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:
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
+
+[](https://github.com/GroupeZ-dev/zItems)
+[](https://www.spigotmc.org/)
+[](https://www.oracle.com/java/)
+[](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.
+
+
+
+### 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.
+
+
+
+### Farming Hoe - Auto-Harvest & Replant
+Revolutionary farming with auto-harvest, auto-replant, and area tilling. Perfect for farming servers and automated agriculture!
+
+
+
+### Effect Application - Smithing Table
+Apply effects to items using the vanilla Smithing Table. Familiar mechanics for your players with full customization!
+
+
+
+### Effect Application - Custom GUI
+Advanced applicator with ingredient requirements. Create progression systems where players need rare materials to upgrade their gear!
+
+
+
+### Auto-Sell Effect
+Automatically sell mined blocks and drops! Perfect for prison and economy servers. Watch the money roll in as you mine!
+
+
+
+### Silk Spawner Effect
+Mine spawners and keep them as items! Compatible with all mob types and custom block providers.
+
+
+
+### Beautiful Effect Display
+Dynamic lore showing effects with full visibility control. Use gradients and MiniMessage formatting for stunning item descriptions!
+
+
+
+### Full Video Showcase
+See all features in action with our comprehensive video tutorial!
+
+[](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
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/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
diff --git a/src/main/java/fr/traqueur/items/ZItems.java b/src/main/java/fr/traqueur/items/ZItems.java
index b37158d..be59596 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,21 +69,30 @@ 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;
private ButtonManager buttonManager;
+ @Override
+ public void onLoad() {
+ this.registerRegistries();
+ }
+
@Override
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());
@@ -111,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...");
@@ -122,8 +127,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 +298,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 extends Event> 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;
+ }
+
+}
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/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/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/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/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/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/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/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/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/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/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/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/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/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"
+ - "