Ghaz-ranka

Untitled

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