Skip to content

Commit d0199a8

Browse files
committed
added damage done system
1 parent e37048f commit d0199a8

File tree

10 files changed

+450
-118
lines changed

10 files changed

+450
-118
lines changed

src/main/java/lol/hyper/toolstats/ToolStats.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ public final class ToolStats extends JavaPlugin {
7777
* Stores how much damage an armor piece has taken.
7878
*/
7979
public final NamespacedKey armorDamage = new NamespacedKey(this, "damage-taken");
80+
/**
81+
* Stores how much damage a weapon has done.
82+
*/
83+
public final NamespacedKey damageDone = new NamespacedKey(this, "damage-done");
8084
/**
8185
* Key for tracking new elytras that spawn.
8286
*/
@@ -113,7 +117,7 @@ public final class ToolStats extends JavaPlugin {
113117
*/
114118
public final NamespacedKey originType = new NamespacedKey(this, "origin");
115119

116-
public final int CONFIG_VERSION = 10;
120+
public final int CONFIG_VERSION = 11;
117121
public final Logger logger = this.getLogger();
118122
public final File configFile = new File(this.getDataFolder(), "config.yml");
119123
public boolean tokens = false;

src/main/java/lol/hyper/toolstats/events/AnvilEvent.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ public void onAnvilEvent(PrepareAnvilEvent event) {
133133
addToken(event, tokenType, "mob-kills", clone);
134134
return;
135135
}
136+
if (tokenType.equalsIgnoreCase("damage-done")) {
137+
addToken(event, tokenType, "damage-done", clone);
138+
return;
139+
}
136140
return;
137141
}
138142
if (firstSlotMaterial == Material.BOW || firstSlotMaterial == Material.CROSSBOW) {
@@ -148,6 +152,10 @@ public void onAnvilEvent(PrepareAnvilEvent event) {
148152
addToken(event, tokenType, "arrows-shot", clone);
149153
return;
150154
}
155+
if (tokenType.equalsIgnoreCase("damage-done")) {
156+
addToken(event, tokenType, "damage-done", clone);
157+
return;
158+
}
151159
return;
152160
}
153161
if (firstSlotMaterial == Material.ELYTRA) {
@@ -203,7 +211,16 @@ private void addToken(PrepareAnvilEvent event, String attemptToken, String targe
203211
}
204212
case "damage-taken": {
205213
if (toolStats.config.getBoolean("enabled.armor-damage")) {
206-
newItem.setItemMeta(toolStats.itemLore.updateDamage(newItem, 0.0, false));
214+
newItem.setItemMeta(toolStats.itemLore.updateArmorDamage(newItem, 0.0, false));
215+
} else {
216+
event.setResult(null);
217+
return;
218+
}
219+
break;
220+
}
221+
case "damage-done": {
222+
if (toolStats.configTools.checkConfig(newItem.getType(), "damage-done")) {
223+
newItem.setItemMeta(toolStats.itemLore.updateWeaponDamage(newItem, 0.0, false));
207224
} else {
208225
event.setResult(null);
209226
return;
@@ -338,7 +355,15 @@ private void reset(PrepareAnvilEvent event, ItemStack inputItem) {
338355
if (armorDamage == null) {
339356
return;
340357
}
341-
meta = toolStats.itemLore.updateDamage(finalItem, -armorDamage, true);
358+
meta = toolStats.itemLore.updateArmorDamage(finalItem, -armorDamage, true);
359+
finalItem.setItemMeta(meta);
360+
}
361+
if (container.has(toolStats.damageDone)) {
362+
Double damageDone = container.get(toolStats.damageDone, PersistentDataType.DOUBLE);
363+
if (damageDone == null) {
364+
return;
365+
}
366+
meta = toolStats.itemLore.updateArmorDamage(finalItem, -damageDone, true);
342367
finalItem.setItemMeta(meta);
343368
}
344369
if (container.has(toolStats.arrowsShot)) {

src/main/java/lol/hyper/toolstats/events/EntityDamage.java

Lines changed: 176 additions & 113 deletions
Large diffs are not rendered by default.

src/main/java/lol/hyper/toolstats/tools/ItemChecker.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,9 @@ public String addTokensToExisting(ItemStack item) {
333333
if (container.has(toolStats.flightTime)) {
334334
tokens.add("flight-time");
335335
}
336+
if (container.has(toolStats.damageDone)) {
337+
tokens.add("damage-done");
338+
}
336339
if (tokens.isEmpty()) {
337340
return null;
338341
}

src/main/java/lol/hyper/toolstats/tools/ItemLore.java

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ public ItemMeta updateMobKills(ItemStack playerWeapon, int add) {
567567
* @param damage The amount of damage to apply.
568568
* @param bypass Bypass the negative damage check.
569569
*/
570-
public ItemMeta updateDamage(ItemStack armorPiece, double damage, boolean bypass) {
570+
public ItemMeta updateArmorDamage(ItemStack armorPiece, double damage, boolean bypass) {
571571
// ignore if the damage is zero or negative
572572
if (damage < 0) {
573573
if (!bypass) {
@@ -651,6 +651,97 @@ public ItemMeta updateDamage(ItemStack armorPiece, double damage, boolean bypass
651651
return meta;
652652
}
653653

654+
/**
655+
* Add damage to a weapon.
656+
*
657+
* @param weapon The weapon to update.
658+
* @param damage The amount of damage to apply.
659+
* @param bypass Bypass the negative damage check.
660+
*/
661+
public ItemMeta updateWeaponDamage(ItemStack weapon, double damage, boolean bypass) {
662+
// ignore if the damage is zero or negative
663+
if (damage < 0) {
664+
if (!bypass) {
665+
return null;
666+
}
667+
}
668+
ItemStack clone = weapon.clone();
669+
ItemMeta meta = clone.getItemMeta();
670+
if (meta == null) {
671+
toolStats.logger.warning(clone + " does NOT have any meta! Unable to update stats.");
672+
return null;
673+
}
674+
675+
PersistentDataContainer container = meta.getPersistentDataContainer();
676+
677+
// if it's disabled, don't update the stats
678+
// check to see if the item has the stats, remove them if it does
679+
if (!toolStats.configTools.checkConfig(clone.getType(), "damage-done")) {
680+
if (container.has(toolStats.damageDone)) {
681+
Double damageDone = container.get(toolStats.damageDone, PersistentDataType.DOUBLE);
682+
if (damageDone == null) {
683+
return null;
684+
}
685+
container.remove(toolStats.damageDone);
686+
if (meta.hasLore()) {
687+
String oldDamageDoneFormatted = toolStats.numberFormat.formatDouble(damageDone);
688+
Component lineToRemove = toolStats.configTools.formatLore("damage-done", "{damage}", oldDamageDoneFormatted);
689+
List<Component> newLore = removeLore(meta.lore(), lineToRemove);
690+
meta.lore(newLore);
691+
}
692+
return meta;
693+
}
694+
return null;
695+
}
696+
697+
// check for tokens
698+
boolean validToken = toolStats.itemChecker.checkTokens(container, "damage-done");
699+
// check for tokens
700+
if (toolStats.config.getBoolean("tokens.enabled")) {
701+
// if the item has stats but no token, add the token
702+
if (container.has(toolStats.damageDone) && !validToken) {
703+
String newTokens = toolStats.itemChecker.addTokensToExisting(clone);
704+
if (newTokens != null) {
705+
container.set(toolStats.tokenApplied, PersistentDataType.STRING, newTokens);
706+
}
707+
}
708+
709+
// the item does not have a valid token
710+
if (!validToken) {
711+
return null;
712+
}
713+
} else {
714+
if (!validToken) {
715+
String newTokens = toolStats.itemChecker.addTokensToExisting(clone);
716+
if (newTokens != null) {
717+
container.set(toolStats.tokenApplied, PersistentDataType.STRING, newTokens);
718+
}
719+
}
720+
}
721+
722+
Double damageDone = 0.0;
723+
if (container.has(toolStats.damageDone, PersistentDataType.DOUBLE)) {
724+
damageDone = container.get(toolStats.damageDone, PersistentDataType.DOUBLE);
725+
}
726+
727+
if (damageDone == null) {
728+
damageDone = 0.0;
729+
toolStats.logger.warning(clone + " does not have valid damage-done set! Resting to zero. This should NEVER happen.");
730+
}
731+
732+
container.set(toolStats.damageDone, PersistentDataType.DOUBLE, damageDone + damage);
733+
String oldDamageFormatted = toolStats.numberFormat.formatDouble(damageDone);
734+
String newDamageFormatted = toolStats.numberFormat.formatDouble(damageDone + damage);
735+
Component oldLine = toolStats.configTools.formatLore("damage-done", "{damage}", oldDamageFormatted);
736+
Component newLine = toolStats.configTools.formatLore("damage-done", "{damage}", newDamageFormatted);
737+
if (oldLine == null || newLine == null) {
738+
return null;
739+
}
740+
List<Component> newLore = toolStats.itemLore.updateItemLore(meta, oldLine, newLine);
741+
meta.lore(newLore);
742+
return meta;
743+
}
744+
654745
/**
655746
* Add flight time to an elytra.
656747
*

src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ public void setup() {
8686
armorDamageRecipe.setIngredient('C', Material.LEATHER_CHESTPLATE);
8787
recipes.add(armorDamageRecipe);
8888

89+
NamespacedKey damageDoneKey = new NamespacedKey(toolStats, "damage-done-token");
90+
ShapedRecipe damageDoneRecipe = new ShapedRecipe(damageDoneKey, toolStats.tokenItems.damageDone());
91+
damageDoneRecipe.shape(" P ", "PSP", " P ");
92+
damageDoneRecipe.setIngredient('P', Material.PAPER);
93+
damageDoneRecipe.setIngredient('S', Material.SHIELD);
94+
recipes.add(damageDoneRecipe);
95+
8996
NamespacedKey arrowsShotKey = new NamespacedKey(toolStats, "arrows-shot-token");
9097
ShapedRecipe arrowsShotRecipe = new ShapedRecipe(arrowsShotKey, toolStats.tokenItems.arrowsShot());
9198
arrowsShotRecipe.shape(" P ", "PAP", " P ");

src/main/java/lol/hyper/toolstats/tools/config/ConfigUpdater.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,10 @@ public void updateConfig() {
5656
Version10 version10 = new Version10(toolStats);
5757
version10.update();
5858
}
59+
// Version 10 to 11
60+
if (version == 10) {
61+
Version11 version11 = new Version11(toolStats);
62+
version11.update();
63+
}
5964
}
6065
}

src/main/java/lol/hyper/toolstats/tools/config/TokenItems.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,24 @@ public ItemStack damageTaken() {
162162
return token;
163163
}
164164

165+
public ItemStack damageDone() {
166+
// set up the item
167+
ItemStack token = new ItemStack(Material.PAPER);
168+
ItemMeta tokenMeta = token.getItemMeta();
169+
PersistentDataContainer tokenData = tokenMeta.getPersistentDataContainer();
170+
171+
// set the title and lore
172+
Component title = toolStats.configTools.format("tokens.data.damage-done.title");
173+
List<Component> lore = toolStats.configTools.getTokenLore("damage-done");
174+
tokenMeta.displayName(title);
175+
tokenMeta.lore(lore);
176+
177+
// set the PDC
178+
tokenData.set(toolStats.tokenType, PersistentDataType.STRING, "damage-done");
179+
token.setItemMeta(tokenMeta);
180+
return token;
181+
}
182+
165183
public ItemStack arrowsShot() {
166184
// set up the item
167185
ItemStack token = new ItemStack(Material.PAPER);
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/*
2+
* This file is part of ToolStats.
3+
*
4+
* ToolStats is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* ToolStats is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with ToolStats. If not, see <https://www.gnu.org/licenses/>.
16+
*/
17+
18+
package lol.hyper.toolstats.tools.config.versions;
19+
20+
import lol.hyper.toolstats.ToolStats;
21+
22+
import java.io.File;
23+
import java.io.IOException;
24+
import java.util.ArrayList;
25+
import java.util.List;
26+
27+
public class Version11 {
28+
29+
private final ToolStats toolStats;
30+
31+
/**
32+
* Used for updating from version 10 to 11.
33+
*
34+
* @param toolStats ToolStats instance.
35+
*/
36+
public Version11(ToolStats toolStats) {
37+
this.toolStats = toolStats;
38+
}
39+
40+
/**
41+
* Perform the config update.
42+
*/
43+
public void update() {
44+
// save the old config first
45+
try {
46+
toolStats.config.save("plugins" + File.separator + "ToolStats" + File.separator + "config-10.yml");
47+
} catch (IOException exception) {
48+
toolStats.logger.severe("Unable to save config-10.yml!");
49+
throw new RuntimeException(exception);
50+
}
51+
52+
// we make this super verbose so that admins can see what's being added
53+
toolStats.logger.info("Updating config.yml to version 11.");
54+
toolStats.config.set("config-version", 11);
55+
56+
// add new tokens
57+
toolStats.logger.info("Adding tokens.data.damage-done.title to config.yml.");
58+
toolStats.config.set("tokens.data.damage-done.title", "&7ToolStats: &8Damage Done Token");
59+
List<String> damageDoneLore = new ArrayList<>();
60+
damageDoneLore.add("&8Combine with a melee or ranged weapon in an anvil to track damage done.");
61+
toolStats.config.set("tokens.data.damage-done.lore", damageDoneLore);
62+
toolStats.logger.info("Adding tokens.data.damage-done.lore to config.yml.");
63+
toolStats.config.set("tokens.data.damage-done.levels", 1);
64+
toolStats.logger.info("Adding tokens.data.damage-done.levels to config.yml.");
65+
66+
toolStats.logger.info("Adding tokens.data.remove.title to config.yml.");
67+
toolStats.config.set("tokens.data.remove.title", "&7ToolStats: &8Remove Token");
68+
List<String> removeLore = new ArrayList<>();
69+
removeLore.add("&8Combine in an anvil with to REMOVE ALL stats and tokens for this item.");
70+
toolStats.config.set("tokens.data.remove.lore", removeLore);
71+
toolStats.logger.info("Adding tokens.data.remove.lore to config.yml.");
72+
toolStats.config.set("tokens.data.remove.levels", 1);
73+
toolStats.logger.info("Adding tokens.data.remove.levels to config.yml.");
74+
75+
toolStats.logger.info("Adding messages.damage-done to config.yml.");
76+
toolStats.config.set("messages.damage-done", "&7Damage done: &8{damage}");
77+
78+
toolStats.config.set("enabled.damage-done.sword", true);
79+
toolStats.config.set("enabled.damage-done.axe", true);
80+
toolStats.config.set("enabled.damage-done.trident", true);
81+
toolStats.config.set("enabled.damage-done.bow", true);
82+
toolStats.config.set("enabled.damage-done.mace", true);
83+
toolStats.logger.info("Adding enabled.damage-done.sword to config.yml");
84+
toolStats.logger.info("Adding enabled.damage-done.axe to config.yml");
85+
toolStats.logger.info("Adding enabled.damage-done.trident to config.yml");
86+
toolStats.logger.info("Adding enabled.damage-done.bow to config.yml");
87+
toolStats.logger.info("Adding enabled.damage-done.mace to config.yml");
88+
89+
// save the config and reload it
90+
try {
91+
toolStats.config.save("plugins" + File.separator + "ToolStats" + File.separator + "config.yml");
92+
} catch (IOException exception) {
93+
toolStats.logger.severe("Unable to save config.yml!");
94+
throw new RuntimeException(exception);
95+
}
96+
toolStats.loadConfig();
97+
toolStats.logger.info("Config has been updated to version 11. A copy of version 10 has been saved as config-10.yml");
98+
}
99+
}

src/main/resources/config.yml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ tokens:
3939
lore:
4040
- "&8Combine with an armor piece in an anvil to track damage taken."
4141
levels: 1
42+
damage-done:
43+
title: "&7ToolStats: &8Damage Done Token"
44+
lore:
45+
- "&8Combine with a melee or ranged weapon in an anvil to track damage done."
46+
levels: 1
4247
arrows-shot:
4348
title: "&7ToolStats: &8Arrows Shot Token"
4449
lore:
@@ -54,6 +59,11 @@ tokens:
5459
lore:
5560
- "&8Combine in an anvil with to reset ALL stats for this item. Tokens on this item stay."
5661
levels: 1
62+
remove:
63+
title: "&7ToolStats: &8Remove Token"
64+
lore:
65+
- "&8Combine in an anvil with to REMOVE ALL stats and tokens for this item."
66+
levels: 1
5767

5868
enabled:
5969
# Will show ownership of items when they are created/found.
@@ -113,6 +123,12 @@ enabled:
113123
bow: true
114124
armor: true
115125
fishing-rod: true
126+
damage-done:
127+
sword: true
128+
axe: true
129+
trident: true
130+
bow: true
131+
mace: true
116132
player-kills:
117133
sword: true
118134
axe: true
@@ -181,6 +197,7 @@ messages:
181197
damage-taken: "&7Damage taken: &8{damage}"
182198
arrows-shot: "&7Arrows shot: &8{arrows}"
183199
flight-time: "&7Flight time: &8{time}"
200+
damage-done: "&7Damage done: &8{damage}"
184201
# Set display name for mobs. See: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/EntityType.html
185202
mobs:
186203
ZOMBIE: "Zombie"
@@ -203,4 +220,4 @@ number-formats:
203220
# This has no use currently, but can be used for future features for dupe detection.
204221
generate-hash-for-items: false
205222

206-
config-version: 10
223+
config-version: 11

0 commit comments

Comments
 (0)