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]");
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/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/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 83%
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..da9257cc 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,12 +1,13 @@
-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;
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();
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/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..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
@@ -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(
@@ -77,27 +84,7 @@ public boolean triggerAbility(BlockDropItemEvent event) {
}
@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) {
-
+ 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 1de03ef5..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
@@ -1,33 +1,30 @@
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
@@ -36,12 +33,7 @@ public boolean canTrigger(BlightedPlayer player) {
}
@Override
- public void start(BlightedPlayer player) {
-
- }
-
- @Override
- public void stop(BlightedPlayer player) {
-
+ 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 5e24f8ff..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
@@ -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;
@@ -110,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/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);
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/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..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
@@ -24,24 +24,24 @@ 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);
+ 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(AbilityManager ability, Blighted
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;
}
@@ -70,11 +70,11 @@ 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());
- cancel(event);
+ if (ability.cancelEvent(false)) cancel(event);
}
}
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/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;
}
}
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..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
@@ -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();
+ 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/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/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/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;
/**
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;
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..ada36144
--- /dev/null
+++ b/blighted-smp/src/test/java/fr/moussax/blightedSMP/engine/items/ItemTest.java
@@ -0,0 +1,187 @@
+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());
+ }
+
+ @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");
+ }
+}