Skip to content
This repository was archived by the owner on Mar 8, 2022. It is now read-only.

Commit c4dcb80

Browse files
committed
repair hand & repair info
1 parent d190e79 commit c4dcb80

File tree

4 files changed

+148
-0
lines changed

4 files changed

+148
-0
lines changed

src/main/java/cat/nyaa/nyaautils/repair/RepairCommands.java

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package cat.nyaa.nyaautils.repair;
22

3+
import cat.nyaa.nyaautils.I18n;
34
import cat.nyaa.nyaautils.NyaaUtils;
45
import cat.nyaa.utils.CommandReceiver;
56
import cat.nyaa.utils.Internationalization;
7+
import cat.nyaa.utils.Message;
68
import org.bukkit.Material;
79
import org.bukkit.command.CommandSender;
10+
import org.bukkit.entity.Player;
11+
import org.bukkit.inventory.ItemStack;
12+
import org.bukkit.inventory.meta.Repairable;
13+
14+
import static cat.nyaa.nyaautils.repair.RepairInstance.RepairStat.REPAIRABLE;
15+
import static cat.nyaa.nyaautils.repair.RepairInstance.RepairStat.UNREPAIRABLE;
816

917
public class RepairCommands extends CommandReceiver<NyaaUtils> {
1018
private final NyaaUtils plugin;
@@ -36,4 +44,68 @@ public void addRepairItem(CommandSender sender, Arguments args) {
3644
plugin.cfg.repair.addItem(tool, item);
3745
msg(sender, "user.repair.item_added");
3846
}
47+
48+
@SubCommand(value = "info", permission = "nu.repair")
49+
public void repairInfo(CommandSender sender, Arguments args) {
50+
ItemStack item = getItemInHand(sender);
51+
RepairInstance info = new RepairInstance(item, plugin.cfg.repair);
52+
new Message(I18n._("user.repair.info_1")).append(item).send(asPlayer(sender));
53+
msg(sender, "user.repair.info_2", item.getType().name());
54+
if (info.stat != REPAIRABLE) {
55+
msg(sender, "user.repair.info_3", I18n._("user.repair.unrepairable." + info.stat.name()));
56+
}
57+
if (info.stat == UNREPAIRABLE) return;
58+
int fullDur = item.getType().getMaxDurability();
59+
int currDur = fullDur - item.getDurability();
60+
msg(sender, "user.repair.info_4", currDur, fullDur, (double) currDur / (double) fullDur * 100);
61+
new Message(I18n._("user.repair.info_5")).append(new ItemStack(info.repairMaterial)).send(asPlayer(sender));
62+
msg(sender, "user.repair.info_6", info.expConsumption);
63+
msg(sender, "user.repair.info_7", info.durRecovered, (double) info.durRecovered / (double) fullDur * 100);
64+
if (info.repairLimit <= 0) {
65+
msg(sender, "user.repair.info_8");
66+
} else {
67+
int repairTime = ((Repairable) item.getItemMeta()).getRepairCost();
68+
msg(sender, "user.repair.info_9", repairTime, info.repairLimit);
69+
}
70+
}
71+
72+
@SubCommand(value = "hand", permission = "nu.repair")
73+
public void repairHand(CommandSender sender, Arguments args) {
74+
ItemStack item = getItemInHand(sender);
75+
ItemStack material = getItemInOffHand(sender);
76+
RepairInstance info = new RepairInstance(item, plugin.cfg.repair);
77+
if (info.stat != REPAIRABLE) {
78+
msg(sender, "user.repair.info_3", I18n._("user.repair.unrepairable." + info.stat.name()));
79+
return;
80+
}
81+
if (material.getType() != info.repairMaterial || material.getAmount() <= 0) {
82+
msg(sender, "user.repair.material_mismatch");
83+
return;
84+
}
85+
Player p = asPlayer(sender);
86+
if (p.getTotalExperience() < info.expConsumption) {
87+
msg(sender, "user.repair.no_enough_exp");
88+
return;
89+
}
90+
91+
// TODO: elegant exp handling
92+
int tmp = p.getTotalExperience() - info.expConsumption;
93+
p.setTotalExperience(0);
94+
p.setLevel(0);
95+
p.setExp(0);
96+
p.giveExp(tmp);
97+
98+
int dur = item.getDurability();
99+
dur -= info.durRecovered;
100+
if (dur < 0) dur = 0;
101+
item.setDurability((short) dur);
102+
p.getInventory().setItemInMainHand(item);
103+
int count = material.getAmount();
104+
if (count <= 1) {
105+
p.getInventory().setItemInOffHand(new ItemStack(Material.AIR));
106+
} else {
107+
material.setAmount(count - 1);
108+
p.getInventory().setItemInOffHand(material);
109+
}
110+
}
39111
}

src/main/java/cat/nyaa/nyaautils/repair/RepairConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,8 @@ public void addItem(Material m, RepairConfigItem item) {
8787
repairMap.put(m, item);
8888
save();
8989
}
90+
91+
public RepairConfigItem getRepairConfig(Material toolMaterial) {
92+
return repairMap.get(toolMaterial);
93+
}
9094
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package cat.nyaa.nyaautils.repair;
2+
3+
import org.bukkit.Material;
4+
import org.bukkit.inventory.ItemStack;
5+
import org.bukkit.inventory.meta.Repairable;
6+
7+
public class RepairInstance {
8+
public enum RepairStat{
9+
UNREPAIRABLE,
10+
UNREPAIRABLE_REPAIRED,
11+
UNREPAIRABLE_UNBREAKABLE,
12+
UNREPAIRABLE_RLE,// RepairLimitExceeded
13+
UNREPAIRABLE_LOWRECOVER,
14+
REPAIRABLE;
15+
}
16+
17+
public RepairStat stat = RepairStat.UNREPAIRABLE;
18+
public Material repairMaterial;
19+
public int expConsumption;
20+
public int durRecovered;
21+
public int repairLimit;
22+
23+
public RepairInstance(ItemStack item, RepairConfig config) {
24+
if (item == null || item.getType() == Material.AIR) return;
25+
RepairConfig.RepairConfigItem cfg = config.getRepairConfig(item.getType());
26+
if (cfg == null) return;
27+
if (!(item.getItemMeta() instanceof Repairable)) return;
28+
stat = RepairStat.REPAIRABLE;
29+
if (item.getItemMeta().spigot().isUnbreakable()){
30+
stat = RepairStat.UNREPAIRABLE_UNBREAKABLE;
31+
}
32+
Repairable repairableMeta = (Repairable) item.getItemMeta();
33+
repairLimit = cfg.repairLimit;
34+
if (repairLimit > 0 && repairableMeta.getRepairCost() >= repairLimit) {
35+
stat = RepairStat.UNREPAIRABLE_RLE;
36+
}
37+
38+
Material toolMaterial = item.getType();
39+
repairMaterial = cfg.material;
40+
int currentDurability = item.getDurability();
41+
if (currentDurability <= 0) {
42+
stat = RepairStat.UNREPAIRABLE_REPAIRED;
43+
}
44+
45+
int enchLevel = 0;
46+
for (Integer i : item.getEnchantments().values()) enchLevel += i;
47+
48+
int fullDurability = toolMaterial.getMaxDurability();
49+
durRecovered = (int)Math.floor((double)fullDurability/((double)cfg.fullRepairCost + (double)enchLevel * cfg.enchantCostPerLv));
50+
expConsumption = (int)Math.floor(cfg.expCost + cfg.enchantCostPerLv * enchLevel);
51+
if (durRecovered <= 0) {
52+
stat = RepairStat.UNREPAIRABLE_LOWRECOVER;
53+
}
54+
}
55+
}

src/main/resources/lang/en_US.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,23 @@ user:
164164

165165
repair:
166166
item_added: "Repairable item added"
167+
material_mismatch: "Material mismatch"
168+
no_enough_exp: "Experience not sufficient"
169+
info_1: "Currently holds: "
170+
info_2: "Item type: %s"
171+
info_3: "Item not repairable. Reason: %s"
172+
info_4: "Durability: %d/%d (%.01f%%)"
173+
info_5: "Material required: "
174+
info_6: "Exp consumption: %d (per material)"
175+
info_7: "Durability gain: %d (%.01f%%) (per material)"
176+
info_8: "Repair limit: unlimited"
177+
info_9: "Repair limit: %d/%d"
178+
unrepairable:
179+
UNREPAIRABLE: "Item unrepairable."
180+
UNREPAIRABLE_REPAIRED: "Already fully repaired."
181+
UNREPAIRABLE_UNBREAKABLE: "Item is unbreakable."
182+
UNREPAIRABLE_RLE: "Repair count limit exceeded."
183+
UNREPAIRABLE_LOWRECOVER: "Durability not recoverable."
167184

168185
manual:
169186
no_description: "No description"

0 commit comments

Comments
 (0)