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 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 ability, boolean injectLore) { - if (ability == null) return; - this.abilities.add(ability); + public BlightedItem addAbility(ItemAbility 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... abilities) { + for (ItemAbility 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... abilities) { - for (AbilityManager 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 ability : abilities) { - if (ability.getType().matches(event)) { - AbilityExecutor.execute((AbilityManager) ability, blightedPlayer, event); + for (ItemAbility 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 bestMatch = null; - for (AbilityManager ability : abilities) { - if (!ability.getType().matches(event)) continue; - if (bestMatch == null || isMoreSpecific(ability.getType(), bestMatch.getType())) { - bestMatch = ability; + for (ItemAbility 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 managerClass, AbilityType type, int seconds) { - setCooldown(managerClass != null ? managerClass.getName() : "", type, seconds); + public void setCooldown(Class 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 managerClass, AbilityType type) { - return getRemainingCooldown(managerClass != null ? managerClass.getName() : "", type); + public double getRemainingCooldown(Class 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"); + } +}