Advertisement
Lisenochek

Untitled

Oct 28th, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.40 KB | None | 0 0
  1. package ru.lisenochek.mcrust.objects.blockMechanic;
  2.  
  3. import org.bukkit.Bukkit;
  4. import org.bukkit.Location;
  5. import org.bukkit.Material;
  6. import org.bukkit.entity.HumanEntity;
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.inventory.Inventory;
  9. import org.bukkit.inventory.ItemStack;
  10. import org.bukkit.scheduler.BukkitRunnable;
  11. import ru.lisenochek.mcrust.Items;
  12. import ru.lisenochek.mcrust.Main;
  13. import ru.lisenochek.mcrust.objects.misc.Sounds;
  14. import ru.lisenochek.mcrust.objects.player.craft.Craft;
  15. import ru.lisenochek.mcrust.sql.SQLManager;
  16. import ru.lisenochek.mcrust.utils.ISBuilder;
  17. import ru.lisenochek.mcrust.utils.Utils;
  18.  
  19. import java.util.*;
  20.  
  21. public class Recycler {
  22.  
  23. private static HashMap<Location, Recycler> recyclersMap = new HashMap<>();
  24. private static List<Integer> recyclerSlots = Arrays.asList(10, 11, 12, 13, 14);
  25.  
  26. private Location location;
  27. private boolean isWork;
  28. private int taskID;
  29. private Inventory inventory;
  30.  
  31. private Recycler(Location location) {
  32. this.location = location;
  33. this.inventory = Bukkit.createInventory(null, 27, Utils.stripColor("&2&lПереработчик"));
  34. recyclersMap.put(location, this);
  35. }
  36.  
  37. private Recycler(Location location, String data) {
  38. this.location = location;
  39. this.inventory = Bukkit.createInventory(null, 27, Utils.stripColor("&2&lПереработчик"));
  40. for (String s : data.split(" ")) {
  41. String[] s1 = s.split("-");
  42. inventory.setItem(Integer.parseInt(s1[0]), ISBuilder.deserialiseStack(s1[1]));
  43. }
  44. recyclersMap.put(location, this);
  45. }
  46.  
  47. public static Recycler create(Location location) {
  48. return new Recycler(location);
  49. }
  50.  
  51. public static Recycler create(Location location, String data) {
  52. return new Recycler(location, data);
  53. }
  54.  
  55. public static Recycler fromLocation(Location location) {
  56. return recyclersMap.get(location);
  57. }
  58.  
  59. public Location getLocation() {
  60. return location;
  61. }
  62.  
  63. public static List<Integer> getRecyclerSlots() {
  64. return recyclerSlots;
  65. }
  66.  
  67. public static void save() {
  68. for (Recycler recycler : recyclersMap.values()) {
  69. recycler.stopWork();
  70. SQLManager.getManager().updateRecyclerData(recycler);
  71. }
  72. }
  73.  
  74. public void remove() {
  75. stopWork();
  76. Recycler.recyclersMap.remove(location);
  77. SQLManager.getManager().deleteRecyclerData(this);
  78. }
  79.  
  80. public void openGUI(Player player) {
  81.  
  82. inventory.setItem(16, (isWork
  83. ?
  84. ISBuilder.getBuilder(Material.BOOK, 0, 1, "&a&l» &e&lПереработчик запущен",
  85. "",
  86. "&7Нажмите, чтобы &aостановить",
  87. "&7переработчик"
  88. )
  89. :
  90. ISBuilder.getBuilder(Material.BOOK, 0, 1, "&a&l» &e&lПереработчик остановлен",
  91. "",
  92. "&7Нажмите, чтобы &aвключить",
  93. "&7переработчик"
  94. )).setTag("location", Utils.serialiseLocation(location)).getStack()
  95. );
  96.  
  97. inventory.setItem(18, ISBuilder.getBuilder(Material.BOOK, 0, 1, "&a&l» &e&lРабота переработчика",
  98. "",
  99. "&7&l&nМатериалы для переработки&7&l:",
  100. "",
  101. "&7Положите предметы для &aпереработки &7в любые &a5 &7слотов. Предметы, которые",
  102. "&aнельзя &7создать и &aнекоторые &7создаваемые &aнельзя &7переработать. Предметы",
  103. "&7перерабатываются &aслева-направо &7и их составляющие &aпоявляются &7в &aсвободных",
  104. "&7слотах",
  105. "",
  106. "&7&l&nРабота переработчика&7&l:",
  107. "",
  108. "&7Нажмите по иконке &aсправа&7, чтобы &aвключить &7переработчик.",
  109. "&7Переработчик &aостановится&7, если он будет &aпереполнен &7ресурсами или",
  110. "&7если в нем &aне &7будет предметов для &aпереработки"
  111. ).getStack());
  112.  
  113. for (int freeSlot = 0; freeSlot < inventory.getSize(); freeSlot++) if (!recyclerSlots.contains(freeSlot) && inventory.getItem(freeSlot) == null) inventory.setItem(freeSlot, ISBuilder.getBuilder(Material.STAINED_GLASS_PANE, 0, 1, " ").getStack());
  114. player.openInventory(inventory);
  115. }
  116.  
  117. public void startWork() {
  118.  
  119. if (isWork) return;
  120. if (isFull() || isEmpty()) return;
  121.  
  122. isWork = true;
  123. for (HumanEntity entity : new ArrayList<>(inventory.getViewers())) openGUI((Player) entity);
  124. location.getWorld().playSound(location, Sounds.RECYCLER_START_WORK.getSoundName(), 1, 1);
  125.  
  126. BukkitRunnable runnable = new BukkitRunnable() {
  127.  
  128. int milsec = 0;
  129.  
  130. @Override
  131. public void run() {
  132.  
  133. if (!recyclersMap.containsKey(location)) {
  134. cancel();
  135. return;
  136. }
  137.  
  138. if (isFull() || isEmpty()) {
  139. stopWork();
  140. return;
  141. }
  142.  
  143. milsec++;
  144.  
  145. if (milsec % 20 == 0) location.getWorld().playSound(location, Sounds.RECYCLER_WORK.getSoundName(), 1, 1);
  146. if (milsec % (20 * 5) != 0) return;
  147.  
  148. for (int slot : recyclerSlots) {
  149.  
  150. boolean resFound = false;
  151. ItemStack material = inventory.getItem(slot);
  152.  
  153. if (material == null) continue;
  154.  
  155. HashMap<ItemStack, List<ItemStack>> map = getItems();
  156.  
  157. for (Map.Entry<ItemStack, List<ItemStack>> entry : map.entrySet()) {
  158.  
  159. if (!Utils.checkItem(material, entry.getKey())) continue;
  160.  
  161. inventory.setItem(slot, ISBuilder.getBuilder(material).setAmount(material.getAmount() - 1).getStack());
  162.  
  163. for (ItemStack stack : entry.getValue()) {
  164.  
  165. Collection<ItemStack> dropList = inventory.addItem(stack).values();
  166.  
  167. if (dropList.size() != 0) stopWork();
  168. for (ItemStack drops : dropList) location.getWorld().dropItemNaturally(location.clone().add(0.5D, 1, 0.5D), drops);
  169. }
  170.  
  171. resFound = true;
  172. break;
  173. }
  174.  
  175. if (resFound) break;
  176. }
  177. }
  178. };
  179. runnable.runTaskTimer(Main.plugin, 1, 1);
  180. taskID = runnable.getTaskId();
  181. }
  182.  
  183. public void stopWork() {
  184.  
  185. if (!isWork) return;
  186.  
  187. isWork = false;
  188. for (HumanEntity entity : new ArrayList<>(inventory.getViewers())) openGUI((Player) entity);
  189. Sounds.stopSounds(location, Sounds.RECYCLER_START_WORK.getSoundName(), Sounds.RECYCLER_WORK.getSoundName());
  190. location.getWorld().playSound(location, Sounds.RECYCLER_STOP_WORK.getSoundName(), 1, 1);
  191. Bukkit.getScheduler().cancelTask(taskID);
  192. }
  193.  
  194. private boolean isFull() {
  195.  
  196. boolean isFull = true;
  197.  
  198. for (int slot : recyclerSlots) {
  199.  
  200. ItemStack stack = inventory.getItem(slot);
  201.  
  202. if (stack == null) {
  203. isFull = false;
  204. break;
  205. }
  206.  
  207. for (Map.Entry<ItemStack, List<ItemStack>> entry : getItems().entrySet()) {
  208.  
  209. if (!Utils.checkItem(entry.getKey(), stack)) continue;
  210.  
  211. for (ItemStack result : entry.getValue()) {
  212.  
  213. if (!Utils.checkItem(result, stack)) continue;
  214. if (stack.getAmount() == stack.getMaxStackSize()) continue;
  215.  
  216. isFull = false;
  217. break;
  218. }
  219. }
  220. }
  221.  
  222. return isFull;
  223. }
  224.  
  225. private boolean isEmpty() {
  226.  
  227. boolean isEmpty = true;
  228.  
  229. for (int slot : recyclerSlots) {
  230. ItemStack stack = inventory.getItem(slot);
  231. if (stack == null) continue;
  232. for (ItemStack recycleItem : getItems().keySet()) {
  233. if (!Utils.checkItem(recycleItem, stack)) continue;
  234. isEmpty = false;
  235. break;
  236. }
  237. }
  238.  
  239. return isEmpty;
  240. }
  241.  
  242. private HashMap<ItemStack, List<ItemStack>> getItems() {
  243.  
  244. HashMap<ItemStack, List<ItemStack>> map = new HashMap<>();
  245.  
  246. for (Craft.CraftItems categoryItems : Craft.CraftItems.values()) {
  247. if (categoryItems.isNotRecycling()) continue;
  248. List<ItemStack> list = new ArrayList<>();
  249. for (ItemStack stack : categoryItems.getNeedItems()) list.add(ISBuilder.getBuilder(stack.clone()).setAmount(stack.getAmount() / 2).getStack());
  250. map.put(categoryItems.getResult(), list);
  251. }
  252.  
  253. for (I i : I.values()) map.put(i.getStack(), Arrays.asList(i.getResult()));
  254. return map;
  255. }
  256.  
  257. public String serialize() {
  258.  
  259. StringBuilder builder = new StringBuilder();
  260. boolean isEmpty = true;
  261.  
  262. for (int slot : recyclerSlots) {
  263. ItemStack stack = inventory.getItem(slot);
  264. if (stack == null) continue;
  265. isEmpty = false;
  266. break;
  267. }
  268.  
  269. if (isEmpty) return null;
  270.  
  271. for (int slot : recyclerSlots) {
  272. ItemStack stack = inventory.getItem(slot);
  273. if (stack == null) continue;
  274. builder.append(slot).append("-").append(ISBuilder.serialise(stack)).append(" ");
  275. }
  276.  
  277. return builder.toString();
  278. }
  279.  
  280. public enum I {
  281.  
  282. SEMI_RIFLE_BODY(Items.SEMI_RIFLE_BODY.getStack(),
  283. ISBuilder.getBuilder(Items.SCRAP.getStack()).setAmount(5).getStack(),
  284. Items.HQM.getStack(),
  285. ISBuilder.getBuilder(Items.METAL_FRAGMENTS.getStack()).setAmount(20).getStack()
  286. ),
  287.  
  288. SMG_BODY(Items.SMG_BODY.getStack(),
  289. ISBuilder.getBuilder(Items.SCRAP.getStack()).setAmount(15).getStack(),
  290. ISBuilder.getBuilder(Items.HQM.getStack()).setAmount(4).getStack()
  291. ),
  292.  
  293. RIFLE_BODY(Items.RIFLE_BODY.getStack(),
  294. ISBuilder.getBuilder(Items.SCRAP.getStack()).setAmount(25).getStack(),
  295. ISBuilder.getBuilder(Items.HQM.getStack()).setAmount(4).getStack()
  296. ),
  297.  
  298. ROPE(Items.RIFLE_BODY.getStack(),
  299. ISBuilder.getBuilder(Items.SCRAP.getStack()).setAmount(25).getStack(),
  300. ISBuilder.getBuilder(Items.HQM.getStack()).setAmount(4).getStack()
  301. );
  302.  
  303. private ItemStack stack;
  304. private ItemStack[] result;
  305.  
  306. I(ItemStack stack, ItemStack... result) {
  307. this.stack = stack;
  308. this.result = result;
  309. }
  310.  
  311. public ItemStack getStack() {
  312. return stack;
  313. }
  314.  
  315. public ItemStack[] getResult() {
  316. return result;
  317. }
  318. }
  319. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement