From 02ba4f51d836dcb9beebadda6387630992e5908e Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 09:53:36 +0200
Subject: [PATCH 1/9] refactor(architecture): promote recipes and blocks to
top-level packages
---
.../blightedSMP/commands/impl/CraftCommand.java | 2 +-
.../blightedSMP/commands/impl/ForgeCommand.java | 2 +-
.../blightedSMP/content/ContentRegistrar.java | 10 +++++-----
.../{items => }/blocks/BlightedBlockItems.java | 2 +-
.../{items => }/blocks/BlightedBlocks.java | 4 ++--
.../{items => }/blocks/BlightedForge.java | 6 +++---
.../{items => }/blocks/BlightedWorkbench.java | 6 +++---
.../blightedSMP/content/recipes/EndRecipes.java | 4 ++--
.../content/recipes/EquipmentRecipes.java | 4 ++--
.../content/recipes/FishingArmorsRecipes.java | 4 ++--
.../content/recipes/ForgeRecipes.java | 4 ++--
.../content/recipes/MaterialRecipes.java | 4 ++--
.../content/recipes/NetherMaterialRecipes.java | 4 ++--
.../engine/{items => }/blocks/BlightedBlock.java | 2 +-
.../blocks/BlightedBlockListener.java | 10 +++++-----
.../blocks/registry/BlockRegistry.java | 9 ++++-----
.../engine/entities/rituals/AncientRitual.java | 2 +-
.../rituals/menu/AncientRitualsMenu.java | 2 +-
.../entities/rituals/menu/RitualAltarMenu.java | 2 +-
.../{items => }/recipes/CraftingObject.java | 2 +-
.../recipes/RecipePreviewManager.java | 16 ++++++++--------
.../engine/{items => }/recipes/ShapeEncoder.java | 2 +-
.../recipes/crafting/BlightedRecipe.java | 4 ++--
.../recipes/crafting/BlightedShapedRecipe.java | 4 ++--
.../crafting/BlightedShapelessRecipe.java | 4 ++--
.../crafting/builder/ShapedRecipeBuilder.java | 8 ++++----
.../crafting/builder/ShapelessRecipeBuilder.java | 14 ++++++--------
.../crafting/menu/CraftingRecipePreviewMenu.java | 12 ++++++------
.../recipes/crafting/menu/CraftingTableMenu.java | 10 +++++-----
.../recipes/crafting/menu/RecipeBookMenu.java | 4 ++--
.../crafting/registry/RecipeRegistry.java | 8 ++++----
.../{items => }/recipes/forging/ForgeFuel.java | 2 +-
.../{items => }/recipes/forging/ForgeRecipe.java | 4 ++--
.../recipes/forging/menu/ForgeMenu.java | 8 ++++----
.../forging/menu/ForgeRecipePreviewMenu.java | 8 ++++----
.../recipes/forging/menu/ForgeRecipesMenu.java | 8 ++++----
.../recipes/forging/registry/ForgeRegistry.java | 4 ++--
.../blightedSMP/registry/RegistrySystem.java | 6 +++---
38 files changed, 104 insertions(+), 107 deletions(-)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/content/{items => }/blocks/BlightedBlockItems.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/content/{items => }/blocks/BlightedBlocks.java (75%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/content/{items => }/blocks/BlightedForge.java (79%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/content/{items => }/blocks/BlightedWorkbench.java (85%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/blocks/BlightedBlock.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/blocks/BlightedBlockListener.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/blocks/registry/BlockRegistry.java (85%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/CraftingObject.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/RecipePreviewManager.java (91%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/ShapeEncoder.java (98%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/BlightedRecipe.java (98%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/BlightedShapedRecipe.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/BlightedShapelessRecipe.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/builder/ShapedRecipeBuilder.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/builder/ShapelessRecipeBuilder.java (93%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/menu/CraftingRecipePreviewMenu.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/menu/CraftingTableMenu.java (96%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/menu/RecipeBookMenu.java (94%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/crafting/registry/RecipeRegistry.java (90%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/ForgeFuel.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/ForgeRecipe.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/menu/ForgeMenu.java (98%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/menu/ForgeRecipePreviewMenu.java (97%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/menu/ForgeRecipesMenu.java (90%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/{items => }/recipes/forging/registry/ForgeRegistry.java (87%)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/CraftCommand.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/CraftCommand.java
index a0e9e21d..c441e990 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/CraftCommand.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/CraftCommand.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.commands.impl;
import fr.moussax.bedrock.commands.PlayerCommand;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.menu.CraftingTableMenu;
+import fr.moussax.blightedSMP.engine.recipes.crafting.menu.CraftingTableMenu;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/ForgeCommand.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/ForgeCommand.java
index d234b910..6cd2193f 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/ForgeCommand.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/ForgeCommand.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.commands.impl;
import fr.moussax.bedrock.commands.PlayerCommand;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.menu.ForgeMenu;
+import fr.moussax.blightedSMP.engine.recipes.forging.menu.ForgeMenu;
import org.bukkit.command.Command;
import org.bukkit.entity.Player;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/ContentRegistrar.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/ContentRegistrar.java
index c7edd195..4531965a 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/ContentRegistrar.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/ContentRegistrar.java
@@ -15,8 +15,8 @@
import fr.moussax.blightedSMP.content.items.armors.FishingArmors;
import fr.moussax.blightedSMP.content.items.armors.HomodeusArmor;
import fr.moussax.blightedSMP.content.items.armors.RocketBoots;
-import fr.moussax.blightedSMP.content.items.blocks.BlightedBlockItems;
-import fr.moussax.blightedSMP.content.items.blocks.BlightedBlocks;
+import fr.moussax.blightedSMP.content.blocks.BlightedBlockItems;
+import fr.moussax.blightedSMP.content.blocks.BlightedBlocks;
import fr.moussax.blightedSMP.content.items.materials.BlightedMaterials;
import fr.moussax.blightedSMP.content.items.materials.EndMaterials;
import fr.moussax.blightedSMP.content.items.materials.FishingMaterials;
@@ -27,9 +27,9 @@
import fr.moussax.blightedSMP.engine.entities.rituals.AncientRitual;
import fr.moussax.blightedSMP.engine.fishing.registry.FishingRegistryHandler;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlock;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlock;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.List;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlockItems.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlockItems.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
index 9ce6538d..7fa03ccc 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlockItems.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
@@ -1,4 +1,4 @@
-package fr.moussax.blightedSMP.content.items.blocks;
+package fr.moussax.blightedSMP.content.blocks;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import fr.moussax.blightedSMP.engine.items.ItemRarity;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlocks.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlocks.java
similarity index 75%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlocks.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlocks.java
index 4da5674a..556b1a70 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedBlocks.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlocks.java
@@ -1,6 +1,6 @@
-package fr.moussax.blightedSMP.content.items.blocks;
+package fr.moussax.blightedSMP.content.blocks;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlock;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlock;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedForge.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedForge.java
similarity index 79%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedForge.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedForge.java
index 97db4072..06d81856 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedForge.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedForge.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.content.items.blocks;
+package fr.moussax.blightedSMP.content.blocks;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlock;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.menu.ForgeMenu;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlock;
+import fr.moussax.blightedSMP.engine.recipes.forging.menu.ForgeMenu;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import org.bukkit.Material;
import org.bukkit.entity.Player;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedWorkbench.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedWorkbench.java
similarity index 85%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedWorkbench.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedWorkbench.java
index 9c6f2389..453527cc 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/blocks/BlightedWorkbench.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedWorkbench.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.content.items.blocks;
+package fr.moussax.blightedSMP.content.blocks;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlock;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.menu.CraftingTableMenu;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlock;
+import fr.moussax.blightedSMP.engine.recipes.crafting.menu.CraftingTableMenu;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import fr.moussax.bedrock.text.Messenger;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EndRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EndRecipes.java
index c95da515..0f988563 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EndRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EndRecipes.java
@@ -1,10 +1,10 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
-import static fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
+import static fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EquipmentRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EquipmentRecipes.java
index 74772219..49cf89ac 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EquipmentRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/EquipmentRecipes.java
@@ -1,11 +1,11 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
import org.bukkit.Material;
-import static fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
+import static fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
public final class EquipmentRecipes implements RegistryModule> {
@Override
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/FishingArmorsRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/FishingArmorsRecipes.java
index dccdbf61..ebc6fa87 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/FishingArmorsRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/FishingArmorsRecipes.java
@@ -1,12 +1,12 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import org.bukkit.Material;
import java.util.function.Consumer;
-import static fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
+import static fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
public final class FishingArmorsRecipes implements RegistryModule> {
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/ForgeRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/ForgeRecipes.java
index 5e99998a..1a8e392e 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/ForgeRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/ForgeRecipes.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/MaterialRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/MaterialRecipes.java
index 255ccf5d..b8824820 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/MaterialRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/MaterialRecipes.java
@@ -1,12 +1,12 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import org.bukkit.Material;
-import static fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
+import static fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
public final class MaterialRecipes implements RegistryModule> {
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/NetherMaterialRecipes.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/NetherMaterialRecipes.java
index e7212971..b2b771c6 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/NetherMaterialRecipes.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/recipes/NetherMaterialRecipes.java
@@ -1,10 +1,10 @@
package fr.moussax.blightedSMP.content.recipes;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
-import static fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
+import static fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry.shapedRecipe;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlock.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlock.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlock.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlock.java
index 64d4e8f1..5395ec98 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlock.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlock.java
@@ -1,4 +1,4 @@
-package fr.moussax.blightedSMP.engine.items.blocks;
+package fr.moussax.blightedSMP.engine.blocks;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import lombok.Getter;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlockListener.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlockListener.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlockListener.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlockListener.java
index 3c09b61f..2f850f3f 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/BlightedBlockListener.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/BlightedBlockListener.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.blocks;
+package fr.moussax.blightedSMP.engine.blocks;
import fr.moussax.blightedSMP.BlightedSMP;
-import fr.moussax.blightedSMP.server.database.PluginDatabase;
+import fr.moussax.blightedSMP.engine.blocks.registry.BlockRegistry;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.blocks.registry.BlockRegistry;
+import fr.moussax.blightedSMP.server.database.PluginDatabase;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@@ -19,10 +19,10 @@
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
-import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
-import java.util.*;
+import java.util.List;
+import java.util.Random;
public final class BlightedBlockListener implements Listener {
private final BlightedSMP plugin = BlightedSMP.getInstance();
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/registry/BlockRegistry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/registry/BlockRegistry.java
similarity index 85%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/registry/BlockRegistry.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/registry/BlockRegistry.java
index 5661c9b5..292df199 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/blocks/registry/BlockRegistry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/blocks/registry/BlockRegistry.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.blocks.registry;
+package fr.moussax.blightedSMP.engine.blocks.registry;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlock;
+import fr.moussax.bedrock.utils.debug.Log;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlock;
import fr.moussax.blightedSMP.registry.EngineRegistry;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import fr.moussax.bedrock.utils.debug.Log;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
@@ -16,8 +16,7 @@
*/
public final class BlockRegistry {
- private static final EngineRegistry REGISTRY =
- new EngineRegistry<>("BlockRegistry", BlightedBlock::getId);
+ private static final EngineRegistry REGISTRY = new EngineRegistry<>("BlockRegistry", BlightedBlock::getId);
private BlockRegistry() {
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/AncientRitual.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/AncientRitual.java
index ecd8cf0c..b33b717b 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/AncientRitual.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/AncientRitual.java
@@ -2,7 +2,7 @@
import fr.moussax.bedrock.utils.ItemBuilder;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import lombok.Getter;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/AncientRitualsMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/AncientRitualsMenu.java
index 25b32711..e4e999af 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/AncientRitualsMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/AncientRitualsMenu.java
@@ -6,7 +6,7 @@
import fr.moussax.bedrock.utils.ItemBuilder;
import fr.moussax.blightedSMP.engine.entities.rituals.AncientRitual;
import fr.moussax.blightedSMP.engine.entities.rituals.registry.RitualRegistry;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/RitualAltarMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/RitualAltarMenu.java
index 0d487c94..805dba00 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/RitualAltarMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/entities/rituals/menu/RitualAltarMenu.java
@@ -11,7 +11,7 @@
import fr.moussax.blightedSMP.engine.entities.rituals.AncientCreature;
import fr.moussax.blightedSMP.engine.entities.rituals.AncientRitual;
import fr.moussax.blightedSMP.engine.entities.rituals.RitualAnimations;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.Bukkit;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/CraftingObject.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/CraftingObject.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/CraftingObject.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/CraftingObject.java
index 714dbb8a..5a5174e8 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/CraftingObject.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/CraftingObject.java
@@ -1,4 +1,4 @@
-package fr.moussax.blightedSMP.engine.items.recipes;
+package fr.moussax.blightedSMP.engine.recipes;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import lombok.Getter;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/RecipePreviewManager.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/RecipePreviewManager.java
similarity index 91%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/RecipePreviewManager.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/RecipePreviewManager.java
index 0a0c4344..6ddd7bbf 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/RecipePreviewManager.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/RecipePreviewManager.java
@@ -1,13 +1,13 @@
-package fr.moussax.blightedSMP.engine.items.recipes;
+package fr.moussax.blightedSMP.engine.recipes;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapelessRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.menu.CraftingRecipePreviewMenu;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.menu.ForgeRecipePreviewMenu;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.registry.ForgeRegistry;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapelessRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.menu.CraftingRecipePreviewMenu;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.forging.menu.ForgeRecipePreviewMenu;
+import fr.moussax.blightedSMP.engine.recipes.forging.registry.ForgeRegistry;
import fr.moussax.bedrock.ui.menu.Menu;
import fr.moussax.bedrock.ui.menu.interaction.MenuElementPreset;
import fr.moussax.bedrock.utils.ItemBuilder;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/ShapeEncoder.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/ShapeEncoder.java
similarity index 98%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/ShapeEncoder.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/ShapeEncoder.java
index e04eb501..835f39e2 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/ShapeEncoder.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/ShapeEncoder.java
@@ -1,4 +1,4 @@
-package fr.moussax.blightedSMP.engine.items.recipes;
+package fr.moussax.blightedSMP.engine.recipes;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedRecipe.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedRecipe.java
similarity index 98%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedRecipe.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedRecipe.java
index e53e1789..74914cf6 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedRecipe.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedRecipe.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting;
+package fr.moussax.blightedSMP.engine.recipes.crafting;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapedRecipe.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapedRecipe.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapedRecipe.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapedRecipe.java
index b233fe0b..a89be4f6 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapedRecipe.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapedRecipe.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting;
+package fr.moussax.blightedSMP.engine.recipes.crafting;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.inventory.ItemStack;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapelessRecipe.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapelessRecipe.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapelessRecipe.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapelessRecipe.java
index ef9535de..576d9926 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/BlightedShapelessRecipe.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/BlightedShapelessRecipe.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting;
+package fr.moussax.blightedSMP.engine.recipes.crafting;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapedRecipeBuilder.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapedRecipeBuilder.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapedRecipeBuilder.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapedRecipeBuilder.java
index 4add925c..71a84e7a 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapedRecipeBuilder.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapedRecipeBuilder.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.builder;
+package fr.moussax.blightedSMP.engine.recipes.crafting.builder;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.ShapeEncoder;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.ShapeEncoder;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapelessRecipeBuilder.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapelessRecipeBuilder.java
similarity index 93%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapelessRecipeBuilder.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapelessRecipeBuilder.java
index 2a6ceba6..53155a4b 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/builder/ShapelessRecipeBuilder.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/builder/ShapelessRecipeBuilder.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.builder;
+package fr.moussax.blightedSMP.engine.recipes.crafting.builder;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapelessRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapelessRecipe;
import org.bukkit.Material;
import java.util.ArrayList;
@@ -85,7 +85,6 @@ public static ShapelessRecipeBuilder of(String resultId, int amount) {
* @param material the material required by the recipe
* @return this builder
*/
- // ponytail: simplified — single-item quantity default overload
public ShapelessRecipeBuilder addIngredient(Material material) {
return addIngredient(material, 1, false);
}
@@ -108,7 +107,7 @@ public ShapelessRecipeBuilder addIngredient(Material material, int amount) {
* @param material the material required by the recipe
* @param amount the required amount
* @param isAttributeSource whether this ingredient provides the attributes
- * for the resulting item
+ * for the resulting item
* @return this builder
*/
public ShapelessRecipeBuilder addIngredient(
@@ -151,7 +150,7 @@ public ShapelessRecipeBuilder addIngredient(BlightedItem item, int amount) {
* @param item the custom item required by the recipe
* @param amount the required amount
* @param isAttributeSource whether this ingredient provides the attributes
- * for the resulting item
+ * for the resulting item
* @return this builder
*/
public ShapelessRecipeBuilder addIngredient(
@@ -172,7 +171,6 @@ public ShapelessRecipeBuilder addIngredient(
* @return this builder
* @throws IllegalArgumentException if the item ID is not registered
*/
- // ponytail: simplified — single-item quantity default overload
public ShapelessRecipeBuilder addIngredient(String itemId) {
return addIngredient(ItemRegistry.get(itemId), 1, false);
}
@@ -196,7 +194,7 @@ public ShapelessRecipeBuilder addIngredient(String itemId, int amount) {
* @param itemId the ID of the required custom item
* @param amount the required amount
* @param isAttributeSource whether this ingredient provides the attributes
- * for the resulting item
+ * for the resulting item
* @return this builder
* @throws IllegalArgumentException if the item ID is not registered
*/
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingRecipePreviewMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingRecipePreviewMenu.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingRecipePreviewMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingRecipePreviewMenu.java
index 4cf0c8c8..43461dea 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingRecipePreviewMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingRecipePreviewMenu.java
@@ -1,11 +1,11 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.menu;
+package fr.moussax.blightedSMP.engine.recipes.crafting.menu;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.RecipePreviewManager;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapelessRecipe;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.RecipePreviewManager;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapelessRecipe;
import fr.moussax.bedrock.scheduling.PluginContext;
import fr.moussax.bedrock.text.Messenger;
import fr.moussax.bedrock.ui.menu.Menu;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingTableMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingTableMenu.java
similarity index 96%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingTableMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingTableMenu.java
index 2ca7f108..dae4d398 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/CraftingTableMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/CraftingTableMenu.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.menu;
+package fr.moussax.blightedSMP.engine.recipes.crafting.menu;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedShapelessRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedShapelessRecipe;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.bedrock.ui.menu.types.InteractiveMenu;
import fr.moussax.bedrock.ui.menu.interaction.MenuElementPreset;
import fr.moussax.bedrock.utils.ItemBuilder;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/RecipeBookMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/RecipeBookMenu.java
similarity index 94%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/RecipeBookMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/RecipeBookMenu.java
index 27d63600..4840c54a 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/menu/RecipeBookMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/menu/RecipeBookMenu.java
@@ -1,6 +1,6 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.menu;
+package fr.moussax.blightedSMP.engine.recipes.crafting.menu;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import fr.moussax.bedrock.ui.menu.Menu;
import fr.moussax.bedrock.ui.menu.types.PaginatedMenu;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/registry/RecipeRegistry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/registry/RecipeRegistry.java
similarity index 90%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/registry/RecipeRegistry.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/registry/RecipeRegistry.java
index 9cbae6ed..5d5f6982 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/crafting/registry/RecipeRegistry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/crafting/registry/RecipeRegistry.java
@@ -1,8 +1,8 @@
-package fr.moussax.blightedSMP.engine.items.recipes.crafting.registry;
+package fr.moussax.blightedSMP.engine.recipes.crafting.registry;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.builder.ShapedRecipeBuilder;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.builder.ShapelessRecipeBuilder;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.builder.ShapedRecipeBuilder;
+import fr.moussax.blightedSMP.engine.recipes.crafting.builder.ShapelessRecipeBuilder;
import fr.moussax.blightedSMP.registry.RegistryModule;
import fr.moussax.bedrock.utils.debug.Log;
import org.jspecify.annotations.NonNull;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeFuel.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeFuel.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeFuel.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeFuel.java
index 320ea243..0d326322 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeFuel.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeFuel.java
@@ -1,4 +1,4 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging;
+package fr.moussax.blightedSMP.engine.recipes.forging;
import fr.moussax.blightedSMP.utils.Utilities;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeRecipe.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeRecipe.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeRecipe.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeRecipe.java
index 7e14c976..2fc0a1dc 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/ForgeRecipe.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/ForgeRecipe.java
@@ -1,7 +1,7 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging;
+package fr.moussax.blightedSMP.engine.recipes.forging;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import lombok.Getter;
import org.bukkit.Material;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeMenu.java
similarity index 98%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeMenu.java
index a975b919..151a1807 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeMenu.java
@@ -1,9 +1,9 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging.menu;
+package fr.moussax.blightedSMP.engine.recipes.forging.menu;
import fr.moussax.blightedSMP.content.sound.BlightedSounds;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeFuel;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeFuel;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
import fr.moussax.bedrock.ui.menu.Menu;
import fr.moussax.bedrock.ui.menu.interaction.MenuElementPreset;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipePreviewMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipePreviewMenu.java
similarity index 97%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipePreviewMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipePreviewMenu.java
index a00bd1fe..79af6c00 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipePreviewMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipePreviewMenu.java
@@ -1,10 +1,10 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging.menu;
+package fr.moussax.blightedSMP.engine.recipes.forging.menu;
import fr.moussax.blightedSMP.content.sound.BlightedSounds;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.RecipePreviewManager;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.RecipePreviewManager;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.bedrock.scheduling.PluginContext;
import fr.moussax.bedrock.text.Formatter;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipesMenu.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipesMenu.java
similarity index 90%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipesMenu.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipesMenu.java
index c7b7ebbf..78681649 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/menu/ForgeRecipesMenu.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/menu/ForgeRecipesMenu.java
@@ -1,8 +1,8 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging.menu;
+package fr.moussax.blightedSMP.engine.recipes.forging.menu;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.registry.ForgeRegistry;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.forging.registry.ForgeRegistry;
import fr.moussax.bedrock.text.Formatter;
import fr.moussax.bedrock.ui.menu.Menu;
import fr.moussax.bedrock.ui.menu.types.PaginatedMenu;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/registry/ForgeRegistry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/registry/ForgeRegistry.java
similarity index 87%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/registry/ForgeRegistry.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/registry/ForgeRegistry.java
index 72e60708..9eedcfeb 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/recipes/forging/registry/ForgeRegistry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/recipes/forging/registry/ForgeRegistry.java
@@ -1,6 +1,6 @@
-package fr.moussax.blightedSMP.engine.items.recipes.forging.registry;
+package fr.moussax.blightedSMP.engine.recipes.forging.registry;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.ForgeRecipe;
+import fr.moussax.blightedSMP.engine.recipes.forging.ForgeRecipe;
import fr.moussax.blightedSMP.registry.EngineRegistry;
import fr.moussax.blightedSMP.registry.RegistryModule;
import org.jspecify.annotations.NonNull;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/RegistrySystem.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/RegistrySystem.java
index 98425877..825a7281 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/RegistrySystem.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/RegistrySystem.java
@@ -4,9 +4,9 @@
import fr.moussax.blightedSMP.engine.entities.registry.EntitiesRegistry;
import fr.moussax.blightedSMP.engine.entities.rituals.registry.RitualRegistry;
import fr.moussax.blightedSMP.engine.fishing.registry.FishingLootRegistry;
-import fr.moussax.blightedSMP.engine.items.blocks.registry.BlockRegistry;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.registry.RecipeRegistry;
-import fr.moussax.blightedSMP.engine.items.recipes.forging.registry.ForgeRegistry;
+import fr.moussax.blightedSMP.engine.blocks.registry.BlockRegistry;
+import fr.moussax.blightedSMP.engine.recipes.crafting.registry.RecipeRegistry;
+import fr.moussax.blightedSMP.engine.recipes.forging.registry.ForgeRegistry;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
/**
From 42c5748120945fd6f3d6ccd1b6539359f890caa6 Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 09:54:01 +0200
Subject: [PATCH 2/9] refactor(items): modernize item abilities, restrictions,
and lore rendering
---
.../commands/impl/TestCommand.java | 24 +-
.../engine/items/BlightedItem.java | 213 +++++++++---------
.../engine/items/ItemRestriction.java | 25 ++
.../items/abilities/AbilityExecutor.java | 8 +-
.../{AbilityType.java => AbilityTrigger.java} | 56 ++---
.../engine/items/abilities/CooldownEntry.java | 8 +-
.../{AbilityManager.java => ItemAbility.java} | 38 +---
.../ArmorSetManager.java} | 19 +-
.../ItemAbilityListener.java} | 49 ++--
.../ItemRestrictionListener.java} | 62 ++---
.../VanillaRecipeProtectionListener.java | 2 +-
.../engine/items/lore/ItemLoreRenderer.java | 84 +++++++
.../engine/items/registry/ItemRegistry.java | 7 +-
.../engine/items/rules/ItemRule.java | 112 ---------
.../engine/items/rules/ItemRuleEngine.java | 88 --------
.../engine/player/BlightedPlayer.java | 61 +++--
.../engine/player/hud/PlayerHudManager.java | 22 +-
.../blightedSMP/registry/EventsRegistry.java | 12 +-
.../moussax/blightedSMP/utils/Utilities.java | 2 +-
19 files changed, 384 insertions(+), 508 deletions(-)
create mode 100644 blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/ItemRestriction.java
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/{AbilityType.java => AbilityTrigger.java} (67%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/{AbilityManager.java => ItemAbility.java} (71%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/{abilities/ArmorManager.java => equipment/ArmorSetManager.java} (80%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/{abilities/AbilityListener.java => listeners/ItemAbilityListener.java} (81%)
rename blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/{rules/ItemRuleListener.java => listeners/ItemRestrictionListener.java} (51%)
create mode 100644 blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/lore/ItemLoreRenderer.java
delete mode 100644 blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRule.java
delete mode 100644 blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleEngine.java
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/TestCommand.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/TestCommand.java
index 8bf4b8c3..5f1e0c7b 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/TestCommand.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/commands/impl/TestCommand.java
@@ -1,32 +1,16 @@
package fr.moussax.blightedSMP.commands.impl;
-import fr.moussax.bedrock.utils.ItemBuilder;
+import fr.moussax.bedrock.ui.actionbar.Actionbar;
import fr.moussax.blightedSMP.commands.AdminCommand;
-import org.bukkit.Material;
import org.bukkit.command.Command;
-import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemFlag;
-import org.bukkit.inventory.ItemStack;
+
+import static fr.moussax.blightedSMP.engine.player.hud.PlayerHudManager.SECTION_HEALTH;
public final class TestCommand extends AdminCommand {
@Override
protected boolean executeAdmin(Player player, Command command, String label, String[] args) {
-
- ItemStack item = new ItemBuilder(Material.COPPER_HELMET)
- .setDisplayName("§fAngler Helmet")
- .addEnchantment(Enchantment.UNBREAKING, 5)
- .addItemFlag(ItemFlag.HIDE_ATTRIBUTES)
- .addLore("",
- " §8A simple garb from a simple ",
- " §8craft. Though beneath the",
- " §8surface, nothing is ever",
- " §8quite so simple.",
- "", "§f§lCOMMON"
- )
- .toItemStack();
-
- player.getInventory().addItem(item);
+ Actionbar.sendSlotCountdown(player, SECTION_HEALTH, "§e§lIMMUNE! §f%ds", 20);
return true;
}
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/BlightedItem.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/BlightedItem.java
index 1b1894e9..9423f324 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/BlightedItem.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/BlightedItem.java
@@ -4,20 +4,17 @@
import fr.moussax.bedrock.utils.ItemBuilder;
import fr.moussax.blightedSMP.BlightedSMP;
import fr.moussax.blightedSMP.engine.items.abilities.AbilityExecutor;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
import fr.moussax.blightedSMP.engine.items.abilities.FullSetBonus;
-import fr.moussax.blightedSMP.engine.items.recipes.RecipePreviewManager;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.lore.ItemLoreRenderer;
+import fr.moussax.blightedSMP.engine.recipes.RecipePreviewManager;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRuleEngine;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import lombok.Getter;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.persistence.PersistentDataContainer;
@@ -25,23 +22,26 @@
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
import java.util.function.Consumer;
import java.util.function.Supplier;
/**
* Custom item definition with persistent identity, rarity, abilities, and restriction rules.
*
- * Extends {@link ItemBuilder} to provide fluent item construction while integrating with the
+ *
Extends {@link ItemBuilder} to provide fluent construction while integrating with the
* BlightedMC item system (ability execution, set bonuses, restriction rules, and recipe previews).
* Built stacks are marked with persistent metadata keys {@link #BLIGHTED_ID_KEY} and
* {@link #BLIGHTED_RARITY_KEY}.
*/
-public final class BlightedItem extends ItemBuilder implements ItemRule, Supplier {
+public class BlightedItem extends ItemBuilder implements Supplier {
- public static final NamespacedKey BLIGHTED_ID_KEY = new NamespacedKey(BlightedSMP.getInstance(), "blighted_id");
- public static final NamespacedKey BLIGHTED_RARITY_KEY = new NamespacedKey(BlightedSMP.getInstance(), "blighted_rarity");
+ public static final NamespacedKey BLIGHTED_ID_KEY = BlightedSMP.getInstance() != null
+ ? new NamespacedKey(BlightedSMP.getInstance(), "blighted_id")
+ : NamespacedKey.fromString("blightedsmp:blighted_id");
+ public static final NamespacedKey BLIGHTED_RARITY_KEY = BlightedSMP.getInstance() != null
+ ? new NamespacedKey(BlightedSMP.getInstance(), "blighted_rarity")
+ : NamespacedKey.fromString("blightedsmp:blighted_rarity");
@Getter
private final String itemId;
@@ -52,11 +52,17 @@ public final class BlightedItem extends ItemBuilder implements ItemRule, Supplie
@Getter
private FullSetBonus fullSetBonus;
@Getter
- private final List> abilities = new ArrayList<>();
+ private final List> abilities = new ArrayList<>();
@Getter
- private final ItemRuleEngine ruleEngine = new ItemRuleEngine();
+ private final Set restrictions = EnumSet.noneOf(ItemRestriction.class);
+ @Getter
+ private final List description = new ArrayList<>();
+ @Getter
+ private final List customLoreLines = new ArrayList<>();
@Getter
private boolean recipePreviewEnabled = false;
+ @Getter
+ private ItemConsumeHandler consumeHandler;
/**
* Constructs a custom item definition from a base material.
@@ -68,9 +74,9 @@ public final class BlightedItem extends ItemBuilder implements ItemRule, Supplie
*/
public BlightedItem(@NonNull String itemId, @NonNull ItemType type, @NonNull ItemRarity rarity, @NonNull Material material) {
super(material);
- this.itemId = itemId;
- this.itemType = type;
- this.itemRarity = rarity;
+ this.itemId = Objects.requireNonNull(itemId, "itemId cannot be null");
+ this.itemType = Objects.requireNonNull(type, "itemType cannot be null");
+ this.itemRarity = Objects.requireNonNull(rarity, "itemRarity cannot be null");
}
/**
@@ -83,80 +89,110 @@ public BlightedItem(@NonNull String itemId, @NonNull ItemType type, @NonNull Ite
*/
public BlightedItem(@NonNull String itemId, @NonNull ItemType type, @NonNull ItemRarity rarity, @NonNull ItemStack itemStack) {
super(itemStack);
- this.itemId = itemId;
- this.itemType = type;
- this.itemRarity = rarity;
+ this.itemId = Objects.requireNonNull(itemId, "itemId cannot be null");
+ this.itemType = Objects.requireNonNull(type, "itemType cannot be null");
+ this.itemRarity = Objects.requireNonNull(rarity, "itemRarity cannot be null");
}
/**
- * Adds an ability to this item and appends its formatted description to the lore.
+ * Sets description lines describing this item.
*
- * @param ability ability to add
+ * @param lines description lines
+ * @return this item instance for method chaining
*/
- public void addAbility(AbilityManager extends Event> ability) {
- addAbility(ability, true);
+ public BlightedItem description(String... lines) {
+ this.description.clear();
+ Collections.addAll(this.description, lines);
+ return this;
}
/**
- * Adds an ability to this item with optional lore injection.
+ * Adds an ability to this item.
*
- * @param ability ability to add
- * @param injectLore {@code true} to append formatted ability description to lore
+ * @param ability ability to add
+ * @return this item instance for method chaining
*/
- public void addAbility(AbilityManager extends Event> ability, boolean injectLore) {
- if (ability == null) return;
- this.abilities.add(ability);
+ public BlightedItem addAbility(ItemAbility extends Event> ability) {
+ if (ability != null) {
+ this.abilities.add(ability);
+ }
+ return this;
+ }
- if (injectLore) {
- List formattedLore = ability.getAbilityLore();
- this.addLore(formattedLore.toArray(new String[0]));
+ @SafeVarargs
+ public final BlightedItem addAbilities(ItemAbility extends Event>... abilities) {
+ for (ItemAbility extends Event> ability : abilities) {
+ addAbility(ability);
}
+ return this;
}
/**
- * Adds multiple abilities to this item and appends their descriptions to the lore.
+ * Sets the full-set bonus for this item.
*
- * @param abilities abilities to add
+ * @param fullSetBonus set bonus to assign, or {@code null} to remove
+ * @return this item instance for method chaining
*/
- @SafeVarargs
- public final void addAbilities(AbilityManager extends Event>... abilities) {
- for (AbilityManager extends Event> ability : abilities) {
- addAbility(ability, true);
- }
+ public BlightedItem setFullSetBonus(FullSetBonus fullSetBonus) {
+ this.fullSetBonus = fullSetBonus;
+ return this;
}
/**
- * Sets the full-set bonus for this item and appends its description to the lore.
+ * Registers a behavioral restriction flag for this item.
*
- * @param fullSetBonus set bonus to assign, or {@code null} to remove
+ * @param restriction restriction to add
+ * @return this item instance for method chaining
*/
- public void setFullSetBonus(FullSetBonus fullSetBonus) {
- setFullSetBonus(fullSetBonus, true);
+ public BlightedItem addRestriction(@NonNull ItemRestriction restriction) {
+ this.restrictions.add(Objects.requireNonNull(restriction, "restriction cannot be null"));
+ return this;
}
/**
- * Sets the full-set bonus for this item with optional lore injection.
+ * Checks if this item has the given restriction flag.
*
- * @param fullSetBonus set bonus to assign, or {@code null} to remove
- * @param injectLore {@code true} to append set bonus description to lore
+ * @param restriction restriction to check
+ * @return {@code true} if restricted, {@code false} otherwise
*/
- public void setFullSetBonus(FullSetBonus fullSetBonus, boolean injectLore) {
- this.fullSetBonus = fullSetBonus;
- if (fullSetBonus == null) return;
+ public boolean hasRestriction(@NonNull ItemRestriction restriction) {
+ return this.restrictions.contains(restriction);
+ }
- if (injectLore) {
- List formattedLore = fullSetBonus.getBonusLore();
- this.addLore(formattedLore.toArray(new String[0]));
- }
+ public BlightedItem preventPlacement() {
+ return addRestriction(ItemRestriction.PREVENT_PLACEMENT);
+ }
+
+ public BlightedItem preventConsume() {
+ return addRestriction(ItemRestriction.PREVENT_CONSUMPTION);
+ }
+
+ public BlightedItem preventProjectileLaunch() {
+ return addRestriction(ItemRestriction.PREVENT_PROJECTILE_LAUNCH);
+ }
+
+ public BlightedItem preventBucketInteractions() {
+ return addRestriction(ItemRestriction.PREVENT_BUCKET_INTERACTIONS);
+ }
+
+ public BlightedItem preventDrop() {
+ return addRestriction(ItemRestriction.PREVENT_DROP);
+ }
+
+ public BlightedItem preventInteraction() {
+ return addRestriction(ItemRestriction.PREVENT_INTERACTION);
}
/**
- * Registers a gameplay restriction rule for this item.
+ * Appends custom lore lines to this item.
*
- * @param rule restriction rule to add
+ * @param lines lore lines
+ * @return this item instance for method chaining
*/
- public void addRule(ItemRule rule) {
- ruleEngine.addRule(rule);
+ @Override
+ public BlightedItem addLore(String... lines) {
+ Collections.addAll(this.customLoreLines, lines);
+ return this;
}
/**
@@ -200,14 +236,14 @@ public BlightedItem setDisplayName(@NonNull String displayName) {
}
/**
- * Resolves the registered custom item definition corresponding to an item stack.
+ * Resolves the registered custom item definition corresponding to an item stack safely.
*
* @param itemStack item stack to inspect
* @return registered custom item definition, or {@code null} if stack is non-custom or unregistered
*/
@Nullable
- public static BlightedItem fromItemStack(@NonNull ItemStack itemStack) {
- if (itemStack.getType().isAir()) return null;
+ public static BlightedItem fromItemStack(@Nullable ItemStack itemStack) {
+ if (itemStack == null || itemStack.getType().isAir()) return null;
ItemMeta itemMeta = itemStack.getItemMeta();
if (itemMeta == null) return null;
@@ -227,16 +263,13 @@ public static BlightedItem fromItemStack(@NonNull ItemStack itemStack) {
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void triggerAbilities(BlightedPlayer blightedPlayer, Event event) {
- for (AbilityManager extends Event> ability : abilities) {
- if (ability.getType().matches(event)) {
- AbilityExecutor.execute((AbilityManager) ability, blightedPlayer, event);
+ for (ItemAbility extends Event> ability : abilities) {
+ if (ability.getTrigger().matches(event)) {
+ AbilityExecutor.execute((ItemAbility) ability, blightedPlayer, event);
}
}
}
- @Getter
- private ItemConsumeHandler consumeHandler;
-
/**
* Registers an item consume handler receiving both the player and item stack.
*
@@ -271,51 +304,19 @@ public boolean isEquipment() {
}
/**
- * Evaluates whether block placement should be restricted for an item stack.
+ * Builds the item stack, applies metadata, renders canonical lore, and returns an independent clone.
*
- * @param event block place event
- * @param itemStack item stack being placed
- * @return {@code true} if placement is restricted, {@code false} otherwise
- */
- @Override
- public boolean shouldRestrictPlace(BlockPlaceEvent event, ItemStack itemStack) {
- return ruleEngine.shouldRestrictPlace(event, itemStack);
- }
-
- /**
- * Evaluates whether player interaction should be restricted for an item stack.
- *
- * @param event player interact event
- * @param itemStack item stack being interacted with
- * @return {@code true} if interaction is restricted, {@code false} otherwise
- */
- @Override
- public boolean shouldRestrictInteract(PlayerInteractEvent event, ItemStack itemStack) {
- return ruleEngine.shouldRestrictInteract(event, itemStack);
- }
-
- /**
- * Evaluates whether generic usage should be restricted for an event and item stack.
- *
- * @param event triggering event
- * @param itemStack item stack being used
- * @return {@code true} if usage is restricted, {@code false} otherwise
- */
- @Override
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return ruleEngine.shouldRestrictUse(event, itemStack);
- }
-
- /**
- * Builds the item stack and applies BlightedMC persistent metadata.
- *
- * @return configured item stack
+ * @return configured, pristine item stack
*/
@Override
public ItemStack toItemStack() {
setPersistentData(BLIGHTED_ID_KEY, PersistentDataType.STRING, itemId);
setPersistentData(BLIGHTED_RARITY_KEY, PersistentDataType.STRING, itemRarity.name());
- return super.toItemStack();
+
+ List renderedLore = ItemLoreRenderer.render(this);
+ super.setLore(renderedLore);
+
+ return super.toItemStack().clone();
}
/**
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/ItemRestriction.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/ItemRestriction.java
new file mode 100644
index 00000000..48cd1388
--- /dev/null
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/ItemRestriction.java
@@ -0,0 +1,25 @@
+package fr.moussax.blightedSMP.engine.items;
+
+/**
+ * Defines behavioral restriction flags for custom items.
+ */
+public enum ItemRestriction {
+
+ /** Prevents the item from being placed as a block in the world. */
+ PREVENT_PLACEMENT,
+
+ /** Prevents the item from being eaten or drank. */
+ PREVENT_CONSUMPTION,
+
+ /** Prevents projectile launching (e.g. throwing pearls, firing bows). */
+ PREVENT_PROJECTILE_LAUNCH,
+
+ /** Prevents emptying or filling bucket items. */
+ PREVENT_BUCKET_INTERACTIONS,
+
+ /** Prevents the item from being dropped by a player. */
+ PREVENT_DROP,
+
+ /** Prevents generic interaction with the item. */
+ PREVENT_INTERACTION
+}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
index 667954aa..bd493244 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
@@ -24,16 +24,16 @@ private AbilityExecutor() {
* Evaluates active cooldowns, verifies mana sufficiency, and executes an ability.
*
* @param event type
- * @param ability ability manager to execute
+ * @param ability ability to execute
* @param player player context triggering the ability
* @param event triggering Bukkit event
*/
- public static void execute(AbilityManager ability, BlightedPlayer player, T event) {
+ public static void execute(ItemAbility ability, BlightedPlayer player, T event) {
String cooldownKey = ability.getName() != null && !ability.getName().isBlank()
? ability.getName()
: ability.getClass().getName();
- double remaining = player.getRemainingCooldown(cooldownKey, ability.getType());
+ double remaining = player.getRemainingCooldown(cooldownKey, ability.getTrigger());
if (remaining > 0) {
warn(player.getPlayer(), "§c⌚ Your §f" + ability.getName() + " §cability is on cooldown for §d" + (int) Math.ceil(remaining) + "s§c!");
cancel(event);
@@ -70,7 +70,7 @@ public static void execute(AbilityManager ability, Blighted
ability.start(player);
if (ability.getCooldownSeconds() > 0) {
- player.setCooldown(cooldownKey, ability.getType(), ability.getCooldownSeconds());
+ player.setCooldown(cooldownKey, ability.getTrigger(), ability.getCooldownSeconds());
}
} catch (Exception exception) {
Log.error("AbilityExecutor", "Ability execution failed: " + exception.getClass().getSimpleName());
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityType.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityTrigger.java
similarity index 67%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityType.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityTrigger.java
index f59c6e61..928be988 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityType.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityTrigger.java
@@ -4,6 +4,7 @@
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
@@ -11,60 +12,56 @@
* Defines trigger conditions and interaction modes for item abilities.
*/
@Getter
-public enum AbilityType {
+public enum AbilityTrigger {
/**
* Ability triggered by right-clicking.
*/
RIGHT_CLICK("§d§lRIGHT CLICK"),
+
/**
* Ability triggered by left-clicking.
*/
LEFT_CLICK("§d§lLEFT CLICK"),
+
/**
- * Ability triggered by either left or right clicking.
- */
- LEFT_OR_RIGHT_CLICK("§d§lCLICK"),
- /**
- * Ability triggered while sneaking.
+ * Ability triggered by clicking.
*/
- SNEAK("§d§lSNEAK"),
+ CLICK("§d§lCLICK"),
+
/**
* Ability triggered by sneaking and right-clicking.
*/
SNEAK_RIGHT_CLICK("§d§lSNEAK RIGHT CLICK"),
+
/**
* Ability triggered by sneaking and left-clicking.
*/
SNEAK_LEFT_CLICK("§d§lSNEAK LEFT CLICK"),
+
/**
* Ability triggered by sneaking and clicking.
*/
- SNEAK_LEFT_OR_RIGHT_CLICK("§d§lSNEAK CLICK"),
- /**
- * Ability activated when a full armor set is worn.
- */
- FULL_SET_BONUS("§6§lFULL SET BONUS"),
+ SNEAK_CLICK("§d§lSNEAK CLICK"),
+
/**
- * Ability triggered when hitting an entity.
+ * Ability triggered on attacking an entity.
*/
ENTITY_HIT("§d§lON HIT"),
+
/**
- * Ability triggered before dealing damage.
- */
- PRE_HIT("§d§lPRE HIT"),
- /**
- * Ability triggered after dealing damage.
+ * Ability triggered when breaking a block.
*/
- AFTER_HIT("§d§lAFTER HIT"),
+ BLOCK_BREAK("§d§lON BREAK"),
+
/**
- * Passive ability continuously active or triggered on passive events.
+ * Ability triggered when block drops are generated.
*/
- PASSIVE("");
+ BLOCK_DROP("§d§lPASSIVE");
private final String displayName;
- AbilityType(String displayName) {
+ AbilityTrigger(String displayName) {
this.displayName = displayName;
}
@@ -82,13 +79,12 @@ public boolean matches(Event event) {
boolean isRight = (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK);
return switch (this) {
- case RIGHT_CLICK -> isRight;
- case LEFT_CLICK -> isLeft;
- case LEFT_OR_RIGHT_CLICK -> (isLeft || isRight);
- case SNEAK -> isSneaking;
+ case RIGHT_CLICK -> isRight && !isSneaking;
+ case LEFT_CLICK -> isLeft && !isSneaking;
+ case CLICK -> (isLeft || isRight) && !isSneaking;
case SNEAK_RIGHT_CLICK -> isRight && isSneaking;
case SNEAK_LEFT_CLICK -> isLeft && isSneaking;
- case SNEAK_LEFT_OR_RIGHT_CLICK -> (isLeft || isRight) && isSneaking;
+ case SNEAK_CLICK -> (isLeft || isRight) && isSneaking;
default -> false;
};
}
@@ -98,7 +94,11 @@ public boolean matches(Event event) {
}
if (event instanceof BlockBreakEvent) {
- return this == PASSIVE;
+ return this == BLOCK_BREAK;
+ }
+
+ if (event instanceof BlockDropItemEvent) {
+ return this == BLOCK_DROP;
}
return false;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/CooldownEntry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/CooldownEntry.java
index 1b4e1885..74b48b60 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/CooldownEntry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/CooldownEntry.java
@@ -1,13 +1,13 @@
package fr.moussax.blightedSMP.engine.items.abilities;
/**
- * Tracks an active cooldown for a specific ability execution manager or key and type.
+ * Tracks an active cooldown for a specific ability execution key and trigger.
*
- * @param key unique identifier or class name owning this cooldown
- * @param abilityType ability trigger type under cooldown
+ * @param key unique identifier owning this cooldown
+ * @param trigger ability trigger under cooldown
* @param expirationTimeMillis epoch timestamp in milliseconds when the cooldown expires
*/
-public record CooldownEntry(String key, AbilityType abilityType, long expirationTimeMillis) {
+public record CooldownEntry(String key, AbilityTrigger trigger, long expirationTimeMillis) {
/**
* Checks whether the cooldown period has elapsed.
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityManager.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ItemAbility.java
similarity index 71%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityManager.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ItemAbility.java
index f1ba7935..c435ecd0 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityManager.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ItemAbility.java
@@ -3,15 +3,12 @@
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.event.Event;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Defines execution logic, lifecycle hooks, and resource requirements for an item ability.
*
* @param Bukkit event type that triggers this ability
*/
-public interface AbilityManager {
+public interface ItemAbility {
/**
* Gets the display name of this ability.
@@ -21,11 +18,11 @@ public interface AbilityManager {
String getName();
/**
- * Gets the trigger condition type for this ability.
+ * Gets the trigger condition for this ability.
*
- * @return ability trigger type
+ * @return ability trigger
*/
- AbilityType getType();
+ AbilityTrigger getTrigger();
/**
* Executes the ability logic when triggered by an event.
@@ -97,31 +94,4 @@ default boolean cancelEvent(boolean success) {
default String[] getDescription() {
return new String[0];
}
-
- /**
- * Formats lore lines displaying the ability name, trigger type, description, and resource costs.
- *
- * @return formatted list of item lore lines
- */
- default List getAbilityLore() {
- List lore = new ArrayList<>();
-
- lore.add("");
- lore.add("§5 Ability: " + getName() + " " + getType().getDisplayName());
-
- for (String line : getDescription()) {
- lore.add("§7 " + line);
- }
-
- int mana = getManaCost();
- int cooldown = getCooldownSeconds();
-
- if (mana > 0) {
- lore.add("§8 Mana Cost: §3" + mana);
- }
- if (cooldown > 0) {
- lore.add("§8 Cooldown: §a" + cooldown + "s");
- }
- return lore;
- }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ArmorManager.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/equipment/ArmorSetManager.java
similarity index 80%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ArmorManager.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/equipment/ArmorSetManager.java
index f7c8a6a3..0299cc28 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/ArmorManager.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/equipment/ArmorSetManager.java
@@ -1,7 +1,8 @@
-package fr.moussax.blightedSMP.engine.items.abilities;
+package fr.moussax.blightedSMP.engine.items.equipment;
import fr.moussax.bedrock.utils.debug.Log;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
+import fr.moussax.blightedSMP.engine.items.abilities.FullSetBonus;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.inventory.ItemStack;
@@ -13,9 +14,9 @@
/**
* Manages player armor evaluation, set bonus activation, and sneak state updates.
*/
-public final class ArmorManager {
+public final class ArmorSetManager {
- private ArmorManager() {
+ private ArmorSetManager() {
}
/**
@@ -28,6 +29,7 @@ public static void updatePlayerArmor(BlightedPlayer player) {
player.clearArmorPieces();
Map, Integer> bonusCount = new HashMap<>();
+ Map, FullSetBonus> bonusPrototypes = new HashMap<>();
for (ItemStack item : armorContents) {
if (item == null || item.getType().isAir()) continue;
@@ -40,6 +42,7 @@ public static void updatePlayerArmor(BlightedPlayer player) {
FullSetBonus bonus = blightedItem.getFullSetBonus();
if (bonus != null) {
bonusCount.merge(bonus.getClass(), 1, Integer::sum);
+ bonusPrototypes.putIfAbsent(bonus.getClass(), bonus);
}
}
@@ -59,14 +62,14 @@ public static void updatePlayerArmor(BlightedPlayer player) {
if (isRunning) return;
- try {
- FullSetBonus newBonus = bonusClass.getDeclaredConstructor().newInstance();
- if (count < newBonus.getMaxPieces()) return;
+ FullSetBonus prototype = bonusPrototypes.get(bonusClass);
+ if (prototype == null || count < prototype.getMaxPieces()) return;
- newBonus.setPlayer(player);
+ try {
+ FullSetBonus newBonus = prototype.createNew(player);
player.addActiveBonus(newBonus);
} catch (Exception exception) {
- Log.error("ArmorManager", "Failed to activate bonus " + bonusClass.getSimpleName());
+ Log.error("ArmorSetManager", "Failed to activate bonus " + bonusClass.getSimpleName());
}
});
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityListener.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemAbilityListener.java
similarity index 81%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityListener.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemAbilityListener.java
index 5712d40d..0277db95 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityListener.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemAbilityListener.java
@@ -1,10 +1,12 @@
-package fr.moussax.blightedSMP.engine.items.abilities;
+package fr.moussax.blightedSMP.engine.items.listeners;
import fr.moussax.blightedSMP.BlightedSMP;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityExecutor;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.equipment.ArmorSetManager;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Bukkit;
-import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
@@ -13,6 +15,7 @@
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDispenseArmorEvent;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
@@ -29,7 +32,7 @@
/**
* Listens for Bukkit interaction, block break, and inventory events to trigger item abilities and schedule armor updates.
*/
-public final class AbilityListener implements Listener {
+public final class ItemAbilityListener implements Listener {
private final Set dirtyArmorPlayers = new HashSet<>();
private boolean updateTaskScheduled = false;
@@ -54,7 +57,7 @@ private void processArmorUpdates() {
BlightedPlayer blightedPlayer = BlightedPlayer.get(player);
if (blightedPlayer == null) continue;
- ArmorManager.updatePlayerArmor(blightedPlayer);
+ ArmorSetManager.updatePlayerArmor(blightedPlayer);
}
dirtyArmorPlayers.clear();
}
@@ -120,7 +123,7 @@ public void onPlayerJoin(PlayerJoinEvent event) {
public void onSneakToggle(PlayerToggleSneakEvent event) {
BlightedPlayer blightedPlayer = BlightedPlayer.get(event.getPlayer());
if (blightedPlayer != null) {
- ArmorManager.handleSneakUpdate(blightedPlayer, event.isSneaking());
+ ArmorSetManager.handleSneakUpdate(blightedPlayer, event.isSneaking());
}
}
@@ -154,6 +157,18 @@ public void onBlockBreak(BlockBreakEvent event) {
trigger(event.getPlayer(), event);
}
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+ public void onBlockDropItem(org.bukkit.event.block.BlockDropItemEvent event) {
+ trigger(event.getPlayer(), event);
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+ public void onEntityDamage(EntityDamageByEntityEvent event) {
+ if (event.getDamager() instanceof Player player) {
+ trigger(player, event);
+ }
+ }
+
private boolean isArmorMaterial(String name) {
return name.endsWith("_HELMET") || name.endsWith("_CHESTPLATE")
|| name.endsWith("_LEGGINGS") || name.endsWith("_BOOTS") || name.equals("ELYTRA");
@@ -170,34 +185,24 @@ private void trigger(Player player, T event) {
if (interactEvent.getItem() != null) {
blightedItem = BlightedItem.fromItemStack(interactEvent.getItem());
}
- } else if (event instanceof BlockBreakEvent) {
+ } else if (event instanceof BlockBreakEvent || event instanceof org.bukkit.event.block.BlockDropItemEvent || event instanceof EntityDamageByEntityEvent) {
ItemStack mainHand = player.getInventory().getItemInMainHand();
- if (mainHand.getType() != Material.AIR) {
+ if (!mainHand.getType().isAir()) {
blightedItem = BlightedItem.fromItemStack(mainHand);
}
} else {
- blightedItem = blightedPlayer.getEquippedItemManager();
+ blightedItem = blightedPlayer.getEquippedItem();
}
if (blightedItem == null) return;
- List> abilities = blightedItem.getAbilities();
+ List> abilities = blightedItem.getAbilities();
if (abilities.isEmpty()) return;
- AbilityManager extends Event> bestMatch = null;
- for (AbilityManager extends Event> ability : abilities) {
- if (!ability.getType().matches(event)) continue;
- if (bestMatch == null || isMoreSpecific(ability.getType(), bestMatch.getType())) {
- bestMatch = ability;
+ for (ItemAbility extends Event> ability : abilities) {
+ if (ability.getTrigger().matches(event)) {
+ AbilityExecutor.execute((ItemAbility) ability, blightedPlayer, event);
}
}
-
- if (bestMatch != null) {
- AbilityExecutor.execute((AbilityManager) bestMatch, blightedPlayer, event);
- }
- }
-
- private boolean isMoreSpecific(AbilityType candidate, AbilityType current) {
- return candidate.name().startsWith("SNEAK_") && !current.name().startsWith("SNEAK_");
}
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleListener.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemRestrictionListener.java
similarity index 51%
rename from blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleListener.java
rename to blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemRestrictionListener.java
index 3007e2c5..962c9d86 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleListener.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/ItemRestrictionListener.java
@@ -1,9 +1,8 @@
-package fr.moussax.blightedSMP.engine.items.rules;
+package fr.moussax.blightedSMP.engine.items.listeners;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
+import fr.moussax.blightedSMP.engine.items.ItemRestriction;
import org.bukkit.entity.Player;
-import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
@@ -14,31 +13,18 @@
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.persistence.PersistentDataType;
-
-import static fr.moussax.blightedSMP.engine.items.BlightedItem.BLIGHTED_ID_KEY;
/**
- * Event listener enforcing item rules and processing custom item consumption callbacks.
+ * Event listener enforcing item restriction flags and processing custom item consumption callbacks.
*/
-public final class ItemRuleListener implements Listener {
-
- private BlightedItem getManager(ItemStack itemStack) {
- if (itemStack == null || !itemStack.hasItemMeta()) return null;
- ItemMeta itemMeta = itemStack.getItemMeta();
- if (itemMeta == null) return null;
- String itemId = itemMeta.getPersistentDataContainer().get(BLIGHTED_ID_KEY, PersistentDataType.STRING);
- if (itemId == null) return null;
- return ItemRegistry.get(itemId);
- }
+public final class ItemRestrictionListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onPlayerInteract(PlayerInteractEvent event) {
ItemStack itemStack = event.getItem();
- BlightedItem manager = getManager(itemStack);
+ BlightedItem item = BlightedItem.fromItemStack(itemStack);
- if (manager != null && manager.shouldRestrictInteract(event, itemStack)) {
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_INTERACTION)) {
event.setCancelled(true);
}
}
@@ -47,17 +33,17 @@ public void onPlayerInteract(PlayerInteractEvent event) {
public void onProjectileLaunch(ProjectileLaunchEvent event) {
if (!(event.getEntity().getShooter() instanceof Player player)) return;
- boolean mainHandRestricted = checkAndRestrictHandItem(player, player.getInventory().getItemInMainHand(), event);
- boolean offHandRestricted = checkAndRestrictHandItem(player, player.getInventory().getItemInOffHand(), event);
+ boolean mainHandRestricted = checkAndRestrictHandItem(player, player.getInventory().getItemInMainHand());
+ boolean offHandRestricted = checkAndRestrictHandItem(player, player.getInventory().getItemInOffHand());
if (mainHandRestricted || offHandRestricted) {
event.setCancelled(true);
}
}
- private boolean checkAndRestrictHandItem(Player player, ItemStack itemStack, Event event) {
- BlightedItem manager = getManager(itemStack);
- if (manager != null && manager.shouldRestrictUse(event, itemStack)) {
+ private boolean checkAndRestrictHandItem(Player player, ItemStack itemStack) {
+ BlightedItem item = BlightedItem.fromItemStack(itemStack);
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_PROJECTILE_LAUNCH)) {
player.setCooldown(itemStack.getType(), 0);
return true;
}
@@ -67,16 +53,16 @@ private boolean checkAndRestrictHandItem(Player player, ItemStack itemStack, Eve
@EventHandler(ignoreCancelled = true)
public void onBucketEmpty(PlayerBucketEmptyEvent event) {
ItemStack handItem = event.getPlayer().getInventory().getItem(event.getHand());
- BlightedItem manager = getManager(handItem);
- if (manager != null && manager.shouldRestrictUse(event, handItem)) {
+ BlightedItem item = BlightedItem.fromItemStack(handItem);
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_BUCKET_INTERACTIONS)) {
event.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) {
- BlightedItem manager = getManager(event.getItemInHand());
- if (manager != null && manager.shouldRestrictPlace(event, event.getItemInHand())) {
+ BlightedItem item = BlightedItem.fromItemStack(event.getItemInHand());
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_PLACEMENT)) {
event.setCancelled(true);
event.getPlayer().updateInventory();
}
@@ -84,31 +70,31 @@ public void onBlockPlace(BlockPlaceEvent event) {
@EventHandler(ignoreCancelled = true)
public void onItemDrop(PlayerDropItemEvent event) {
- BlightedItem manager = getManager(event.getItemDrop().getItemStack());
- if (manager != null && manager.shouldRestrictUse(event, event.getItemDrop().getItemStack())) {
+ BlightedItem item = BlightedItem.fromItemStack(event.getItemDrop().getItemStack());
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_DROP)) {
event.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true)
public void onItemConsume(PlayerItemConsumeEvent event) {
- BlightedItem manager = getManager(event.getItem());
- if (manager == null) return;
+ BlightedItem item = BlightedItem.fromItemStack(event.getItem());
+ if (item == null) return;
- if (manager.shouldRestrictUse(event, event.getItem())) {
+ if (item.hasRestriction(ItemRestriction.PREVENT_CONSUMPTION)) {
event.setCancelled(true);
return;
}
- if (manager.getConsumeHandler() != null) {
- manager.getConsumeHandler().onConsume(event.getPlayer(), event.getItem());
+ if (item.getConsumeHandler() != null) {
+ item.getConsumeHandler().onConsume(event.getPlayer(), event.getItem());
}
}
@EventHandler(ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
- BlightedItem manager = getManager(event.getCurrentItem());
- if (manager != null && manager.shouldRestrictUse(event, event.getCurrentItem())) {
+ BlightedItem item = BlightedItem.fromItemStack(event.getCurrentItem());
+ if (item != null && item.hasRestriction(ItemRestriction.PREVENT_INTERACTION)) {
event.setCancelled(true);
}
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/VanillaRecipeProtectionListener.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/VanillaRecipeProtectionListener.java
index 998b1d27..89125441 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/VanillaRecipeProtectionListener.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/listeners/VanillaRecipeProtectionListener.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.engine.items.listeners;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.recipes.crafting.BlightedRecipe;
+import fr.moussax.blightedSMP.engine.recipes.crafting.BlightedRecipe;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/lore/ItemLoreRenderer.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/lore/ItemLoreRenderer.java
new file mode 100644
index 00000000..9318c6fd
--- /dev/null
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/lore/ItemLoreRenderer.java
@@ -0,0 +1,84 @@
+package fr.moussax.blightedSMP.engine.items.lore;
+
+import fr.moussax.blightedSMP.engine.items.BlightedItem;
+import fr.moussax.blightedSMP.engine.items.ItemRarity;
+import fr.moussax.blightedSMP.engine.items.ItemType;
+import fr.moussax.blightedSMP.engine.items.abilities.FullSetBonus;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Renders standardized, canonical BlightedMC item lore.
+ *
+ * Formats descriptions, custom stat blocks, ability triggers and resource costs,
+ * set bonuses, and the canonical rarity and item-type footer.
+ */
+public final class ItemLoreRenderer {
+
+ private ItemLoreRenderer() {
+ }
+
+ /**
+ * Renders complete lore lines for a custom item.
+ *
+ * @param item item definition to render lore for
+ * @return ordered list of formatted lore lines
+ */
+ public static List render(BlightedItem item) {
+ List lore = new ArrayList<>();
+
+ // 1. Description lines
+ List description = item.getDescription();
+ if (!description.isEmpty()) {
+ lore.add("");
+ for (String line : description) {
+ lore.add("§7 " + line);
+ }
+ }
+
+ // 2. Abilities
+ for (ItemAbility> ability : item.getAbilities()) {
+ lore.add("");
+ lore.add("§5 Ability: " + ability.getName() + " " + ability.getTrigger().getDisplayName());
+
+ for (String line : ability.getDescription()) {
+ lore.add("§7 " + line);
+ }
+
+ int mana = ability.getManaCost();
+ int cooldown = ability.getCooldownSeconds();
+
+ if (mana > 0) {
+ lore.add("§8 Mana Cost: §3" + mana);
+ }
+ if (cooldown > 0) {
+ lore.add("§8 Cooldown: §a" + cooldown + "s");
+ }
+ }
+
+ // 3. Set Bonus / Piece Bonus
+ FullSetBonus setBonus = item.getFullSetBonus();
+ if (setBonus != null) {
+ List bonusLore = setBonus.getBonusLore();
+ lore.addAll(bonusLore);
+ }
+
+ // 4. Custom lore lines appended directly
+ List customLore = item.getCustomLoreLines();
+ if (!customLore.isEmpty()) {
+ lore.addAll(customLore);
+ }
+
+ // 5. Canonical Rarity & Type Footer
+ ItemRarity rarity = item.getItemRarity();
+ ItemType type = item.getItemType();
+ String typeSuffix = (type != null && type != ItemType.UNCATEGORIZED) ? " " + type.name() : "";
+
+ lore.add("");
+ lore.add(rarity.getName() + typeSuffix);
+
+ return lore;
+ }
+}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/registry/ItemRegistry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/registry/ItemRegistry.java
index c68a29c9..baa9158e 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/registry/ItemRegistry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/registry/ItemRegistry.java
@@ -42,8 +42,13 @@ public static void register(BlightedItem... items) {
}
}
- @NonNull
+ @Nullable
public static BlightedItem get(@NonNull String itemId) {
+ return REGISTRY.get(itemId);
+ }
+
+ @NonNull
+ public static BlightedItem getOrThrow(@NonNull String itemId) {
BlightedItem item = REGISTRY.get(itemId);
if (item == null) {
throw new IllegalArgumentException("Unknown item ID: " + itemId);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRule.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRule.java
deleted file mode 100644
index 4a41f755..00000000
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRule.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package fr.moussax.blightedSMP.engine.items.rules;
-
-import org.bukkit.event.Event;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.event.entity.ProjectileLaunchEvent;
-import org.bukkit.event.player.PlayerBucketEmptyEvent;
-import org.bukkit.event.player.PlayerDropItemEvent;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.event.player.PlayerItemConsumeEvent;
-import org.bukkit.inventory.ItemStack;
-
-/**
- * Defines behavioral restrictions for custom items in BlightedMC.
- *
- * Implementations override these methods to restrict specific actions.
- * All rule methods return {@code true} to restrict/cancel an action, or {@code false} to permit it.
- */
-public interface ItemRule {
-
- /**
- * Rule preventing bucket fill and empty operations.
- */
- ItemRule PREVENT_BUCKET_INTERACTIONS = new ItemRule() {
- @Override
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return event instanceof PlayerBucketEmptyEvent;
- }
- };
-
- /**
- * Rule preventing item consumption (eating or drinking).
- */
- ItemRule PREVENT_CONSUME = new ItemRule() {
- @Override
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return event instanceof PlayerItemConsumeEvent;
- }
- };
-
- /**
- * Rule preventing items from being dropped by players.
- */
- ItemRule PREVENT_DROP = new ItemRule() {
- @Override
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return event instanceof PlayerDropItemEvent;
- }
- };
-
- /**
- * Rule preventing all environmental interactions with the item.
- */
- ItemRule PREVENT_INTERACTION = new ItemRule() {
- @Override
- public boolean shouldRestrictInteract(PlayerInteractEvent event, ItemStack itemStack) {
- return true;
- }
- };
-
- /**
- * Rule preventing custom item block placement.
- */
- ItemRule PREVENT_PLACEMENT = new ItemRule() {
- @Override
- public boolean shouldRestrictPlace(BlockPlaceEvent event, ItemStack itemStack) {
- return true;
- }
- };
-
- /**
- * Rule preventing projectile launching (bows, tridents, snowballs).
- */
- ItemRule PREVENT_PROJECTILE_LAUNCH = new ItemRule() {
- @Override
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return event instanceof ProjectileLaunchEvent;
- }
- };
-
- /**
- * Determines whether block placement should be restricted for this item.
- *
- * @param event block place event
- * @param itemStack item stack being placed
- * @return {@code true} to restrict placement (cancel event), {@code false} to allow
- */
- default boolean shouldRestrictPlace(BlockPlaceEvent event, ItemStack itemStack) {
- return false;
- }
-
- /**
- * Determines whether player interaction should be restricted for this item.
- *
- * @param event player interact event
- * @param itemStack item stack being used
- * @return {@code true} to restrict interaction (cancel event), {@code false} to allow
- */
- default boolean shouldRestrictInteract(PlayerInteractEvent event, ItemStack itemStack) {
- return false;
- }
-
- /**
- * Determines whether generic usage should be restricted for this item.
- *
- * @param event triggering event
- * @param itemStack item stack being used
- * @return {@code true} to restrict usage (cancel event), {@code false} to allow
- */
- default boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- return false;
- }
-}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleEngine.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleEngine.java
deleted file mode 100644
index cd1da0c8..00000000
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/rules/ItemRuleEngine.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package fr.moussax.blightedSMP.engine.items.rules;
-
-import org.bukkit.event.Event;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.event.player.PlayerInteractEvent;
-import org.bukkit.inventory.ItemStack;
-import org.jspecify.annotations.NonNull;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Evaluates behavioral restriction rules for custom items.
- *
- * An {@code ItemRuleEngine} maintains a collection of {@link ItemRule} instances and evaluates
- * whether actions such as block placement, player interaction, or generic event usage should be restricted.
- */
-public final class ItemRuleEngine {
-
- private final List rules = new ArrayList<>();
-
- /**
- * Constructs an empty item rule engine.
- */
- public ItemRuleEngine() {
- }
-
- /**
- * Registers an item restriction rule.
- *
- * @param rule restriction rule to add
- */
- public void addRule(@NonNull ItemRule rule) {
- this.rules.add(rule);
- }
-
- /**
- * Evaluates whether block placement should be restricted for an item stack.
- *
- * @param event block place event
- * @param itemStack item stack being placed
- * @return {@code true} if placement is restricted, {@code false} otherwise
- */
- public boolean shouldRestrictPlace(BlockPlaceEvent event, ItemStack itemStack) {
- for (ItemRule rule : rules) {
- if (rule.shouldRestrictPlace(event, itemStack)) return true;
- }
- return false;
- }
-
- /**
- * Evaluates whether player interaction should be restricted for an item stack.
- *
- * @param event player interact event
- * @param itemStack item stack being interacted with
- * @return {@code true} if interaction is restricted, {@code false} otherwise
- */
- public boolean shouldRestrictInteract(PlayerInteractEvent event, ItemStack itemStack) {
- for (ItemRule rule : rules) {
- if (rule.shouldRestrictInteract(event, itemStack)) return true;
- }
- return false;
- }
-
- /**
- * Evaluates whether generic usage should be restricted for an event and item stack.
- *
- * @param event triggering event
- * @param itemStack item stack being used
- * @return {@code true} if usage is restricted, {@code false} otherwise
- */
- public boolean shouldRestrictUse(Event event, ItemStack itemStack) {
- for (ItemRule rule : rules) {
- if (rule.shouldRestrictUse(event, itemStack)) return true;
- }
- return false;
- }
-
- /**
- * Returns an unmodifiable list of all registered restriction rules.
- *
- * @return unmodifiable view of registered rules
- */
- public List getRules() {
- return Collections.unmodifiableList(rules);
- }
-}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/BlightedPlayer.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/BlightedPlayer.java
index 5d80288b..dd7ac89b 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/BlightedPlayer.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/BlightedPlayer.java
@@ -3,7 +3,11 @@
import fr.moussax.blightedSMP.BlightedSMP;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import fr.moussax.blightedSMP.engine.items.ItemType;
-import fr.moussax.blightedSMP.engine.items.abilities.*;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
+import fr.moussax.blightedSMP.engine.items.abilities.CooldownEntry;
+import fr.moussax.blightedSMP.engine.items.abilities.FullSetBonus;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.equipment.ArmorSetManager;
import fr.moussax.blightedSMP.server.PluginSettings;
import fr.moussax.blightedSMP.server.database.PlayerDataHandler;
import lombok.Getter;
@@ -69,14 +73,11 @@ private BlightedPlayer(Player player) {
this.gems = dataHandler.getSavedGems();
this.maxMana = DEFAULT_MAX_MANA;
- this.manaRegenerationRate = Optional.ofNullable(BlightedSMP.getInstance())
- .map(BlightedSMP::getSettings)
- .map(PluginSettings::getDefaultManaRegenerationRate)
- .orElse(DEFAULT_MANA_REGEN_RATE);
+ this.manaRegenerationRate = Optional.ofNullable(BlightedSMP.getInstance()).map(BlightedSMP::getSettings).map(PluginSettings::getDefaultManaRegenerationRate).orElse(DEFAULT_MANA_REGEN_RATE);
setCurrentMana(dataHandler.getSavedMana());
this.forgeFuel = dataHandler.getSavedForgeFuel();
- ArmorManager.updatePlayerArmor(this);
+ ArmorSetManager.updatePlayerArmor(this);
}
/**
@@ -154,45 +155,44 @@ public void removeCooldown(CooldownEntry entry) {
}
/**
- * Sets or replaces the cooldown duration for a string key and ability type.
+ * Sets or replaces the cooldown duration for a string key and ability trigger.
*
* @param key cooldown key or ability name
- * @param type ability type associated with the cooldown
+ * @param trigger ability trigger associated with the cooldown
* @param seconds cooldown duration in seconds
*/
- public void setCooldown(String key, AbilityType type, int seconds) {
+ public void setCooldown(String key, AbilityTrigger trigger, int seconds) {
long expire = System.currentTimeMillis() + (seconds * 1000L);
- cooldowns.removeIf(currentCooldown ->
- currentCooldown.key().equals(key) && currentCooldown.abilityType() == type);
- cooldowns.add(new CooldownEntry(key, type, expire));
+ cooldowns.removeIf(currentCooldown -> currentCooldown.key().equals(key) && currentCooldown.trigger() == trigger);
+ cooldowns.add(new CooldownEntry(key, trigger, expire));
}
/**
- * Sets or replaces the cooldown duration for an ability manager and ability type.
+ * Sets or replaces the cooldown duration for an ability class and ability trigger.
*
- * @param managerClass ability manager class associated with the cooldown
- * @param type ability type associated with the cooldown
+ * @param abilityClass ability class associated with the cooldown
+ * @param trigger ability trigger associated with the cooldown
* @param seconds cooldown duration in seconds
*/
@SuppressWarnings("rawtypes")
- public void setCooldown(Class extends AbilityManager> managerClass, AbilityType type, int seconds) {
- setCooldown(managerClass != null ? managerClass.getName() : "", type, seconds);
+ public void setCooldown(Class extends ItemAbility> abilityClass, AbilityTrigger trigger, int seconds) {
+ setCooldown(abilityClass != null ? abilityClass.getName() : "", trigger, seconds);
}
/**
- * Returns the remaining cooldown duration in seconds for a string key and ability type.
+ * Returns the remaining cooldown duration in seconds for a string key and ability trigger.
*
* Expired cooldown entries are removed before performing the lookup.
*
- * @param key cooldown key or ability name
- * @param type ability type associated with the cooldown
+ * @param key cooldown key or ability name
+ * @param trigger ability trigger associated with the cooldown
* @return remaining cooldown in seconds, or {@code 0} if no active cooldown exists
*/
- public double getRemainingCooldown(String key, AbilityType type) {
+ public double getRemainingCooldown(String key, AbilityTrigger trigger) {
cooldowns.removeIf(CooldownEntry::isExpired);
for (CooldownEntry entry : cooldowns) {
- if (entry.key().equals(key) && entry.abilityType() == type) {
+ if (entry.key().equals(key) && entry.trigger() == trigger) {
return entry.getRemainingCooldownTimeInSeconds();
}
}
@@ -200,17 +200,17 @@ public double getRemainingCooldown(String key, AbilityType type) {
}
/**
- * Returns the remaining cooldown duration in seconds for an ability manager and ability type.
+ * Returns the remaining cooldown duration in seconds for an ability class and ability trigger.
*
* Expired cooldown entries are removed before performing the lookup.
*
- * @param managerClass ability manager class associated with the cooldown
- * @param type ability type associated with the cooldown
+ * @param abilityClass ability class associated with the cooldown
+ * @param trigger ability trigger associated with the cooldown
* @return remaining cooldown in seconds, or {@code 0} if no active cooldown exists
*/
@SuppressWarnings("rawtypes")
- public double getRemainingCooldown(Class extends AbilityManager> managerClass, AbilityType type) {
- return getRemainingCooldown(managerClass != null ? managerClass.getName() : "", type);
+ public double getRemainingCooldown(Class extends ItemAbility> abilityClass, AbilityTrigger trigger) {
+ return getRemainingCooldown(abilityClass != null ? abilityClass.getName() : "", trigger);
}
/**
@@ -225,7 +225,7 @@ public void clearArmorPieces() {
*
* @return custom item held in main hand, or {@code null} if non-custom or empty
*/
- public BlightedItem getEquippedItemManager() {
+ public BlightedItem getEquippedItem() {
ItemStack mainHandItem = player.getInventory().getItemInMainHand();
return BlightedItem.fromItemStack(mainHandItem);
}
@@ -456,10 +456,7 @@ public void saveData() {
int gemsToSave = this.gems;
double manaToSave = this.currentMana;
int forgeFuelToSave = this.forgeFuel;
- Bukkit.getScheduler().runTaskAsynchronously(
- BlightedSMP.getInstance(),
- () -> dataHandler.save(gemsToSave, manaToSave, forgeFuelToSave)
- );
+ Bukkit.getScheduler().runTaskAsynchronously(BlightedSMP.getInstance(), () -> dataHandler.save(gemsToSave, manaToSave, forgeFuelToSave));
}
/**
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
index b6b1c7bf..956ed2a1 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
@@ -4,14 +4,18 @@
import fr.moussax.bedrock.ui.actionbar.Actionbar;
import fr.moussax.bedrock.ui.actionbar.ActionbarSection;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
+import org.bukkit.attribute.Attribute;
import org.bukkit.plugin.Plugin;
import org.jspecify.annotations.NonNull;
+import java.util.Objects;
+
/**
* Manages player HUD display registration and periodic action bar formatting.
*/
public final class PlayerHudManager {
+ public static final String SECTION_HEALTH = "health";
public static final String SECTION_GEMS = "gems";
public static final String SECTION_MANA = "mana";
@@ -28,12 +32,24 @@ public PlayerHudManager(@NonNull Plugin plugin) {
}
private void initializeDefaultSections() {
- ActionbarSection gemsSection = ActionbarSection.builder(SECTION_GEMS)
+
+ ActionbarSection healthSection = ActionbarSection.builder(SECTION_HEALTH)
.order(0)
+ .render(player -> {
+ int health = (int) player.getHealth();
+ int maxHealth = (int) Objects.requireNonNull(player.getAttribute(Attribute.MAX_HEALTH)).getValue();
+ int absorption = (int) player.getAbsorptionAmount() / 2;
+ String dynamicHealth = absorption > 0 ? "§6" + (absorption + health) : "§c" + health;
+ return dynamicHealth + "/" + maxHealth + "❤";
+ })
+ .build();
+
+ ActionbarSection gemsSection = ActionbarSection.builder(SECTION_GEMS)
+ .order(1)
.render(player -> {
BlightedPlayer blightedPlayer = BlightedPlayer.get(player);
if (blightedPlayer == null) return null;
- return "§d" + Formatter.formatDecimalWithCommas(blightedPlayer.getGems()) + "✵ Gems";
+ return "§d" + Formatter.formatDecimalWithCommas(blightedPlayer.getGems()) + "❖ Blight";
})
.build();
@@ -47,6 +63,7 @@ private void initializeDefaultSections() {
})
.build();
+ Actionbar.register(plugin, healthSection);
Actionbar.register(plugin, gemsSection);
Actionbar.register(plugin, manaSection);
}
@@ -55,6 +72,7 @@ private void initializeDefaultSections() {
* Unregisters all sections managed by this HUD manager.
*/
public void unregister() {
+ Actionbar.unregister(SECTION_HEALTH);
Actionbar.unregister(SECTION_GEMS);
Actionbar.unregister(SECTION_MANA);
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/EventsRegistry.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/EventsRegistry.java
index cda7661c..f5a42f59 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/EventsRegistry.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/registry/EventsRegistry.java
@@ -1,17 +1,16 @@
package fr.moussax.blightedSMP.registry;
import fr.moussax.blightedSMP.BlightedSMP;
-import fr.moussax.blightedSMP.content.items.abilities.WitherImpactAbility;
import fr.moussax.blightedSMP.engine.entities.listeners.BlightedEntitiesListener;
import fr.moussax.blightedSMP.engine.entities.listeners.EntityComponentListener;
import fr.moussax.blightedSMP.engine.entities.listeners.SpawnableEntitiesListener;
import fr.moussax.blightedSMP.engine.entities.registry.EntitiesRegistry;
import fr.moussax.blightedSMP.engine.fishing.FishingListener;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityListener;
-import fr.moussax.blightedSMP.engine.items.blocks.BlightedBlockListener;
+import fr.moussax.blightedSMP.engine.blocks.BlightedBlockListener;
+import fr.moussax.blightedSMP.engine.items.listeners.ItemAbilityListener;
+import fr.moussax.blightedSMP.engine.items.listeners.ItemRestrictionListener;
import fr.moussax.blightedSMP.engine.items.listeners.UnsafeAnvilListener;
import fr.moussax.blightedSMP.engine.items.listeners.VanillaRecipeProtectionListener;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRuleListener;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.blightedSMP.engine.player.PlayerListener;
import fr.moussax.blightedSMP.engine.player.hud.PlayerHudManager;
@@ -69,12 +68,11 @@ public void initializeListeners() {
pluginManager.registerEvents(spawnableEntitiesListener, instance);
pluginManager.registerEvents(new BlightedBlockListener(), instance);
pluginManager.registerEvents(new PlayerListener(), instance);
- pluginManager.registerEvents(new ItemRuleListener(), instance);
- pluginManager.registerEvents(new AbilityListener(), instance);
+ pluginManager.registerEvents(new ItemRestrictionListener(), instance);
+ pluginManager.registerEvents(new ItemAbilityListener(), instance);
pluginManager.registerEvents(new FishingListener(), instance);
pluginManager.registerEvents(new UnsafeAnvilListener(), instance);
pluginManager.registerEvents(new VanillaRecipeProtectionListener(), instance);
- pluginManager.registerEvents(new WitherImpactAbility(), instance);
pluginManager.registerEvents(new BlightedQuestListener(), instance);
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/utils/Utilities.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/utils/Utilities.java
index 2676e4d7..fc01ca67 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/utils/Utilities.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/utils/Utilities.java
@@ -1,6 +1,6 @@
package fr.moussax.blightedSMP.utils;
-import fr.moussax.blightedSMP.engine.items.recipes.CraftingObject;
+import fr.moussax.blightedSMP.engine.recipes.CraftingObject;
import fr.moussax.bedrock.text.Formatter;
import org.bukkit.Material;
import org.bukkit.entity.Player;
From b461e5367c56043c3e6bb961799396ccde8c41a8 Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 09:54:21 +0200
Subject: [PATCH 3/9] refactor(content/items): migrate items and abilities to
modernized API
---
.../content/items/BlightedItems.java | 57 +++----
.../content/items/BlightedTools.java | 19 +--
.../blightedSMP/content/items/Bonemerang.java | 14 +-
.../content/items/GlimmeringEye.java | 8 +-
.../blightedSMP/content/items/Hyperion.java | 15 +-
.../content/items/KnightsSword.java | 16 +-
.../content/items/ThermalFuels.java | 66 ++++----
.../items/abilities/BonemerangAbility.java | 23 ++-
.../items/abilities/KnightsSlamAbility.java | 18 ++-
.../items/abilities/RocketBootsAbility.java | 4 +-
.../items/abilities/VoidStepAbility.java | 10 +-
.../items/abilities/WitherImpactAbility.java | 78 ++++------
.../abilities/tools/AutosmeltAbility.java | 42 ++---
.../items/abilities/tools/HammerAbility.java | 35 ++---
.../items/abilities/tools/TimberAbility.java | 17 ++-
.../abilities/tools/VeinmineAbility.java | 40 ++---
.../content/items/armors/FishingArmors.java | 39 ++---
.../content/items/armors/HomodeusArmor.java | 1 -
.../content/items/armors/RocketBoots.java | 1 -
.../items/materials/BlightedMaterials.java | 6 +-
.../content/items/materials/EndMaterials.java | 21 +--
.../items/materials/FishingMaterials.java | 144 +++++++-----------
.../items/materials/NetherMaterials.java | 58 +++----
23 files changed, 290 insertions(+), 442 deletions(-)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedItems.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedItems.java
index e3a3df46..a40001d7 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedItems.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedItems.java
@@ -3,9 +3,6 @@
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
-
-import java.util.function.Consumer;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import fr.moussax.blightedSMP.registry.RegistryModule;
import fr.moussax.blightedSMP.engine.loot.results.gems.GemsItem;
import org.bukkit.DyeColor;
@@ -16,6 +13,7 @@
import org.bukkit.inventory.ItemFlag;
import java.util.List;
+import java.util.function.Consumer;
public class BlightedItems implements RegistryModule> {
@@ -25,15 +23,12 @@ public void register(Consumer registry) {
BlightedItem blightedBanner = new BlightedItem(
"BLIGHTED_BANNER", ItemType.UNCATEGORIZED, ItemRarity.EPIC, Material.BLACK_BANNER);
blightedBanner.setDisplayName("Crown of the Blight");
- blightedBanner.addLore(
- "",
- "§7 An ancient standard woven from",
- "§5 shadow-silk§7. Its fabric beats with ",
- "§7 a faint, living pulse, drawing the",
- "§7 corruption of the Blight like",
- "§7 a cosmic §5lightning rod§7.",
- "",
- ItemRarity.EPIC.getName()
+ blightedBanner.description(
+ "An ancient standard woven from",
+ "§5shadow-silk§7. Its fabric beats with ",
+ "a faint, living pulse, drawing the",
+ "corruption of the Blight like",
+ "a cosmic §5lightning rod§7."
);
blightedBanner.addBannerPatterns(List.of(
new Pattern(DyeColor.PURPLE, PatternType.CURLY_BORDER),
@@ -44,18 +39,19 @@ public void register(Consumer registry) {
new Pattern(DyeColor.BLACK, PatternType.FLOW)
));
blightedBanner.addItemFlag(ItemFlag.HIDE_BANNER_PATTERNS);
- blightedBanner.addRule(ItemRule.PREVENT_PLACEMENT);
+ blightedBanner.preventPlacement();
blightedBanner.editEquippable(equippable -> equippable.setSlot(EquipmentSlot.HEAD));
blightedBanner.fireResistant();
blightedBanner.unstackable();
BlightedItem blightedCodex = new BlightedItem("BLIGHTED_CODEX", ItemType.UNCATEGORIZED, ItemRarity.EPIC, Material.ENCHANTED_BOOK);
blightedCodex.setDisplayName("Blighted Codex");
+ blightedCodex.description(
+ "A forbidden ledger bound in cracked",
+ "leather. Its pages remain blank until",
+ "they absorb the essence of the Blight."
+ );
blightedCodex.addLore(
- "",
- "§7 A forbidden ledger bound in cracked",
- "§7 leather. Its pages remain blank until",
- "§7 they absorb the essence of the Blight.",
"",
" D2A5FF§lSEALED RIDDLE!",
"D2A5FF Wear the woven shadow as your crown,",
@@ -65,33 +61,28 @@ public void register(Consumer registry) {
"D2A5FF Lay your hand upon the ancient seal,",
"D2A5FF and the hidden path shall awaken.",
"",
- "§8 Souls trapped: §d0 ☠",
- "",
- ItemRarity.EPIC.getName()
+ "§8 Souls trapped: §d0 ☠"
);
blightedCodex.fireResistant();
BlightedItem blightedGemstone = new BlightedItem("BLIGHTED_GEMSTONE", ItemType.UNCATEGORIZED, ItemRarity.SPECIAL, Material.PLAYER_HEAD);
blightedGemstone.setCustomSkullTexture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDM2MjM1MjFjODExMWFkMjllOWRjZjdhY2M1NjA4NWE5YWIwN2RhNzMyZDE1MTg5NzZhZWU2MWQwYjNlM2JkNiJ9fX0=");
blightedGemstone.setDisplayName("Blighted Gemstone");
+ blightedGemstone.description(
+ "A gemstone §5corrupted§7 by shadow,",
+ "stolen from the heart of a §5fallen",
+ "§5abomination§7. Within its core lie §dGems ",
+ "sealed and waiting for a daring",
+ "hand to claim them."
+ );
blightedGemstone.addLore(
- "",
- "§7 A gemstone §5corrupted§7 by shadow,",
- "§7 stolen from the heart of a §5fallen",
- "§5 abomination§7. Within its core lie §dGems ",
- "§7 sealed and waiting for a daring",
- "§7 hand to claim them.",
- "§8 Ges: §d1✵",
- "",
- "§d Right click to consume!",
- "",
- ItemRarity.SPECIAL.getName()
+ "§8 Gems: §d1✵"
);
blightedGemstone.preventEquipping();
blightedGemstone.unstackable();
- blightedGemstone.addRule(ItemRule.PREVENT_PLACEMENT);
- blightedGemstone.addAbility(new GemsItem.BlightedGemstoneAbility(), false);
+ blightedGemstone.preventPlacement();
+ blightedGemstone.addAbility(new GemsItem.BlightedGemstoneAbility());
registry.accept(blightedBanner);
registry.accept(blightedCodex);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedTools.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedTools.java
index 79914bcc..8ec75a58 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedTools.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/BlightedTools.java
@@ -15,27 +15,22 @@ public class BlightedTools implements RegistryModule> {
public void register(Consumer registry) {
BlightedItem magmaRod = new BlightedItem("MAGMA_ROD", ItemType.LAVA_FISHING_ROD, ItemRarity.UNCOMMON, Material.FISHING_ROD);
magmaRod.setDisplayName("Magma Rod");
-
- magmaRod.addLore("",
- " §7Impervious to the inferno,",
- " §7this rod casts where others ",
- " §7burn to dredge §6molten depths ",
- " §7for treasures.",
- ""
+ magmaRod.description(
+ "Impervious to the inferno,",
+ "this rod casts where others",
+ "burn to dredge §6molten depths",
+ "for treasures."
);
- magmaRod.addLore(ItemRarity.UNCOMMON.getName() + " ROD");
magmaRod.setFireResistant(true);
BlightedItem voidRod = new BlightedItem("VOID_ROD", ItemType.VOID_FISHING_ROD, ItemRarity.RARE, Material.FISHING_ROD);
voidRod.setDisplayName("Void Rod");
- voidRod.addLore("§8Demonstration tool");
- voidRod.addLore("");
- voidRod.addLore(ItemRarity.RARE.getName() + " ROD");
+ voidRod.description("Demonstration tool");
BlightedItem demoPickaxe = new BlightedItem("DEMO_PICKAXE", ItemType.PICKAXE, ItemRarity.SPECIAL, Material.DIAMOND_PICKAXE);
demoPickaxe.setDisplayName("Demo Pickaxe");
demoPickaxe.addAbility(new VeinmineAbility());
- demoPickaxe.addLore("§8Demonstration tool");
+ demoPickaxe.description("Demonstration tool");
registry.accept(demoPickaxe);
registry.accept(magmaRod);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Bonemerang.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Bonemerang.java
index b4e4070a..fc1e679f 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Bonemerang.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Bonemerang.java
@@ -5,25 +5,17 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class Bonemerang implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem bonemerang = new BlightedItem("BONEMERANG", ItemType.BOW, ItemRarity.EPIC, Material.BONE);
bonemerang.setDisplayName("Bonemerang");
- bonemerang.addLore(
- "",
- "§5 Ability: Swing §d§lRIGHT CLICK",
- "§7 Throw the bone forward, slicing",
- "§7 through foes, dealing §c12 §7damage ",
- "§7 before returning to you.",
- "",
- ItemRarity.EPIC.getName() + " BOW"
- );
- bonemerang.addAbility(new BonemerangAbility(), false);
+ bonemerang.addAbility(new BonemerangAbility());
bonemerang.glow();
bonemerang.unstackable();
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/GlimmeringEye.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/GlimmeringEye.java
index 4603c63c..c1a26e00 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/GlimmeringEye.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/GlimmeringEye.java
@@ -5,21 +5,19 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class GlimmeringEye implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem glimmeringEye = new BlightedItem("GLIMMERING_EYE", ItemType.UNCATEGORIZED, ItemRarity.RARE, Material.ENDER_EYE);
glimmeringEye.setDisplayName("Glimmering Eye");
-
glimmeringEye.glow();
glimmeringEye.addAbility(new VoidStepAbility());
- glimmeringEye.addLore("", ItemRarity.RARE.getName());
- glimmeringEye.addRule(ItemRule.PREVENT_PROJECTILE_LAUNCH);
+ glimmeringEye.preventProjectileLaunch();
registry.accept(glimmeringEye);
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Hyperion.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Hyperion.java
index d1393924..c9d54fb9 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Hyperion.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/Hyperion.java
@@ -5,29 +5,20 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
import org.bukkit.Material;
import org.bukkit.inventory.ItemFlag;
+import java.util.function.Consumer;
+
public class Hyperion implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem hyperion = new BlightedItem("HYPERION", ItemType.SWORD, ItemRarity.LEGENDARY, Material.IRON_SWORD);
hyperion.setDisplayName("Hyperion");
- hyperion.addLore(
- "",
- "§5 Ability: Wither Impact §d§lRIGHT CLICK",
- "§7 Teleport §a10 §7blocks ahead of you. Then dealing §c15,000 ",
- "§7 damage to nearby enemies. Also applies the wither",
- "§7 shield scroll reducing damage taken and granting",
- "§7 an §6absorption §7shield for §e5 §7seconds.",
- "",
- ItemRarity.LEGENDARY.getName() + " SWORD"
- );
hyperion.setUnbreakable(true);
hyperion.addItemFlag(ItemFlag.HIDE_UNBREAKABLE);
- hyperion.addAbility(new WitherImpactAbility(), false);
+ hyperion.addAbility(new WitherImpactAbility());
registry.accept(hyperion);
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/KnightsSword.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/KnightsSword.java
index 256c8ebb..eb38d538 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/KnightsSword.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/KnightsSword.java
@@ -5,29 +5,19 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class KnightsSword implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem knightSword = new BlightedItem("ANCIENT_KNIGHT_SWORD", ItemType.LONGSWORD, ItemRarity.LEGENDARY, Material.NETHERITE_SWORD);
knightSword.setDisplayName("Knight's Sword");
- knightSword.addLore(
- "",
- "§5 Ability: Knight's Slam §d§lRIGHT CLICK ",
- "§7 Slam your sword into the ground dealing ",
- "§7 §c50 §7damage to nearby enemies.",
- "§8 Mana Cost: §390",
- "§8 Cooldown: §a30s",
- "",
- ItemRarity.LEGENDARY.getName() + " LONGSWORD"
- );
-
- knightSword.addAbility(new KnightsSlamAbility(), false);
knightSword.setAttackDamage(10);
knightSword.setAttackSpeed(1.2);
+ knightSword.addAbility(new KnightsSlamAbility());
registry.accept(knightSword);
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/ThermalFuels.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/ThermalFuels.java
index 63cba04b..1e7d5051 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/ThermalFuels.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/ThermalFuels.java
@@ -4,64 +4,64 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class ThermalFuels implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem enchantedCoal = new BlightedItem("ENCHANTED_COAL", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.COAL);
enchantedCoal.setDisplayName("Enchanted Coal");
- enchantedCoal.addLore(
- "§8Thermal Fuel", "",
- " §7Ultra-dense carbon radiating ",
- " §7with intense heat that adds ",
- " §6\uD83E\uDEA3 3,000mB §7to a refuelable ",
- " §7machine.", ""
+ enchantedCoal.description(
+ "§8Thermal Fuel",
+ "",
+ "Ultra-dense carbon radiating",
+ "with intense heat that adds",
+ "§6\uD83E\uDEA3 3,000mB §7to a refuelable",
+ "machine."
);
- enchantedCoal.addLore(ItemRarity.UNCOMMON.getName());
enchantedCoal.glow();
BlightedItem enchantedLavaBucket = new BlightedItem("ENCHANTED_LAVA_BUCKET", ItemType.UNCATEGORIZED, ItemRarity.RARE, Material.LAVA_BUCKET);
enchantedLavaBucket.setDisplayName("Enchanted Lava Bucket");
- enchantedLavaBucket.addLore(
- "§8Thermal Fuel", "",
- " §7Enriched lava capable of ",
- " §7prolonged burning that adds ",
- " §6\uD83E\uDEA3 10,000mB §7to a refuelable ",
- " §7machine.", ""
+ enchantedLavaBucket.description(
+ "§8Thermal Fuel",
+ "",
+ "Enriched lava capable of",
+ "prolonged burning that adds",
+ "§6\uD83E\uDEA3 10,000mB §7to a refuelable",
+ "machine."
);
- enchantedLavaBucket.addLore(ItemRarity.RARE.getName());
enchantedLavaBucket.glow();
- enchantedLavaBucket.addRule(ItemRule.PREVENT_BUCKET_INTERACTIONS);
+ enchantedLavaBucket.preventBucketInteractions();
BlightedItem magmaBucket = new BlightedItem("MAGMA_BUCKET", ItemType.UNCATEGORIZED, ItemRarity.EPIC, Material.LAVA_BUCKET);
magmaBucket.setDisplayName("Magma Bucket");
- magmaBucket.addLore(
- "§8Thermal Fuel", "",
- " §7A superheated amalgam of ",
- " §7compressed magma that adds ",
- " §6\uD83E\uDEA3 20,000mB §7to a refuelable",
- " §7machine.", ""
+ magmaBucket.description(
+ "§8Thermal Fuel",
+ "",
+ "A superheated amalgam of",
+ "compressed magma that adds",
+ "§6\uD83E\uDEA3 20,000mB §7to a refuelable",
+ "machine."
);
- magmaBucket.addLore(ItemRarity.EPIC.getName());
magmaBucket.glow();
- magmaBucket.addRule(ItemRule.PREVENT_BUCKET_INTERACTIONS);
+ magmaBucket.preventBucketInteractions();
BlightedItem plasmaBucket = new BlightedItem("PLASMA_BUCKET", ItemType.UNCATEGORIZED, ItemRarity.LEGENDARY, Material.LAVA_BUCKET);
plasmaBucket.setDisplayName("Plasma Bucket");
- plasmaBucket.addLore(
- "§8Thermal Fuel", "",
- " §7Stable ionized matter containing ",
- " §7stellar-grade heat that adds",
- " §6\uD83E\uDEA3 50,000mB §7to a refuelable",
- " §7machine.", ""
+ plasmaBucket.description(
+ "§8Thermal Fuel",
+ "",
+ "Stable ionized matter containing",
+ "stellar-grade heat that adds",
+ "§6\uD83E\uDEA3 50,000mB §7to a refuelable",
+ "machine."
);
- plasmaBucket.addLore(ItemRarity.LEGENDARY.getName());
plasmaBucket.glow();
- plasmaBucket.addRule(ItemRule.PREVENT_BUCKET_INTERACTIONS);
+ plasmaBucket.preventBucketInteractions();
registry.accept(enchantedCoal);
registry.accept(enchantedLavaBucket);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/BonemerangAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/BonemerangAbility.java
index 5ee662d1..86ab9591 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/BonemerangAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/BonemerangAbility.java
@@ -1,8 +1,8 @@
package fr.moussax.blightedSMP.content.items.abilities;
import fr.moussax.blightedSMP.BlightedSMP;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Particle;
@@ -25,9 +25,11 @@
import java.util.Set;
import java.util.UUID;
-public class BonemerangAbility implements AbilityManager {
+public class BonemerangAbility implements ItemAbility {
- private static final NamespacedKey THROWN_KEY = new NamespacedKey(BlightedSMP.getInstance(), "thrown_bonemerang");
+ private static final NamespacedKey THROWN_KEY = BlightedSMP.getInstance() != null
+ ? new NamespacedKey(BlightedSMP.getInstance(), "thrown_bonemerang")
+ : NamespacedKey.fromString("blightedsmp:thrown_bonemerang");
private static final int OUTBOUND_TICKS = 13;
private static final int RETURN_TICKS = 13;
private static final double PROJECTILE_SPEED = 1.16;
@@ -42,8 +44,17 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.RIGHT_CLICK;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Throw the bone forward, slicing",
+ "through foes, dealing §c12 §7damage ",
+ "before returning to you."
+ };
}
@Override
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/KnightsSlamAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/KnightsSlamAbility.java
index 4d3673ce..d805c1de 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/KnightsSlamAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/KnightsSlamAbility.java
@@ -1,8 +1,8 @@
package fr.moussax.blightedSMP.content.items.abilities;
import fr.moussax.blightedSMP.BlightedSMP;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -19,15 +19,23 @@
import java.util.List;
import java.util.Objects;
-public class KnightsSlamAbility implements AbilityManager {
+public class KnightsSlamAbility implements ItemAbility {
@Override
public String getName() {
return "Knight's Slam";
}
@Override
- public AbilityType getType() {
- return AbilityType.RIGHT_CLICK;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Slam your sword into the ground dealing ",
+ "§c50 §7damage to nearby enemies."
+ };
}
@Override
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/RocketBootsAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/RocketBootsAbility.java
index 5e1ad553..8305821d 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/RocketBootsAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/RocketBootsAbility.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.items.abilities;
import fr.moussax.blightedSMP.engine.items.abilities.AbstractFullSetBonus;
-import fr.moussax.blightedSMP.engine.items.abilities.ArmorManager;
+import fr.moussax.blightedSMP.engine.items.equipment.ArmorSetManager;
import org.bukkit.GameMode;
import org.bukkit.Particle;
import org.bukkit.Sound;
@@ -129,7 +129,7 @@ private void applyDurabilityDamageToBoots(Player player) {
if (durabilityDamage >= maxDurability) {
player.getInventory().setBoots(null);
player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1f, 1f);
- ArmorManager.updatePlayerArmor(getAbilityOwner());
+ ArmorSetManager.updatePlayerArmor(getAbilityOwner());
} else {
damageable.setDamage(durabilityDamage);
boots.setItemMeta(meta);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/VoidStepAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/VoidStepAbility.java
index b3ce634b..8e7402ba 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/VoidStepAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/VoidStepAbility.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.items.abilities;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.bedrock.text.Messenger;
import org.bukkit.*;
@@ -12,7 +12,7 @@
import org.bukkit.util.RayTraceResult;
import org.bukkit.util.Vector;
-public class VoidStepAbility implements AbilityManager {
+public class VoidStepAbility implements ItemAbility {
private static final int MAX_DISTANCE = 40;
@Override
@@ -21,8 +21,8 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.RIGHT_CLICK;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
}
@Override
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/WitherImpactAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/WitherImpactAbility.java
index f9aa3b0f..55e75e25 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/WitherImpactAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/WitherImpactAbility.java
@@ -1,12 +1,10 @@
package fr.moussax.blightedSMP.content.items.abilities;
-import fr.moussax.blightedSMP.BlightedSMP;
-import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
-import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.bedrock.text.Formatter;
import fr.moussax.bedrock.text.Messenger;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.Sound;
@@ -14,27 +12,19 @@
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
-import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.EquipmentSlot;
-import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
-import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-public class WitherImpactAbility implements AbilityManager, Listener {
- private final Map cooldowns = new HashMap<>();
- private final double TELEPORT_DISTANCE = 10.0;
- private final double TELEPORT_STEP = 0.5;
- private final double MIN_DAMAGE = 15000.0;
- private final double MAX_DAMAGE = 150000.0;
- private final double DAMAGE_RANGE = 5.0;
- private final long HEALING_COOLDOWN = 5000L;
+public class WitherImpactAbility implements ItemAbility {
+ private static final String WITHER_SHIELD_COOLDOWN = "wither_shield";
+ private static final double TELEPORT_DISTANCE = 10.0;
+ private static final double TELEPORT_STEP = 0.5;
+ private static final double MIN_DAMAGE = 15000.0;
+ private static final double MAX_DAMAGE = 150000.0;
+ private static final double DAMAGE_RANGE = 5.0;
@Override
public String getName() {
@@ -42,8 +32,23 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.RIGHT_CLICK;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Teleport §a10 §7blocks ahead of you, dealing §c15,000 ",
+ "damage to nearby enemies. Also applies the wither",
+ "shield scroll reducing damage taken and granting",
+ "an §6absorption §7shield for §e5 §7seconds."
+ };
+ }
+
+ @Override
+ public int getManaCost() {
+ return 50;
}
@Override
@@ -53,29 +58,25 @@ public boolean triggerAbility(PlayerInteractEvent event) {
}
Player player = event.getPlayer();
+ BlightedPlayer blightedPlayer = BlightedPlayer.get(player);
+ if (blightedPlayer == null) return false;
- if (!isHoldingHyperion(player)) return false;
teleport(player);
damageNearbyEntities(player);
- if (canUseHealingAbility(player)) {
+ if (blightedPlayer.getRemainingCooldown(WITHER_SHIELD_COOLDOWN, getTrigger()) <= 0) {
applyHealingEffect(player);
- setHealingCooldown(player);
+ blightedPlayer.setCooldown(WITHER_SHIELD_COOLDOWN, getTrigger(), 5);
}
return true;
}
- private boolean isHoldingHyperion(Player player) {
- BlightedItem blightedItem = BlightedItem.fromItemStack(player.getInventory().getItemInMainHand());
- return blightedItem != null && "HYPERION".equals(blightedItem.getItemId());
- }
-
private void teleport(Player player) {
Vector direction = player.getLocation().getDirection().normalize();
Location teleportDestination = findTeleportDestination(player, direction);
player.teleport(teleportDestination);
World world = player.getWorld();
- world.playSound(player.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 100.0F, 1.0F);
+ world.playSound(player.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1.0F, 1.0F);
world.spawnParticle(Particle.EXPLOSION, player.getLocation(), 5);
}
@@ -111,11 +112,6 @@ private void notifyPlayerOfAbilityDamage(Player player, int entitiesDamaged, dou
}
}
- private boolean canUseHealingAbility(Player player) {
- Long lastUsed = cooldowns.get(player.getUniqueId());
- return lastUsed == null || System.currentTimeMillis() >= lastUsed;
- }
-
private void applyHealingEffect(Player player) {
player.addPotionEffect(new PotionEffect(PotionEffectType.ABSORPTION, 100, 5));
player.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION, 100, 10));
@@ -125,14 +121,4 @@ private void applyHealingEffect(Player player) {
world.playSound(playerLocation, Sound.ENTITY_ZOMBIE_VILLAGER_CURE, 1.0F, 1.0F);
world.spawnParticle(Particle.EXPLOSION, playerLocation, 1);
}
-
- private void setHealingCooldown(Player player) {
- cooldowns.put(player.getUniqueId(), System.currentTimeMillis() + 5000L);
- new BukkitRunnable() {
- @Override
- public void run() {
- cooldowns.remove(player.getUniqueId());
- }
- }.runTaskLater(BlightedSMP.getInstance(), 100L);
- }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
index 3d76d0ea..106d5aeb 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.items.abilities.tools;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Material;
import org.bukkit.event.block.BlockDropItemEvent;
@@ -9,7 +9,7 @@
import java.util.Map;
-public class AutosmeltAbility implements AbilityManager {
+public class AutosmeltAbility implements ItemAbility {
@Override
public String getName() {
@@ -17,8 +17,15 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.PASSIVE;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.BLOCK_DROP;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Automatically smelts mined blocks and ores."
+ };
}
private static final Map SMELTABLE = Map.ofEntries(
@@ -75,29 +82,4 @@ public boolean triggerAbility(BlockDropItemEvent event) {
return true;
}
-
- @Override
- public int getCooldownSeconds() {
- return 0;
- }
-
- @Override
- public int getManaCost() {
- return 0;
- }
-
- @Override
- public boolean canTrigger(BlightedPlayer player) {
- return true;
- }
-
- @Override
- public void start(BlightedPlayer player) {
-
- }
-
- @Override
- public void stop(BlightedPlayer player) {
-
- }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
index 1de03ef5..c67d0ad5 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
@@ -1,47 +1,34 @@
package fr.moussax.blightedSMP.content.items.abilities.tools;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.event.block.BlockBreakEvent;
-public class HammerAbility implements AbilityManager {
+public class HammerAbility implements ItemAbility {
@Override
public String getName() {
return "Hammer";
}
@Override
- public AbilityType getType() {
- return AbilityType.PASSIVE;
- }
- @Override
- public boolean triggerAbility(BlockBreakEvent event) {
- return false;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.BLOCK_BREAK;
}
@Override
- public int getCooldownSeconds() {
- return 0;
+ public String[] getDescription() {
+ return new String[]{
+ "Mines in a wide 3x3 area."
+ };
}
-
@Override
- public int getManaCost() {
- return 0;
+ public boolean triggerAbility(BlockBreakEvent event) {
+ return false;
}
@Override
public boolean canTrigger(BlightedPlayer player) {
return false;
}
-
- @Override
- public void start(BlightedPlayer player) {
-
- }
-
- @Override
- public void stop(BlightedPlayer player) {
-
- }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
index 5e24f8ff..d5529496 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.items.abilities.tools;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -9,7 +9,7 @@
import java.util.*;
-public class TimberAbility implements AbilityManager {
+public class TimberAbility implements ItemAbility {
@Override
public String getName() {
@@ -17,8 +17,15 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.PASSIVE;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.BLOCK_BREAK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Fells entire trees in a single strike."
+ };
}
private static final int MAX_LOGS = 32;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/VeinmineAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/VeinmineAbility.java
index 971b21d7..27f8795d 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/VeinmineAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/VeinmineAbility.java
@@ -1,7 +1,7 @@
package fr.moussax.blightedSMP.content.items.abilities.tools;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -9,7 +9,7 @@
import java.util.*;
-public class VeinmineAbility implements AbilityManager {
+public class VeinmineAbility implements ItemAbility {
@Override
public String getName() {
@@ -17,8 +17,15 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.PASSIVE;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.BLOCK_BREAK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Mines entire ore veins in a single strike."
+ };
}
private static final int MAX_BLOCK = 64;
@@ -106,27 +113,4 @@ private List getNeighbours(Block block) {
}
return blocks;
}
-
- @Override
- public int getCooldownSeconds() {
- return 0;
- }
-
- @Override
- public int getManaCost() {
- return 0;
- }
-
- @Override
- public boolean canTrigger(BlightedPlayer player) {
- return true;
- }
-
- @Override
- public void start(BlightedPlayer player) {
- }
-
- @Override
- public void stop(BlightedPlayer player) {
- }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/FishingArmors.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/FishingArmors.java
index ad53b54b..01c176f9 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/FishingArmors.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/FishingArmors.java
@@ -6,7 +6,6 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.engine.items.abilities.FullSetBonus;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import fr.moussax.blightedSMP.registry.RegistryModule;
import org.bukkit.Material;
import org.bukkit.attribute.Attribute;
@@ -25,13 +24,11 @@ public final class FishingArmors implements RegistryModule registry) {
- String[] anglerArmorLore = new String[]{
- "",
- " §8A simple garb from a simple ",
- " §8craft. Though beneath the",
- " §8surface, nothing is ever",
- " §8quite so simple.", "",
- ItemRarity.COMMON.getName()
+ String[] anglerArmorDescription = new String[]{
+ "A simple garb from a simple",
+ "craft. Though beneath the",
+ "surface, nothing is ever",
+ "quite so simple."
};
BlightedItem anglerHelmet = new BlightedItem("ANGLER_HELMET", ItemType.HELMET, ItemRarity.COMMON, Material.COPPER_HELMET);
@@ -39,7 +36,7 @@ public void register(Consumer registry) {
anglerHelmet.addAttributeModifier(Attribute.ARMOR, 2.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.HEAD);
anglerHelmet.addAttributeModifier(Attribute.OXYGEN_BONUS, 0.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.HEAD);
anglerHelmet.addItemFlag(ItemFlag.HIDE_ATTRIBUTES);
- anglerHelmet.addLore(anglerArmorLore);
+ anglerHelmet.description(anglerArmorDescription);
anglerHelmet.setMaxDurability(121);
BlightedItem anglerChestplate = new BlightedItem("ANGLER_CHESTPLATE", ItemType.CHESTPLATE, ItemRarity.COMMON, Material.LEATHER_CHESTPLATE);
@@ -47,7 +44,7 @@ public void register(Consumer registry) {
anglerChestplate.addAttributeModifier(Attribute.ARMOR, 4.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.CHEST);
anglerChestplate.addAttributeModifier(Attribute.OXYGEN_BONUS, 0.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.CHEST);
anglerChestplate.addItemFlag(ItemFlag.HIDE_DYE, ItemFlag.HIDE_ATTRIBUTES);
- anglerChestplate.addLore(anglerArmorLore);
+ anglerChestplate.description(anglerArmorDescription);
anglerChestplate.setLeatherColor("#2B457A");
anglerChestplate.setMaxDurability(176);
@@ -56,7 +53,7 @@ public void register(Consumer registry) {
anglerLeggings.addAttributeModifier(Attribute.ARMOR, 3.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.LEGS);
anglerLeggings.addAttributeModifier(Attribute.OXYGEN_BONUS, 0.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.LEGS);
anglerLeggings.addItemFlag(ItemFlag.HIDE_DYE, ItemFlag.HIDE_ATTRIBUTES);
- anglerLeggings.addLore(anglerArmorLore);
+ anglerLeggings.description(anglerArmorDescription);
anglerLeggings.setLeatherColor("#2B457A");
anglerLeggings.setMaxDurability(165);
@@ -65,7 +62,7 @@ public void register(Consumer registry) {
anglerBoots.addAttributeModifier(Attribute.ARMOR, 1.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.FEET);
anglerBoots.addAttributeModifier(Attribute.OXYGEN_BONUS, 0.5, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.FEET);
anglerBoots.addItemFlag(ItemFlag.HIDE_DYE, ItemFlag.HIDE_ATTRIBUTES);
- anglerBoots.addLore(anglerArmorLore);
+ anglerBoots.description(anglerArmorDescription);
anglerBoots.setLeatherColor("#2B457A");
registry.accept(anglerHelmet);
@@ -73,20 +70,16 @@ public void register(Consumer registry) {
registry.accept(anglerLeggings);
registry.accept(anglerBoots);
-
-
-
FullSetBonus emberWeaveSetBonus = new EmberWeaveSetBonus();
BlightedItem emberWeaveHelmet = new BlightedItem("EMBERWEAVE_HELMET", ItemType.HELMET, ItemRarity.RARE, Material.PLAYER_HEAD);
emberWeaveHelmet.setDisplayName("Emberweave Helmet");
emberWeaveHelmet.addAttributeModifier(Attribute.ARMOR, 2.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.HEAD);
- emberWeaveHelmet.addRule(ItemRule.PREVENT_PLACEMENT);
+ emberWeaveHelmet.preventPlacement();
emberWeaveHelmet.setCustomSkullTexture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjY2M2RkY2JhZjdjNDQ4YTc2ODk4MWFiMDhkYTBmYWMyMzQ4MTU1N2M0ZTVhNTg2YWJmZTc1OWRmMTI3MWNhIn19fQ==");
emberWeaveHelmet.editEquippable(equippable -> equippable.setSlot(EquipmentSlot.HEAD));
emberWeaveHelmet.setFireResistant(true);
emberWeaveHelmet.setFullSetBonus(emberWeaveSetBonus);
- emberWeaveHelmet.addLore("", ItemRarity.RARE.getName() + " HELMET");
BlightedItem emberWeaveChestplate = new BlightedItem("EMBERWEAVE_CHESTPLATE", ItemType.CHESTPLATE, ItemRarity.RARE, Material.LEATHER_CHESTPLATE);
emberWeaveChestplate.setDisplayName("Emberweave Chestplate");
@@ -96,7 +89,6 @@ public void register(Consumer registry) {
emberWeaveChestplate.setFireResistant(true);
emberWeaveChestplate.setMaxDurability(240);
emberWeaveChestplate.setFullSetBonus(emberWeaveSetBonus);
- emberWeaveChestplate.addLore("", ItemRarity.RARE.getName() + " CHESTPLATE");
BlightedItem emberWeaveLeggins = new BlightedItem("EMBERWEAVE_LEGGINS", ItemType.LEGGINGS, ItemRarity.RARE, Material.LEATHER_LEGGINGS);
emberWeaveLeggins.setDisplayName("Emberweave Leggings");
@@ -106,7 +98,6 @@ public void register(Consumer registry) {
emberWeaveLeggins.setFireResistant(true);
emberWeaveLeggins.setMaxDurability(225);
emberWeaveLeggins.setFullSetBonus(emberWeaveSetBonus);
- emberWeaveLeggins.addLore("", ItemRarity.RARE.getName() + " LEGGINGS");
BlightedItem emberWeaveBoots = new BlightedItem("EMBERWEAVE_BOOTS", ItemType.BOOTS, ItemRarity.RARE, Material.LEATHER_BOOTS);
emberWeaveBoots.setDisplayName("Emberweave Boots");
@@ -116,8 +107,6 @@ public void register(Consumer registry) {
emberWeaveBoots.setFireResistant(true);
emberWeaveBoots.setMaxDurability(195);
emberWeaveBoots.setFullSetBonus(emberWeaveSetBonus);
- emberWeaveBoots.addLore("", ItemRarity.RARE.getName() + " BOOTS");
-
FullSetBonus magmaWeaveSetBonus = new MagmaweaveSetBonus();
@@ -126,12 +115,10 @@ public void register(Consumer registry) {
ashfangHelmet.addAttributeModifier(Attribute.ARMOR, 3.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.HEAD);
ashfangHelmet.addAttributeModifier(Attribute.ARMOR_TOUGHNESS, 2.0, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlotGroup.HEAD);
ashfangHelmet.editEquippable(equippable -> equippable.setSlot(EquipmentSlot.HEAD));
- ashfangHelmet.addRule(ItemRule.PREVENT_PLACEMENT);
+ ashfangHelmet.preventPlacement();
ashfangHelmet.setCustomSkullTexture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjNlNTkyNTBjOTY4ZTUwODUzOWJmMmU4NDkyZjU2YTJmNjY0ZWZiMzA5ZjQ5NWEwN2RjM2E1NGM4YjZhMjQ5ZSJ9fX0=");
ashfangHelmet.setFireResistant(true);
ashfangHelmet.setFullSetBonus(magmaWeaveSetBonus);
- ashfangHelmet.addLore("", ItemRarity.EPIC.getName() + " HELMET");
-
BlightedItem ashfangChestplate = new BlightedItem("ASHFANG_CHESTPLATE", ItemType.CHESTPLATE, ItemRarity.EPIC, Material.LEATHER_CHESTPLATE);
ashfangChestplate.setDisplayName("Ashfang Chestplate");
@@ -143,8 +130,6 @@ public void register(Consumer registry) {
ashfangChestplate.setFireResistant(true);
ashfangChestplate.setMaxDurability(528);
ashfangChestplate.setFullSetBonus(magmaWeaveSetBonus);
- ashfangChestplate.addLore("", ItemRarity.EPIC.getName() + " CHESTPLATE");
-
BlightedItem ashfangLeggins = new BlightedItem("ASHFANG_LEGGINS", ItemType.LEGGINGS, ItemRarity.EPIC, Material.LEATHER_LEGGINGS);
ashfangLeggins.setDisplayName("Ashfang Leggings");
@@ -156,7 +141,6 @@ public void register(Consumer registry) {
ashfangLeggins.setFireResistant(true);
ashfangLeggins.setMaxDurability(495);
ashfangLeggins.setFullSetBonus(magmaWeaveSetBonus);
- ashfangLeggins.addLore("", ItemRarity.EPIC.getName() + " LEGGINGS");
BlightedItem ashfangBoots = new BlightedItem("ASHFANG_BOOTS", ItemType.BOOTS, ItemRarity.EPIC, Material.LEATHER_BOOTS);
ashfangBoots.setDisplayName("Ashfang Boots");
@@ -168,7 +152,6 @@ public void register(Consumer registry) {
ashfangBoots.setFireResistant(true);
ashfangBoots.setMaxDurability(429);
ashfangBoots.setFullSetBonus(magmaWeaveSetBonus);
- ashfangBoots.addLore("", ItemRarity.EPIC.getName() + " BOOTS");
registry.accept(emberWeaveHelmet);
registry.accept(emberWeaveChestplate);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/HomodeusArmor.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/HomodeusArmor.java
index 857f4bd5..654b1d59 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/HomodeusArmor.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/HomodeusArmor.java
@@ -45,6 +45,5 @@ private void setupHomodeusPiece(BlightedItem piece, FullSetBonus bonus) {
piece.hideAllFlags();
piece.setFullSetBonus(bonus);
- piece.addLore("", ItemRarity.LEGENDARY.getName());
}
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/RocketBoots.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/RocketBoots.java
index 8494fe7e..d0d3ac34 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/RocketBoots.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/armors/RocketBoots.java
@@ -22,7 +22,6 @@ public void register(Consumer registry) {
rocketBoots.addItemFlag(ItemFlag.HIDE_DYE, ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_ARMOR_TRIM);
rocketBoots.setFullSetBonus(new RocketBootsAbility());
- rocketBoots.addLore("", ItemRarity.UNCOMMON.getName() + " BOOTS");
rocketBoots.setMaxDurability(140);
registry.accept(rocketBoots);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/BlightedMaterials.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/BlightedMaterials.java
index 761c0507..69420591 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/BlightedMaterials.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/BlightedMaterials.java
@@ -5,7 +5,6 @@
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
import java.util.function.Consumer;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import org.bukkit.Material;
public class BlightedMaterials implements RegistryModule> {
@@ -150,15 +149,14 @@ private BlightedItem createMaterialItem(
) {
BlightedItem item = new BlightedItem(id, type, rarity, material);
item.setDisplayName(displayName);
- item.addLore(rarity.getName());
item.glow();
if (preventPlacement) {
- item.addRule(ItemRule.PREVENT_PLACEMENT);
+ item.preventPlacement();
}
if (preventConsume) {
- item.addRule(ItemRule.PREVENT_CONSUME);
+ item.preventConsume();
}
return item;
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/EndMaterials.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/EndMaterials.java
index fa9fd2bd..6f91c50c 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/EndMaterials.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/EndMaterials.java
@@ -4,38 +4,33 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class EndMaterials implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem enchantedEnderPearl = new BlightedItem("ENCHANTED_ENDER_PEARL", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.ENDER_PEARL);
enchantedEnderPearl.setDisplayName("Enchanted Ender Pearl");
- enchantedEnderPearl.addLore(ItemRarity.UNCOMMON.getName());
enchantedEnderPearl.glow();
- enchantedEnderPearl.addRule(ItemRule.PREVENT_PROJECTILE_LAUNCH);
+ enchantedEnderPearl.preventProjectileLaunch();
BlightedItem enchantedEndstone = new BlightedItem("ENCHANTED_END_STONE", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.END_STONE);
enchantedEndstone.setDisplayName("Enchanted End Stone");
- enchantedEndstone.addLore(ItemRarity.UNCOMMON.getName());
enchantedEndstone.glow();
- enchantedEndstone.addRule(ItemRule.PREVENT_PLACEMENT);
+ enchantedEndstone.preventPlacement();
BlightedItem enchantedChorusFruit = new BlightedItem("ENCHANTED_CHORUS_FRUIT", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.CHORUS_FRUIT);
enchantedChorusFruit.setDisplayName("Enchanted Chorus Fruit");
- enchantedChorusFruit.addLore(ItemRarity.UNCOMMON.getName());
enchantedChorusFruit.glow();
BlightedItem voidResidue = new BlightedItem("VOID_RESIDUE", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.PURPLE_DYE);
voidResidue.setDisplayName("Voidling Residue");
- voidResidue.addLore("",
- " §7The tangible byproduct of entropy,",
- " §7harvested from the §5Outer Islands",
- " §7where reality begins to fray.",
- "",
- ItemRarity.UNCOMMON.getName()
+ voidResidue.description(
+ "The tangible byproduct of entropy,",
+ "harvested from the §5Outer Islands",
+ "where reality begins to fray."
);
voidResidue.glow();
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/FishingMaterials.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/FishingMaterials.java
index 9f58be8d..e0705c92 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/FishingMaterials.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/FishingMaterials.java
@@ -3,7 +3,6 @@
import fr.moussax.blightedSMP.engine.items.BlightedItem;
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import fr.moussax.blightedSMP.registry.RegistryModule;
import org.bukkit.Material;
import org.bukkit.potion.PotionEffect;
@@ -19,27 +18,21 @@ public void register(Consumer registry) {
BlightedItem blightedAlgae = new BlightedItem("BLIGHTED_ALGAE", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.KELP);
blightedAlgae.setDisplayName("Blighted Algae");
- blightedAlgae.addLore(
- "",
- " §7A thick, dark strand of kelp ",
- " §7that grows in waters heavy with ",
- " §7corruption. Pulsates with a dim, ",
- " §7dark glow.",
- "",
- ItemRarity.UNCOMMON.getName()
+ blightedAlgae.description(
+ "A thick, dark strand of kelp",
+ "that grows in waters heavy with",
+ "corruption. Pulsates with a dim,",
+ "dark glow."
);
- blightedAlgae.addRule(ItemRule.PREVENT_PLACEMENT);
+ blightedAlgae.preventPlacement();
blightedAlgae.glow();
BlightedItem smokedSalmonPlate = new BlightedItem("SMOKED_SALMON_PLATE", ItemType.UNCATEGORIZED, ItemRarity.UNCOMMON, Material.COOKED_SALMON);
smokedSalmonPlate.setDisplayName("Smoked Salmon Plate");
- smokedSalmonPlate.addLore(
- "",
- " §7A seasoned, perfectly smoked",
- " §7salmon fillet. Tastes of wild sea ",
- " §7herbs and hickory wood.",
- "",
- ItemRarity.UNCOMMON.getName()
+ smokedSalmonPlate.description(
+ "A seasoned, perfectly smoked",
+ "salmon fillet. Tastes of wild sea",
+ "herbs and hickory wood."
);
smokedSalmonPlate.editFood(food -> {
food.setNutrition(8);
@@ -49,13 +42,10 @@ public void register(Consumer registry) {
BlightedItem saltedCod = new BlightedItem("SALTED_COD", ItemType.UNCATEGORIZED, ItemRarity.UNCOMMON, Material.COOKED_COD);
saltedCod.setDisplayName("Salted Cod");
- saltedCod.addLore(
- "",
- " §7Sun-dried cod heavily encrusted in ",
- " §7coarse sea salt. Keeps indefinitely",
- " §7and fills the belly.",
- "",
- ItemRarity.UNCOMMON.getName()
+ saltedCod.description(
+ "Sun-dried cod heavily encrusted in",
+ "coarse sea salt. Keeps indefinitely",
+ "and fills the belly."
);
saltedCod.editFood(food -> {
food.setNutrition(7);
@@ -65,28 +55,24 @@ public void register(Consumer registry) {
BlightedItem fishermansBait = new BlightedItem("FISHERMANS_BAIT", ItemType.UNCATEGORIZED, ItemRarity.UNCOMMON, Material.HONEY_BOTTLE);
fishermansBait.setDisplayName("Fisherman's Bait");
- fishermansBait.addLore(
- "",
- " §7A sweet, pungent mixture of",
- " §7golden honey and ground bugs. ",
- " §7Irresistible to aquatic life.",
- "",
- ItemRarity.UNCOMMON.getName()
+ fishermansBait.description(
+ "A sweet, pungent mixture of",
+ "golden honey and ground bugs.",
+ "Irresistible to aquatic life."
);
- fishermansBait.addRule(ItemRule.PREVENT_CONSUME);
+ fishermansBait.preventConsume();
BlightedItem fishermansStew = new BlightedItem("FISHERMANS_STEW", ItemType.UNCATEGORIZED, ItemRarity.UNCOMMON, Material.RABBIT_STEW);
fishermansStew.setDisplayName("Fisherman's Stew");
+ fishermansStew.description(
+ "A hearty stew prepared from",
+ "fresh catches. Provides the",
+ "consumer with aquatic affinity."
+ );
fishermansStew.addLore(
- "",
- " §7A hearty stew prepared from",
- " §7fresh catches. Provides the ",
- " §7consumer with aquatic affinity. ",
"",
" §8When Consumed:",
- " §8 ‣ EBAFFWater Breathing I §8(2:00)",
- "",
- ItemRarity.UNCOMMON.getName()
+ " §8 ‣ EBAFFWater Breathing I §8(2:00)"
);
fishermansStew.editFood(food -> {
food.setNutrition(10);
@@ -97,56 +83,48 @@ public void register(Consumer registry) {
BlightedItem barnacleCluster = new BlightedItem("BARNACLE_CLUSTER", ItemType.MATERIAL, ItemRarity.RARE, Material.NAUTILUS_SHELL);
barnacleCluster.setDisplayName("Barnacle Cluster");
- barnacleCluster.addLore(
- "",
- " §7A hardened mass of razor-sharp ",
- " §7barnacles clinging to a glowing ",
- " §7fossilized shell.",
- "",
- ItemRarity.RARE.getName()
+ barnacleCluster.description(
+ "A hardened mass of razor-sharp",
+ "barnacles clinging to a glowing",
+ "fossilized shell."
);
barnacleCluster.glow();
BlightedItem coralFragment = new BlightedItem("CORAL_FRAGMENT", ItemType.MATERIAL, ItemRarity.RARE, Material.FIRE_CORAL);
coralFragment.setDisplayName("Coral Fragment");
- coralFragment.addLore(
- "",
- " §7A bright, warm fragment of coral",
- " §7retrieved from the depths. Retains ",
- " §7a mystical heat.",
- "",
- ItemRarity.RARE.getName()
+ coralFragment.description(
+ "A bright, warm fragment of coral",
+ "retrieved from the depths. Retains",
+ "a mystical heat."
);
- coralFragment.addRule(ItemRule.PREVENT_PLACEMENT);
+ coralFragment.preventPlacement();
coralFragment.glow();
BlightedItem messageInABottle = new BlightedItem("MESSAGE_IN_A_BOTTLE", ItemType.UNCATEGORIZED, ItemRarity.RARE, Material.GLASS_BOTTLE);
messageInABottle.setDisplayName("Message in a Bottle");
+ messageInABottle.description(
+ "A sealed glass bottle containing",
+ "a worn, waterlogged note. Perhaps",
+ "someone's final words."
+ );
messageInABottle.addLore(
"",
- " §7A sealed glass bottle containing",
- " §7a worn, waterlogged note. Perhaps ",
- " §7someone's final words.",
- "",
- " §fRight click to shatter!",
- "",
- ItemRarity.RARE.getName()
+ " §fRight click to shatter!"
);
- messageInABottle.addRule(ItemRule.PREVENT_PLACEMENT);
+ messageInABottle.preventPlacement();
BlightedItem blightedSushi = new BlightedItem("BLIGHTED_SUSHI", ItemType.UNCATEGORIZED, ItemRarity.RARE, Material.SUSPICIOUS_STEW);
blightedSushi.setDisplayName("Blighted Sushi");
+ blightedSushi.description(
+ "A questionable sushi roll",
+ "wrapped in algae. It hums with",
+ "unstable entropic energy."
+ );
blightedSushi.addLore(
- "",
- " §7A questionable sushi roll ",
- " §7wrapped in algae. It hums with ",
- " §7unstable entropic energy.",
"",
" §8When Consumed:",
" §8 ‣ EBAFFWater Breathing I §8(1:00)",
- " §8 ‣ FFCEB8Hunger I §8(0:15) §7(∼50%)",
- "",
- ItemRarity.RARE.getName()
+ " §8 ‣ FFCEB8Hunger I §8(0:15) §7(∼50%)"
);
blightedSushi.editFood(food -> {
food.setNutrition(6);
@@ -163,28 +141,22 @@ public void register(Consumer registry) {
BlightedItem abyssalPearl = new BlightedItem("ABYSSAL_PEARL", ItemType.MATERIAL, ItemRarity.EPIC, Material.ENDER_PEARL);
abyssalPearl.setDisplayName("Abyssal Pearl");
- abyssalPearl.addLore(
- "",
- " F1B8FFA dark, swirling orb pulled from ",
- " F1B8FFthe abyss. Its core feels freezing ",
- " F1B8FFcold and infinitely deep.",
- "",
- ItemRarity.EPIC.getName()
+ abyssalPearl.description(
+ "A dark, swirling orb pulled from",
+ "the abyss. Its core feels freezing",
+ "cold and infinitely deep."
);
- abyssalPearl.addRule(ItemRule.PREVENT_PROJECTILE_LAUNCH);
+ abyssalPearl.preventProjectileLaunch();
abyssalPearl.glow();
BlightedItem drownedResearchCodex = new BlightedItem("DROWNED_RESEARCH_CODEX", ItemType.UNCATEGORIZED, ItemRarity.EPIC, Material.KNOWLEDGE_BOOK);
drownedResearchCodex.setDisplayName("Drowned Research Codex");
- drownedResearchCodex.addLore(
- "",
- " §7A preserved collection of research ",
- " §7behind by an unknown explorer. Its ",
- " §7pages reveal forgotten secrets",
- " §7of the abyssal currents and the",
- " §7creatures lurking beneath.",
- "",
- ItemRarity.EPIC.getName()
+ drownedResearchCodex.description(
+ "A preserved collection of research",
+ "behind by an unknown explorer. Its",
+ "pages reveal forgotten secrets",
+ "of the abyssal currents and the",
+ "creatures lurking beneath."
);
drownedResearchCodex.setEnchantmentGlint(false);
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/NetherMaterials.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/NetherMaterials.java
index 178380c2..8d89c0d2 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/NetherMaterials.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/materials/NetherMaterials.java
@@ -4,101 +4,82 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
-
-import fr.moussax.blightedSMP.engine.items.rules.ItemRule;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class NetherMaterials implements RegistryModule> {
@Override
public void register(Consumer registry) {
BlightedItem enchantedGhastTear = new BlightedItem("ENCHANTED_GHAST_TEAR", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.GHAST_TEAR);
enchantedGhastTear.setDisplayName("Enchanted Ghast Tear");
- enchantedGhastTear.addLore(ItemRarity.UNCOMMON.getName());
enchantedGhastTear.glow();
BlightedItem enchantedMagmaCream = new BlightedItem("ENCHANTED_MAGMA_CREAM", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.MAGMA_CREAM);
enchantedMagmaCream.setDisplayName("Enchanted Magma Cream");
- enchantedMagmaCream.addLore(ItemRarity.UNCOMMON.getName());
enchantedMagmaCream.glow();
BlightedItem enchantedQuartz = new BlightedItem("ENCHANTED_QUARTZ", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.QUARTZ);
enchantedQuartz.setDisplayName("Enchanted Quartz");
- enchantedQuartz.addLore(ItemRarity.UNCOMMON.getName());
enchantedQuartz.glow();
BlightedItem enchantedBlazePowder = new BlightedItem("ENCHANTED_BLAZE_POWDER", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.BLAZE_POWDER);
enchantedBlazePowder.setDisplayName("Enchanted Blaze Powder");
- enchantedBlazePowder.addLore(ItemRarity.UNCOMMON.getName());
enchantedBlazePowder.glow();
BlightedItem enchantedBlazeRod = new BlightedItem("ENCHANTED_BLAZE_ROD", ItemType.MATERIAL, ItemRarity.RARE, Material.BLAZE_ROD);
enchantedBlazeRod.setDisplayName("Enchanted Blaze Rod");
- enchantedBlazeRod.addLore(ItemRarity.RARE.getName());
enchantedBlazeRod.glow();
BlightedItem enchantedGlowstoneDust = new BlightedItem("ENCHANTED_GLOWSTONE_DUST", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.GLOWSTONE_DUST);
enchantedGlowstoneDust.setDisplayName("Enchanted Glowstone Dust");
- enchantedGlowstoneDust.addLore(ItemRarity.UNCOMMON.getName());
enchantedGlowstoneDust.glow();
BlightedItem enchantedNetherWart = new BlightedItem("ENCHANTED_NETHER_WART", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.NETHER_WART);
enchantedNetherWart.setDisplayName("Enchanted Nether Wart");
- enchantedNetherWart.addLore(ItemRarity.UNCOMMON.getName());
enchantedNetherWart.glow();
BlightedItem flames = new BlightedItem("FLAMES", ItemType.MATERIAL, ItemRarity.RARE, Material.BLAZE_POWDER);
flames.setDisplayName("Flames");
- flames.addLore("",
- " §7Dredged from the deepest magma, ",
- " §7these §6abyssal embers §7burn with",
- " §7a cold heat that defies nature.",
- "",
- ItemRarity.RARE.getName()
+ flames.description(
+ "Dredged from the deepest magma,",
+ "these §6abyssal embers §7burn with",
+ "a cold heat that defies nature."
);
flames.glow();
BlightedItem sulfur = new BlightedItem("SULFUR", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.GLOWSTONE_DUST);
sulfur.setDisplayName("Sulfur");
- sulfur.addLore(
- "", " §7A pungent precipitate scraped ",
- " §7from Nether vents, used to",
- " §7catalyze volatile reactions.",
- "",
- ItemRarity.UNCOMMON.getName()
+ sulfur.description(
+ "A pungent precipitate scraped",
+ "from Nether vents, used to",
+ "catalyze volatile reactions."
);
BlightedItem enchantedSulfur = new BlightedItem("ENCHANTED_SULFUR", ItemType.MATERIAL, ItemRarity.RARE, Material.GLOWSTONE_DUST);
enchantedSulfur.setDisplayName("Enchanted Sulfur");
- enchantedSulfur.addLore(ItemRarity.RARE.getName());
enchantedSulfur.glow();
BlightedItem enchantedNetherrack = new BlightedItem("ENCHANTED_NETHERRACK", ItemType.MATERIAL, ItemRarity.UNCOMMON, Material.NETHERRACK);
enchantedNetherrack.setDisplayName("Enchanted Netherrack");
- enchantedNetherrack.addLore(ItemRarity.UNCOMMON.getName());
enchantedNetherrack.glow();
- // TODO - Finish items
BlightedItem vengefulEye = new BlightedItem("VENGEFUL_EYE", ItemType.UNCATEGORIZED, ItemRarity.EPIC, Material.PLAYER_HEAD);
vengefulEye.setDisplayName("Vengeful Eye");
vengefulEye.setCustomSkullTexture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjkzZWMyODVmNWM2NzcwZTdkZmMxZjI3NzVkMGU5NTYzOTk3Mzc4Njk5OWJkZDM2Y2M4ZTk5OGIyNWU3NTNmYiJ9fX0=");
- vengefulEye.addLore(ItemRarity.EPIC.getName());
- vengefulEye.addRule(ItemRule.PREVENT_PLACEMENT);
+ vengefulEye.preventPlacement();
BlightedItem cremeBrulee = new BlightedItem("CREME_BRULEE", ItemType.UNCATEGORIZED, ItemRarity.UNCOMMON, Material.PUMPKIN_PIE);
cremeBrulee.setDisplayName("Crème brûlée");
- cremeBrulee.addLore(
- "",
- " §7Impervious to the flame that",
- " §7scorched its §6caramelized§7,",
- " §6crown§7, this custard remains",
- " §7velvety and untouched within. ",
- "",
- " §8“Sous le feu, la promesse",
- " §8d'un instant sucré.”",
+ cremeBrulee.description(
+ "Impervious to the flame that",
+ "scorched its §6caramelized",
+ "§6crown§7, this custard remains",
+ "velvety and untouched within.",
"",
- ItemRarity.UNCOMMON.getName()
+ "§8“Sous le feu, la promesse",
+ "§8d'un instant sucré.”"
);
cremeBrulee.editFood(food -> {
food.setNutrition(10);
@@ -109,8 +90,7 @@ public void register(Consumer registry) {
BlightedItem suspiciousFungus = new BlightedItem("SUSPICIOUS_FUNGUS", ItemType.UNCATEGORIZED, ItemRarity.RARE, Material.CRIMSON_FUNGUS);
suspiciousFungus.setDisplayName("SuSpIcIoUs Fungus");
- suspiciousFungus.addLore(ItemRarity.RARE.getName());
- suspiciousFungus.addRule(ItemRule.PREVENT_PLACEMENT);
+ suspiciousFungus.preventPlacement();
suspiciousFungus.glow();
registry.accept(enchantedGhastTear);
From 98291015dae717cdee95e18aee4fc705053a4b62 Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 09:54:36 +0200
Subject: [PATCH 4/9] fix(items): isolate gemstone item lore mutation and
secure persistent key
---
.../engine/loot/results/gems/GemsItem.java | 40 +++++++++++++------
1 file changed, 27 insertions(+), 13 deletions(-)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/loot/results/gems/GemsItem.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/loot/results/gems/GemsItem.java
index ff9c1b57..127a6411 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/loot/results/gems/GemsItem.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/loot/results/gems/GemsItem.java
@@ -3,8 +3,8 @@
import fr.moussax.blightedSMP.BlightedSMP;
import fr.moussax.blightedSMP.content.sound.BlightedSounds;
import fr.moussax.blightedSMP.engine.items.BlightedItem;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityManager;
-import fr.moussax.blightedSMP.engine.items.abilities.AbilityType;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
import fr.moussax.blightedSMP.engine.player.BlightedPlayer;
import fr.moussax.bedrock.text.Messenger;
@@ -24,6 +24,10 @@
*/
public record GemsItem(int amount) implements Supplier {
+ private static final NamespacedKey GEMS_KEY = BlightedSMP.getInstance() != null
+ ? new NamespacedKey(BlightedSMP.getInstance(), "gems")
+ : NamespacedKey.fromString("blightedsmp:gems");
+
/**
* Constructs a GemsItem by reading the gem quantity from an existing item stack's persistent data.
*
@@ -32,8 +36,7 @@ public record GemsItem(int amount) implements Supplier {
public GemsItem(ItemStack itemStack) {
ItemMeta meta = Objects.requireNonNull(itemStack.getItemMeta(), "itemMeta cannot be null");
- Integer value = meta.getPersistentDataContainer().get(
- new NamespacedKey(BlightedSMP.getInstance(), "gems"), PersistentDataType.INTEGER);
+ Integer value = meta.getPersistentDataContainer().get(GEMS_KEY, PersistentDataType.INTEGER);
this(value != null ? value : 1);
}
@@ -49,7 +52,7 @@ public void addGems(BlightedPlayer player) {
/**
* Ability handler for consuming Blighted Gemstone items on player interaction.
*/
- public static class BlightedGemstoneAbility implements AbilityManager {
+ public static class BlightedGemstoneAbility implements ItemAbility {
@Override
public String getName() {
@@ -57,8 +60,15 @@ public String getName() {
}
@Override
- public AbilityType getType() {
- return AbilityType.RIGHT_CLICK;
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{
+ "Right click to consume."
+ };
}
@Override
@@ -88,15 +98,19 @@ public boolean triggerAbility(PlayerInteractEvent event) {
*/
@Override
public ItemStack get() {
- BlightedItem blightedItem = ItemRegistry.get("BLIGHTED_GEMSTONE");
-
- blightedItem.setLore(6, "§8 Gems: §d" + this.amount + "✵");
- ItemStack itemStack = blightedItem.toItemStack();
+ BlightedItem prototype = ItemRegistry.getOrThrow("BLIGHTED_GEMSTONE");
+ ItemStack itemStack = prototype.toItemStack();
ItemMeta meta = Objects.requireNonNull(itemStack.getItemMeta(), "itemMeta cannot be null");
- meta.getPersistentDataContainer().set(new NamespacedKey(BlightedSMP.getInstance(), "gems"), PersistentDataType.INTEGER, amount);
- itemStack.setItemMeta(meta);
+ meta.getPersistentDataContainer().set(GEMS_KEY, PersistentDataType.INTEGER, amount);
+
+ java.util.List lore = meta.getLore();
+ if (lore != null) {
+ lore.replaceAll(line -> line.contains("Gems:") ? "§8 Gems: §d" + this.amount + "✵" : line);
+ meta.setLore(lore);
+ }
+ itemStack.setItemMeta(meta);
return itemStack;
}
}
From 2fceeff12ac82da479b90a14895006d30a6f1b58 Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 09:54:51 +0200
Subject: [PATCH 5/9] test(items): add unit tests for restrictions, lore, and
registry
---
.../blightedSMP/engine/items/ItemTest.java | 157 ++++++++++++++++++
1 file changed, 157 insertions(+)
create mode 100644 blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
diff --git a/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java b/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
new file mode 100644
index 00000000..77606b35
--- /dev/null
+++ b/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
@@ -0,0 +1,157 @@
+package fr.moussax.blightedSMP.engine.items;
+
+import fr.moussax.blightedSMP.engine.items.abilities.AbilityTrigger;
+import fr.moussax.blightedSMP.engine.items.abilities.ItemAbility;
+import fr.moussax.blightedSMP.engine.items.lore.ItemLoreRenderer;
+import fr.moussax.blightedSMP.engine.items.registry.ItemRegistry;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.Server;
+import org.bukkit.event.player.PlayerInteractEvent;
+import org.bukkit.inventory.ItemFactory;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import java.lang.reflect.Proxy;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class ItemTest {
+
+ @BeforeAll
+ static void setUpBukkitServer() {
+ if (Bukkit.getServer() == null) {
+ ItemMeta mockMeta = (ItemMeta) Proxy.newProxyInstance(
+ ItemMeta.class.getClassLoader(),
+ new Class>[]{ItemMeta.class},
+ (proxy, method, args) -> switch (method.getName()) {
+ case "clone" -> proxy;
+ case "equals" -> proxy == (args != null && args.length > 0 ? args[0] : null);
+ case "hashCode" -> 1;
+ default -> method.getReturnType().isPrimitive() ? 0 : null;
+ }
+ );
+
+ ItemFactory mockFactory = (ItemFactory) Proxy.newProxyInstance(
+ ItemFactory.class.getClassLoader(),
+ new Class>[]{ItemFactory.class},
+ (_, method, _) -> switch (method.getName()) {
+ case "getItemMeta" -> mockMeta;
+ case "isApplicable" -> true;
+ case "equals" -> true;
+ default -> null;
+ }
+ );
+
+ Server mockServer = (Server) Proxy.newProxyInstance(
+ Server.class.getClassLoader(),
+ new Class>[]{Server.class},
+ (_, method, _) -> switch (method.getName()) {
+ case "getItemFactory" -> mockFactory;
+ case "getLogger" -> java.util.logging.Logger.getGlobal();
+ default -> null;
+ }
+ );
+
+ Bukkit.setServer(mockServer);
+ }
+ }
+
+ @Test
+ @DisplayName("BlightedItem restrictions can be configured fluently and checked")
+ void testItemRestrictions() {
+ BlightedItem item = new BlightedItem("test_item", ItemType.MATERIAL, ItemRarity.COMMON, Material.STICK)
+ .preventPlacement()
+ .preventConsume()
+ .preventProjectileLaunch()
+ .preventBucketInteractions()
+ .preventDrop()
+ .preventInteraction();
+
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_PLACEMENT));
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_CONSUMPTION));
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_PROJECTILE_LAUNCH));
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_BUCKET_INTERACTIONS));
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_DROP));
+ assertTrue(item.hasRestriction(ItemRestriction.PREVENT_INTERACTION));
+ }
+
+ @Test
+ @DisplayName("ItemLoreRenderer renders canonical footer, description, and abilities")
+ void testItemLoreRenderer() {
+ BlightedItem item = new BlightedItem("test_sword", ItemType.SWORD, ItemRarity.LEGENDARY, Material.DIAMOND_SWORD)
+ .description("A blade forged in ancient fires.", "Destroys enemies.")
+ .addAbility(new ItemAbility() {
+ @Override
+ public String getName() {
+ return "Flaming Slash";
+ }
+
+ @Override
+ public AbilityTrigger getTrigger() {
+ return AbilityTrigger.RIGHT_CLICK;
+ }
+
+ @Override
+ public int getManaCost() {
+ return 30;
+ }
+
+ @Override
+ public int getCooldownSeconds() {
+ return 5;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[]{"Launches a wave of flames."};
+ }
+
+ @Override
+ public boolean triggerAbility(PlayerInteractEvent event) {
+ return true;
+ }
+ });
+
+ List lore = ItemLoreRenderer.render(item);
+
+ assertNotNull(lore);
+ assertTrue(lore.stream().anyMatch(l -> l.contains("A blade forged in ancient fires.")));
+ assertTrue(lore.stream().anyMatch(l -> l.contains("Ability: Flaming Slash")));
+ assertTrue(lore.stream().anyMatch(l -> l.contains("RIGHT CLICK")));
+ assertTrue(lore.stream().anyMatch(l -> l.contains("Mana Cost: §330")));
+ assertTrue(lore.stream().anyMatch(l -> l.contains("Cooldown: §a5s")));
+ assertTrue(lore.stream().anyMatch(l -> l.contains(ItemRarity.LEGENDARY.getName() + " SWORD")));
+ long rarityLineCount = lore.stream().filter(l -> l.contains(ItemRarity.LEGENDARY.getName())).count();
+ assertEquals(1, rarityLineCount, "Item lore should contain exactly one canonical rarity footer");
+ }
+
+ @Test
+ @DisplayName("ItemRegistry safe get and getOrThrow contract")
+ void testItemRegistryLookup() {
+ ItemRegistry.clear();
+ BlightedItem registered = new BlightedItem("custom_gem", ItemType.MATERIAL, ItemRarity.RARE, Material.EMERALD);
+ ItemRegistry.register(registered);
+
+ assertSame(registered, ItemRegistry.get("custom_gem"));
+ assertSame(registered, ItemRegistry.getOrThrow("custom_gem"));
+
+ assertNull(ItemRegistry.get("non_existent_item_id"));
+ assertThrows(IllegalArgumentException.class, () -> ItemRegistry.getOrThrow("non_existent_item_id"));
+
+ ItemRegistry.clear();
+ assertNull(ItemRegistry.get("custom_gem"));
+ }
+
+ @Test
+ @DisplayName("AbilityTrigger correctly identifies click actions and formatted display names")
+ void testAbilityTriggerMatches() {
+ assertEquals("§d§lRIGHT CLICK", AbilityTrigger.RIGHT_CLICK.getDisplayName());
+ assertEquals("§d§lLEFT CLICK", AbilityTrigger.LEFT_CLICK.getDisplayName());
+ assertEquals("§d§lSNEAK RIGHT CLICK", AbilityTrigger.SNEAK_RIGHT_CLICK.getDisplayName());
+ assertEquals("§d§lSNEAK LEFT CLICK", AbilityTrigger.SNEAK_LEFT_CLICK.getDisplayName());
+ }
+}
From e1b90e5c2738678a60379c94634b3d8444e8c279 Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 10:05:11 +0200
Subject: [PATCH 6/9] fix(content/blocks): remove manual item rarity injection
---
.../content/blocks/BlightedBlockItems.java | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
index 7fa03ccc..da9257cc 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/blocks/BlightedBlockItems.java
@@ -4,9 +4,10 @@
import fr.moussax.blightedSMP.engine.items.ItemRarity;
import fr.moussax.blightedSMP.engine.items.ItemType;
import fr.moussax.blightedSMP.registry.RegistryModule;
-import java.util.function.Consumer;
import org.bukkit.Material;
+import java.util.function.Consumer;
+
public class BlightedBlockItems implements RegistryModule> {
@Override
@@ -20,9 +21,7 @@ public void register(Consumer registry) {
" §7A crafting table infused with ",
" §5blighted energy §7capable",
" §7of weaving forbidden magic",
- " §7into physical form.",
- "",
- ItemRarity.UNCOMMON.getName() + " BLOCK"
+ " §7into physical form."
);
blightedWorkbench.glow();
@@ -34,9 +33,7 @@ public void register(Consumer registry) {
" §7An industrial crucible powered by ",
" §5blighted energy§7, designed to fuse ",
" §7magic and metal under heat",
- " §7intolerable to mortal craft.",
- "",
- ItemRarity.RARE.getName() + " MACHINE"
+ " §7intolerable to mortal craft."
);
blightedForge.glow();
From 27330d58d1b9cf2c79d8d6447c1ff4501bf96fec Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 10:12:53 +0200
Subject: [PATCH 7/9] fix(items): preserve block break and drop events for
passive tool abilities
Override cancelEvent to return false in AutosmeltAbility, TimberAbility, and HammerAbility so unhandled block drops and breaks remain uncancelled. In AbilityExecutor, guard cooldown, precondition, and error cancellations behind ability.cancelEvent(false) to prevent active cooldowns from blocking vanilla block breaking.
---
.../abilities/tools/AutosmeltAbility.java | 5 ++++
.../items/abilities/tools/HammerAbility.java | 5 ++++
.../items/abilities/tools/TimberAbility.java | 4 +++
.../items/abilities/AbilityExecutor.java | 8 ++---
.../blightedSMP/engine/items/ItemTest.java | 30 +++++++++++++++++++
5 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
index 106d5aeb..60f06957 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/AutosmeltAbility.java
@@ -82,4 +82,9 @@ public boolean triggerAbility(BlockDropItemEvent event) {
return true;
}
+
+ @Override
+ public boolean cancelEvent(boolean success) {
+ return false;
+ }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
index c67d0ad5..dc3bc4ad 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/HammerAbility.java
@@ -31,4 +31,9 @@ public boolean triggerAbility(BlockBreakEvent event) {
public boolean canTrigger(BlightedPlayer player) {
return false;
}
+
+ @Override
+ public boolean cancelEvent(boolean success) {
+ return false;
+ }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
index d5529496..7ced7995 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/content/items/abilities/tools/TimberAbility.java
@@ -117,4 +117,8 @@ public int getCooldownSeconds() {
return 2;
}
+ @Override
+ public boolean cancelEvent(boolean success) {
+ return false;
+ }
}
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
index bd493244..2a517261 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/items/abilities/AbilityExecutor.java
@@ -36,12 +36,12 @@ public static void execute(ItemAbility ability, BlightedPla
double remaining = player.getRemainingCooldown(cooldownKey, ability.getTrigger());
if (remaining > 0) {
warn(player.getPlayer(), "§c⌚ Your §f" + ability.getName() + " §cability is on cooldown for §d" + (int) Math.ceil(remaining) + "s§c!");
- cancel(event);
+ if (ability.cancelEvent(false)) cancel(event);
return;
}
if (!ability.canTrigger(player)) {
- cancel(event);
+ if (ability.cancelEvent(false)) cancel(event);
return;
}
@@ -49,7 +49,7 @@ public static void execute(ItemAbility ability, BlightedPla
if (!player.hasMana(manaCost)) {
player.getPlayer().playSound(player.getPlayer().getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 100f, 0.5f);
Actionbar.sendSlotAlert(player.getPlayer(), PlayerHudManager.SECTION_MANA, "§c§lNOT ENOUGH MANA", Duration.ofSeconds(2));
- cancel(event);
+ if (ability.cancelEvent(false)) cancel(event);
return;
}
@@ -74,7 +74,7 @@ public static void execute(ItemAbility ability, BlightedPla
}
} catch (Exception exception) {
Log.error("AbilityExecutor", "Ability execution failed: " + exception.getClass().getSimpleName());
- cancel(event);
+ if (ability.cancelEvent(false)) cancel(event);
}
}
diff --git a/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java b/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
index 77606b35..ada36144 100644
--- a/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
+++ b/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
@@ -154,4 +154,34 @@ void testAbilityTriggerMatches() {
assertEquals("§d§lSNEAK RIGHT CLICK", AbilityTrigger.SNEAK_RIGHT_CLICK.getDisplayName());
assertEquals("§d§lSNEAK LEFT CLICK", AbilityTrigger.SNEAK_LEFT_CLICK.getDisplayName());
}
+
+ @Test
+ @DisplayName("Tool abilities preserve block break/drop events while interactive abilities cancel them")
+ void testAbilityEventCancellation() {
+ fr.moussax.blightedSMP.content.items.abilities.tools.AutosmeltAbility autosmelt =
+ new fr.moussax.blightedSMP.content.items.abilities.tools.AutosmeltAbility();
+ fr.moussax.blightedSMP.content.items.abilities.tools.TimberAbility timber =
+ new fr.moussax.blightedSMP.content.items.abilities.tools.TimberAbility();
+ fr.moussax.blightedSMP.content.items.abilities.tools.VeinmineAbility veinmine =
+ new fr.moussax.blightedSMP.content.items.abilities.tools.VeinmineAbility();
+ fr.moussax.blightedSMP.content.items.abilities.tools.HammerAbility hammer =
+ new fr.moussax.blightedSMP.content.items.abilities.tools.HammerAbility();
+
+ assertFalse(autosmelt.cancelEvent(false), "Autosmelt should not cancel unhandled drops");
+ assertFalse(autosmelt.cancelEvent(true), "Autosmelt should not cancel handled drops");
+
+ assertFalse(timber.cancelEvent(false), "Timber should not cancel unhandled block breaks");
+ assertFalse(timber.cancelEvent(true), "Timber should not cancel handled block breaks");
+
+ assertFalse(veinmine.cancelEvent(false), "Veinmine should not cancel unhandled block breaks");
+ assertFalse(veinmine.cancelEvent(true), "Veinmine should not cancel handled block breaks");
+
+ assertFalse(hammer.cancelEvent(false), "Hammer should not cancel unhandled block breaks");
+ assertFalse(hammer.cancelEvent(true), "Hammer should not cancel handled block breaks");
+
+ fr.moussax.blightedSMP.content.items.abilities.BonemerangAbility bonemerang =
+ new fr.moussax.blightedSMP.content.items.abilities.BonemerangAbility();
+ assertTrue(bonemerang.cancelEvent(false), "Interactive abilities cancel on failure by default");
+ assertTrue(bonemerang.cancelEvent(true), "Interactive abilities cancel on success by default");
+ }
}
From 6e130d1bb9c5033e756113987a77421983d81c7d Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 10:13:49 +0200
Subject: [PATCH 8/9] refactor(TextAnimation): change class declaration to
final for immutability
---
.../java/fr/moussax/bedrock/ui/animation/TextAnimation.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bedrock/src/main/java/fr/moussax/bedrock/ui/animation/TextAnimation.java b/bedrock/src/main/java/fr/moussax/bedrock/ui/animation/TextAnimation.java
index 8895f51d..b874c50d 100644
--- a/bedrock/src/main/java/fr/moussax/bedrock/ui/animation/TextAnimation.java
+++ b/bedrock/src/main/java/fr/moussax/bedrock/ui/animation/TextAnimation.java
@@ -32,7 +32,7 @@
* Titles, Subtitles, and custom UI consumers. Eliminates visual stutter and client opacity resets
* through in-place packet updates and automatic background HUD suspension during playback.
*/
-public class TextAnimation {
+public final class TextAnimation {
private static final Pattern COLOR_PATTERN = Pattern.compile("§[0-9a-fk-orA-FK-OR]");
From 107752755d63608ec2d2fafe52e7b7a33a984afa Mon Sep 17 00:00:00 2001
From: Moussa
Date: Sun, 4 Oct 2026 10:21:42 +0200
Subject: [PATCH 9/9] refactor(player/hub): fix scale difference between health
and absorption
---
.../moussax/blightedSMP/engine/player/hud/PlayerHudManager.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
index 956ed2a1..6d955f69 100644
--- a/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
+++ b/blighted-smp/src/main/java/fr/moussax/blightedSMP/engine/player/hud/PlayerHudManager.java
@@ -38,7 +38,7 @@ private void initializeDefaultSections() {
.render(player -> {
int health = (int) player.getHealth();
int maxHealth = (int) Objects.requireNonNull(player.getAttribute(Attribute.MAX_HEALTH)).getValue();
- int absorption = (int) player.getAbsorptionAmount() / 2;
+ int absorption = (int) player.getAbsorptionAmount();
String dynamicHealth = absorption > 0 ? "§6" + (absorption + health) : "§c" + health;
return dynamicHealth + "/" + maxHealth + "❤";
})