From a91179f3b12ac6fe1a9519b1a5a854d17b740284 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Wed, 19 Nov 2025 14:44:33 +0100 Subject: [PATCH 1/7] fix: oraxen repo --- hooks/Oraxen/build.gradle.kts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hooks/Oraxen/build.gradle.kts b/hooks/Oraxen/build.gradle.kts index b7c9ef8..232d325 100644 --- a/hooks/Oraxen/build.gradle.kts +++ b/hooks/Oraxen/build.gradle.kts @@ -1,3 +1,7 @@ +repositories { + maven("https://repo.oraxen.com/releases") +} + dependencies { - compileOnly("com.github.oraxen:oraxen:1.193.2") + compileOnly("io.th0rgal:oraxen:1.195.1") } \ No newline at end of file From f5bb4149ab1261fa200d1bf7a02d81aef4c24db9 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Thu, 4 Dec 2025 15:19:19 +0100 Subject: [PATCH 2/7] feat: pass all config in english --- ...jobs_boost_xp.yml => example_jobs_boost_xp.yml} | 0 .../items/blocks/cobblestone_compressed_x1.yml | 12 ++++++------ .../items/blocks/cobblestone_compressed_x2.yml | 14 +++++++------- .../{exemple_beacon.yml => example_beacon.yml} | 0 ...brewing_stand.yml => example_brewing_stand.yml} | 0 ...command_block.yml => example_command_block.yml} | 0 ...exemple_container.yml => example_container.yml} | 0 ...ting_table.yml => example_enchanting_table.yml} | 0 .../{exemple_furnace.yml => example_furnace.yml} | 0 .../{exemple_jukebox.yml => example_jukebox.yml} | 0 .../{exemple_lectern.yml => example_lectern.yml} | 0 .../blocks/{exemple_sign.yml => example_sign.yml} | 0 .../{exemple_skull.yml => example_skull.yml} | 0 .../{exemple_spawner.yml => example_spawner.yml} | 0 src/main/resources/items/diamond_pack.yml | 12 ++++++------ ...ple_custom_tool.yml => example_custom_tool.yml} | 0 ..._enchants.yml => example_disabled_enchants.yml} | 0 17 files changed, 19 insertions(+), 19 deletions(-) rename src/main/resources/effects/{exemple_jobs_boost_xp.yml => example_jobs_boost_xp.yml} (100%) rename src/main/resources/items/blocks/{exemple_beacon.yml => example_beacon.yml} (100%) rename src/main/resources/items/blocks/{exemple_brewing_stand.yml => example_brewing_stand.yml} (100%) rename src/main/resources/items/blocks/{exemple_command_block.yml => example_command_block.yml} (100%) rename src/main/resources/items/blocks/{exemple_container.yml => example_container.yml} (100%) rename src/main/resources/items/blocks/{exemple_enchanting_table.yml => example_enchanting_table.yml} (100%) rename src/main/resources/items/blocks/{exemple_furnace.yml => example_furnace.yml} (100%) rename src/main/resources/items/blocks/{exemple_jukebox.yml => example_jukebox.yml} (100%) rename src/main/resources/items/blocks/{exemple_lectern.yml => example_lectern.yml} (100%) rename src/main/resources/items/blocks/{exemple_sign.yml => example_sign.yml} (100%) rename src/main/resources/items/blocks/{exemple_skull.yml => example_skull.yml} (100%) rename src/main/resources/items/blocks/{exemple_spawner.yml => example_spawner.yml} (100%) rename src/main/resources/items/tools/{exemple_custom_tool.yml => example_custom_tool.yml} (100%) rename src/main/resources/items/weapons/{exemple_disabled_enchants.yml => example_disabled_enchants.yml} (100%) diff --git a/src/main/resources/effects/exemple_jobs_boost_xp.yml b/src/main/resources/effects/example_jobs_boost_xp.yml similarity index 100% rename from src/main/resources/effects/exemple_jobs_boost_xp.yml rename to src/main/resources/effects/example_jobs_boost_xp.yml diff --git a/src/main/resources/items/blocks/cobblestone_compressed_x1.yml b/src/main/resources/items/blocks/cobblestone_compressed_x1.yml index f1ee46a..7b4907c 100644 --- a/src/main/resources/items/blocks/cobblestone_compressed_x1.yml +++ b/src/main/resources/items/blocks/cobblestone_compressed_x1.yml @@ -1,13 +1,13 @@ -# Cobblestone Compressé x1 -# Crafté avec 9 cobblestones normales +# Compressed Cobblestone x1 +# Crafted with 9 normal cobblestones id: "cobblestone_compressed_x1" material: COBBLESTONE -display-name: "⬛ Cobblestone Compressé x1" +display-name: "⬛ Compressed Cobblestone x1" lore: - - "Une cobblestone ultra-compressée" - - "Contient 9 cobblestones" + - "An ultra-compressed cobblestone" + - "Contains 9 cobblestones" - "" - - "⚡ Peut être compressé davantage" + - "⚡ Can be compressed further" custom-model-data: 2001 hide-tooltip: false max-stack-size: 64 diff --git a/src/main/resources/items/blocks/cobblestone_compressed_x2.yml b/src/main/resources/items/blocks/cobblestone_compressed_x2.yml index 417626b..2093716 100644 --- a/src/main/resources/items/blocks/cobblestone_compressed_x2.yml +++ b/src/main/resources/items/blocks/cobblestone_compressed_x2.yml @@ -1,14 +1,14 @@ -# Cobblestone Compressé x2 -# Crafté avec 9 Cobblestone Compressé x1 +# Compressed Cobblestone x2 +# Crafted with 9 Compressed Cobblestone x1 id: "cobblestone_compressed_x2" material: COBBLESTONE -display-name: "⬛⬛ Cobblestone Compressé x2" +display-name: "⬛⬛ Compressed Cobblestone x2" lore: - - "Une cobblestone extrêmement compressée" - - "Contient 81 cobblestones (9x9)" + - "An extremely compressed cobblestone" + - "Contains 81 cobblestones (9x9)" - "" - - "💎 Peut être transformé en diamants!" - - "⚠ Très précieux" + - "💎 Can be transformed into diamonds!" + - "⚠ Very valuable" custom-model-data: 2002 hide-tooltip: false max-stack-size: 64 diff --git a/src/main/resources/items/blocks/exemple_beacon.yml b/src/main/resources/items/blocks/example_beacon.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_beacon.yml rename to src/main/resources/items/blocks/example_beacon.yml diff --git a/src/main/resources/items/blocks/exemple_brewing_stand.yml b/src/main/resources/items/blocks/example_brewing_stand.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_brewing_stand.yml rename to src/main/resources/items/blocks/example_brewing_stand.yml diff --git a/src/main/resources/items/blocks/exemple_command_block.yml b/src/main/resources/items/blocks/example_command_block.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_command_block.yml rename to src/main/resources/items/blocks/example_command_block.yml diff --git a/src/main/resources/items/blocks/exemple_container.yml b/src/main/resources/items/blocks/example_container.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_container.yml rename to src/main/resources/items/blocks/example_container.yml diff --git a/src/main/resources/items/blocks/exemple_enchanting_table.yml b/src/main/resources/items/blocks/example_enchanting_table.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_enchanting_table.yml rename to src/main/resources/items/blocks/example_enchanting_table.yml diff --git a/src/main/resources/items/blocks/exemple_furnace.yml b/src/main/resources/items/blocks/example_furnace.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_furnace.yml rename to src/main/resources/items/blocks/example_furnace.yml diff --git a/src/main/resources/items/blocks/exemple_jukebox.yml b/src/main/resources/items/blocks/example_jukebox.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_jukebox.yml rename to src/main/resources/items/blocks/example_jukebox.yml diff --git a/src/main/resources/items/blocks/exemple_lectern.yml b/src/main/resources/items/blocks/example_lectern.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_lectern.yml rename to src/main/resources/items/blocks/example_lectern.yml diff --git a/src/main/resources/items/blocks/exemple_sign.yml b/src/main/resources/items/blocks/example_sign.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_sign.yml rename to src/main/resources/items/blocks/example_sign.yml diff --git a/src/main/resources/items/blocks/exemple_skull.yml b/src/main/resources/items/blocks/example_skull.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_skull.yml rename to src/main/resources/items/blocks/example_skull.yml diff --git a/src/main/resources/items/blocks/exemple_spawner.yml b/src/main/resources/items/blocks/example_spawner.yml similarity index 100% rename from src/main/resources/items/blocks/exemple_spawner.yml rename to src/main/resources/items/blocks/example_spawner.yml diff --git a/src/main/resources/items/diamond_pack.yml b/src/main/resources/items/diamond_pack.yml index c749957..73c112e 100644 --- a/src/main/resources/items/diamond_pack.yml +++ b/src/main/resources/items/diamond_pack.yml @@ -1,14 +1,14 @@ # Diamond Pack -# Crafté avec 1 Cobblestone Compressé x2 -# Donne 64 diamants +# Crafted with 1 Compressed Cobblestone x2 +# Gives 64 diamonds id: "diamond_pack" material: DIAMOND -display-name: "💎 Pack de Diamants" +display-name: "💎 Diamond Pack" lore: - - "Contient 64 diamants précieux" - - "Obtenu via compression extrême" + - "Contains 64 precious diamonds" + - "Obtained via extreme compression" - "" - - "✨ Résultat de la compression ultime" + - "✨ Result of ultimate compression" custom-model-data: 3001 hide-tooltip: false max-stack-size: 64 diff --git a/src/main/resources/items/tools/exemple_custom_tool.yml b/src/main/resources/items/tools/example_custom_tool.yml similarity index 100% rename from src/main/resources/items/tools/exemple_custom_tool.yml rename to src/main/resources/items/tools/example_custom_tool.yml diff --git a/src/main/resources/items/weapons/exemple_disabled_enchants.yml b/src/main/resources/items/weapons/example_disabled_enchants.yml similarity index 100% rename from src/main/resources/items/weapons/exemple_disabled_enchants.yml rename to src/main/resources/items/weapons/example_disabled_enchants.yml From 92018416cecb575fa4079218de76e9dd964685a1 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Fri, 5 Dec 2025 13:44:47 +0100 Subject: [PATCH 3/7] feat: spigot compatibility --- .../api/registries/FileBasedRegistry.java | 2 +- .../fr/traqueur/items/api/utils/ItemUtil.java | 37 ++++++++++++++----- build.gradle.kts | 4 +- src/main/java/fr/traqueur/items/ZItems.java | 31 ++++++++++------ .../traqueur/items/blocks/BlockTracker.java | 7 ++-- .../items/blocks/BlockTrackerListener.java | 13 +------ .../items/effects/ZEffectsManager.java | 20 +++++++--- .../items/effects/ZEventsListener.java | 10 ++--- .../effects/handlers/EnchantsApplicator.java | 7 +++- .../items/effects/handlers/MeltMining.java | 4 +- .../items/effects/handlers/SilkSpawner.java | 7 +--- .../items/effects/handlers/Unbreakable.java | 7 +++- .../items/hooks/recipes/RecipesHook.java | 8 +--- .../java/fr/traqueur/items/items/ZItem.java | 30 +++++++++------ .../items/items/blockdata/CrafterMeta.java | 18 ++++++++- .../items/items/blockdata/JigsawMeta.java | 19 +++++++++- .../blockstate/CommandBlockStateMeta.java | 10 ++++- .../blockstate/EnchantingTableStateMeta.java | 11 +++++- .../items/items/blockstate/SignStateMeta.java | 10 ++++- .../items/blockstate/SkullStateMeta.java | 3 +- .../items/metadata/ArmorStandMetadata.java | 1 + .../items/metadata/AxolotBucketMeta.java | 3 +- .../items/items/metadata/BannerMetadata.java | 7 +--- .../items/metadata/BlockDataMetadata.java | 3 +- .../items/metadata/BlockStateMetadata.java | 3 +- .../metadata/EnchantStorageMetadata.java | 3 +- .../items/metadata/LeatherArmorMetadata.java | 3 +- .../items/items/metadata/PotionMetadata.java | 3 +- .../items/items/metadata/ToolMetadata.java | 5 ++- .../items/items/metadata/TrimMetadata.java | 3 +- .../listeners/AnvilEffectFusionListener.java | 4 +- .../listeners/DisableEnchantsListener.java | 4 +- .../listeners/ItemRestrictionsListener.java | 8 ++-- .../settings/readers/EnchantmentReader.java | 6 +-- .../settings/readers/PatternTypeReader.java | 6 +-- .../items/settings/readers/SoundReader.java | 5 +-- .../settings/readers/TrimMaterialReader.java | 13 +------ .../settings/readers/TrimPatternReader.java | 7 +--- .../traqueur/items/utils/AttributeUtil.java | 11 ++++-- .../fr/traqueur/items/utils/ChunkUtil.java | 18 +++++++++ 40 files changed, 234 insertions(+), 140 deletions(-) create mode 100644 src/main/java/fr/traqueur/items/utils/ChunkUtil.java diff --git a/api/src/main/java/fr/traqueur/items/api/registries/FileBasedRegistry.java b/api/src/main/java/fr/traqueur/items/api/registries/FileBasedRegistry.java index 0d7bd45..5a2561e 100644 --- a/api/src/main/java/fr/traqueur/items/api/registries/FileBasedRegistry.java +++ b/api/src/main/java/fr/traqueur/items/api/registries/FileBasedRegistry.java @@ -50,7 +50,7 @@ protected FileBasedRegistry(ItemsPlugin plugin, String resourceFolder, String lo * Loads items from the specified folder, building the folder structure. */ public void loadFromFolder() { - Path folder = this.plugin.getDataPath().resolve(this.resourceFolder); + Path folder = this.plugin.getDataFolder().toPath().resolve(this.resourceFolder); if (!ensureFolderExists(folder)) { return; } diff --git a/api/src/main/java/fr/traqueur/items/api/utils/ItemUtil.java b/api/src/main/java/fr/traqueur/items/api/utils/ItemUtil.java index 3112e06..511e5e9 100644 --- a/api/src/main/java/fr/traqueur/items/api/utils/ItemUtil.java +++ b/api/src/main/java/fr/traqueur/items/api/utils/ItemUtil.java @@ -2,7 +2,6 @@ import fr.maxlego08.menu.api.dupe.DupeManager; import fr.traqueur.items.api.PlatformType; -import fr.traqueur.items.api.placeholders.PlaceholderParser; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -14,10 +13,11 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; +import java.util.function.Consumer; /** * Utility class for creating and modifying ItemStacks with Paper/Spigot compatibility. @@ -46,12 +46,14 @@ public static ItemStack cloneItemStack(ItemStack itemStack) { return null; } ItemStack clone = itemStack.clone(); - - clone.editPersistentDataContainer(container -> { - if (container.has(DUPE_KEY)) { - container.remove(DUPE_KEY); + ItemMeta meta = clone.getItemMeta(); + if (meta != null) { + PersistentDataContainer persistentDataContainer = meta.getPersistentDataContainer(); + if (persistentDataContainer.has(DUPE_KEY)) { + persistentDataContainer.remove(DUPE_KEY); } - }); + clone.setItemMeta(meta); + } return clone; } @@ -173,7 +175,7 @@ public static List getLore(ItemStack itemStack) { * @return The created ItemStack */ public static ItemStack createItem(Material material, int amount, Component displayName, List lore, Component itemName) { - ItemStack itemStack = ItemStack.of(material, amount); + ItemStack itemStack = new ItemStack(material, amount); if (displayName != null) { setDisplayName(itemStack, displayName); @@ -234,8 +236,8 @@ public static void applyDamageToItem(ItemStack item, int damage, Player player) return; } - PlayerItemDamageEvent damageEvent = new PlayerItemDamageEvent(player, item, damage, damage); - damageEvent.callEvent(); + PlayerItemDamageEvent damageEvent = new PlayerItemDamageEvent(player, item, damage); + Bukkit.getPluginManager().callEvent(damageEvent); if (damageEvent.isCancelled()) { return; } @@ -255,4 +257,19 @@ public static void applyDamageToItem(ItemStack item, int damage, Player player) } } } + + public static boolean editMeta(ItemStack item, Class metaClass, Consumer consumer) { + ItemMeta meta = item.getItemMeta(); + if (meta == null) { + return false; + } + if (metaClass.isInstance(meta)) { + T metaItem = metaClass.cast(meta); + consumer.accept(metaItem); + item.setItemMeta(metaItem); + return true; + } + return false; + } + } \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 7a5ff6b..bd572c3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -47,7 +47,6 @@ allprojects { dependencies { compileOnly("io.papermc.paper:paper-api:1.21.5-R0.1-SNAPSHOT") - /* Depends */ compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("fr.maxlego08.menu:zmenu-api:1.1.0.4") @@ -55,10 +54,11 @@ allprojects { /* Adventure for Spigot compatibility */ compileOnly("net.kyori:adventure-platform-bukkit:4.3.4") + compileOnly("net.kyori:adventure-text-minimessage:4.18.0") /* Libraries */ implementation("com.github.Traqueur-dev:RecipesAPI:3.1.1") - implementation("com.github.Traqueur-dev:Structura:feat~optimize-SNAPSHOT") + implementation("fr.traqueur:structura:1.6.0") implementation("com.github.Traqueur-dev.CommandsAPI:platform-spigot:4.2.3") compileOnly("org.reflections:reflections:0.10.2") diff --git a/src/main/java/fr/traqueur/items/ZItems.java b/src/main/java/fr/traqueur/items/ZItems.java index b37158d..31b3926 100644 --- a/src/main/java/fr/traqueur/items/ZItems.java +++ b/src/main/java/fr/traqueur/items/ZItems.java @@ -4,20 +4,22 @@ import fr.maxlego08.menu.api.InventoryManager; import fr.maxlego08.menu.api.loader.NoneLoader; import fr.traqueur.commands.spigot.CommandManager; -import fr.traqueur.items.blocks.ZItemsProvider; -import fr.traqueur.items.buttons.ItemsListButton; import fr.traqueur.items.api.ItemsPlugin; import fr.traqueur.items.api.Logger; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.effects.Effect; import fr.traqueur.items.api.effects.EffectsDispatcher; import fr.traqueur.items.api.items.Item; import fr.traqueur.items.api.managers.EffectsManager; import fr.traqueur.items.api.managers.ItemsManager; import fr.traqueur.items.api.registries.*; -import fr.traqueur.items.api.settings.models.AttributeMergeStrategy; import fr.traqueur.items.api.settings.Settings; +import fr.traqueur.items.api.settings.models.AttributeMergeStrategy; +import fr.traqueur.items.api.utils.MessageUtil; import fr.traqueur.items.blocks.BlockTracker; import fr.traqueur.items.blocks.BlockTrackerListener; +import fr.traqueur.items.blocks.ZItemsProvider; +import fr.traqueur.items.buttons.ItemsListButton; import fr.traqueur.items.buttons.applicator.ApplicatorButton; import fr.traqueur.items.buttons.applicator.ApplicatorOutputButton; import fr.traqueur.items.commands.CommandsMessageHandler; @@ -38,7 +40,6 @@ import fr.traqueur.items.settings.PluginSettings; import fr.traqueur.items.settings.readers.*; import fr.traqueur.items.shop.ShopProviders; -import fr.traqueur.items.api.utils.MessageUtil; import fr.traqueur.recipes.api.RecipesAPI; import fr.traqueur.recipes.api.hook.Hook; import fr.traqueur.structura.api.Structura; @@ -53,7 +54,6 @@ import org.bukkit.block.banner.PatternType; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.EquipmentSlotGroup; -import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.trim.TrimMaterial; import org.bukkit.inventory.meta.trim.TrimPattern; import org.bukkit.potion.PotionEffectType; @@ -61,8 +61,6 @@ import org.jetbrains.annotations.NotNull; import java.io.File; -import java.util.List; -import java.util.Optional; public class ZItems extends ItemsPlugin { @@ -71,6 +69,8 @@ public class ZItems extends ItemsPlugin { public static final String ITEMS_FOLDER = "items"; public static final String EFFECTS_FOLDER = "effects"; + private org.slf4j.Logger logger; + private RecipesAPI recipesManager; private EffectsDispatcher dispatcher; private InventoryManager inventoryManager; @@ -81,11 +81,13 @@ public void onEnable() { long enableTime = System.currentTimeMillis(); + logger = org.slf4j.LoggerFactory.getLogger("zItems"); + this.saveDefaultConfig(); this.injectReaders(); PluginSettings settings = this.createSettings(CONFIG_FILE, PluginSettings.class); - Logger.init(this.getSLF4JLogger(), settings.debug()); + Logger.init(logger, settings.debug()); Logger.info("=== ENABLE START ==="); Logger.info("Plugin Version V{}", this.getDescription().getVersion()); @@ -122,8 +124,13 @@ public void onEnable() { Logger.info("Event dispatching system initialized successfully!"); // Register legacy rune migration listener (zItemsOld backward compatibility) - this.getServer().getPluginManager().registerEvents(new LegacyMigrationListener(), this); - Logger.info("Legacy rune migration system enabled - zItemsOld items will be auto-migrated"); + if(PlatformType.isPaper()) { + this.getServer().getPluginManager().registerEvents(new LegacyMigrationListener(), this); + Logger.info("Legacy rune migration system enabled - zItemsOld items will be auto-migrated"); + } else { + Logger.warning("Legacy rune migration system is only possible with paper spigot!"); + } + this.registerListeners(); @@ -288,9 +295,9 @@ public void reloadConfig() { PluginSettings settings = this.createSettings(CONFIG_FILE, PluginSettings.class); Logger.setDebug(settings.debug()); try { - Structura.loadEnum(this.getDataPath().resolve(MESSAGES_FILE), Messages.class); + Structura.loadEnum(this.getDataFolder().toPath().resolve(MESSAGES_FILE), Messages.class); } catch (StructuraException e) { - this.getSLF4JLogger().error("Failed to load messages configuration.", e); + this.logger.error("Failed to load messages configuration.", e); } EffectsRegistry effectsRegistry = Registry.get(EffectsRegistry.class); diff --git a/src/main/java/fr/traqueur/items/blocks/BlockTracker.java b/src/main/java/fr/traqueur/items/blocks/BlockTracker.java index 1229ce1..5be0b73 100644 --- a/src/main/java/fr/traqueur/items/blocks/BlockTracker.java +++ b/src/main/java/fr/traqueur/items/blocks/BlockTracker.java @@ -5,6 +5,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.blocks.TrackedBlock; import fr.traqueur.items.serialization.Keys; +import fr.traqueur.items.utils.ChunkUtil; import org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -51,7 +52,7 @@ private BlockTracker() { */ private record WorldChunkKey(UUID worldUid, long chunkKey) { WorldChunkKey(Chunk chunk) { - this(chunk.getWorld().getUID(), chunk.getChunkKey()); + this(chunk.getWorld().getUID(), ChunkUtil.getChunkKey(chunk)); } } @@ -157,7 +158,7 @@ public void loadChunk(Chunk chunk) { } Logger.debug("Loaded {} tracked blocks from chunk {} in world {}", - trackedBlocks.size(), chunk.getChunkKey(), chunk.getWorld().getName()); + trackedBlocks.size(), ChunkUtil.getChunkKey(chunk), chunk.getWorld().getName()); } } @@ -183,7 +184,7 @@ public void unloadChunk(Chunk chunk) { Keys.TRACKED_BLOCKS.set(pdc, trackedBlocks); Logger.debug("Saved {} tracked blocks for chunk {} in world {}", - trackedBlocks.size(), chunk.getChunkKey(), chunk.getWorld().getName()); + trackedBlocks.size(), ChunkUtil.getChunkKey(chunk), chunk.getWorld().getName()); // Remove from cache after saving cache.row(worldChunkKey).clear(); diff --git a/src/main/java/fr/traqueur/items/blocks/BlockTrackerListener.java b/src/main/java/fr/traqueur/items/blocks/BlockTrackerListener.java index d23236d..1852427 100644 --- a/src/main/java/fr/traqueur/items/blocks/BlockTrackerListener.java +++ b/src/main/java/fr/traqueur/items/blocks/BlockTrackerListener.java @@ -26,17 +26,8 @@ * - Drops correct custom item when tracked blocks are broken * - Manages chunk load/unload for persistence */ -public class BlockTrackerListener implements Listener { - - private final BlockTracker tracker; - private final ItemsManager itemsManager; - private final EffectsManager effectsManager; - - public BlockTrackerListener(BlockTracker tracker, ItemsManager itemsManager, EffectsManager effectsManager) { - this.tracker = tracker; - this.itemsManager = itemsManager; - this.effectsManager = effectsManager; - } +public record BlockTrackerListener(BlockTracker tracker, ItemsManager itemsManager, + EffectsManager effectsManager) implements Listener { /** * Tracks blocks placed from custom items. diff --git a/src/main/java/fr/traqueur/items/effects/ZEffectsManager.java b/src/main/java/fr/traqueur/items/effects/ZEffectsManager.java index 62afd78..9846bf0 100644 --- a/src/main/java/fr/traqueur/items/effects/ZEffectsManager.java +++ b/src/main/java/fr/traqueur/items/effects/ZEffectsManager.java @@ -15,22 +15,23 @@ import fr.traqueur.items.api.registries.Registry; import fr.traqueur.items.api.settings.ItemSettings; import fr.traqueur.items.api.settings.Settings; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.items.api.utils.MessageUtil; import fr.traqueur.items.serialization.Keys; import fr.traqueur.items.settings.PluginSettings; -import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.recipes.api.RecipeType; import fr.traqueur.recipes.impl.domains.ItemRecipe; import fr.traqueur.recipes.impl.domains.ingredients.StrictItemStackIngredient; import fr.traqueur.recipes.impl.domains.recipes.RecipeBuilder; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Material; import org.bukkit.Tag; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; import java.util.*; import java.util.stream.Collectors; @@ -145,11 +146,15 @@ private EffectApplicationResult applyEffect(Player player, ItemStack item, Effec return compatibilityResult; } - item.editPersistentDataContainer(container -> { + ItemMeta meta = item.getItemMeta(); + if (meta != null) { + PersistentDataContainer container = meta.getPersistentDataContainer(); List effects = new ArrayList<>(Keys.EFFECTS.get(container, new ArrayList<>())); effects.add(effect); Keys.EFFECTS.set(container, effects); - }); + item.setItemMeta(meta); + } + this.getPlugin().getDispatcher().applyNoEventEffect(player, item, effect); // Update item lore to show the new effect (only if requested) @@ -521,9 +526,12 @@ public ItemStack createEffectItem(Effect effect, Player player) { ItemStack item = representation.item().build(player); // Store the effect ID in PDC to mark it as an effect representation - item.editPersistentDataContainer(container -> { + ItemMeta meta = item.getItemMeta(); + if (meta != null) { + PersistentDataContainer container = meta.getPersistentDataContainer(); Keys.EFFECT_REPRESENTATION.set(container, effect.id()); - }); + item.setItemMeta(meta); + } return item; } diff --git a/src/main/java/fr/traqueur/items/effects/ZEventsListener.java b/src/main/java/fr/traqueur/items/effects/ZEventsListener.java index e2fee93..fccaf91 100644 --- a/src/main/java/fr/traqueur/items/effects/ZEventsListener.java +++ b/src/main/java/fr/traqueur/items/effects/ZEventsListener.java @@ -41,18 +41,16 @@ *
  • Extensible via custom extractors
  • * */ -public class ZEventsListener implements Listener { +public record ZEventsListener(EffectsDispatcher dispatcher) implements Listener { private static final ConcurrentHashMap, Method> HANDLER_LISTS_CACHE = new ConcurrentHashMap<>(); - private final EffectsDispatcher dispatcher; /** * Creates a new dynamic events listener. * * @param dispatcher the dispatcher to send events to */ - public ZEventsListener(EffectsDispatcher dispatcher) { - this.dispatcher = dispatcher; + public ZEventsListener { } /** @@ -194,8 +192,8 @@ private HandlerList getHandlerList(Class eventClass) throws Exc */ @SuppressWarnings("unchecked") private void handleEvent(E event) { - if(event instanceof Cancellable cancellable) { - if(cancellable.isCancelled()) { + if (event instanceof Cancellable cancellable) { + if (cancellable.isCancelled()) { return; } } diff --git a/src/main/java/fr/traqueur/items/effects/handlers/EnchantsApplicator.java b/src/main/java/fr/traqueur/items/effects/handlers/EnchantsApplicator.java index 51cd368..8dc816f 100644 --- a/src/main/java/fr/traqueur/items/effects/handlers/EnchantsApplicator.java +++ b/src/main/java/fr/traqueur/items/effects/handlers/EnchantsApplicator.java @@ -4,6 +4,7 @@ import fr.traqueur.items.api.effects.EffectContext; import fr.traqueur.items.api.effects.EffectHandler; import fr.traqueur.items.effects.settings.EnchantsSettings; +import org.bukkit.inventory.meta.ItemMeta; @AutoEffect(value = "ENCHANTS_APPLICATOR") public class EnchantsApplicator implements EffectHandler.NoEventEffectHandler { @@ -28,7 +29,8 @@ public void handle(EffectContext context, EnchantsSettings settings) { return; } - context.itemSource().editMeta(meta -> { + ItemMeta meta = context.itemSource().getItemMeta(); + if (meta != null) { for (EnchantsSettings.EnchantSetting enchantment : settings.enchantments()) { int evolution = enchantment.computeEvolutionValue(); int level = meta.getEnchants().getOrDefault(enchantment.wrapper().enchantment(), 0); @@ -39,7 +41,8 @@ public void handle(EffectContext context, EnchantsSettings settings) { meta.addEnchant(enchantment.wrapper().enchantment(), level + evolution, true); } } - }); + context.itemSource().setItemMeta(meta); + } } @Override diff --git a/src/main/java/fr/traqueur/items/effects/handlers/MeltMining.java b/src/main/java/fr/traqueur/items/effects/handlers/MeltMining.java index 3e6f698..3fb1c26 100644 --- a/src/main/java/fr/traqueur/items/effects/handlers/MeltMining.java +++ b/src/main/java/fr/traqueur/items/effects/handlers/MeltMining.java @@ -37,7 +37,9 @@ public void handle(EffectContext context, EmptySettings settings) { FurnaceRecipe recipe = optionalRecipe.get(); totalExperience += recipe.getExperience(); - context.addDrop(recipe.getResult().asQuantity(blockDrop.getAmount())); + ItemStack result = recipe.getResult(); + result.setAmount(blockDrop.getAmount()); + context.addDrop(result); } this.spawnFlameParticles(world, location); } diff --git a/src/main/java/fr/traqueur/items/effects/handlers/SilkSpawner.java b/src/main/java/fr/traqueur/items/effects/handlers/SilkSpawner.java index 016ffab..3befa86 100644 --- a/src/main/java/fr/traqueur/items/effects/handlers/SilkSpawner.java +++ b/src/main/java/fr/traqueur/items/effects/handlers/SilkSpawner.java @@ -5,9 +5,8 @@ import fr.traqueur.items.api.effects.EffectContext; import fr.traqueur.items.api.effects.EffectHandler; import fr.traqueur.items.api.events.SpawnerDropEvent; -import fr.traqueur.items.api.managers.ItemsManager; -import fr.traqueur.items.blocks.BlockTracker; import fr.traqueur.items.effects.settings.EmptySettings; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.CreatureSpawner; @@ -17,9 +16,7 @@ import org.bukkit.inventory.meta.BlockStateMeta; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Set; @AutoEffect(value = "SILK_SPAWNER") @@ -38,7 +35,7 @@ public void handle(EffectContext context, EmptySettings settings) { ItemStack itemStack = this.getSpawner(block); SpawnerDropEvent event = new SpawnerDropEvent(context.executor(), block.getLocation(), itemStack); - event.callEvent(); + Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { continue; } diff --git a/src/main/java/fr/traqueur/items/effects/handlers/Unbreakable.java b/src/main/java/fr/traqueur/items/effects/handlers/Unbreakable.java index 46aa204..ee09de1 100644 --- a/src/main/java/fr/traqueur/items/effects/handlers/Unbreakable.java +++ b/src/main/java/fr/traqueur/items/effects/handlers/Unbreakable.java @@ -4,15 +4,18 @@ import fr.traqueur.items.api.effects.EffectContext; import fr.traqueur.items.api.effects.EffectHandler; import fr.traqueur.items.effects.settings.EmptySettings; +import org.bukkit.inventory.meta.ItemMeta; @AutoEffect(value = "UNBREAKABLE") public class Unbreakable implements EffectHandler.NoEventEffectHandler { @Override public void handle(EffectContext context, EmptySettings settings) { - context.itemSource().editMeta(meta -> { + ItemMeta meta = context.itemSource().getItemMeta(); + if (meta != null) { meta.setUnbreakable(true); - }); + context.itemSource().setItemMeta(meta); + } } @Override diff --git a/src/main/java/fr/traqueur/items/hooks/recipes/RecipesHook.java b/src/main/java/fr/traqueur/items/hooks/recipes/RecipesHook.java index 13975e3..8361a00 100644 --- a/src/main/java/fr/traqueur/items/hooks/recipes/RecipesHook.java +++ b/src/main/java/fr/traqueur/items/hooks/recipes/RecipesHook.java @@ -8,13 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -public class RecipesHook implements Hook { - - private final ItemsPlugin plugin; - - public RecipesHook(ItemsPlugin plugin) { - this.plugin = plugin; - } +public record RecipesHook(ItemsPlugin plugin) implements Hook { @Override public String getPluginName() { diff --git a/src/main/java/fr/traqueur/items/items/ZItem.java b/src/main/java/fr/traqueur/items/items/ZItem.java index 785ac47..4dce93f 100644 --- a/src/main/java/fr/traqueur/items/items/ZItem.java +++ b/src/main/java/fr/traqueur/items/items/ZItem.java @@ -1,8 +1,7 @@ package fr.traqueur.items.items; -import com.mojang.brigadier.Message; -import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.ItemsPlugin; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.effects.Effect; import fr.traqueur.items.api.events.ItemBuildEvent; import fr.traqueur.items.api.items.Item; @@ -10,10 +9,10 @@ import fr.traqueur.items.api.placeholders.PlaceholderParser; import fr.traqueur.items.api.settings.ItemSettings; import fr.traqueur.items.api.settings.models.EnchantmentWrapper; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.items.api.utils.MessageUtil; import fr.traqueur.items.serialization.Keys; import fr.traqueur.items.utils.AttributeUtil; -import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.structura.annotations.Options; import fr.traqueur.structura.api.Loadable; import net.kyori.adventure.text.Component; @@ -21,14 +20,15 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.Repairable; +import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; public record ZItem(String id, @Options(inline = true) ItemSettings settings) implements Item, Loadable { @@ -57,8 +57,8 @@ public record ZItem(String id, @Options(inline = true) ItemSettings settings) im AttributeUtil.applyAttributes(itemStack, settings.attributes(), plugin, settings.attributeMergeStrategy()); - // Apply additional settings via editMeta - itemStack.editMeta(meta -> { + ItemMeta meta = itemStack.getItemMeta(); + if (meta != null) { // Apply enchantments if (settings.enchantments() != null) { for (EnchantmentWrapper enchantment : settings.enchantments()) { @@ -106,15 +106,19 @@ public record ZItem(String id, @Options(inline = true) ItemSettings settings) im if (settings.damageTypeResistance() != null) { meta.setDamageResistant(settings.damageTypeResistance()); } + itemStack.setItemMeta(meta); + } - }); if (settings.effects() != null && !settings.effects().isEmpty()) { + meta = itemStack.getItemMeta(); // Apply effects directly to PDC without updating lore // (lore was already generated above with generateBaseEffectLore) - itemStack.editPersistentDataContainer(container -> { + if (meta != null) { + PersistentDataContainer container = meta.getPersistentDataContainer(); Keys.EFFECTS.set(container, new ArrayList<>(settings.effects())); - }); + itemStack.setItemMeta(meta); + } // Apply NoEventEffects (attributes, etc.) for each effect for (Effect effect : settings.effects()) { @@ -128,10 +132,12 @@ public record ZItem(String id, @Options(inline = true) ItemSettings settings) im metadata.apply(itemStack, player); } } - - itemStack.editPersistentDataContainer(container -> { + meta = itemStack.getItemMeta(); + if (meta != null) { + PersistentDataContainer container = meta.getPersistentDataContainer(); Keys.ITEM_ID.set(container, id); - }); + itemStack.setItemMeta(meta); + } ItemBuildEvent event = new ItemBuildEvent(player, this, itemStack); plugin.getServer().getPluginManager().callEvent(event); diff --git a/src/main/java/fr/traqueur/items/items/blockdata/CrafterMeta.java b/src/main/java/fr/traqueur/items/items/blockdata/CrafterMeta.java index 067ed6b..350a2f4 100644 --- a/src/main/java/fr/traqueur/items/items/blockdata/CrafterMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockdata/CrafterMeta.java @@ -1,11 +1,15 @@ package fr.traqueur.items.items.blockdata; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockDataMeta; import fr.traqueur.items.api.items.BlockDataMeta; import fr.traqueur.structura.annotations.Options; import org.bukkit.block.Orientation; import org.bukkit.block.data.type.Crafter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** * BlockData metadata for crafter blocks. * Sets crafting state, triggered state, and orientation. @@ -14,7 +18,7 @@ public record CrafterMeta( boolean crafting, boolean triggered, - @Options(optional = true) Orientation orientation + @Options(optional = true) Crafter.Orientation orientation ) implements BlockDataMeta { @Override @@ -22,7 +26,17 @@ public void apply(Crafter blockData) { blockData.setCrafting(crafting); blockData.setTriggered(triggered); if (orientation != null) { - blockData.setOrientation(orientation); + if (PlatformType.isPaper()) { + Orientation o = Orientation.valueOf(orientation.name()); + blockData.setOrientation(o); + } else { + try { + Method method = blockData.getClass().getMethod("setOrientation", Crafter.Orientation.class); + method.invoke(blockData, orientation); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } } } } diff --git a/src/main/java/fr/traqueur/items/items/blockdata/JigsawMeta.java b/src/main/java/fr/traqueur/items/items/blockdata/JigsawMeta.java index f9149d8..7be99bc 100644 --- a/src/main/java/fr/traqueur/items/items/blockdata/JigsawMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockdata/JigsawMeta.java @@ -1,19 +1,34 @@ package fr.traqueur.items.items.blockdata; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockDataMeta; import fr.traqueur.items.api.items.BlockDataMeta; import org.bukkit.block.Orientation; +import org.bukkit.block.data.type.Crafter; import org.bukkit.block.data.type.Jigsaw; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** * BlockData metadata for jigsaw blocks. * Sets the orientation. */ @AutoBlockDataMeta("jigsaw") -public record JigsawMeta(Orientation orientation) implements BlockDataMeta { +public record JigsawMeta(Jigsaw.Orientation orientation) implements BlockDataMeta { @Override public void apply(Jigsaw blockData) { - blockData.setOrientation(orientation); + if (PlatformType.isPaper()) { + Orientation o = Orientation.valueOf(orientation.name()); + blockData.setOrientation(o); + } else { + try { + Method method = blockData.getClass().getMethod("setOrientation", Jigsaw.Orientation.class); + method.invoke(blockData, orientation); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } + } } } diff --git a/src/main/java/fr/traqueur/items/items/blockstate/CommandBlockStateMeta.java b/src/main/java/fr/traqueur/items/items/blockstate/CommandBlockStateMeta.java index effa512..66a76d5 100644 --- a/src/main/java/fr/traqueur/items/items/blockstate/CommandBlockStateMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockstate/CommandBlockStateMeta.java @@ -1,9 +1,11 @@ package fr.traqueur.items.items.blockstate; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockStateMeta; import fr.traqueur.items.api.items.BlockStateMeta; import fr.traqueur.structura.annotations.Options; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.block.CommandBlock; import org.bukkit.entity.Player; @@ -17,6 +19,8 @@ public record CommandBlockStateMeta( @Options(optional = true) Component name ) implements BlockStateMeta { + private static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.legacySection(); + @Override public void apply(Player player, CommandBlock commandBlock) { if (command != null && !command.isEmpty()) { @@ -24,7 +28,11 @@ public void apply(Player player, CommandBlock commandBlock) { } if (name != null) { - commandBlock.name(name); + if (PlatformType.isPaper()) { + commandBlock.name(name); + } else { + commandBlock.setName(LEGACY_SERIALIZER.serialize(name)); + } } } } \ No newline at end of file diff --git a/src/main/java/fr/traqueur/items/items/blockstate/EnchantingTableStateMeta.java b/src/main/java/fr/traqueur/items/items/blockstate/EnchantingTableStateMeta.java index 7fb82ea..744aa1f 100644 --- a/src/main/java/fr/traqueur/items/items/blockstate/EnchantingTableStateMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockstate/EnchantingTableStateMeta.java @@ -1,9 +1,11 @@ package fr.traqueur.items.items.blockstate; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockStateMeta; import fr.traqueur.items.api.items.BlockStateMeta; import fr.traqueur.structura.annotations.Options; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.block.EnchantingTable; import org.bukkit.entity.Player; @@ -15,11 +17,16 @@ public record EnchantingTableStateMeta( @Options(optional = true) Component customName ) implements BlockStateMeta { - + private static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.legacySection(); @Override public void apply(Player player, EnchantingTable enchantingTable) { if (customName != null) { - enchantingTable.customName(customName); + if (PlatformType.isPaper()) { + enchantingTable.customName(customName); + } else { + enchantingTable.setCustomName(LEGACY_SERIALIZER.serialize(customName)); + } + } } } \ No newline at end of file diff --git a/src/main/java/fr/traqueur/items/items/blockstate/SignStateMeta.java b/src/main/java/fr/traqueur/items/items/blockstate/SignStateMeta.java index 0eff00f..aea144b 100644 --- a/src/main/java/fr/traqueur/items/items/blockstate/SignStateMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockstate/SignStateMeta.java @@ -1,11 +1,13 @@ package fr.traqueur.items.items.blockstate; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockStateMeta; import fr.traqueur.items.api.items.BlockStateMeta; import fr.traqueur.structura.annotations.Options; import fr.traqueur.structura.annotations.defaults.DefaultBool; import fr.traqueur.structura.api.Loadable; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.DyeColor; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; @@ -24,7 +26,7 @@ public record SignStateMeta( @Options(optional = true) SignSideConfig front, @Options(optional = true) SignSideConfig back ) implements BlockStateMeta { - + private static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.legacySection(); @Override public void apply(Player player, Sign sign) { sign.setWaxed(waxed); @@ -51,7 +53,11 @@ private void applySide(SignSide signSide, SignSideConfig config) { for (int i = 0; i < Math.min(config.lines().size(), 4); i++) { Component line = config.lines().get(i); if (line != null) { - signSide.line(i, line); + if(PlatformType.isPaper()) { + signSide.line(i, line); + } else { + signSide.setLine(i, LEGACY_SERIALIZER.serialize(line)); + } } } } diff --git a/src/main/java/fr/traqueur/items/items/blockstate/SkullStateMeta.java b/src/main/java/fr/traqueur/items/items/blockstate/SkullStateMeta.java index 4208f6f..351bc7e 100644 --- a/src/main/java/fr/traqueur/items/items/blockstate/SkullStateMeta.java +++ b/src/main/java/fr/traqueur/items/items/blockstate/SkullStateMeta.java @@ -1,6 +1,7 @@ package fr.traqueur.items.items.blockstate; import com.destroystokyo.paper.profile.PlayerProfile; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.annotations.AutoBlockStateMeta; import fr.traqueur.items.api.items.BlockStateMeta; import fr.traqueur.structura.annotations.Options; @@ -38,7 +39,7 @@ public record SkullStateMeta( @Override public void apply(Player __, Skull skull) { - if (texture != null && !texture.isEmpty()) { + if (texture != null && !texture.isEmpty() && PlatformType.isPaper()) { // Set custom texture via player profile PlayerProfile profile = Bukkit.createProfile(UUID.randomUUID()); profile.getProperties().add(new com.destroystokyo.paper.profile.ProfileProperty( diff --git a/src/main/java/fr/traqueur/items/items/metadata/ArmorStandMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/ArmorStandMetadata.java index 5777189..97f9192 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/ArmorStandMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/ArmorStandMetadata.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable; @AutoMetadata("armor-stand") +@AutoMetadata.PaperMetadata public record ArmorStandMetadata( @Options(optional = true) @DefaultBool(false) boolean invisible, @Options(optional = true) @DefaultBool(false) boolean small, diff --git a/src/main/java/fr/traqueur/items/items/metadata/AxolotBucketMeta.java b/src/main/java/fr/traqueur/items/items/metadata/AxolotBucketMeta.java index 759803b..7bd2704 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/AxolotBucketMeta.java +++ b/src/main/java/fr/traqueur/items/items/metadata/AxolotBucketMeta.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import org.bukkit.entity.Axolotl; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -14,7 +15,7 @@ public record AxolotBucketMeta(Axolotl.Variant variant) implements ItemMetadata @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(AxolotlBucketMeta.class, axolotlBucketMeta -> { + boolean applied = ItemUtil.editMeta(itemStack, AxolotlBucketMeta.class, axolotlBucketMeta -> { axolotlBucketMeta.setVariant(variant); }); if (!applied) { diff --git a/src/main/java/fr/traqueur/items/items/metadata/BannerMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/BannerMetadata.java index 7c94ba6..3e3c857 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/BannerMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/BannerMetadata.java @@ -3,11 +3,8 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.items.settings.models.PatternWrapper; -import fr.traqueur.structura.api.Loadable; -import org.bukkit.DyeColor; -import org.bukkit.block.banner.Pattern; -import org.bukkit.block.banner.PatternType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BannerMeta; @@ -20,7 +17,7 @@ public record BannerMetadata(List patterns) implements ItemMetad @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(BannerMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, BannerMeta.class, meta -> { meta.setPatterns(patterns.stream().map(PatternWrapper::toPattern).toList()); }); if (!applied) { diff --git a/src/main/java/fr/traqueur/items/items/metadata/BlockDataMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/BlockDataMetadata.java index ae19131..2d0e061 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/BlockDataMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/BlockDataMetadata.java @@ -4,6 +4,7 @@ import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.BlockDataMeta; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.structura.annotations.Options; import org.bukkit.Bukkit; import org.bukkit.block.data.BlockData; @@ -37,7 +38,7 @@ public void apply(ItemStack itemStack, @Nullable Player player) { } // Apply BlockData to ItemStack using Spigot's standard API - boolean apply = itemStack.editMeta(org.bukkit.inventory.meta.BlockDataMeta.class, meta -> { + boolean apply = ItemUtil.editMeta(itemStack, org.bukkit.inventory.meta.BlockDataMeta.class, meta -> { meta.setBlockData(blockData); }); diff --git a/src/main/java/fr/traqueur/items/items/metadata/BlockStateMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/BlockStateMetadata.java index da3636e..28a0fbf 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/BlockStateMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/BlockStateMetadata.java @@ -4,6 +4,7 @@ import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.BlockStateMeta; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.structura.annotations.Options; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; @@ -35,7 +36,7 @@ public record BlockStateMetadata( @Override public void apply(ItemStack itemStack, @Nullable Player player) { // Edit the BlockStateMeta of the item - boolean applied = itemStack.editMeta(org.bukkit.inventory.meta.BlockStateMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, org.bukkit.inventory.meta.BlockStateMeta.class, meta -> { BlockState blockState = meta.getBlockState(); // Apply all settings to the BlockState diff --git a/src/main/java/fr/traqueur/items/items/metadata/EnchantStorageMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/EnchantStorageMetadata.java index 6089266..b4987c5 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/EnchantStorageMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/EnchantStorageMetadata.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; import fr.traqueur.items.api.settings.models.EnchantmentWrapper; +import fr.traqueur.items.api.utils.ItemUtil; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.EnchantmentStorageMeta; @@ -15,7 +16,7 @@ public record EnchantStorageMetadata(List enchantments) impl @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(EnchantmentStorageMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, EnchantmentStorageMeta.class, meta -> { for (EnchantmentWrapper enchantment : enchantments) { int level = enchantment.level(); if (level < 1) { diff --git a/src/main/java/fr/traqueur/items/items/metadata/LeatherArmorMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/LeatherArmorMetadata.java index 5c3ca8e..fd169a3 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/LeatherArmorMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/LeatherArmorMetadata.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import org.bukkit.Color; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -20,7 +21,7 @@ public record LeatherArmorMetadata( @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(LeatherArmorMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, LeatherArmorMeta.class, meta -> { meta.setColor(color); }); if (!applied) { diff --git a/src/main/java/fr/traqueur/items/items/metadata/PotionMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/PotionMetadata.java index 9369b23..0d9ed4b 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/PotionMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/PotionMetadata.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.items.settings.models.PotionEffectWrapper; import fr.traqueur.structura.annotations.Options; import org.bukkit.Color; @@ -32,7 +33,7 @@ public record PotionMetadata( @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(PotionMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, PotionMeta.class, meta -> { if (color != null) { meta.setColor(color); } diff --git a/src/main/java/fr/traqueur/items/items/metadata/ToolMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/ToolMetadata.java index 898b6a8..d6d914b 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/ToolMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/ToolMetadata.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import fr.traqueur.structura.annotations.Options; import fr.traqueur.structura.annotations.defaults.DefaultBool; import fr.traqueur.structura.annotations.defaults.DefaultDouble; @@ -12,6 +13,7 @@ import org.bukkit.Tag; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.ToolComponent; import org.jetbrains.annotations.Nullable; @@ -44,7 +46,6 @@ * Discriminator key: "tool" */ @AutoMetadata("tool") -@AutoMetadata.PaperMetadata public record ToolMetadata( @Options(optional = true) @DefaultInt(1) int damagePerBlock, @Options(optional = true) @DefaultDouble(1.0) double defaultMiningSpeed, @@ -55,7 +56,7 @@ public record ToolMetadata( @Override public void apply(ItemStack itemStack, @Nullable Player player) { try { - boolean applied = itemStack.editMeta(meta -> { + boolean applied = ItemUtil.editMeta(itemStack, ItemMeta.class, meta -> { // Get the current tool component or create a new one ToolComponent toolComponent = meta.getTool(); diff --git a/src/main/java/fr/traqueur/items/items/metadata/TrimMetadata.java b/src/main/java/fr/traqueur/items/items/metadata/TrimMetadata.java index e03ac22..affef3c 100644 --- a/src/main/java/fr/traqueur/items/items/metadata/TrimMetadata.java +++ b/src/main/java/fr/traqueur/items/items/metadata/TrimMetadata.java @@ -3,6 +3,7 @@ import fr.traqueur.items.api.Logger; import fr.traqueur.items.api.annotations.AutoMetadata; import fr.traqueur.items.api.items.ItemMetadata; +import fr.traqueur.items.api.utils.ItemUtil; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ArmorMeta; @@ -23,7 +24,7 @@ public record TrimMetadata( @Override public void apply(ItemStack itemStack, @Nullable Player player) { - boolean applied = itemStack.editMeta(ArmorMeta.class, meta -> { + boolean applied = ItemUtil.editMeta(itemStack, ArmorMeta.class, meta -> { ArmorTrim trim = new ArmorTrim(material, pattern); meta.setTrim(trim); }); diff --git a/src/main/java/fr/traqueur/items/listeners/AnvilEffectFusionListener.java b/src/main/java/fr/traqueur/items/listeners/AnvilEffectFusionListener.java index 7a2b350..bf8619b 100644 --- a/src/main/java/fr/traqueur/items/listeners/AnvilEffectFusionListener.java +++ b/src/main/java/fr/traqueur/items/listeners/AnvilEffectFusionListener.java @@ -45,8 +45,8 @@ public AnvilEffectFusionListener(ItemsPlugin plugin) { @EventHandler(priority = EventPriority.HIGHEST) public void onAnvilPrepare(PrepareAnvilEvent event) { AnvilInventory inventory = event.getInventory(); - ItemStack firstItem = inventory.getFirstItem(); - ItemStack secondItem = inventory.getSecondItem(); + ItemStack firstItem = inventory.getItem(0); + ItemStack secondItem = inventory.getItem(1); // If we don't have two items, do nothing if (firstItem == null || secondItem == null || firstItem.getType().isAir() || secondItem.getType().isAir()) { diff --git a/src/main/java/fr/traqueur/items/listeners/DisableEnchantsListener.java b/src/main/java/fr/traqueur/items/listeners/DisableEnchantsListener.java index ee35cee..24e0960 100644 --- a/src/main/java/fr/traqueur/items/listeners/DisableEnchantsListener.java +++ b/src/main/java/fr/traqueur/items/listeners/DisableEnchantsListener.java @@ -67,8 +67,8 @@ private boolean hasDisabledEnchantment(ItemStack itemStack, DisabledEnchantment @EventHandler(priority = EventPriority.HIGH) public void onAnvil(PrepareAnvilEvent event) { AnvilInventory anvilInventory = event.getInventory(); - ItemStack firstItem = anvilInventory.getFirstItem(); - ItemStack secondItem = anvilInventory.getSecondItem(); + ItemStack firstItem = anvilInventory.getItem(0); + ItemStack secondItem = anvilInventory.getItem(1); if (firstItem == null || secondItem == null) { return; diff --git a/src/main/java/fr/traqueur/items/listeners/ItemRestrictionsListener.java b/src/main/java/fr/traqueur/items/listeners/ItemRestrictionsListener.java index 56f122a..2c03819 100644 --- a/src/main/java/fr/traqueur/items/listeners/ItemRestrictionsListener.java +++ b/src/main/java/fr/traqueur/items/listeners/ItemRestrictionsListener.java @@ -45,8 +45,8 @@ public ItemRestrictionsListener(ItemsPlugin plugin) { */ @EventHandler(priority = EventPriority.HIGH) public void onGrindstone(PrepareGrindstoneEvent event) { - ItemStack upperItem = event.getInventory().getUpperItem(); - ItemStack lowerItem = event.getInventory().getLowerItem(); + ItemStack upperItem = event.getInventory().getItem(0); + ItemStack lowerItem = event.getInventory().getItem(1); ItemsManager itemsManager = plugin.getManager(ItemsManager.class); if (itemsManager == null) { @@ -90,8 +90,8 @@ public void onGrindstone(PrepareGrindstoneEvent event) { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onAnvil(PrepareAnvilEvent event) { - ItemStack firstItem = event.getInventory().getFirstItem(); - ItemStack secondItem = event.getInventory().getSecondItem(); + ItemStack firstItem = event.getInventory().getItem(0); + ItemStack secondItem = event.getInventory().getItem(1); // If we don't have two items, do nothing if (firstItem == null || secondItem == null || firstItem.getType().isAir() || secondItem.getType().isAir()) { diff --git a/src/main/java/fr/traqueur/items/settings/readers/EnchantmentReader.java b/src/main/java/fr/traqueur/items/settings/readers/EnchantmentReader.java index d6261ee..42588d6 100644 --- a/src/main/java/fr/traqueur/items/settings/readers/EnchantmentReader.java +++ b/src/main/java/fr/traqueur/items/settings/readers/EnchantmentReader.java @@ -2,9 +2,8 @@ import fr.traqueur.structura.exceptions.StructuraException; import fr.traqueur.structura.readers.Reader; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.enchantments.Enchantment; import java.util.NoSuchElementException; @@ -12,8 +11,9 @@ public class EnchantmentReader implements Reader { @Override public Enchantment read(String s) throws StructuraException { + Registry enchantmentRegistry = Registry.ENCHANTMENT; try { - return RegistryAccess.registryAccess().getRegistry(RegistryKey.ENCHANTMENT).getOrThrow(NamespacedKey.minecraft(s.toLowerCase())); + return enchantmentRegistry.getOrThrow(NamespacedKey.minecraft(s.toLowerCase())); } catch (NoSuchElementException e) { throw new StructuraException("Enchantment " + s + " not found"); } diff --git a/src/main/java/fr/traqueur/items/settings/readers/PatternTypeReader.java b/src/main/java/fr/traqueur/items/settings/readers/PatternTypeReader.java index f84a272..e8e82d7 100644 --- a/src/main/java/fr/traqueur/items/settings/readers/PatternTypeReader.java +++ b/src/main/java/fr/traqueur/items/settings/readers/PatternTypeReader.java @@ -2,14 +2,14 @@ import fr.traqueur.structura.exceptions.StructuraException; import fr.traqueur.structura.readers.Reader; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.block.banner.PatternType; public class PatternTypeReader implements Reader { @Override public PatternType read(String value) throws StructuraException { - return RegistryAccess.registryAccess().getRegistry(RegistryKey.BANNER_PATTERN).getOrThrow(NamespacedKey.minecraft(value.toLowerCase())); + Registry registry = Registry.BANNER_PATTERN; + return registry.getOrThrow(NamespacedKey.minecraft(value.toLowerCase())); } } diff --git a/src/main/java/fr/traqueur/items/settings/readers/SoundReader.java b/src/main/java/fr/traqueur/items/settings/readers/SoundReader.java index 1d668b0..26510fe 100644 --- a/src/main/java/fr/traqueur/items/settings/readers/SoundReader.java +++ b/src/main/java/fr/traqueur/items/settings/readers/SoundReader.java @@ -2,14 +2,13 @@ import fr.traqueur.structura.exceptions.StructuraException; import fr.traqueur.structura.readers.Reader; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.Sound; public class SoundReader implements Reader { @Override public Sound read(String value) throws StructuraException { - return RegistryAccess.registryAccess().getRegistry(RegistryKey.SOUND_EVENT).get(NamespacedKey.fromString(value.toLowerCase())); + return Registry.SOUNDS.getOrThrow(NamespacedKey.fromString(value.toLowerCase())); } } diff --git a/src/main/java/fr/traqueur/items/settings/readers/TrimMaterialReader.java b/src/main/java/fr/traqueur/items/settings/readers/TrimMaterialReader.java index dfb92bf..0701e29 100644 --- a/src/main/java/fr/traqueur/items/settings/readers/TrimMaterialReader.java +++ b/src/main/java/fr/traqueur/items/settings/readers/TrimMaterialReader.java @@ -2,22 +2,13 @@ import fr.traqueur.structura.exceptions.StructuraException; import fr.traqueur.structura.readers.Reader; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.inventory.meta.trim.TrimMaterial; -import java.util.NoSuchElementException; - public class TrimMaterialReader implements Reader { @Override public TrimMaterial read(String s) throws StructuraException { - try { - return RegistryAccess.registryAccess() - .getRegistry(RegistryKey.TRIM_MATERIAL) - .getOrThrow(NamespacedKey.minecraft(s.toLowerCase())); - } catch (NoSuchElementException e) { - throw new StructuraException("Unknown trim material: " + s); - } + return Registry.TRIM_MATERIAL.getOrThrow(NamespacedKey.minecraft(s)); } } \ No newline at end of file diff --git a/src/main/java/fr/traqueur/items/settings/readers/TrimPatternReader.java b/src/main/java/fr/traqueur/items/settings/readers/TrimPatternReader.java index 36b3862..170b09f 100644 --- a/src/main/java/fr/traqueur/items/settings/readers/TrimPatternReader.java +++ b/src/main/java/fr/traqueur/items/settings/readers/TrimPatternReader.java @@ -2,9 +2,8 @@ import fr.traqueur.structura.exceptions.StructuraException; import fr.traqueur.structura.readers.Reader; -import io.papermc.paper.registry.RegistryAccess; -import io.papermc.paper.registry.RegistryKey; import org.bukkit.NamespacedKey; +import org.bukkit.Registry; import org.bukkit.inventory.meta.trim.TrimPattern; import java.util.NoSuchElementException; @@ -13,9 +12,7 @@ public class TrimPatternReader implements Reader { @Override public TrimPattern read(String s) throws StructuraException { try { - return RegistryAccess.registryAccess() - .getRegistry(RegistryKey.TRIM_PATTERN) - .getOrThrow(NamespacedKey.minecraft(s.toLowerCase())); + return Registry.TRIM_PATTERN.getOrThrow(NamespacedKey.minecraft(s.toLowerCase())); } catch (NoSuchElementException e) { throw new StructuraException("Unknown trim pattern: " + s); } diff --git a/src/main/java/fr/traqueur/items/utils/AttributeUtil.java b/src/main/java/fr/traqueur/items/utils/AttributeUtil.java index 4d9eb33..21cffb7 100644 --- a/src/main/java/fr/traqueur/items/utils/AttributeUtil.java +++ b/src/main/java/fr/traqueur/items/utils/AttributeUtil.java @@ -1,17 +1,22 @@ package fr.traqueur.items.utils; -import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.ItemsPlugin; +import fr.traqueur.items.api.PlatformType; import fr.traqueur.items.api.settings.models.AttributeMergeStrategy; import fr.traqueur.items.api.settings.models.AttributeWrapper; +import fr.traqueur.items.api.utils.ItemUtil; import io.papermc.paper.datacomponent.DataComponentTypes; import io.papermc.paper.datacomponent.item.ItemAttributeModifiers; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; import org.bukkit.inventory.EquipmentSlotGroup; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -93,7 +98,7 @@ public static void applyAttributesModern(ItemStack itemStack, List attributes, ItemsPlugin plugin, AttributeMergeStrategy strategy) { - itemStack.editMeta(meta -> { + ItemUtil.editMeta(itemStack, ItemMeta.class, meta -> { // Get existing modifiers List existingEntries = new ArrayList<>(); if (meta.hasAttributeModifiers()) { diff --git a/src/main/java/fr/traqueur/items/utils/ChunkUtil.java b/src/main/java/fr/traqueur/items/utils/ChunkUtil.java new file mode 100644 index 0000000..86f87fe --- /dev/null +++ b/src/main/java/fr/traqueur/items/utils/ChunkUtil.java @@ -0,0 +1,18 @@ +package fr.traqueur.items.utils; + +import org.bukkit.Chunk; + +public class ChunkUtil { + + /** + * Utility Class for chunk key + */ + private ChunkUtil() { + //Utility Class + } + + public static long getChunkKey(Chunk chunk) { + return (long) chunk.getX() & 0xffffffffL | ((long) chunk.getZ() & 0xffffffffL) << 32; + } + +} From 87bed29766ac577c9a864095fde53894e1d6a027 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Sat, 6 Dec 2025 15:38:20 +0100 Subject: [PATCH 4/7] feat: finish english translation --- .../items/blocks/example_advanced_crafter.yml | 20 ++++++++--------- .../items/blocks/example_ancient_portal.yml | 20 ++++++++--------- .../items/blocks/example_berry_vines.yml | 20 ++++++++--------- .../items/blocks/example_birthday_cake.yml | 16 +++++++------- .../items/blocks/example_charged_anchor.yml | 14 ++++++------ .../items/blocks/example_dragon_egg_nest.yml | 18 +++++++-------- .../items/blocks/example_eternal_campfire.yml | 22 +++++++++---------- .../items/blocks/example_ice_dripstone.yml | 20 ++++++++--------- .../blocks/example_musical_noteblock.yml | 12 +++++----- .../items/blocks/example_pink_garden.yml | 18 +++++++-------- .../items/blocks/example_rainbow_candles.yml | 16 +++++++------- .../items/blocks/example_sculk_alarm.yml | 22 +++++++++---------- .../blocks/example_sea_pickle_colony.yml | 20 ++++++++--------- .../blocks/example_supercharged_redstone.yml | 18 +++++++-------- .../blocks/example_ultimate_farmland.yml | 20 ++++++++--------- 15 files changed, 138 insertions(+), 138 deletions(-) diff --git a/src/main/resources/items/blocks/example_advanced_crafter.yml b/src/main/resources/items/blocks/example_advanced_crafter.yml index 9a56439..e26ec08 100644 --- a/src/main/resources/items/blocks/example_advanced_crafter.yml +++ b/src/main/resources/items/blocks/example_advanced_crafter.yml @@ -1,19 +1,19 @@ -# Advanced Auto-Crafter - Crafter automatique amélioré +# Advanced Auto-Crafter - Enhanced automatic crafter id: "advanced_autocrafter" material: CRAFTER -display-name: "⚙ Auto-Crafter Avancé" +display-name: "⚙ Advanced Auto-Crafter" lore: - - "Un crafter automatique de haute technologie" + - "A high-tech automatic crafter" - "" - - "⚙ Fonctionnalités:" - - " • Déclenchement immédiat" - - " • Circuit intégré activé" - - " • Craft ultra-rapide" + - "⚙ Features:" + - " • Instant triggering" + - " • Integrated circuit enabled" + - " • Ultra-fast crafting" - "" - - "🔧 Technologie: Redstone Quantique" + - "🔧 Technology: Quantum Redstone" - "" - - "Compatible avec tous les systèmes de redstone" - - "Vitesse: 10x plus rapide" + - "Compatible with all redstone systems" + - "Speed: 10x faster" custom-model-data: 3010 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_ancient_portal.yml b/src/main/resources/items/blocks/example_ancient_portal.yml index 699e798..5221fcd 100644 --- a/src/main/resources/items/blocks/example_ancient_portal.yml +++ b/src/main/resources/items/blocks/example_ancient_portal.yml @@ -1,19 +1,19 @@ -# Ancient End Portal Frame - Portail de l'End avec œil pré-inséré +# Ancient End Portal Frame - End portal with pre-inserted eye id: "ancient_portal_frame" material: END_PORTAL_FRAME -display-name: "👁 Cadre de Portail Ancien" +display-name: "👁 Ancient Portal Frame" lore: - - "Un morceau ancien du portail de l'End" + - "An ancient piece of the End portal" - "" - - "👁 État:" - - " • Œil d'Ender déjà inséré" - - " • Activé et prêt" - - " • Énergie dimensionnelle stable" + - "👁 Status:" + - " • Eye of Ender already inserted" + - " • Activated and ready" + - " • Stable dimensional energy" - "" - - "🌟 Trouvé dans les ruines anciennes" + - "🌟 Found in ancient ruins" - "" - - "Collection: Artefacts de l'End" - - "Légendaire" + - "Collection: End Artifacts" + - "Legendary" custom-model-data: 3007 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_berry_vines.yml b/src/main/resources/items/blocks/example_berry_vines.yml index fd70f83..dd87967 100644 --- a/src/main/resources/items/blocks/example_berry_vines.yml +++ b/src/main/resources/items/blocks/example_berry_vines.yml @@ -1,19 +1,19 @@ -# Glowing Berry Vines - Lianes avec baies lumineuses +# Glowing Berry Vines - Vines with glowing berries id: "glowing_berry_vines" material: CAVE_VINES -display-name: "🫐 Lianes Lumineuses Chargées" +display-name: "🫐 Charged Glowing Vines" lore: - - "Des lianes de caverne pleines de baies" + - "Cave vines full of berries" - "" - - "🫐 Propriétés:" - - " • Baies mûres et prêtes" - - " • Émet une douce lumière" - - " • Harvest instantané" + - "🫐 Properties:" + - " • Ripe and ready berries" + - " • Emits soft light" + - " • Instant harvest" - "" - - "✨ Parfaites pour décorer les caves!" + - "✨ Perfect for decorating caves!" - "" - - "Clic droit pour récolter les baies" - - "Se régénère lentement" + - "Right-click to harvest berries" + - "Regenerates slowly" custom-model-data: 3008 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_birthday_cake.yml b/src/main/resources/items/blocks/example_birthday_cake.yml index 784ef3c..0eb6394 100644 --- a/src/main/resources/items/blocks/example_birthday_cake.yml +++ b/src/main/resources/items/blocks/example_birthday_cake.yml @@ -1,18 +1,18 @@ -# Birthday Cake - Un gâteau d'anniversaire magique qui se régénère +# Birthday Cake - A magical birthday cake that regenerates id: "birthday_cake" material: CAKE -display-name: "🎂 Gâteau d'Anniversaire Magique" +display-name: "🎂 Magical Birthday Cake" lore: - - "Un délicieux gâteau qui ne finit jamais..." + - "A delicious cake that never ends..." - "" - - "✨ Propriétés magiques:" - - " • Toujours 3 parts disponibles" - - " • Régénération instantanée" + - "✨ Magical properties:" + - " • Always 3 slices available" + - " • Instant regeneration" - "" - - "🎉 Parfait pour les fêtes!" + - "🎉 Perfect for parties!" custom-model-data: 3001 metadata: block-data: settings: cake: - bites: 3 # Déjà mangé 3 fois sur 6 + bites: 3 # Already eaten 3 times out of 6 diff --git a/src/main/resources/items/blocks/example_charged_anchor.yml b/src/main/resources/items/blocks/example_charged_anchor.yml index 8ab1857..bc7b6d1 100644 --- a/src/main/resources/items/blocks/example_charged_anchor.yml +++ b/src/main/resources/items/blocks/example_charged_anchor.yml @@ -1,17 +1,17 @@ -# Respawn Anchor - Ancre de respawn pré-chargée +# Respawn Anchor - Pre-charged respawn anchor id: "charged_respawn_anchor" material: RESPAWN_ANCHOR -display-name: "⚡ Ancre de Respawn Chargée" +display-name: "⚡ Charged Respawn Anchor" lore: - - "Une ancre dimensionnelle déjà chargée" + - "A pre-charged dimensional anchor" - "" - "⚡ Charges:" - - " • 4/4 charges de glowstone" - - " • Prêt à l'utilisation immédiate" + - " • 4/4 glowstone charges" + - " • Ready for immediate use" - "" - - "🌟 Parfait pour les explorateurs du Nether!" + - "🌟 Perfect for Nether explorers!" - "" - - "Place-le pour définir ton point de respawn" + - "Place it to set your respawn point" custom-model-data: 3002 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_dragon_egg_nest.yml b/src/main/resources/items/blocks/example_dragon_egg_nest.yml index c34c9d5..570c5ff 100644 --- a/src/main/resources/items/blocks/example_dragon_egg_nest.yml +++ b/src/main/resources/items/blocks/example_dragon_egg_nest.yml @@ -1,19 +1,19 @@ -# Dragon Egg Nest - Nid d'œufs de tortue prêt à éclore +# Dragon Egg Nest - Turtle egg nest ready to hatch id: "dragon_egg_nest" material: TURTLE_EGG -display-name: "🥚 Nid d'Œufs Enchantés" +display-name: "🥚 Enchanted Egg Nest" lore: - - "Un nid contenant de précieux œufs" + - "A nest containing precious eggs" - "" - "🥚 Configuration:" - - " • 4 œufs empilés" - - " • Prêts à éclore" - - " • Protection magique" + - " • 4 stacked eggs" + - " • Ready to hatch" + - " • Magical protection" - "" - - "🐢 Créatures à naître: Tortues Marines" + - "🐢 Creatures to be born: Sea Turtles" - "" - - "Place-les près de l'eau pour l'éclosion" - - "Temps d'éclosion réduit de 50%" + - "Place near water for hatching" + - "Hatching time reduced by 50%" custom-model-data: 3009 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_eternal_campfire.yml b/src/main/resources/items/blocks/example_eternal_campfire.yml index f932db7..4cb95f5 100644 --- a/src/main/resources/items/blocks/example_eternal_campfire.yml +++ b/src/main/resources/items/blocks/example_eternal_campfire.yml @@ -1,22 +1,22 @@ -# Eternal Campfire - Feu de camp éternel qui ne produit pas de fumée +# Eternal Campfire - Eternal campfire that produces no smoke id: "eternal_campfire" material: CAMPFIRE -display-name: "🔥 Feu de Camp Éternel" +display-name: "🔥 Eternal Campfire" lore: - - "Un feu qui brûle sans fin, sans fumée" + - "A fire that burns endlessly, without smoke" - "" - - "🔥 Propriétés:" - - " • Toujours allumé" - - " • Aucune fumée" - - " • Cuisines 4x plus vite" + - "🔥 Properties:" + - " • Always lit" + - " • No smoke" + - " • Cooks 4x faster" - "" - - "✨ Parfait pour les camps de base!" + - "✨ Perfect for base camps!" - "" - - "Ne nécessite aucun combustible" + - "Requires no fuel" custom-model-data: 3004 metadata: block-data: settings: campfire: - lit: true # Toujours allumé - signal-fire: false # Pas de fumée + lit: true # Always lit + signal-fire: false # No smoke diff --git a/src/main/resources/items/blocks/example_ice_dripstone.yml b/src/main/resources/items/blocks/example_ice_dripstone.yml index cb507c9..f9930cd 100644 --- a/src/main/resources/items/blocks/example_ice_dripstone.yml +++ b/src/main/resources/items/blocks/example_ice_dripstone.yml @@ -1,19 +1,19 @@ -# Frozen Dripstone - Stalactite de glace massive +# Frozen Dripstone - Massive ice stalactite id: "frozen_dripstone" material: POINTED_DRIPSTONE -display-name: "🧊 Stalactite de Glace" +display-name: "🧊 Ice Stalactite" lore: - - "Une formation de glace ancienne" + - "An ancient ice formation" - "" - - "🧊 Caractéristiques:" - - " • Épaisseur: THICK (Massive)" - - " • Direction: Vers le bas" - - " • Glace millénaire" + - "🧊 Characteristics:" + - " • Thickness: THICK (Massive)" + - " • Direction: Downward" + - " • Millennial ice" - "" - - "❄ Découvert dans les cavernes gelées" + - "❄ Discovered in frozen caverns" - "" - - "Danger: Peut tomber et causer des dégâts!" - - "Inflige 6 points de dégâts en tombant" + - "Danger: Can fall and cause damage!" + - "Inflicts 6 damage points when falling" custom-model-data: 3012 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_musical_noteblock.yml b/src/main/resources/items/blocks/example_musical_noteblock.yml index 4e9d270..d1c08eb 100644 --- a/src/main/resources/items/blocks/example_musical_noteblock.yml +++ b/src/main/resources/items/blocks/example_musical_noteblock.yml @@ -1,17 +1,17 @@ -# Musical Note Block - Note block pré-configuré pour jouer une note spécifique +# Musical Note Block - Pre-configured note block to play a specific note id: "musical_noteblock_epic" material: NOTE_BLOCK -display-name: "🎵 Note Block - Accord Épique" +display-name: "🎵 Note Block - Epic Chord" lore: - - "Un bloc musical accordé parfaitement" + - "A perfectly tuned musical block" - "" - "🎵 Configuration:" - " • Instrument: PIANO" - - " • Note: Do aigu (Note 12)" + - " • Note: High C (Note 12)" - "" - - "🎼 Créé par le Maestro dimensionnel" + - "🎼 Created by the dimensional Maestro" - "" - - "Clic droit pour écouter la magie!" + - "Right-click to hear the magic!" custom-model-data: 3003 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_pink_garden.yml b/src/main/resources/items/blocks/example_pink_garden.yml index 13a2c4e..f8780e5 100644 --- a/src/main/resources/items/blocks/example_pink_garden.yml +++ b/src/main/resources/items/blocks/example_pink_garden.yml @@ -1,19 +1,19 @@ -# Pink Petals Garden - Jardin complet de pétales roses +# Pink Petals Garden - Complete pink petals garden id: "pink_garden_complete" material: PINK_PETALS -display-name: "🌸 Jardin de Pétales Roses" +display-name: "🌸 Pink Petals Garden" lore: - - "Un magnifique arrangement floral complet" + - "A beautiful complete floral arrangement" - "" - "🌸 Composition:" - - " • 4 fleurs roses (maximum)" - - " • Disposition harmonieuse" - - " • Parfum enchanteur" + - " • 4 pink flowers (maximum)" + - " • Harmonious arrangement" + - " • Enchanting fragrance" - "" - - "✨ Collection: Jardins Enchantés" + - "✨ Collection: Enchanted Gardens" - "" - - "Parfait pour décorer les sentiers" - - "Attire les abeilles et papillons" + - "Perfect for decorating pathways" + - "Attracts bees and butterflies" custom-model-data: 3011 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_rainbow_candles.yml b/src/main/resources/items/blocks/example_rainbow_candles.yml index 9270ca1..9bfae1e 100644 --- a/src/main/resources/items/blocks/example_rainbow_candles.yml +++ b/src/main/resources/items/blocks/example_rainbow_candles.yml @@ -1,18 +1,18 @@ -# Rainbow Candles - Bougies arc-en-ciel empilées +# Rainbow Candles - Stacked rainbow candles id: "rainbow_candles" material: CANDLE -display-name: "🕯 Bougies Arc-en-ciel" +display-name: "🕯 Rainbow Candles" lore: - - "Un arrangement magique de bougies colorées" + - "A magical arrangement of colorful candles" - "" - "🕯 Configuration:" - - " • 4 bougies empilées" - - " • Allumées et prêtes" - - " • Éclairage maximal" + - " • 4 stacked candles" + - " • Lit and ready" + - " • Maximum lighting" - "" - - "✨ Crée une ambiance festive!" + - "✨ Creates a festive atmosphere!" - "" - - "Parfait pour les décorations d'événements" + - "Perfect for event decorations" custom-model-data: 3005 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_sculk_alarm.yml b/src/main/resources/items/blocks/example_sculk_alarm.yml index 03c6f38..c5f8662 100644 --- a/src/main/resources/items/blocks/example_sculk_alarm.yml +++ b/src/main/resources/items/blocks/example_sculk_alarm.yml @@ -1,20 +1,20 @@ -# Sculk Alarm System - Système d'alarme Sculk sophistiqué +# Sculk Alarm System - Sophisticated Sculk alarm system id: "sculk_alarm_system" material: SCULK_SHRIEKER -display-name: "🔊 Système d'Alarme Sculk" +display-name: "🔊 Sculk Alarm System" lore: - - "Un système de sécurité dimensionnel" + - "A dimensional security system" - "" - - "🔊 Fonctionnalités:" - - " • Mode alerte activé" - - " • Peut invoquer le Warden" - - " • Détection de mouvement" + - "🔊 Features:" + - " • Alert mode activated" + - " • Can summon the Warden" + - " • Motion detection" - "" - - "⚠ DANGER: Extrêmement sensible" + - "⚠ DANGER: Extremely sensitive" - "" - - "Invoque le Warden après 3 déclenchements" - - "Portée de détection: 16 blocs" - - "Technologie: Sculpture Ancienne" + - "Summons the Warden after 3 triggers" + - "Detection range: 16 blocks" + - "Technology: Ancient Sculk" custom-model-data: 3015 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_sea_pickle_colony.yml b/src/main/resources/items/blocks/example_sea_pickle_colony.yml index 14c7dae..2d67bbc 100644 --- a/src/main/resources/items/blocks/example_sea_pickle_colony.yml +++ b/src/main/resources/items/blocks/example_sea_pickle_colony.yml @@ -1,20 +1,20 @@ -# Sea Pickle Colony - Colonie complète de cornichons de mer +# Sea Pickle Colony - Complete sea pickle colony id: "sea_pickle_colony" material: SEA_PICKLE -display-name: "🥒 Colonie de Cornichons Marins" +display-name: "🥒 Sea Pickle Colony" lore: - - "Une colonie florissante de pickles lumineux" + - "A thriving colony of glowing pickles" - "" - "🥒 Composition:" - - " • 4 cornichons (colonie complète)" - - " • Lumière sous-marine maximale" - - " • Écosystème stable" + - " • 4 pickles (complete colony)" + - " • Maximum underwater light" + - " • Stable ecosystem" - "" - - "🌊 Récolté dans les récifs coralliens" + - "🌊 Harvested from coral reefs" - "" - - "Émet une lumière verte apaisante" - - "Fonctionne uniquement sous l'eau" - - "Niveau de lumière: 15 (max)" + - "Emits a soothing green light" + - "Only works underwater" + - "Light level: 15 (max)" custom-model-data: 3014 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_supercharged_redstone.yml b/src/main/resources/items/blocks/example_supercharged_redstone.yml index 22d78c0..8b0f798 100644 --- a/src/main/resources/items/blocks/example_supercharged_redstone.yml +++ b/src/main/resources/items/blocks/example_supercharged_redstone.yml @@ -1,18 +1,18 @@ -# Supercharged Comparator - Comparateur de redstone surpuissant +# Supercharged Comparator - Supercharged redstone comparator id: "supercharged_comparator" material: COMPARATOR -display-name: "⚡ Comparateur Surpuissant" +display-name: "⚡ Supercharged Comparator" lore: - - "Un comparateur modifié par la magie rouge" + - "A comparator modified by red magic" - "" - - "⚡ Caractéristiques:" - - " • Puissance maximale (15/15)" - - " • Mode soustracteur" - - " • Surcharge arcanique" + - "⚡ Characteristics:" + - " • Maximum power (15/15)" + - " • Subtract mode" + - " • Arcane overcharge" - "" - - "🔧 Pour les maîtres de la redstone" + - "🔧 For redstone masters" - "" - - "Attention: Peut causer des explosions dimensionnelles" + - "Warning: May cause dimensional explosions" custom-model-data: 3006 metadata: block-data: diff --git a/src/main/resources/items/blocks/example_ultimate_farmland.yml b/src/main/resources/items/blocks/example_ultimate_farmland.yml index 1aeb656..281e689 100644 --- a/src/main/resources/items/blocks/example_ultimate_farmland.yml +++ b/src/main/resources/items/blocks/example_ultimate_farmland.yml @@ -1,19 +1,19 @@ -# Ultimate Farmland - Terre agricole ultra-hydratée +# Ultimate Farmland - Ultra-hydrated farmland id: "ultimate_farmland" material: FARMLAND -display-name: "🌾 Terre Agricole Divine" +display-name: "🌾 Divine Farmland" lore: - - "Une terre agricole bénie par les dieux" + - "Farmland blessed by the gods" - "" - - "🌾 Propriétés:" - - " • Hydratation maximale (7/7)" - - " • Croissance 3x plus rapide" - - " • Ne peut jamais se dessécher" + - "🌾 Properties:" + - " • Maximum hydration (7/7)" + - " • 3x faster growth" + - " • Can never dry out" - "" - - "✨ Bénédiction de la Déesse des Moissons" + - "✨ Blessing of the Harvest Goddess" - "" - - "Les cultures ne peuvent jamais être piétinées" - - "Parfait pour les méga-fermes" + - "Crops can never be trampled" + - "Perfect for mega-farms" custom-model-data: 3013 metadata: block-data: From 8fadd4ee60180dca799c239c4f6237b75a16c7d7 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Mon, 8 Dec 2025 11:21:40 +0100 Subject: [PATCH 5/7] feat: market.md --- MARKET.md | 336 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 MARKET.md diff --git a/MARKET.md b/MARKET.md new file mode 100644 index 0000000..de442f8 --- /dev/null +++ b/MARKET.md @@ -0,0 +1,336 @@ +# ⚔️ zItems + +[![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)](https://github.com/GroupeZ-dev/zItems) +[![Minecraft](https://img.shields.io/badge/minecraft-1.21+-green.svg)](https://www.spigotmc.org/) +[![Java](https://img.shields.io/badge/java-21-orange.svg)](https://www.oracle.com/java/) +[![License](https://img.shields.io/badge/license-All%20Rights%20Reserved-red.svg)](https://groupez.dev) + +A modern, extensible Minecraft plugin for creating advanced custom items with powerful effects and seamless third-party integrations. + +## 📋 Description + +**zItems** revolutionizes custom item creation on your Minecraft server. Built with cutting-edge Java 21 architecture, create unique tools, weapons, and armor with powerful effects like 3D area mining, automatic selling, advanced farming, and much more. Transform your server rewards, crate items, and donation perks into truly legendary gear! + +## 🎬 Showcase + +> **Note:** GIFs are demonstrations of the plugin's capabilities in action! + +### Hammer Effect - 3x3 Area Mining +Watch as players mine entire areas at once with the powerful Hammer effect. Configurable dimensions and material filters make it perfect for any mining scenario. + +![Hammer Mining](https://img.groupez.dev/zitems/hammer-mining.gif) + +### Vein Miner - Instant Ore Vein Mining +Mine an entire ore vein with a single break! The Vein Miner effect intelligently detects connected ores and mines them all at once. + +![Vein Miner](https://img.groupez.dev/zitems/vein-miner.gif) + +### Farming Hoe - Auto-Harvest & Replant +Revolutionary farming with auto-harvest, auto-replant, and area tilling. Perfect for farming servers and automated agriculture! + +![Farming Hoe](https://img.groupez.dev/zitems/farming-hoe.gif) + +### Effect Application - Smithing Table +Apply effects to items using the vanilla Smithing Table. Familiar mechanics for your players with full customization! + +![Smithing Table Application](https://img.groupez.dev/zitems/smithing-application.gif) + +### Effect Application - Custom GUI +Advanced applicator with ingredient requirements. Create progression systems where players need rare materials to upgrade their gear! + +![Custom GUI Application](https://img.groupez.dev/zitems/custom-applicator.gif) + +### Auto-Sell Effect +Automatically sell mined blocks and drops! Perfect for prison and economy servers. Watch the money roll in as you mine! + +![Auto-Sell](https://img.groupez.dev/zitems/auto-sell.gif) + +### Silk Spawner Effect +Mine spawners and keep them as items! Compatible with all mob types and custom block providers. + +![Silk Spawner](https://img.groupez.dev/zitems/silk-spawner.gif) + +### Beautiful Effect Display +Dynamic lore showing effects with full visibility control. Use gradients and MiniMessage formatting for stunning item descriptions! + +![Effect Lore Display](https://img.groupez.dev/zitems/effect-lore.gif) + +### Full Video Showcase +See all features in action with our comprehensive video tutorial! + +[![zItems Showcase](https://img.youtube.com/vi/VIDEO_ID/maxresdefault.jpg)](https://youtube.com/watch?v=VIDEO_ID) + +## ✨ Key Features + +- **⚡ 16+ Powerful Effects** - Hammer, Vein Mining, Auto-Sell, Farming Hoe, Silk Spawners, XP Boost, and more +- **🎨 Complete Item Customization** - Names, lore, enchantments, attributes, armor trims, leather colors, potions, food metadata +- **🔧 Effect Application System** - Apply effects via Smithing Table or custom ingredient-based GUI +- **💎 Smart Effect Display** - Dynamic lore with full visibility control for base and additional effects +- **📦 Recipe System** - Create custom crafting recipes (shaped/shapeless) with vanilla or custom ingredients +- **🔗 11 Plugin Integrations** - Jobs, WorldGuard, ItemsAdder, Nexo, Oraxen, shops, and more +- **🎮 Beautiful GUIs** - Powered by zMenu for stunning inventory interfaces +- **⚙️ Hot Reload** - Update configurations without restarting your server +- **🚀 Modern Architecture** - Java 21, efficient PDC storage, Folia support + +## ⚔️ Built-in Effects + +### ⛏️ Mining & Harvesting + +| Effect | Description | +|------------------|-------------------------------------------------------------------| +| **HAMMER** | Mine in configurable 3D areas (e.g., 3x3x3) with material filters | +| **VEIN_MINING** | Mine entire ore veins at once with block limit control | +| **MELT_MINING** | Auto-smelt ores while mining (instant furnace processing) | +| **SILK_SPAWNER** | Mine spawners and keep them as items with mob type | +| **FARMING_HOE** | Auto-harvest, auto-replant, area tilling, and seed planting | +| **ABSORPTION** | Auto-pickup drops directly to inventory | + +### 💰 Economy & Progression + +| Effect | Description | +|---------------------|-------------------------------------------------------| +| **AUTO_SELL** | Auto-sell drops with configurable price multiplier | +| **SELL_STICK** | Right-click containers to sell all contents | +| **XP_BOOST** | Multiply XP gained with configurable boost and chance | +| **JOB_XP_BOOST** | Boost Jobs/ZJobs plugin XP earnings | +| **JOB_MONEY_BOOST** | Boost Jobs/ZJobs plugin money earnings | + +### 🛡️ Item Enhancement + +| Effect | Description | +|---------------------------|-----------------------------------------------------------------------------| +| **ATTRIBUTES_APPLICATOR** | Apply custom attributes (attack damage, speed, armor, movement speed, etc.) | +| **ENCHANTS_APPLICATOR** | Apply enchantments with level control and increase/decrease evolution | +| **UNBREAKABLE** | Make items unbreakable - perfect for rewards | +| **INFINITE_BUCKET** | Never-ending water and lava buckets | + +## 🎁 Item Customization + +**Everything You Need:** + +- **Display**: Custom names with gradients, hex colors, multi-line lore, custom model data, max stack size +- **Enchantments**: Any enchantment at any level with hide flag support +- **Attributes**: Custom attributes with 5 merge strategies (REPLACE, ADD, KEEP_HIGHEST, KEEP_LOWEST, SUM) +- **Armor**: Leather dyeing (hex colors), armor trims (any material/pattern) +- **Potions**: Custom colors, base types, multiple effects with duration/amplifier +- **Food**: Custom nutrition, saturation, eat duration, potion effects on consumption (Paper only) +- **Recipes**: Create shaped or shapeless crafting recipes with custom ingredients + +## 🔧 Effect Representation + +Transform effects into **tradeable items** that players can obtain, trade, and apply! + +**Two Application Methods:** + +- **Smithing Table**: Use vanilla mechanics - familiar and simple +- **Custom Applicator GUI**: Require specific ingredients for advanced effects + +**Perfect For:** +- Server rewards and achievements +- Donation perks and crate items +- Player-driven economy +- Progression systems + +**Example:** +```yaml +representation: + material: EMERALD + display-name: "⛏ Vein Miner Crystal" + applicator-type: SMITHING_TABLE + applicable-materials: + - DIAMOND_PICKAXE + - NETHERITE_PICKAXE +``` + +## 🔗 Plugin Integrations + +**11 Automatic Integrations** - No configuration needed! + +| Plugin | Type | Features | +|------------------------------------------|---------------|--------------------------------------------------| +| **Jobs / ZJobs** | Economy | XP/Money boost effects | +| **ItemsAdder / Nexo / Oraxen** | Custom Blocks | Auto-detect custom blocks for Hammer/Vein Mining | +| **WorldGuard / SuperiorSkyBlock2** | Protection | Respect region/island permissions | +| **PlaceholderAPI** | Placeholders | Use in messages and configs | +| **EconomyShopGUI / ShopGUIPlus / ZShop** | Shops | Auto-sell integration | + +## 🎮 Commands + +| Command | Description | +|--------------------------------------------------|------------------------------------| +| `/zitems give [amount]` | Give custom item to player | +| `/zitems apply ` | Apply effect to player's held item | +| `/zitems effect give [amount]` | Give effect as tradeable item | +| `/zitems effect view` | View effects on held item | +| `/zitems gui` | Open zItems GUI | +| `/zitems reload` | Reload all configurations | + +**Aliases:** `/zit`, `/zitem` + +## ⚙️ Configuration Examples + +### Powerful Mining Pickaxe + +```yaml +id: "super_pickaxe" +material: DIAMOND_PICKAXE +display-name: "⛏ Legendary Pickaxe" +lore: + - "A pickaxe imbued with incredible power" + - "" + - "• Mines in 3x3 areas" + - "• Auto-smelts ores" + - "• 200% XP gain" + +effects: + - super_hammer + - auto_smelt_pickaxe + - xp_boost_pickaxe + +enchantments: + - enchantment: efficiency + level: 5 + - enchantment: fortune + level: 3 + +unbreakable: true +``` + +### Custom Armor with Attributes + +```yaml +id: "ruby_chestplate" +material: LEATHER_CHESTPLATE +display-name: "💎 Ruby Chestplate" + +enchantments: + - enchantment: protection + level: 5 + +attributes: + - attribute: armor + operation: ADD_NUMBER + amount: 10.0 + slot: CHEST + - attribute: movement_speed + operation: ADD_SCALAR + amount: 0.2 # +20% speed + slot: CHEST + +attribute-merge-strategy: SUM + +metadata: + leather-armor: + color: "#FF0000" + trim: + material: DIAMOND + pattern: VEX +``` + +### Tradeable Effect Item + +```yaml +id: "vein_miner_effect" +type: "VEIN_MINING" +display-name: "⛏ VEIN MINING" + +representation: + material: EMERALD + display-name: "⛏ Vein Miner Crystal" + applicator-type: SMITHING_TABLE + applicable-materials: + - DIAMOND_PICKAXE + - NETHERITE_PICKAXE + +materials: + - COAL_ORE + - IRON_ORE + - DIAMOND_ORE + - EMERALD_ORE + +block-limit: 64 +``` + +## 📦 Requirements + +- **Server**: Paper or Spigot 1.21.5+ +- **Java**: Version 21+ +- **Required**: [zMenu](https://www.spigotmc.org/resources/zmenu.109103/) + +**Optional**: Jobs, PlaceholderAPI, WorldGuard, SuperiorSkyBlock2, ItemsAdder, Nexo, Oraxen, shop plugins + +## 🚀 Quick Start + +1. Download **zItems** and **zMenu** +2. Place both JARs in `plugins/` folder +3. Restart server +4. Edit configs in `plugins/zItems/`: + - `items/*.yml` - Your custom items + - `effects/*.yml` - Reusable effect templates + - `messages.yml` - Customize all messages +5. Use `/zitems reload` to apply changes +6. Give items: `/zitems give ` + +## 💡 Why Choose zItems? + +✅ **Easy to Use** - YAML configuration with extensive examples +✅ **Extremely Powerful** - 16+ effects with unlimited combinations +✅ **Well Integrated** - Works with 11 popular plugins automatically +✅ **Performance Optimized** - Modern Java 21 architecture, efficient PDC storage +✅ **Beautiful** - MiniMessage formatting with gradients and hex colors +✅ **Flexible** - Complete control over visibility, applicability, and behavior +✅ **Production Ready** - Folia support, hot reload, actively maintained + +## 🎯 Perfect For + +- 🏆 **Server Rewards** - Achievement and milestone rewards +- 💎 **Donation Perks** - Exclusive custom tools for supporters +- 🎁 **Crate Items** - Exciting rewards for your crates +- ⚔️ **RPG Servers** - Custom weapons and armor with unique abilities +- 🏭 **Prison Servers** - Progressive mining tools with auto-sell +- 🌾 **Farming Servers** - Advanced farming automation +- 🏝️ **Skyblock Servers** - Custom progression and tools +- 🎮 **Survival Servers** - Enhanced vanilla gameplay + +## 🎓 Developer API + +Create custom effects with our annotation-driven API: + +```java +@AutoEffect("MY_CUSTOM_EFFECT") +public class MyEffect implements EffectHandler.SingleEventEffectHandler { + @Override + public void handle(EffectContext context, MySettings settings, BlockBreakEvent event) { + // Your effect logic + context.addDrops(event.getBlock().getDrops()); + context.breakBlock(event.getBlock()); + } +} +``` + +**Maven Dependency:** +```xml + + fr.traqueur + zItems-api + 1.0.0 + +``` + +## 🤝 Support & Links + +- **Website**: [groupez.dev](https://groupez.dev) +- **Author**: Traqueur_ +- **Documentation**: [GitHub Repository](https://github.com/GroupeZ-dev/zItems) +- **Issues**: [GitHub Issues](https://github.com/GroupeZ-dev/zItems/issues) +- **Discord**: Join our community for support + +--- + +**Ready to transform your server's item system?** + +Download now and start creating legendary items that your players will love! ⚔️ + +--- + +Developed with ❤️ by [Traqueur_](https://groupez.dev) \ No newline at end of file From dc2fba1db0a82c9b67d368bc3501e911c3119d97 Mon Sep 17 00:00:00 2001 From: Maxlego08 Date: Mon, 22 Dec 2025 19:04:30 +0100 Subject: [PATCH 6/7] :memo: build --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ae38883..314e376 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Build Action on: push: - branches: [ main, develop ] + branches: [ main, develop, feat/modernize ] pull_request: types: [ opened, synchronize, reopened ] workflow_dispatch: From a09dcee6ac4474fb628eae0fb3082456e77c0a24 Mon Sep 17 00:00:00 2001 From: Traqueur_ Date: Sun, 18 Jan 2026 17:21:52 +0100 Subject: [PATCH 7/7] feat: add registry on load permits to add in onEnable of addon elements --- src/main/java/fr/traqueur/items/ZItems.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/traqueur/items/ZItems.java b/src/main/java/fr/traqueur/items/ZItems.java index 31b3926..be59596 100644 --- a/src/main/java/fr/traqueur/items/ZItems.java +++ b/src/main/java/fr/traqueur/items/ZItems.java @@ -76,6 +76,11 @@ public class ZItems extends ItemsPlugin { private InventoryManager inventoryManager; private ButtonManager buttonManager; + @Override + public void onLoad() { + this.registerRegistries(); + } + @Override public void onEnable() { @@ -113,8 +118,6 @@ public void onEnable() { } Logger.info("Shop provider {} has been found.", ShopProviders.FOUND_PROVIDER.pluginName()); - this.registerRegistries(); - this.populateRegistries(); Logger.info("Setting up event dispatching system...");