Skip to content

Commit ee6d3f5

Browse files
committed
Finally re-implement repairing
1 parent bc1175f commit ee6d3f5

File tree

2 files changed

+130
-123
lines changed

2 files changed

+130
-123
lines changed

src/main/java/com/shanebeestudios/survival/api/item/Item.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.shanebeestudios.survival.api.item;
22

3-
import com.shanebeestudios.survival.plugin.config.ItemConfig;
43
import com.shanebeestudios.survival.api.util.Utils;
4+
import com.shanebeestudios.survival.plugin.config.ItemConfig;
55
import io.papermc.paper.datacomponent.DataComponentTypes;
66
import io.papermc.paper.datacomponent.item.DyedItemColor;
77
import io.papermc.paper.registry.RegistryAccess;
@@ -40,8 +40,8 @@ public abstract class Item {
4040
private ItemStack itemStack;
4141
private String name;
4242

43-
@SuppressWarnings({"FieldCanBeLocal", "unused"})
44-
private double repairPercent; // TODO figure this out
43+
private double repairPercent;
44+
private int repairCost;
4545

4646
/**
4747
* Get an ItemStack from this item
@@ -115,9 +115,9 @@ protected void setupDefaults(String key, ItemStack itemStack, boolean vanillaMod
115115
}
116116

117117
// Repair Cost
118-
int repairCost = ITEM_CONFIG.getRepairCost(key);
119-
if (repairCost > 0) {
120-
itemStack.setData(DataComponentTypes.REPAIR_COST, repairCost);
118+
this.repairCost = ITEM_CONFIG.getRepairCost(key);
119+
if (this.repairCost > 0) {
120+
itemStack.setData(DataComponentTypes.REPAIR_COST, this.repairCost);
121121
}
122122

123123
// Repair Percent
@@ -160,6 +160,25 @@ public boolean is(ItemStack itemStack) {
160160
return false;
161161
}
162162

163+
/**
164+
* Get the repair percent of this item
165+
* <p>This is used to determine output durability during repairs</p>
166+
*
167+
* @return Repair percent of item
168+
*/
169+
public double getRepairPercent() {
170+
return this.repairPercent;
171+
}
172+
173+
/**
174+
* Get the repair cost of this item
175+
*
176+
* @return Repair cost of item
177+
*/
178+
public int getRepairCost() {
179+
return this.repairCost;
180+
}
181+
163182
/**
164183
* Get the {@link Key} of this item
165184
*
Lines changed: 105 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,112 @@
11
package com.shanebeestudios.survival.plugin.listeners.item;
22

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;
39
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;
417

18+
import java.util.ArrayList;
19+
import java.util.List;
20+
21+
@SuppressWarnings("UnstableApiUsage")
522
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+
}
123111

124112
}

0 commit comments

Comments
 (0)