Skip to content

Commit c7cd25e

Browse files
committed
custom model data & massive cleanup
closes #105
1 parent 67d141c commit c7cd25e

File tree

5 files changed

+166
-360
lines changed

5 files changed

+166
-360
lines changed

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import lol.hyper.toolstats.tools.*;
2626
import lol.hyper.toolstats.tools.config.ConfigTools;
2727
import lol.hyper.toolstats.tools.config.ConfigUpdater;
28-
import lol.hyper.toolstats.tools.config.TokenItems;
2928
import org.bstats.bukkit.Metrics;
3029
import org.bukkit.Bukkit;
3130
import org.bukkit.NamespacedKey;
@@ -150,8 +149,7 @@ public final class ToolStats extends JavaPlugin {
150149
public ItemChecker itemChecker;
151150
public ShootBow shootBow;
152151
public ConfigTools configTools;
153-
public TokenItems tokenItems;
154-
public TokenCrafting tokenCrafting;
152+
public TokenData tokenData;
155153
public AnvilEvent anvilEvent;
156154
public PrepareCraft prepareCraft;
157155

@@ -164,10 +162,9 @@ public void onEnable() {
164162

165163
loadConfig();
166164
configTools = new ConfigTools(this);
167-
tokenItems = new TokenItems(this);
168-
tokenCrafting = new TokenCrafting(this);
169-
tokenCrafting.setup();
170-
for (ShapedRecipe recipe : tokenCrafting.getRecipes()) {
165+
tokenData = new TokenData(this);
166+
tokenData.setup();
167+
for (ShapedRecipe recipe : tokenData.getRecipes()) {
171168
if (tokens && config.getBoolean("tokens.craft-tokens")) {
172169
Bukkit.addRecipe(recipe);
173170
}

src/main/java/lol/hyper/toolstats/commands/CommandToolStats.java

Lines changed: 11 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.bukkit.command.TabExecutor;
3131
import org.bukkit.entity.Player;
3232
import org.bukkit.inventory.ItemStack;
33-
import org.bukkit.inventory.PlayerInventory;
3433
import org.bukkit.inventory.ShapedRecipe;
3534
import org.bukkit.inventory.meta.ItemMeta;
3635
import org.bukkit.persistence.PersistentDataContainer;
@@ -64,23 +63,23 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
6463
if (sender.hasPermission("toolstats.reload")) {
6564
boolean oldTokensStatus = toolStats.tokens;
6665
toolStats.loadConfig();
67-
toolStats.tokenCrafting.getRecipes().clear();
68-
toolStats.tokenCrafting.setup();
66+
toolStats.tokenData.getRecipes().clear();
67+
toolStats.tokenData.setup();
6968
// if the server went from tokens off -> on, add the recipes
7069
// if the server went from tokens on -> off, remove the recipes
7170
if (toolStats.tokens != oldTokensStatus) {
7271
// tokens are now enabled
7372
if (toolStats.tokens) {
7473
sender.sendMessage(Component.text("It looks like you ENABLED the token system. While this is fine, it can break. Please restart your server instead.", NamedTextColor.YELLOW));
7574
if (toolStats.config.getBoolean("tokens.craft-token")) {
76-
for (ShapedRecipe recipe : toolStats.tokenCrafting.getRecipes()) {
75+
for (ShapedRecipe recipe : toolStats.tokenData.getRecipes()) {
7776
Bukkit.addRecipe(recipe);
7877
}
7978
}
8079
} else {
8180
// tokens are now disabled
8281
sender.sendMessage(Component.text("It looks like you DISABLED the token system. While this is fine, it can break. Please restart your server instead.", NamedTextColor.YELLOW));
83-
for (ShapedRecipe recipe : toolStats.tokenCrafting.getRecipes()) {
82+
for (ShapedRecipe recipe : toolStats.tokenData.getRecipes()) {
8483
Bukkit.removeRecipe(recipe.getKey());
8584
}
8685
}
@@ -172,7 +171,7 @@ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command
172171
return true;
173172
}
174173
String tokenType = args[2];
175-
if (!toolStats.tokenCrafting.getTokenTypes().contains(tokenType)) {
174+
if (!toolStats.tokenData.getTokenTypes().contains(tokenType)) {
176175
sender.sendMessage(Component.text("Invalid token type.", NamedTextColor.RED));
177176
return true;
178177
}
@@ -458,80 +457,9 @@ private void fixItemLore(ItemStack original, Player player) {
458457
* @param tokenType The token type.
459458
*/
460459
private void giveToken(Player target, String tokenType, int amount) {
461-
switch (tokenType) {
462-
case "crops-mined": {
463-
ItemStack itemStack = toolStats.tokenItems.cropsMined();
464-
itemStack.setAmount(amount);
465-
target.getInventory().addItem(itemStack);
466-
break;
467-
}
468-
case "blocks-mined": {
469-
ItemStack itemStack = toolStats.tokenItems.blocksMined();
470-
itemStack.setAmount(amount);
471-
target.getInventory().addItem(itemStack);
472-
break;
473-
}
474-
case "damage-taken": {
475-
ItemStack itemStack = toolStats.tokenItems.damageTaken();
476-
itemStack.setAmount(amount);
477-
target.getInventory().addItem(itemStack);
478-
break;
479-
}
480-
case "damage-done": {
481-
ItemStack itemStack = toolStats.tokenItems.damageDone();
482-
itemStack.setAmount(amount);
483-
target.getInventory().addItem(itemStack);
484-
break;
485-
}
486-
case "mob-kills": {
487-
ItemStack itemStack = toolStats.tokenItems.mobKills();
488-
itemStack.setAmount(amount);
489-
target.getInventory().addItem(itemStack);
490-
break;
491-
}
492-
case "player-kills": {
493-
ItemStack itemStack = toolStats.tokenItems.playerKills();
494-
itemStack.setAmount(amount);
495-
target.getInventory().addItem(itemStack);
496-
break;
497-
}
498-
case "arrows-shot": {
499-
ItemStack itemStack = toolStats.tokenItems.arrowsShot();
500-
itemStack.setAmount(amount);
501-
target.getInventory().addItem(itemStack);
502-
break;
503-
}
504-
case "sheep-sheared": {
505-
ItemStack itemStack = toolStats.tokenItems.sheepSheared();
506-
itemStack.setAmount(amount);
507-
target.getInventory().addItem(itemStack);
508-
break;
509-
}
510-
case "flight-time": {
511-
ItemStack itemStack = toolStats.tokenItems.flightTime();
512-
itemStack.setAmount(amount);
513-
target.getInventory().addItem(itemStack);
514-
break;
515-
}
516-
case "fish-caught": {
517-
ItemStack itemStack = toolStats.tokenItems.fishCaught();
518-
itemStack.setAmount(amount);
519-
target.getInventory().addItem(itemStack);
520-
break;
521-
}
522-
case "reset": {
523-
ItemStack itemStack = toolStats.tokenItems.resetToken();
524-
itemStack.setAmount(amount);
525-
target.getInventory().addItem(itemStack);
526-
break;
527-
}
528-
case "remove": {
529-
ItemStack itemStack = toolStats.tokenItems.removeToken();
530-
itemStack.setAmount(amount);
531-
target.getInventory().addItem(itemStack);
532-
break;
533-
}
534-
}
460+
ItemStack token = toolStats.tokenData.createToken(tokenType);
461+
token.setAmount(amount);
462+
target.getInventory().addItem(token);
535463
}
536464

537465
/**
@@ -1154,20 +1082,20 @@ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Comman
11541082
}
11551083
if (args.length == 2 && args[0].equalsIgnoreCase("edit") && sender.hasPermission("toolstats.edit")) {
11561084
// yes I am lazy
1157-
return toolStats.tokenCrafting.getTokenTypes().stream()
1085+
return toolStats.tokenData.getTokenTypes().stream()
11581086
.filter(s -> !s.equals("remove") && !s.equals("reset"))
11591087
.map(s -> s.equals("crops-mined") ? "crops-harvested" : s)
11601088
.collect(Collectors.toList());
11611089
}
11621090
if (args.length == 2 && args[0].equalsIgnoreCase("remove") && sender.hasPermission("toolstats.remove")) {
11631091
// yes I am lazy
1164-
return toolStats.tokenCrafting.getTokenTypes().stream()
1092+
return toolStats.tokenData.getTokenTypes().stream()
11651093
.filter(s -> !s.equals("remove") && !s.equals("reset"))
11661094
.map(s -> s.equals("crops-mined") ? "crops-harvested" : s)
11671095
.collect(Collectors.toList());
11681096
}
11691097
if (args.length == 3 && args[0].equalsIgnoreCase("givetokens") && sender.hasPermission("toolstats.givetokens")) {
1170-
return toolStats.tokenCrafting.getTokenTypes();
1098+
return toolStats.tokenData.getTokenTypes();
11711099
}
11721100

11731101
return null;

src/main/java/lol/hyper/toolstats/tools/TokenCrafting.java renamed to src/main/java/lol/hyper/toolstats/tools/TokenData.java

Lines changed: 103 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,104 +17,111 @@
1717

1818
package lol.hyper.toolstats.tools;
1919

20+
import io.papermc.paper.datacomponent.DataComponentTypes;
21+
import io.papermc.paper.datacomponent.item.CustomModelData;
2022
import lol.hyper.toolstats.ToolStats;
23+
import net.kyori.adventure.text.Component;
2124
import org.bukkit.Material;
2225
import org.bukkit.NamespacedKey;
26+
import org.bukkit.configuration.ConfigurationSection;
27+
import org.bukkit.inventory.ItemStack;
2328
import org.bukkit.inventory.ShapedRecipe;
29+
import org.bukkit.inventory.meta.ItemMeta;
30+
import org.bukkit.inventory.meta.components.CustomModelDataComponent;
31+
import org.bukkit.persistence.PersistentDataContainer;
32+
import org.bukkit.persistence.PersistentDataType;
2433

25-
import java.util.ArrayList;
26-
import java.util.HashSet;
27-
import java.util.Set;
34+
import java.util.*;
2835

29-
public class TokenCrafting {
36+
public class TokenData {
3037

3138
private final ToolStats toolStats;
3239
private final Set<ShapedRecipe> recipes = new HashSet<>();
3340
private final ArrayList<String> tokenTypes = new ArrayList<>();
3441

35-
public TokenCrafting(ToolStats toolStats) {
42+
public TokenData(ToolStats toolStats) {
3643
this.toolStats = toolStats;
3744
}
3845

3946
public void setup() {
4047
NamespacedKey playerKillsKey = new NamespacedKey(toolStats, "player-kills-token");
41-
ShapedRecipe playerKillRecipe = new ShapedRecipe(playerKillsKey, toolStats.tokenItems.playerKills());
48+
ShapedRecipe playerKillRecipe = new ShapedRecipe(playerKillsKey, createToken("player-kills"));
4249
playerKillRecipe.shape(" P ", "PSP", " P ");
4350
playerKillRecipe.setIngredient('P', Material.PAPER);
4451
playerKillRecipe.setIngredient('S', Material.WOODEN_SWORD);
4552
recipes.add(playerKillRecipe);
4653

4754
NamespacedKey mobKillsKey = new NamespacedKey(toolStats, "mob-kills-token");
48-
ShapedRecipe mobKillsRecipe = new ShapedRecipe(mobKillsKey, toolStats.tokenItems.mobKills());
55+
ShapedRecipe mobKillsRecipe = new ShapedRecipe(mobKillsKey, createToken("mob-kills"));
4956
mobKillsRecipe.shape(" P ", "PRP", " P ");
5057
mobKillsRecipe.setIngredient('P', Material.PAPER);
5158
mobKillsRecipe.setIngredient('R', Material.ROTTEN_FLESH);
5259
recipes.add(mobKillsRecipe);
5360

5461
NamespacedKey blocksMinedKey = new NamespacedKey(toolStats, "blocks-mined-token");
55-
ShapedRecipe blocksMinedRecipe = new ShapedRecipe(blocksMinedKey, toolStats.tokenItems.blocksMined());
62+
ShapedRecipe blocksMinedRecipe = new ShapedRecipe(blocksMinedKey, createToken("blocks-mined"));
5663
blocksMinedRecipe.shape(" P ", "PSP", " P ");
5764
blocksMinedRecipe.setIngredient('P', Material.PAPER);
5865
blocksMinedRecipe.setIngredient('S', Material.WOODEN_PICKAXE);
5966
recipes.add(blocksMinedRecipe);
6067

6168
NamespacedKey cropsMinedKey = new NamespacedKey(toolStats, "crops-mined-token");
62-
ShapedRecipe cropsMinedRecipe = new ShapedRecipe(cropsMinedKey, toolStats.tokenItems.cropsMined());
69+
ShapedRecipe cropsMinedRecipe = new ShapedRecipe(cropsMinedKey, createToken("crops-mined"));
6370
cropsMinedRecipe.shape(" P ", "PHP", " P ");
6471
cropsMinedRecipe.setIngredient('P', Material.PAPER);
6572
cropsMinedRecipe.setIngredient('H', Material.WOODEN_HOE);
6673
recipes.add(cropsMinedRecipe);
6774

6875
NamespacedKey fishCaughtKey = new NamespacedKey(toolStats, "fish-caught-token");
69-
ShapedRecipe fishCaughtRecipe = new ShapedRecipe(fishCaughtKey, toolStats.tokenItems.fishCaught());
76+
ShapedRecipe fishCaughtRecipe = new ShapedRecipe(fishCaughtKey, createToken("fish-caught"));
7077
fishCaughtRecipe.shape(" P ", "PCP", " P ");
7178
fishCaughtRecipe.setIngredient('P', Material.PAPER);
7279
fishCaughtRecipe.setIngredient('C', Material.COD);
7380
recipes.add(fishCaughtRecipe);
7481

7582
NamespacedKey sheepShearedKey = new NamespacedKey(toolStats, "sheep-sheared-token");
76-
ShapedRecipe sheepShearedRecipe = new ShapedRecipe(sheepShearedKey, toolStats.tokenItems.sheepSheared());
83+
ShapedRecipe sheepShearedRecipe = new ShapedRecipe(sheepShearedKey, createToken("sheep-sheared"));
7784
sheepShearedRecipe.shape(" P ", "PWP", " P ");
7885
sheepShearedRecipe.setIngredient('P', Material.PAPER);
7986
sheepShearedRecipe.setIngredient('W', Material.WHITE_WOOL);
8087
recipes.add(sheepShearedRecipe);
8188

8289
NamespacedKey armorDamageKey = new NamespacedKey(toolStats, "damage-taken-token");
83-
ShapedRecipe armorDamageRecipe = new ShapedRecipe(armorDamageKey, toolStats.tokenItems.damageTaken());
90+
ShapedRecipe armorDamageRecipe = new ShapedRecipe(armorDamageKey, createToken("damage-taken"));
8491
armorDamageRecipe.shape(" P ", "PCP", " P ");
8592
armorDamageRecipe.setIngredient('P', Material.PAPER);
8693
armorDamageRecipe.setIngredient('C', Material.LEATHER_CHESTPLATE);
8794
recipes.add(armorDamageRecipe);
8895

8996
NamespacedKey damageDoneKey = new NamespacedKey(toolStats, "damage-done-token");
90-
ShapedRecipe damageDoneRecipe = new ShapedRecipe(damageDoneKey, toolStats.tokenItems.damageDone());
97+
ShapedRecipe damageDoneRecipe = new ShapedRecipe(damageDoneKey, createToken("damage-done"));
9198
damageDoneRecipe.shape(" P ", "PSP", " P ");
9299
damageDoneRecipe.setIngredient('P', Material.PAPER);
93100
damageDoneRecipe.setIngredient('S', Material.SHIELD);
94101
recipes.add(damageDoneRecipe);
95102

96103
NamespacedKey arrowsShotKey = new NamespacedKey(toolStats, "arrows-shot-token");
97-
ShapedRecipe arrowsShotRecipe = new ShapedRecipe(arrowsShotKey, toolStats.tokenItems.arrowsShot());
104+
ShapedRecipe arrowsShotRecipe = new ShapedRecipe(arrowsShotKey, createToken("arrows-shot"));
98105
arrowsShotRecipe.shape(" P ", "PAP", " P ");
99106
arrowsShotRecipe.setIngredient('P', Material.PAPER);
100107
arrowsShotRecipe.setIngredient('A', Material.ARROW);
101108
recipes.add(arrowsShotRecipe);
102109

103110
NamespacedKey flightTimeKey = new NamespacedKey(toolStats, "flight-time-token");
104-
ShapedRecipe flightTimeRecipe = new ShapedRecipe(flightTimeKey, toolStats.tokenItems.flightTime());
111+
ShapedRecipe flightTimeRecipe = new ShapedRecipe(flightTimeKey, createToken("flight-time"));
105112
flightTimeRecipe.shape(" P ", "PFP", " P ");
106113
flightTimeRecipe.setIngredient('P', Material.PAPER);
107114
flightTimeRecipe.setIngredient('F', Material.FEATHER);
108115
recipes.add(flightTimeRecipe);
109116

110117
NamespacedKey resetKey = new NamespacedKey(toolStats, "reset-token");
111-
ShapedRecipe resetRecipe = new ShapedRecipe(resetKey, toolStats.tokenItems.resetToken());
118+
ShapedRecipe resetRecipe = new ShapedRecipe(resetKey, createToken("reset"));
112119
resetRecipe.shape(" P ", "PPP", " P ");
113120
resetRecipe.setIngredient('P', Material.PAPER);
114121
recipes.add(resetRecipe);
115122

116123
NamespacedKey removeKey = new NamespacedKey(toolStats, "remove-token");
117-
ShapedRecipe removeRecipe = new ShapedRecipe(removeKey, toolStats.tokenItems.removeToken());
124+
ShapedRecipe removeRecipe = new ShapedRecipe(removeKey, createToken("remove"));
118125
removeRecipe.shape(" P ", "P P", " P ");
119126
removeRecipe.setIngredient('P', Material.PAPER);
120127
recipes.add(removeRecipe);
@@ -140,4 +147,83 @@ public Set<ShapedRecipe> getRecipes() {
140147
public ArrayList<String> getTokenTypes() {
141148
return tokenTypes;
142149
}
150+
151+
public ItemStack createToken(String tokenType) {
152+
// we don't have to check if the token exists
153+
// we do that prior
154+
ConfigurationSection tokenConfig = toolStats.config.getConfigurationSection("tokens.data." + tokenType);
155+
156+
String materialFromConfig = tokenConfig.getString("material");
157+
if (materialFromConfig == null) {
158+
toolStats.logger.warning("Could not find material config for token " + tokenType);
159+
return null;
160+
}
161+
Material material = Material.getMaterial(materialFromConfig);
162+
if (material == null) {
163+
toolStats.logger.warning("Material " + materialFromConfig + " is not a valid Minecraft material.");
164+
return null;
165+
}
166+
167+
ItemStack token = new ItemStack(material);
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." + tokenType + ".title");
173+
List<Component> lore = toolStats.configTools.getTokenLore(tokenType);
174+
tokenMeta.displayName(title);
175+
tokenMeta.lore(lore);
176+
177+
// set the custom model data
178+
if (tokenConfig.getBoolean("custom-model-data.enabled")) {
179+
String type = tokenConfig.getString("custom-model-data.type");
180+
Object value = tokenConfig.get("custom-model-data.value");
181+
if (type == null || value == null) {
182+
toolStats.logger.info("Could not find custom model data for token " + tokenType);
183+
toolStats.logger.info("Type: " + type);
184+
toolStats.logger.info("Value: " + value);
185+
return null;
186+
}
187+
CustomModelData data = setData(type, value);
188+
if (data != null) {
189+
token.setData(DataComponentTypes.CUSTOM_MODEL_DATA, data);
190+
} else {
191+
return null;
192+
}
193+
}
194+
195+
// set the PDC
196+
tokenData.set(toolStats.tokenType, PersistentDataType.STRING, tokenType);
197+
token.setItemMeta(tokenMeta);
198+
return token;
199+
}
200+
201+
private CustomModelData setData(String type, Object data) {
202+
switch (type.toLowerCase(Locale.ROOT)) {
203+
case "float": {
204+
Float f;
205+
if (data instanceof Float) {
206+
f = (Float) data;
207+
} else {
208+
toolStats.logger.info(type + " is not a valid float!");
209+
return null;
210+
}
211+
return CustomModelData.customModelData().addFloat(f).build();
212+
}
213+
case "string": {
214+
String s;
215+
if (data instanceof String) {
216+
s = (String) data;
217+
} else {
218+
toolStats.logger.info(type + " is not a valid string!");
219+
return null;
220+
}
221+
return CustomModelData.customModelData().addString(s).build();
222+
}
223+
default: {
224+
toolStats.logger.info(type + " is not a valid data type!");
225+
return null;
226+
}
227+
}
228+
}
143229
}

0 commit comments

Comments
 (0)