tokens update

This commit is contained in:
hyperdefined
2025-01-25 16:56:03 -05:00
parent ff578e170e
commit 30b26533ef
21 changed files with 1705 additions and 531 deletions

View File

@@ -17,9 +17,15 @@
package lol.hyper.toolstats.tools;
import lol.hyper.toolstats.ToolStats;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
@@ -29,11 +35,16 @@ public class ItemChecker {
private final List<Material> armorItems = new ArrayList<>();
private final List<Material> meleeItems = new ArrayList<>();
private final List<Material> mineItems = new ArrayList<>();
private final ToolStats toolStats;
public ItemChecker(ToolStats toolStats) {
this.toolStats = toolStats;
}
/**
* Creates an item checker and saves all valid items we want.
* Set up the item checker.
*/
public ItemChecker() {
public void setup() {
for (Material material : Material.values()) {
String lowerCase = material.toString().toLowerCase(Locale.ROOT);
if (lowerCase.contains("_pickaxe") || lowerCase.contains("_axe") || lowerCase.contains("_hoe") || lowerCase.contains("_shovel")) {
@@ -52,11 +63,12 @@ public class ItemChecker {
// hardcode these
mineItems.add(Material.SHEARS);
meleeItems.add(Material.TRIDENT);
meleeItems.add(Material.MACE);
validItems.add(Material.BOW);
validItems.add(Material.FISHING_ROD);
validItems.add(Material.CROSSBOW);
validItems.add(Material.FISHING_ROD);
validItems.add(Material.ELYTRA);
validItems.add(Material.MACE);
// combine the lists
validItems.addAll(armorItems);
@@ -103,4 +115,89 @@ public class ItemChecker {
public boolean isMineTool(Material itemType) {
return mineItems.contains(itemType);
}
/**
* Check a given item for a target token.
*
* @param container The PDC of the item.
* @param targetToken The target to look for.
* @return True if the item has a given token, false if not.
*/
public boolean checkTokens(PersistentDataContainer container, String targetToken) {
// make sure the item has tokens
if (!container.has(toolStats.tokenApplied, PersistentDataType.STRING)) {
return false;
}
// get the tokens for this item
String tokens = container.get(toolStats.tokenApplied, PersistentDataType.STRING);
if (tokens == null) {
return false;
}
return tokens.contains(targetToken);
}
/**
* Get the tokens for a given item.
*
* @param item The item.
* @return An array of the tokens, empty if there are none.
*/
private String[] getTokens(ItemStack item) {
// make sure the item has tokens
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return new String[0];
}
PersistentDataContainer container = meta.getPersistentDataContainer();
if (!container.has(toolStats.tokenApplied, PersistentDataType.STRING)) {
return new String[0];
}
// get the tokens for this item
String tokensRaw = container.get(toolStats.tokenApplied, PersistentDataType.STRING);
if (tokensRaw == null) {
return new String[0];
}
return tokensRaw.split(",");
}
/**
* Add a token to an item.
*
* @param item The item.
* @param token The token to add.
* @return The new PDC with the new token. Null if something went wrong.
*/
public ItemStack addToken(ItemStack item, String token) {
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return null;
}
PersistentDataContainer container = meta.getPersistentDataContainer();
String[] tokens = getTokens(item);
// there are no tokens
if (tokens.length == 0) {
container.set(toolStats.tokenApplied, PersistentDataType.STRING, token);
} else {
// other tokens exist, so add
String[] newTokens = Arrays.copyOf(tokens, tokens.length + 1);
newTokens[tokens.length] = token;
container.set(toolStats.tokenApplied, PersistentDataType.STRING, String.join(",", newTokens));
}
item.setItemMeta(meta);
return item;
}
/**
* Get the XP levels required to use token in anvil.
*
* @param tokenType The token type.
* @return The amount of levels to use.
*/
public int getCost(String tokenType) {
return toolStats.config.getInt("tokens.data." + tokenType + ".levels");
}
}