|
1 | 1 | package com.shanebeestudios.survival.plugin.listeners.item; |
2 | 2 |
|
| 3 | +import com.shanebeestudios.survival.api.item.Item; |
| 4 | +import com.shanebeestudios.survival.api.item.Items; |
| 5 | +import com.shanebeestudios.survival.api.util.ItemUtils; |
| 6 | +import io.papermc.paper.datacomponent.DataComponentTypes; |
| 7 | +import org.bukkit.Keyed; |
| 8 | +import org.bukkit.event.EventHandler; |
3 | 9 | import org.bukkit.event.Listener; |
| 10 | +import org.bukkit.event.inventory.InventoryType; |
| 11 | +import org.bukkit.event.inventory.PrepareAnvilEvent; |
| 12 | +import org.bukkit.event.inventory.PrepareItemCraftEvent; |
| 13 | +import org.bukkit.inventory.AnvilInventory; |
| 14 | +import org.bukkit.inventory.CraftingInventory; |
| 15 | +import org.bukkit.inventory.ItemStack; |
| 16 | +import org.bukkit.inventory.Recipe; |
4 | 17 |
|
| 18 | +import java.util.ArrayList; |
| 19 | +import java.util.List; |
| 20 | + |
| 21 | +@SuppressWarnings("UnstableApiUsage") |
5 | 22 | public class RepairCrafting implements Listener { |
6 | | - // TODO not sure we need this anymore?!?! |
7 | | - |
8 | | -// @EventHandler |
9 | | -// private void onCraft(PrepareItemCraftEvent event) { |
10 | | -// Recipe recipe = event.getRecipe(); |
11 | | -// if (recipe instanceof Keyed && ((Keyed) recipe).getKey().getNamespace().equalsIgnoreCase("survivalplus")) { |
12 | | -// // If this is a legit recipe, let's get outta here |
13 | | -// return; |
14 | | -// } |
15 | | -// CraftingInventory inventory = event.getInventory(); |
16 | | -// |
17 | | -// List<ItemStack> items = new ArrayList<>(); |
18 | | -// for (ItemStack itemStack : inventory.getMatrix()) { |
19 | | -// if (itemStack != null) { |
20 | | -// items.add(itemStack); |
21 | | -// } |
22 | | -// } |
23 | | -// |
24 | | -// if (items.size() == 2) { |
25 | | -// ItemStack iOne = items.get(0); |
26 | | -// ItemStack iTwo = items.get(1); |
27 | | -// Item itemOne = Item.getFromStack(iOne); |
28 | | -// Item itemTwo = Item.getFromStack(iTwo); |
29 | | -// if (itemOne != null && itemOne == itemTwo) { |
30 | | -// ItemStack result = repair(iOne, iTwo, itemOne); |
31 | | -// if (inventory.getType() == InventoryType.CRAFTING || itemOne.getRepairCostMultiplier() >= 0) { |
32 | | -// // No repairing in player inventory |
33 | | -// // Cost >= 0 signifies it requires an anvil |
34 | | -// result = null; |
35 | | -// } |
36 | | -// // Since we're using a crafting table we're going to reset defaults |
37 | | -// // ie: remove enchantments |
38 | | -// result = resetItem(result); |
39 | | -// inventory.setResult(result); |
40 | | -// |
41 | | -// } else if ((itemOne != null && itemTwo == null) || (itemOne == null && itemTwo != null)) { |
42 | | -// // Prevent repairing custom items with vanilla items |
43 | | -// inventory.setResult(null); |
44 | | -// |
45 | | -// } |
46 | | -// } |
47 | | -// items.clear(); |
48 | | -// } |
49 | | -// |
50 | | -// @EventHandler |
51 | | -// private void onAnvilRepair(PrepareAnvilEvent event) { |
52 | | -// AnvilInventory inventory = event.getInventory(); |
53 | | -// ItemStack iOne = inventory.getContents()[0]; |
54 | | -// ItemStack iTwo = inventory.getContents()[1]; |
55 | | -// if (iOne != null && iTwo != null) { |
56 | | -// if (iOne.getType() != iTwo.getType()) { |
57 | | -// // If two different items, lets get outta here |
58 | | -// // ie: enchanting |
59 | | -// return; |
60 | | -// } |
61 | | -// Item itemOne = Item.getFromStack(iOne); |
62 | | -// Item itemTwo = Item.getFromStack(iTwo); |
63 | | -// // Let's make sure we're joining two of the same item |
64 | | -// if (itemOne != null && itemOne == itemTwo) { |
65 | | -// ItemStack result = repair(iOne, iTwo, itemOne); |
66 | | -// event.setResult(result); |
67 | | -// double cost = itemOne.getRepairCostMultiplier(); |
68 | | -// if (cost > 0) { |
69 | | -// inventory.setRepairCost((int) Math.round(inventory.getRepairCost() * cost)); |
70 | | -// } |
71 | | -// } else if ((itemOne != null && itemTwo == null) || (itemOne == null && itemTwo != null)) { |
72 | | -// // Prevent repairing custom items with vanilla items |
73 | | -// event.setResult(null); |
74 | | -// } |
75 | | -// } |
76 | | -// |
77 | | -// } |
78 | | -// |
79 | | -// private ItemStack repair(ItemStack itemStackOne, ItemStack itemStackTwo, Item item) { |
80 | | -// double repairPercent = item.getRepairPercent(); |
81 | | -// if (repairPercent <= 0) { |
82 | | -// return null; |
83 | | -// } |
84 | | -// |
85 | | -// ItemStack result = itemStackOne.clone(); |
86 | | -// double max = itemStackOne.getType().getMaxDurability(); |
87 | | -// int dura1 = getRemainingDurability(itemStackOne); |
88 | | -// int dura2 = getRemainingDurability(itemStackTwo); |
89 | | -// int repair = (int) Math.min((dura1 + dura2 + Math.floor(max / 20)) * repairPercent, max); |
90 | | -// |
91 | | -// ItemMeta meta = result.getItemMeta(); |
92 | | -// assert meta != null; |
93 | | -// ((Damageable) meta).setDamage((int) (max - repair)); |
94 | | -// result.setItemMeta(meta); |
95 | | -// return result; |
96 | | -// } |
97 | | -// |
98 | | -// private ItemStack resetItem(ItemStack itemStack) { |
99 | | -// Item item = Item.getFromStack(itemStack); |
100 | | -// |
101 | | -// ItemMeta itemMeta = itemStack.getItemMeta(); |
102 | | -// assert itemMeta != null; |
103 | | -// int damage = ((Damageable) itemMeta).getDamage(); |
104 | | -// |
105 | | -// assert item != null; |
106 | | -// ItemStack newItemStack = item.getItem(); |
107 | | -// ItemMeta newItemMeta = newItemStack.getItemMeta(); |
108 | | -// assert newItemMeta != null; |
109 | | -// ((Damageable) newItemMeta).setDamage(damage); |
110 | | -// newItemStack.setItemMeta(newItemMeta); |
111 | | -// |
112 | | -// return newItemStack; |
113 | | -// } |
114 | | -// |
115 | | -// private int getRemainingDurability(ItemStack itemStack) { |
116 | | -// ItemMeta meta = itemStack.getItemMeta(); |
117 | | -// |
118 | | -// if (meta instanceof Damageable) { |
119 | | -// return itemStack.getType().getMaxDurability() - ((Damageable) meta).getDamage(); |
120 | | -// } |
121 | | -// return 0; |
122 | | -// } |
| 23 | + |
| 24 | + @EventHandler |
| 25 | + private void onCraft(PrepareItemCraftEvent event) { |
| 26 | + Recipe recipe = event.getRecipe(); |
| 27 | + if (recipe instanceof Keyed keyed && keyed.getKey().getNamespace().equalsIgnoreCase("survival_plus")) { |
| 28 | + // If this is a legit recipe, let's get outta here |
| 29 | + return; |
| 30 | + } |
| 31 | + CraftingInventory inventory = event.getInventory(); |
| 32 | + |
| 33 | + List<ItemStack> items = new ArrayList<>(); |
| 34 | + for (ItemStack itemStack : inventory.getMatrix()) { |
| 35 | + if (itemStack != null) { |
| 36 | + items.add(itemStack); |
| 37 | + } |
| 38 | + } |
| 39 | + |
| 40 | + if (items.size() == 2) { |
| 41 | + ItemStack iOne = items.get(0); |
| 42 | + ItemStack iTwo = items.get(1); |
| 43 | + Item itemOne = Items.getFromStack(iOne); |
| 44 | + Item itemTwo = Items.getFromStack(iTwo); |
| 45 | + if (itemOne != null && itemOne == itemTwo) { |
| 46 | + ItemStack result = repair(iOne, iTwo, itemOne.getRepairPercent()); |
| 47 | + if (inventory.getType() == InventoryType.CRAFTING || itemOne.getRepairCost() > 0) { |
| 48 | + // No repairing in player inventory |
| 49 | + // Cost > 0 signifies it requires an anvil |
| 50 | + result = null; |
| 51 | + } |
| 52 | + if (result != null) { |
| 53 | + // Since we're using a crafting table we're going to reset defaults |
| 54 | + // ie: remove enchantments |
| 55 | + result = resetItem(itemOne, result); |
| 56 | + } |
| 57 | + inventory.setResult(result); |
| 58 | + |
| 59 | + } else if ((itemOne != null && itemTwo == null) || (itemOne == null && itemTwo != null)) { |
| 60 | + // Prevent repairing custom items with vanilla items |
| 61 | + inventory.setResult(null); |
| 62 | + |
| 63 | + } |
| 64 | + } |
| 65 | + items.clear(); |
| 66 | + } |
| 67 | + |
| 68 | + @EventHandler |
| 69 | + private void onAnvilRepair(PrepareAnvilEvent event) { |
| 70 | + AnvilInventory inventory = event.getInventory(); |
| 71 | + ItemStack slotOne = inventory.getContents()[0]; |
| 72 | + ItemStack slotTwo = inventory.getContents()[1]; |
| 73 | + if (slotOne != null && slotTwo != null) { |
| 74 | + if (slotOne.getType() != slotTwo.getType()) { |
| 75 | + // If two different items, lets get outta here |
| 76 | + // ie: enchanting |
| 77 | + return; |
| 78 | + } |
| 79 | + Item itemOne = Items.getFromStack(slotOne); |
| 80 | + Item itemTwo = Items.getFromStack(slotTwo); |
| 81 | + // Let's make sure we're joining two of the same item |
| 82 | + if (itemOne != null && itemOne == itemTwo) { |
| 83 | + ItemStack result = repair(slotOne, slotTwo, itemOne.getRepairPercent()); |
| 84 | + event.setResult(result); |
| 85 | + } |
| 86 | + } |
| 87 | + } |
| 88 | + |
| 89 | + private ItemStack repair(ItemStack itemStackOne, ItemStack itemStackTwo, double repairPercent) { |
| 90 | + if (repairPercent <= 0) return null; |
| 91 | + |
| 92 | + ItemStack result = itemStackOne.clone(); |
| 93 | + int max = ItemUtils.getMaxDamage(itemStackOne); |
| 94 | + int dura1 = ItemUtils.getDurability(itemStackOne); |
| 95 | + int dura2 = ItemUtils.getDurability(itemStackTwo); |
| 96 | + int repair = (int) Math.min((dura1 + dura2 + Math.floor((double) max / 20)) * repairPercent, max); |
| 97 | + |
| 98 | + result.setData(DataComponentTypes.DAMAGE, max - repair); |
| 99 | + return result; |
| 100 | + } |
| 101 | + |
| 102 | + @SuppressWarnings("DataFlowIssue") |
| 103 | + private ItemStack resetItem(Item baseItem, ItemStack itemStack) { |
| 104 | + if (!itemStack.hasData(DataComponentTypes.DAMAGE)) return null; |
| 105 | + |
| 106 | + ItemStack newItemStack = baseItem.getItemStack(); |
| 107 | + newItemStack.setData(DataComponentTypes.DAMAGE, itemStack.getData(DataComponentTypes.DAMAGE)); |
| 108 | + |
| 109 | + return newItemStack; |
| 110 | + } |
123 | 111 |
|
124 | 112 | } |
0 commit comments