Ghaz-ranka

Untitled

Jun 4th, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.42 KB | None | 0 0
  1. package zorg.esinia.server.anvils;
  2.  
  3. import java.util.Arrays;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Optional;
  8. import java.util.UUID;
  9. import java.util.concurrent.TimeUnit;
  10. import java.util.concurrent.atomic.AtomicInteger;
  11. import java.util.stream.Collectors;
  12.  
  13. import org.spongepowered.api.data.key.Keys;
  14. import org.spongepowered.api.data.type.HandTypes;
  15. import org.spongepowered.api.entity.living.player.Player;
  16. import org.spongepowered.api.event.Listener;
  17. import org.spongepowered.api.event.block.InteractBlockEvent;
  18. import org.spongepowered.api.event.cause.Cause;
  19. import org.spongepowered.api.event.cause.NamedCause;
  20. import org.spongepowered.api.event.filter.Getter;
  21. import org.spongepowered.api.event.filter.cause.Root;
  22. import org.spongepowered.api.event.item.inventory.ClickInventoryEvent;
  23. import org.spongepowered.api.event.item.inventory.DropItemEvent;
  24. import org.spongepowered.api.item.ItemType;
  25. import org.spongepowered.api.item.inventory.Inventory;
  26. import org.spongepowered.api.item.inventory.InventoryArchetypes;
  27. import org.spongepowered.api.item.inventory.ItemStack;
  28. import org.spongepowered.api.item.inventory.ItemStackSnapshot;
  29. import org.spongepowered.api.item.inventory.property.InventoryDimension;
  30. import org.spongepowered.api.item.inventory.property.InventoryTitle;
  31. import org.spongepowered.api.item.inventory.property.SlotPos;
  32. import org.spongepowered.api.scheduler.Task;
  33. import org.spongepowered.api.scoreboard.Scoreboard;
  34. import org.spongepowered.api.scoreboard.critieria.Criteria;
  35. import org.spongepowered.api.scoreboard.displayslot.DisplaySlots;
  36. import org.spongepowered.api.scoreboard.objective.Objective;
  37. import org.spongepowered.api.text.Text;
  38. import org.spongepowered.api.text.format.TextColor;
  39. import org.spongepowered.api.text.format.TextColors;
  40. import org.spongepowered.api.text.serializer.TextSerializers;
  41. import org.spongepowered.api.world.Location;
  42. import org.spongepowered.api.world.World;
  43.  
  44. import com.google.common.collect.ImmutableList;
  45.  
  46. import ninja.leaping.configurate.ConfigurationNode;
  47. import zorg.esinia.server.Config;
  48. import zorg.esinia.server.Config.CraftingEntry;
  49. import zorg.esinia.server.Config.CustomCraftingEntry;
  50. import zorg.esinia.server.Config.ItemEntry;
  51. import zorg.esinia.server.Config.ItemsEntry;
  52. import zorg.esinia.server.Esinia;
  53. //class file name and main method
  54. public class AnvilStone {
  55. public Config config;
  56. private Esinia plugin;
  57. public AnvilStone(Esinia plugin){
  58. this.plugin = plugin;
  59. this.config = plugin.config;
  60. }
  61.  
  62. Map<UUID, Task> tasks = new HashMap<>();
  63. Map<UUID, Scoreboard> boards = new HashMap<>();
  64. Map<UUID, Boolean> isCrafting = new HashMap<>();
  65. //listener for the following event
  66. @Listener
  67. public void onRightClickMainHand(InteractBlockEvent.Secondary.MainHand event){
  68. Player player = event.getCause().first(Player.class).get();
  69. if (player != null){
  70. if (player.getItemInHand(HandTypes.MAIN_HAND).isPresent()){
  71. player.sendMessage(Text.of("Is present 1"));
  72. ItemStack mainhandItem = player.getItemInHand(HandTypes.MAIN_HAND).get();
  73. String toolName = mainhandItem.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain();
  74. String blockName = event.getTargetBlock().getState().getType().toString();
  75. Optional<CustomCraftingEntry> customcraftingEntry_ = config.customCrafting.stream().filter(f -> f.toolName.equals(toolName) && f.blockName.equals(blockName)).findFirst();
  76. if (customcraftingEntry_.isPresent()) {
  77. player.sendMessage(Text.of("Is present 2"));
  78. CustomCraftingEntry customcraftingEntry = customcraftingEntry_.get();
  79. String inventoryName = customcraftingEntry.name;
  80. int itemCounter = -1;
  81. int secondaryCounter = 0;
  82. event.setCancelled(true);
  83. Inventory craftingInventory = Inventory.builder().of(InventoryArchetypes.DOUBLE_CHEST)
  84. .property(InventoryDimension.PROPERTY_NAME, new InventoryDimension(9, 4))
  85. .property(InventoryTitle.PROPERTY_NAME, InventoryTitle.of(Text.of(inventoryName)))
  86. .build(this.plugin);
  87. List<ItemsEntry> craftingItems = customcraftingEntry.items;
  88. for (ItemsEntry craftingItem : craftingItems) {
  89. itemCounter = itemCounter + 1;
  90. if (itemCounter > 9){
  91. itemCounter = 0;
  92. secondaryCounter = secondaryCounter + 1;
  93. }
  94. TextColor itemColor = craftingItem.color;
  95. ItemType itemID = craftingItem.id;
  96. String itemName = craftingItem.name;
  97. List<String> itemLore_ = craftingItem.lore;
  98. List<Text> itemLore = itemLore_.stream().map(TextSerializers.FORMATTING_CODE::deserialize).collect(Collectors.toList());
  99. ItemStack item = ItemStack.of(itemID, 1);
  100. item.offer(Keys.DISPLAY_NAME, Text.of(itemColor, itemName));
  101. item.offer(Keys.ITEM_LORE, itemLore);
  102. craftingInventory.query(new SlotPos(secondaryCounter,itemCounter)).set(item);
  103. }
  104. player.openInventory(craftingInventory, Cause.of(NamedCause.source(player)));
  105. }
  106. } else {
  107. player.sendMessage(Text.of("You need a tool to use " + event.getTargetBlock().getState().getName() + "."));
  108. }
  109. }
  110. }
  111. //if (event.getTargetBlock().getState().getType() == BlockTypes.ANVIL){
  112. // if (mainhanditem.get(Keys.DISPLAY_NAME).get().equals(Text.of("Wooden Hammer"))){
  113. // event.setCancelled(true);
  114. // Optional<ItemType> Stoneshovel_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzshovel");
  115. // ItemType StoneShovelType = Stoneshovel_.get();
  116. // ItemStack stoneShovel = ItemStack.of(StoneShovelType, 1);
  117. // stoneShovel.offer(Keys.DISPLAY_NAME, Text.of("Stone Shovel"));
  118. // List<Text> itemShovelLore = new ArrayList<Text>();
  119. // itemShovelLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
  120. // itemShovelLore.add(Text.of(TextColors.GOLD, "1 Flat Stone"));
  121. // itemShovelLore.add(Text.of(TextColors.GOLD, "1 Tool Handle"));
  122. // stoneShovel.offer(Keys.ITEM_LORE , itemShovelLore);
  123. //
  124. // Optional<ItemType> stoneAxe_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzaxe");
  125. // ItemType stoneaxeType = stoneAxe_.get();
  126. // ItemStack stoneAxe = ItemStack.of(stoneaxeType, 1);
  127. // List<Text> itemAxeLore = new ArrayList<Text>();
  128. // itemAxeLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
  129. // itemAxeLore.add(Text.of(TextColors.GOLD, "1 Stone Axehead"));
  130. // itemAxeLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
  131. // stoneAxe.offer(Keys.ITEM_LORE , itemAxeLore);
  132. //
  133. // Optional<ItemType> stonePickaxe_ = Sponge.getGame().getRegistry().getType(ItemType.class, "forgecraft:wootzpickaxe");
  134. // ItemType stonepickaxeType = stonePickaxe_.get();
  135. // ItemStack stonePickaxe = ItemStack.of(stonepickaxeType, 1);
  136. // List<Text> itemPickaxeLore = new ArrayList<Text>();
  137. // itemPickaxeLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
  138. // itemPickaxeLore.add(Text.of(TextColors.GOLD, "1 Stone Pickaxehead"));
  139. // itemPickaxeLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
  140. // stonePickaxe.offer(Keys.ITEM_LORE , itemPickaxeLore);
  141. //
  142. // ItemStack stoneSword = ItemStack.of(ItemTypes.STONE_SWORD, 1);
  143. // stoneSword.offer(Keys.DISPLAY_NAME, Text.of("Stone Sword"));
  144. // List<Text> itemSwordLore = new ArrayList<Text>();
  145. // itemSwordLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
  146. // itemSwordLore.add(Text.of(TextColors.GOLD, "1 Stone Blade"));
  147. // itemSwordLore.add(Text.of(TextColors.GOLD, "1 Wooden Tool Handle"));
  148. // stoneSword.offer(Keys.ITEM_LORE , itemPickaxeLore);
  149. //
  150. // Inventory BasicAnvilInventory = Inventory.builder().of(InventoryArchetypes.DOUBLE_CHEST)
  151. // .property(InventoryDimension.PROPERTY_NAME, new InventoryDimension(9, 1))
  152. // .property(InventoryTitle.PROPERTY_NAME, InventoryTitle.of(Text.of("Stone Working")))
  153. // .build(this.plugin);
  154. //
  155. // BasicAnvilInventory.query(new SlotPos(0,0)).set(stoneShovel);
  156. // BasicAnvilInventory.query(new SlotPos(1,0)).set(stoneAxe);
  157. // BasicAnvilInventory.query(new SlotPos(2,0)).set(stonePickaxe);
  158. // BasicAnvilInventory.query(new SlotPos(3,0)).set(stoneSword);
  159. // player.openInventory(BasicAnvilInventory, Cause.of(NamedCause.source(player)));
  160. // }
  161. // });
  162. //}
  163. //}
  164.  
  165. @Listener
  166. public void onInventoryClick(ClickInventoryEvent event, @Root Player player, @Getter("getTargetInventory") Inventory inventory) {
  167.  
  168. Location<World> p_Loc = player.getLocation();
  169. UUID id = player.getUniqueId();
  170. if (isCrafting.get(id)){
  171. event.setCancelled(true);
  172. player.sendMessage(Text.of("You are currently crafting"));
  173. } else if (inventory.getName().get().contains("Stone Working")){
  174. event.setCancelled(true);
  175. ItemStackSnapshot clicked = event.getCursorTransaction().getFinal();
  176. String name = clicked.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain();
  177. //if (!name.startsWith("&f")) {
  178. // it does not have the correct name
  179. //}
  180. //name = name.replaceAll("^&f", "");
  181. ItemType itemID = clicked.getType();
  182. Optional<ItemEntry> itemEntry_ = config.items.stream().filter(f -> f.name.equals(name) && f.id.equals(itemID)).findFirst();
  183. if (itemEntry_.isPresent()) {
  184. boolean hasReagents = true;
  185. ItemEntry itemEntry = itemEntry_.get();
  186. String itemName = itemEntry.name;
  187. String craftingType = itemEntry.type;
  188. TextColor itemColor = itemEntry.color;
  189. List<String> itemLore = itemEntry.lore;
  190. int itemQuantity = itemEntry.quantity;
  191. int itemXP = itemEntry.xp;
  192. int itemDifficulty = itemEntry.difficulty;
  193. ConfigurationNode nodeType = plugin.root.getNode(craftingType, player.getUniqueId().toString());
  194. int level = nodeType.getNode("Level").getInt();
  195. int xp = nodeType.getNode("XP").getInt();
  196. List<CraftingEntry> craftingReagents = itemEntry.crafting;
  197. reagents: for (CraftingEntry craftingReagent : craftingReagents) {
  198. ItemType reagentID = craftingReagent.id;
  199. String reagentName = craftingReagent.name;
  200. int reagentQuantity = craftingReagent.quantity;
  201. int inventoryreagentQuantity = 0;
  202. for (Inventory slot : player.getInventory().query(reagentID).slots()){
  203. ItemStack stack = slot.peek().get();
  204. if (stack.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain().equals(reagentName)){
  205. inventoryreagentQuantity += stack.getQuantity();
  206. }
  207. }
  208. if (inventoryreagentQuantity < reagentQuantity){
  209. player.sendMessage(Text.of("You need " + reagentQuantity + " " + reagentName + " to craft " + itemQuantity + " " + itemName + "."));
  210. hasReagents = false;
  211. break reagents;
  212. }
  213. }
  214. if (hasReagents){
  215. Integer time = 1 - (level/100);
  216. Objective obj = Objective.builder()
  217. .criterion(Criteria.DUMMY)
  218. .name("timer")
  219. .displayName(Text.of(TextColors.DARK_BLUE, "[ ]"))
  220. .build();
  221. Scoreboard board = Scoreboard.builder()
  222. .objectives(ImmutableList.of(obj))
  223. .build();
  224. obj.getOrCreateScore(Text.of(player.getName())).setScore(0);
  225. player.setScoreboard(board);
  226. board.updateDisplaySlot(obj, DisplaySlots.SIDEBAR);
  227. boards.put(player.getUniqueId(), board);
  228. AtomicInteger integer = new AtomicInteger(10);
  229. tasks.put(id, Task.builder()
  230. .delay(time, TimeUnit.SECONDS)
  231. .interval(time, TimeUnit.SECONDS)
  232. .execute(() -> {
  233. isCrafting.put(id, true);
  234. if (player.getLocation() == p_Loc){
  235. player.setScoreboard(board);
  236. char[] arr = new char[10];
  237. Arrays.fill(arr, 0, 11 - integer.decrementAndGet(), '|');
  238. obj.setDisplayName(Text.of(TextColors.DARK_BLUE, "[", String.valueOf(arr), "]"));
  239.  
  240. if (integer.get() == 0) {
  241. obj.setDisplayName(Text.of(TextColors.DARK_BLUE, "[||||||||||]"));
  242. int max = itemDifficulty + (itemDifficulty/2);
  243. int min = level;
  244. int random = (int )(Math.random() * max + min);
  245. if (level >= random){
  246. for (CraftingEntry craftingReagent : craftingReagents) {
  247. ItemType reagentID = craftingReagent.id;
  248. String reagentName = craftingReagent.name;
  249. int reagentQuantity = craftingReagent.quantity;
  250. for (Inventory slot : player.getInventory().query(reagentID).slots()) {
  251. ItemStack stack = slot.peek().get();
  252. if (stack.get(Keys.DISPLAY_NAME).orElse(Text.EMPTY).toPlain().equals(reagentName)) {
  253. if (stack.getQuantity() >= reagentQuantity) {
  254. slot.poll(reagentQuantity);
  255. break;
  256. } else {
  257. reagentQuantity -= stack.getQuantity();
  258. slot.poll();
  259. }
  260. }
  261. }
  262. }
  263. ItemStack reward = ItemStack.of(itemID, itemQuantity);
  264. reward.offer(Keys.DISPLAY_NAME, Text.of(itemColor, itemName));
  265. List<Text> rewarditemLore = itemLore.stream().map(TextSerializers.FORMATTING_CODE::deserialize).collect(Collectors.toList());
  266. //itemShovelLore.add(Text.of(TextColors.GOLD, "Crafting Requirements:"));
  267. //itemShovelLore.add(Text.of(TextColors.GOLD, "1 Flat Stone"));
  268. //itemShovelLore.add(Text.of(TextColors.GOLD, "1 Tool Handle"));
  269. reward.offer(Keys.ITEM_LORE, rewarditemLore);
  270. player.getInventory().offer(reward);
  271. int rxp = (int) Math.round(100 * Math.exp(0.6931 * level));
  272. int fxp = xp + itemXP;
  273. if (fxp >= rxp){
  274. int newXP = fxp - rxp;
  275. int fLevel = level + 1;
  276. nodeType.getNode("XP").setValue(newXP);
  277. nodeType.getNode("Level").setValue(fLevel);
  278. player.sendMessage(Text.of("You gained one level."));
  279. plugin.saveConfig();
  280. isCrafting.put(id, false);
  281. tasks.remove(id).cancel();
  282. boards.remove(id);
  283. } else{
  284. nodeType.getNode("XP").setValue(fxp);
  285. plugin.saveConfig();
  286. isCrafting.put(id, false);
  287. tasks.remove(id).cancel();
  288. boards.remove(id);
  289. }
  290. } else {
  291. player.sendMessage(Text.of("You failed while crafting."));
  292. int rxp = (int) Math.round(100 * Math.exp(0.6931 * level));
  293. int fxp = xp + (itemXP/2);
  294. if (fxp >= rxp){
  295. int newXP = fxp - rxp;
  296. int fLevel = level + 1;
  297. nodeType.getNode("XP").setValue(newXP);
  298. nodeType.getNode("Level").setValue(fLevel);
  299. player.sendMessage(Text.of("You gained one level."));
  300. plugin.saveConfig();
  301. isCrafting.put(id, false);
  302. tasks.remove(id).cancel();
  303. boards.remove(id);
  304. } else{
  305. nodeType.getNode("XP").setValue(fxp);
  306. plugin.saveConfig();
  307. isCrafting.put(id, false);
  308. tasks.remove(id).cancel();
  309. boards.remove(id);
  310. }
  311. }
  312. }
  313. } else{
  314. player.sendMessage(Text.of("Don't move while crafting."));
  315. isCrafting.put(id, false);
  316. tasks.remove(id).cancel();
  317. boards.remove(id);
  318. }
  319. })
  320. .submit(this));
  321. }
  322. }
  323. }
  324. }
  325. @Listener
  326. public void onItemDrop(DropItemEvent event, @Root Player p){
  327. UUID id = p.getUniqueId();
  328. if (isCrafting.get(id)){
  329. event.setCancelled(true);
  330.  
  331. }
  332. }
  333. }
Advertisement
Add Comment
Please, Sign In to add comment