aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2024-07-13 07:45:39 +0200
committerKrakenied <46192742+Krakenied@users.noreply.github.com>2024-08-28 11:37:11 +0200
commitef0a494153ec26dfa79d1ad5bb44a1df40b081dc (patch)
tree967e3db0d668958b7fc3a651ea6e2051ad11b36b /bukkit/src/main/java
parent0f1de957ccff2a5eeedef83a3eeec17fd9f56bfb (diff)
Fix HIDE_ATTRIBUTES for 1.20.5+
Change invalidItemStack to screaming snake case
Diffstat (limited to 'bukkit/src/main/java')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java7
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java7
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java12
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java14
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java301
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java14
6 files changed, 333 insertions, 22 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
index 2496ee85..6cf2c8cf 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -19,6 +19,7 @@ import com.leonardobishop.quests.bukkit.hook.essentials.EssentialsHook;
import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter;
import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter13;
import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter14;
+import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter20;
import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter8;
import com.leonardobishop.quests.bukkit.hook.papi.AbstractPlaceholderAPIHook;
import com.leonardobishop.quests.bukkit.hook.papi.PlaceholderAPIHook;
@@ -808,6 +809,12 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
}
private void setItemGetter() {
+ // Spigot 1.20.5+
+ if (CompatUtils.classWithMethodExists("org.bukkit.inventory.meta.ItemMeta", "setEnchantmentGlintOverride", Boolean.class)) {
+ itemGetter = new ItemGetter20(this);
+ return;
+ }
+
// Spigot 1.14+
if (CompatUtils.classWithMethodExists("org.bukkit.inventory.meta.ItemMeta", "setCustomModelData", Integer.class)) {
itemGetter = new ItemGetter14(this);
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java
index 999a1461..f79b916b 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java
@@ -7,7 +7,8 @@ import org.bukkit.inventory.ItemStack;
public abstract class ItemGetter {
- protected static final ItemStack invalidItemStack = new ItemStack(Material.STONE, 1);
+ protected static final ItemStack INVALID_ITEM_STACK = new ItemStack(Material.STONE, 1);
+
protected final BukkitQuestsPlugin plugin;
public ItemGetter(BukkitQuestsPlugin plugin) {
@@ -50,6 +51,8 @@ public abstract class ItemGetter {
ITEM_FLAGS,
UNBREAKABLE,
ATTRIBUTE_MODIFIER,
- CUSTOM_MODEL_DATA
+ CUSTOM_MODEL_DATA,
+ ENCHANTMENT_GLINT_OVERRIDE,
+ HIDE_TOOLTIP
}
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java
index b72894fa..18ec5656 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java
@@ -15,9 +15,9 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.UUID;
/**
@@ -29,7 +29,7 @@ import java.util.UUID;
* <li>enchantments (<b>with</b> namespace support)</li>
* <li>item flags</li>
* <li>unbreakability (<b>with</b> CraftBukkit support)</li>
- * <li>attribute modifiers</li>
+ * <li>attribute modifiers (<b>without</b> namespace support)</li>
* </ul>
* Requires at least API version 1.13.
*/
@@ -44,10 +44,10 @@ public class ItemGetter13 extends ItemGetter {
public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) {
config = config.getConfigurationSection(path);
if (config == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
- List<Filter> filters = Arrays.asList(excludes);
+ Set<Filter> filters = Set.of(excludes);
// type (without data)
String typeString = config.getString("item", config.getString("type"));
@@ -226,12 +226,12 @@ public class ItemGetter13 extends ItemGetter {
@Override
public ItemStack getItemStack(String typeString) {
if (typeString == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
Material type = Material.getMaterial(typeString);
if (type == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
return new ItemStack(type, 1);
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java
index c90ca99c..5ed190ba 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java
@@ -16,9 +16,9 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta;
-import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.UUID;
/**
@@ -30,7 +30,7 @@ import java.util.UUID;
* <li>enchantments (<b>with</b> namespace support)</li>
* <li>item flags</li>
* <li>unbreakability (<b>with</b> CraftBukkit support)</li>
- * <li>attribute modifiers</li>
+ * <li>attribute modifiers (<b>without</b> namespace support)</li>
* <li>custom model data</li>
* </ul>
* Requires at least API version 1.14.
@@ -46,10 +46,10 @@ public class ItemGetter14 extends ItemGetter {
public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) {
config = config.getConfigurationSection(path);
if (config == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
- List<Filter> filters = Arrays.asList(excludes);
+ Set<Filter> filters = Set.of(excludes);
// type (without data)
String typeString = config.getString("item", config.getString("type"));
@@ -234,7 +234,7 @@ public class ItemGetter14 extends ItemGetter {
@Override
public ItemStack getItemStack(String typeString) {
if (typeString == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
Material type = Material.getMaterial(typeString);
@@ -244,7 +244,7 @@ public class ItemGetter14 extends ItemGetter {
NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString);
if (typeKey == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
type = Registry.MATERIAL.get(typeKey);
@@ -252,7 +252,7 @@ public class ItemGetter14 extends ItemGetter {
return new ItemStack(type, 1);
}
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
@Override
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java
new file mode 100644
index 00000000..cca3e903
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java
@@ -0,0 +1,301 @@
+package com.leonardobishop.quests.bukkit.hook.itemgetter;
+
+import com.google.common.collect.Multimap;
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.NamespacedKeyUtils;
+import com.leonardobishop.quests.bukkit.util.chat.Chat;
+import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
+import org.bukkit.Registry;
+import org.bukkit.attribute.Attribute;
+import org.bukkit.attribute.AttributeModifier;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.inventory.meta.SkullMeta;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * Reads the following:
+ * <ul>
+ * <li>type (<b>without</b> data support, <b>with</b> namespace support)</li>
+ * <li>name</li>
+ * <li>lore</li>
+ * <li>enchantments (<b>with</b> namespace support)</li>
+ * <li>item flags</li>
+ * <li>unbreakability (<b>with</b> CraftBukkit support)</li>
+ * <li>attribute modifiers</li>
+ * <li>custom model data</li>
+ * <li>attribute modifiers (<b>without</b> namespace support)</li> // TODO: add namespace support
+ * <li>hide tooltip</li>
+ * </ul>
+ * Requires at least API version 1.20.(5).
+ */
+@SuppressWarnings("DuplicatedCode")
+public class ItemGetter20 extends ItemGetter {
+
+ public ItemGetter20(BukkitQuestsPlugin plugin) {
+ super(plugin);
+ }
+
+ @Override
+ public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) {
+ config = config.getConfigurationSection(path);
+ if (config == null) {
+ return INVALID_ITEM_STACK;
+ }
+
+ Set<Filter> filters = Set.of(excludes);
+
+ // type (without data)
+ String typeString = config.getString("item", config.getString("type"));
+ ItemStack item = getItemStack(typeString);
+ ItemMeta meta = item.getItemMeta();
+
+ // skull
+ if (meta instanceof SkullMeta skullMeta) {
+ String ownerName = config.getString("owner-username");
+ String ownerUniqueIdString = config.getString("owner-uuid");
+ String ownerBase64 = config.getString("owner-base64");
+
+ plugin.getSkullGetter().apply(skullMeta, ownerName, ownerUniqueIdString, ownerBase64);
+ }
+
+ // name
+ String nameString = config.getString("name");
+ if (nameString != null && !filters.contains(Filter.DISPLAY_NAME)) {
+ nameString = Chat.legacyColor(nameString);
+
+ meta.setDisplayName(nameString);
+ }
+
+ // lore
+ List<String> loreStrings = config.getStringList("lore");
+ if (!loreStrings.isEmpty() && !filters.contains(Filter.LORE)) {
+ loreStrings = Chat.legacyColor(loreStrings);
+
+ meta.setLore(loreStrings);
+ }
+
+ // enchantments
+ List<String> enchantmentStrings = config.getStringList("enchantments");
+ if (!enchantmentStrings.isEmpty() && !filters.contains(Filter.ENCHANTMENTS)) {
+ for (String enchantmentString : enchantmentStrings) {
+ String[] parts = enchantmentString.split(":");
+ if (parts.length == 0) {
+ continue;
+ }
+
+ boolean namespaced = parts.length >= 2 && parts[0].startsWith("(") && parts[1].endsWith(")");
+
+ Enchantment enchantment;
+ if (namespaced) {
+ String namespacedKeyString = enchantmentString.substring(1, parts[0].length() + parts[1].length());
+ NamespacedKey namespacedKey = NamespacedKeyUtils.fromString(namespacedKeyString);
+ enchantment = Enchantment.getByKey(namespacedKey);
+ } else {
+ enchantment = Enchantment.getByName(parts[0]);
+ }
+
+ if (enchantment == null) {
+ continue;
+ }
+
+ // (namespace:key):level
+ // 0 1 2
+ // SOME_ENUM_NAME:level
+ // 0 1
+ int levelIndex = namespaced ? 2 : 1;
+
+ int level = 1;
+ if (parts.length >= levelIndex + 1) {
+ try {
+ level = Integer.parseUnsignedInt(parts[levelIndex]);
+ } catch (NumberFormatException ignored) {
+ }
+ }
+
+ meta.addEnchant(enchantment, level, true);
+ }
+ }
+
+ // item flags
+ List<String> itemFlagStrings = config.getStringList("itemflags");
+ if (!itemFlagStrings.isEmpty() && !filters.contains(Filter.ITEM_FLAGS)) {
+ // in case some idiot adds a flag twice - not sure about its behaviour
+ boolean modifiersAdded = false;
+
+ for (String itemFlagString : itemFlagStrings) {
+ ItemFlag itemFlag;
+ try {
+ itemFlag = ItemFlag.valueOf(itemFlagString);
+ } catch (IllegalArgumentException e) {
+ continue;
+ }
+
+ if (!modifiersAdded && itemFlag == ItemFlag.HIDE_ATTRIBUTES) {
+ Material type = item.getType();
+
+ for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) {
+ Multimap<Attribute, AttributeModifier> attributeModifiers = type.getDefaultAttributeModifiers(equipmentSlot);
+
+ attributeModifiers.forEach(meta::addAttributeModifier);
+ }
+
+ modifiersAdded = true;
+ }
+
+ meta.addItemFlags(itemFlag);
+ }
+ }
+
+ // unbreakability
+ Boolean unbreakable = (Boolean) config.get("unbreakable");
+ if (unbreakable != null && !filters.contains(Filter.UNBREAKABLE)) {
+ meta.setUnbreakable(unbreakable);
+ }
+
+ // attribute modifiers // TODO: use dedicated 1.20.5 solution
+ List<Map<?, ?>> attributeModifierMaps = config.getMapList("attributemodifiers");
+ if (!attributeModifierMaps.isEmpty() && !filters.contains(Filter.ATTRIBUTE_MODIFIER)) {
+ for (Map<?, ?> attributeModifierMap : attributeModifierMaps) {
+ // attribute
+ String attributeString = (String) attributeModifierMap.get("attribute");
+ Attribute attribute;
+ try {
+ attribute = Attribute.valueOf(attributeString);
+ } catch (IllegalArgumentException e) {
+ continue;
+ }
+
+ // modifier (map)
+ Map<?, ?> modifierMap = (Map<?, ?>) attributeModifierMap.get("modifier");
+ if (modifierMap == null) {
+ continue;
+ }
+
+ // modifier unique id
+ String modifierUniqueIdString = (String) modifierMap.get("uuid");
+ UUID modifierUniqueId;
+ try {
+ modifierUniqueId = UUID.fromString(modifierUniqueIdString);
+ } catch (IllegalArgumentException e) {
+ modifierUniqueId = null;
+ }
+
+ // modifier name
+ String modifierName = (String) modifierMap.get("name");
+ if (modifierName == null) {
+ continue;
+ }
+
+ // modifier amount
+ Object modifierAmountObject = modifierMap.get("amount");
+ double modifierAmount;
+ if (modifierAmountObject instanceof Number modifierAmountNumber) {
+ modifierAmount = modifierAmountNumber.doubleValue();
+ } else {
+ continue;
+ }
+
+ // modifier operation
+ String modifierOperationString = (String) modifierMap.get("operation");
+ AttributeModifier.Operation modifierOperation;
+ try {
+ modifierOperation = AttributeModifier.Operation.valueOf(modifierOperationString);
+ } catch (IllegalArgumentException e) {
+ continue;
+ }
+
+ // modifier equipment slot
+ String equipmentSlotString = (String) modifierMap.get("equipmentslot");
+ EquipmentSlot equipmentSlot;
+ try {
+ equipmentSlot = EquipmentSlot.valueOf(equipmentSlotString);
+ } catch (IllegalArgumentException e) {
+ equipmentSlot = null;
+ }
+
+ // modifier (ctor)
+ AttributeModifier modifier;
+ if (modifierUniqueId != null) {
+ if (equipmentSlot != null) {
+ modifier = new AttributeModifier(modifierUniqueId, modifierName, modifierAmount, modifierOperation, equipmentSlot);
+ } else {
+ modifier = new AttributeModifier(modifierUniqueId, modifierName, modifierAmount, modifierOperation);
+ }
+ } else {
+ modifier = new AttributeModifier(modifierName, modifierAmount, modifierOperation);
+ }
+
+ meta.addAttributeModifier(attribute, modifier);
+ }
+ }
+
+ // custom model data
+ Integer customModelData = (Integer) config.get("custommodeldata");
+ if (customModelData != null && !filters.contains(Filter.CUSTOM_MODEL_DATA)) {
+ meta.setCustomModelData(customModelData);
+ }
+
+ // enchantment glint override
+ Boolean enchantmentGlintOverride = (Boolean) config.get("enchantmentglintoverride");
+ if (enchantmentGlintOverride != null && !filters.contains(Filter.ENCHANTMENT_GLINT_OVERRIDE)) {
+ meta.setEnchantmentGlintOverride(enchantmentGlintOverride);
+ }
+
+ // hide tooltip
+ Boolean hideTooltip = (Boolean) config.get("hidetooltip");
+ if (hideTooltip != null && !filters.contains(Filter.HIDE_TOOLTIP)) {
+ meta.setHideTooltip(hideTooltip);
+ }
+
+ item.setItemMeta(meta);
+ return item;
+ }
+
+ @Override
+ public ItemStack getItemStack(String typeString) {
+ if (typeString == null) {
+ return INVALID_ITEM_STACK;
+ }
+
+ Material type = Material.getMaterial(typeString);
+ if (type != null) {
+ return new ItemStack(type, 1);
+ }
+
+ NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString);
+ if (typeKey == null) {
+ return INVALID_ITEM_STACK;
+ }
+
+ type = Registry.MATERIAL.get(typeKey);
+ if (type != null) {
+ return new ItemStack(type, 1);
+ }
+
+ return INVALID_ITEM_STACK;
+ }
+
+ @Override
+ public boolean isValidMaterial(String typeString) {
+ if (Material.getMaterial(typeString) != null) {
+ return true;
+ }
+
+ NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString);
+ if (typeKey == null) {
+ return false;
+ }
+
+ return Registry.MATERIAL.get(typeKey) != null;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java
index d3405a5e..3e84c522 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java
@@ -12,8 +12,8 @@ import org.bukkit.inventory.meta.SkullMeta;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.util.Arrays;
import java.util.List;
+import java.util.Set;
/**
* Reads the following:
@@ -52,10 +52,10 @@ public class ItemGetter8 extends ItemGetter {
public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) {
config = config.getConfigurationSection(path);
if (config == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
- List<Filter> filters = Arrays.asList(excludes);
+ Set<Filter> filters = Set.of(excludes);
// type (with data)
String typeString = config.getString("item", config.getString("type"));
@@ -151,7 +151,7 @@ public class ItemGetter8 extends ItemGetter {
@Override
public ItemStack getItemStack(String typeString) {
if (typeString == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
Material type = Material.getMaterial(typeString);
@@ -161,19 +161,19 @@ public class ItemGetter8 extends ItemGetter {
String[] parts = typeString.split(":");
if (parts.length != 2) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
type = Material.getMaterial(parts[0]);
if (type == null) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
byte data;
try {
data = Byte.parseByte(parts[1]);
} catch (NumberFormatException ignored) {
- return invalidItemStack;
+ return INVALID_ITEM_STACK;
}
return new ItemStack(type, 1, (short) 0, data);