diff --git a/src/main/java/me/trouper/armorsmp/ArmorSMP.java b/src/main/java/me/trouper/armorsmp/ArmorSMP.java index 3942c03..c41bbc3 100644 --- a/src/main/java/me/trouper/armorsmp/ArmorSMP.java +++ b/src/main/java/me/trouper/armorsmp/ArmorSMP.java @@ -14,7 +14,7 @@ public final class ArmorSMP extends JavaPlugin { getLogger().info("Instantiating Plugin"); instance = this; - getLogger().info("Initializing Manager"); + getLogger().info("Instantiating Manager"); manager = new Manager(); } @@ -22,7 +22,8 @@ public final class ArmorSMP extends JavaPlugin { public void onEnable() { getLogger().info("Initializing PDK"); PDK.init(this); - + + getLogger().info("Initializing Manager"); manager.init(); } diff --git a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java index 35359e3..551af68 100644 --- a/src/main/java/me/trouper/armorsmp/data/ArmorTier.java +++ b/src/main/java/me/trouper/armorsmp/data/ArmorTier.java @@ -8,6 +8,8 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.util.function.Consumer; + public enum ArmorTier { NONE(0, new ItemStack(Material.AIR), @@ -186,4 +188,5 @@ public enum ArmorTier { public ItemStack getBoots() { return boots; } + } diff --git a/src/main/java/me/trouper/armorsmp/data/Unique.java b/src/main/java/me/trouper/armorsmp/data/Unique.java index 786cdb5..9313e65 100644 --- a/src/main/java/me/trouper/armorsmp/data/Unique.java +++ b/src/main/java/me/trouper/armorsmp/data/Unique.java @@ -4,7 +4,12 @@ import io.github.itzispyder.pdk.plugin.builders.ItemBuilder; import me.trouper.armorsmp.utils.Text; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.function.Consumer; public enum Unique { HELMET(ItemBuilder.create() @@ -20,7 +25,11 @@ public enum Unique { .enchant(Enchantment.AQUA_AFFINITY,1) .customModelData(2) .build(), - "Netherite Helmet"), + "Netherite Helmet", (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,21,1,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.HEALTH_BOOST,25,3,true,false,false)); + }, (p) -> { + }, 50), CHESTPLATE(ItemBuilder.create() .material(Material.NETHERITE_CHESTPLATE) .lore(Text.legacyColor("&bAbilities:")) @@ -33,7 +42,11 @@ public enum Unique { .enchant(Enchantment.MENDING,1) .customModelData(3) .build(), - "Dragon Egg"), + "Dragon Egg", (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH,21,0,true,false,false)); + p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE,21,0,true,false,false)); + }, (p) -> { + }, 50), LEGGINGS(ItemBuilder.create() .material(Material.NETHERITE_LEGGINGS) .lore(Text.legacyColor("&bAbilities:")) @@ -46,7 +59,12 @@ public enum Unique { .enchant(Enchantment.SWIFT_SNEAK,3) .customModelData(4) .build(), - "Netherite Leggings"), + "Netherite Leggings", (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.RESISTANCE,21,0,true,false,false)); + + }, (p) -> { + // TODO: yoink shield ability from OgreDupeAlias + }, 45), BOOTS(ItemBuilder.create() .material(Material.NETHERITE_BOOTS) .lore(Text.legacyColor("&bAbilities:")) @@ -61,7 +79,11 @@ public enum Unique { .enchant(Enchantment.DEPTH_STRIDER,3) .customModelData(5) .build(), - "Netherite Boots"), + "Netherite Boots", (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,21,0,true,false,false)); + }, (p) -> { + // TODO: Vector math for dash ability + }, 50), MACE(ItemBuilder.create() .material(Material.MACE) .lore(Text.legacyColor("&bAbilities:")) @@ -72,7 +94,11 @@ public enum Unique { .enchant(Enchantment.MENDING,1) .customModelData(6) .build(), - "Mace"), + "Mace", (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.SPEED,21,0,true,false,false)); + }, (p) -> { + + }, 50), SWORD(ItemBuilder.create() .material(Material.NETHERITE_SWORD) .enchant(Enchantment.UNBREAKING,3) @@ -80,7 +106,10 @@ public enum Unique { .enchant(Enchantment.SHARPNESS,5) .customModelData(7) .build(), - "Netherite Sword"), + "Netherite Sword", (p) -> { + }, (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.STRENGTH,140,1,true,false,false)); + }, 50), AXE(ItemBuilder.create() .material(Material.NETHERITE_AXE) .enchant(Enchantment.UNBREAKING,3) @@ -89,14 +118,23 @@ public enum Unique { .enchant(Enchantment.EFFICIENCY,5) .customModelData(8) .build(), - "Netherite Axe"); + "Netherite Axe", (p) -> { + }, (p) -> { + p.addPotionEffect(new PotionEffect(PotionEffectType.HASTE,140,5,true,false,false)); + }, 50); private final ItemStack inGame; private final String canonical; + private final Consumer passiveAbility; + private final Consumer ability; + private final int abilityCooldownTicks; - Unique(ItemStack inGame, String canonical) { + Unique(ItemStack inGame, String canonical, Consumer passiveAbility, Consumer ability, int abilityCooldownTicks) { this.inGame = inGame; this.canonical = canonical; + this.passiveAbility = passiveAbility; + this.ability = ability; + this.abilityCooldownTicks = abilityCooldownTicks; } public ItemStack getInGameItem() { @@ -121,4 +159,16 @@ public enum Unique { public String getCanonical() { return canonical; } + + public Consumer getAbility() { + return ability; + } + + public Consumer getPassiveAbility() { + return passiveAbility; + } + + public int getAbilityCooldownTicks() { + return abilityCooldownTicks; + } } diff --git a/src/main/java/me/trouper/armorsmp/data/Config.java b/src/main/java/me/trouper/armorsmp/data/io/Config.java similarity index 97% rename from src/main/java/me/trouper/armorsmp/data/Config.java rename to src/main/java/me/trouper/armorsmp/data/io/Config.java index 96053fa..e58e1dc 100644 --- a/src/main/java/me/trouper/armorsmp/data/Config.java +++ b/src/main/java/me/trouper/armorsmp/data/io/Config.java @@ -1,4 +1,4 @@ -package me.trouper.armorsmp.data; +package me.trouper.armorsmp.data.io; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.armorsmp.ArmorSMP; @@ -28,6 +28,8 @@ public class Config implements JsonSerializable { public Tips tips = new Tips(); public class Tips { public boolean tipsEnabled = true; + public boolean broadcastTips = true; + public int tipInterval = 1200; public List tipList = Arrays.asList( "Kill players to obtain Armor Upgraders and progress through armor tiers!", "Right-click an Armor Upgrader to upgrade your armor to the next tier!", diff --git a/src/main/java/me/trouper/armorsmp/data/IO.java b/src/main/java/me/trouper/armorsmp/data/io/IO.java similarity index 81% rename from src/main/java/me/trouper/armorsmp/data/IO.java rename to src/main/java/me/trouper/armorsmp/data/io/IO.java index b0c3370..4128d59 100644 --- a/src/main/java/me/trouper/armorsmp/data/IO.java +++ b/src/main/java/me/trouper/armorsmp/data/io/IO.java @@ -1,6 +1,7 @@ -package me.trouper.armorsmp.data; +package me.trouper.armorsmp.data.io; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; +import me.trouper.armorsmp.ArmorSMP; import java.io.File; @@ -22,6 +23,7 @@ public class IO { } public void loadAll() { + ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); config = JsonSerializable.load(CONFIG_FILE,Config.class,new Config()); storage = JsonSerializable.load(STORAGE_FILE,Storage.class,new Storage()); @@ -30,6 +32,7 @@ public class IO { } public void saveAll() { + ArmorSMP.getInstance().getLogger().info("Saving all IO Files"); config.save(); storage.save(); } diff --git a/src/main/java/me/trouper/armorsmp/data/Storage.java b/src/main/java/me/trouper/armorsmp/data/io/Storage.java similarity index 89% rename from src/main/java/me/trouper/armorsmp/data/Storage.java rename to src/main/java/me/trouper/armorsmp/data/io/Storage.java index d6c7680..ba757dd 100644 --- a/src/main/java/me/trouper/armorsmp/data/Storage.java +++ b/src/main/java/me/trouper/armorsmp/data/io/Storage.java @@ -1,7 +1,9 @@ -package me.trouper.armorsmp.data; +package me.trouper.armorsmp.data.io; import io.github.itzispyder.pdk.utils.misc.config.JsonSerializable; import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.ArmorTier; +import me.trouper.armorsmp.data.Unique; import java.io.File; import java.util.HashMap; diff --git a/src/main/java/me/trouper/armorsmp/server/Manager.java b/src/main/java/me/trouper/armorsmp/server/Manager.java index 1ec2305..9ed64c5 100644 --- a/src/main/java/me/trouper/armorsmp/server/Manager.java +++ b/src/main/java/me/trouper/armorsmp/server/Manager.java @@ -1,21 +1,26 @@ package me.trouper.armorsmp.server; import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.data.IO; +import me.trouper.armorsmp.data.io.IO; +import me.trouper.armorsmp.server.commands.AbilityCommand; import me.trouper.armorsmp.server.commands.AdminCommand; import me.trouper.armorsmp.server.commands.TrustCommand; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.server.events.*; import me.trouper.armorsmp.server.systems.ArmorBackend; +import me.trouper.armorsmp.server.systems.Broadcaster; import me.trouper.armorsmp.server.systems.TrustBackend; import me.trouper.armorsmp.server.systems.UniquesBackend; +import org.bukkit.Bukkit; public class Manager { // My systems public IO io; + public ArmorBackend armor; public TrustBackend trust; public UniquesBackend uniques; + public Broadcaster broadcaster; public Manager() { io = new IO(); @@ -23,15 +28,18 @@ public class Manager { armor = new ArmorBackend(io); trust = new TrustBackend(io); uniques = new UniquesBackend(io); + broadcaster = new Broadcaster(io); } public void init() { - ArmorSMP.getInstance().getLogger().info("Loading all IO Files"); io.loadAll(); registerCommands(); registerEvents(); registerCrafting(); + + Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(),broadcaster::broadcastTip,0,io.config.tips.tipInterval); + Bukkit.getScheduler().runTaskTimer(ArmorSMP.getInstance(),uniques::applyPersistence,0,20); } @@ -42,19 +50,21 @@ public class Manager { new JoinEvent().register(); new UpgradeRedeemEvent().register(); new PickUpEvent().register(); + new ItemDestroyEvents().register(); } private void registerCommands() { ArmorSMP.getInstance().getLogger().info("Registering Commands"); new AdminCommand().register(); new TrustCommand().register(); + new AbilityCommand().register(); } private void registerCrafting() { - ArmorSMP.getInstance().getLogger().info("Repairing Crafts"); - ArmorUpgrade.removeRecipe(); - - ArmorUpgrade.addRecipe(); + ArmorSMP.getInstance().getLogger().info("Registering Crafts"); + ArmorUpgrade armorUpgrade = new ArmorUpgrade(); + armorUpgrade.removeRecipe(); + armorUpgrade.addRecipe(); } } diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java new file mode 100644 index 0000000..e5d0383 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/commands/AbilityCommand.java @@ -0,0 +1,43 @@ +package me.trouper.armorsmp.server.commands; + +import io.github.itzispyder.pdk.commands.Args; +import io.github.itzispyder.pdk.commands.CommandRegistry; +import io.github.itzispyder.pdk.commands.CustomCommand; +import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; +import io.github.itzispyder.pdk.utils.misc.Cooldown; +import io.github.itzispyder.pdk.utils.misc.Pair; +import me.trouper.armorsmp.data.Unique; +import me.trouper.armorsmp.utils.Text; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.UUID; + +@CommandRegistry(value = "ability", printStackTrace = true, playersOnly = true) +public class AbilityCommand implements CustomCommand { + + Cooldown> abilityCooldown = new Cooldown<>(); + + @Override + public void dispatchCommand(CommandSender sender, Command command, String label, Args args) { + final Unique piece = args.get(0).toEnum(Unique.class); + Player p = (Player) sender; + if (piece == null) { + Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid unique. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); + return; + } + if (abilityCooldown.isOnCooldown(Pair.of(piece,p.getUniqueId()))) { + Text.sendMessage(false, Text.Pallet.WARNING, sender, "The ability for your {0} is on cooldown for {1} seconds.",piece.getCanonical(),abilityCooldown.getCooldownSec(Pair.of(piece,p.getUniqueId()))); + return; + } + piece.getAbility().accept(p); + abilityCooldown.addCooldown(Pair.of(piece,p.getUniqueId()),piece.getAbilityCooldownTicks() * 50L); + } + + @Override + public void dispatchCompletions(CommandSender commandSender, Command command, String label, CompletionBuilder b) { + b.then(b.argEnum(Unique.class)); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java index c35c8d5..112110b 100644 --- a/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java +++ b/src/main/java/me/trouper/armorsmp/server/commands/AdminCommand.java @@ -7,7 +7,7 @@ import io.github.itzispyder.pdk.commands.Permission; import io.github.itzispyder.pdk.commands.completions.CompletionBuilder; import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; -import me.trouper.armorsmp.data.Config; +import me.trouper.armorsmp.data.io.Config; import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.server.crafting.ArmorUpgrade; import me.trouper.armorsmp.utils.Text; @@ -30,150 +30,11 @@ public class AdminCommand implements CustomCommand { } String sub = args.get(0).toString(); switch (sub) { - case "change" -> { - if (args.getSize() < 3) { - Text.sendError(sender, "Usage: /armorsmp change "); - return; - } - final String tierName = args.get(1).toString(); - final String playerName = args.get(2).toString(); - final OfflinePlayer target = Bukkit.getPlayer(playerName); - - if (target == null) { - Text.sendError(sender, "Player not found or offline."); - return; - } - try { - ArmorTier tier = ArmorTier.valueOf(tierName.toUpperCase()); - ArmorSMP.getInstance().getManager().armor.setTier(target,tier); - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender,"Changed armor tier to {0} for {1}",tier,target.getName()); - } catch (IllegalArgumentException e) { - Text.sendError(sender, "Invalid tier! Valid tiers: " + Arrays.toString(ArmorTier.values())); - } - } - case "give" -> { - if (args.getSize() < 2) { - Text.sendError(sender, "Usage: /armorsmp give ..."); - return; - } - final String type = args.get(1).toString().toLowerCase(); - - switch (type) { - case "upgrader" -> { - if (args.getSize() < 3) { - Text.sendError(sender, "Usage: /armorsmp give upgrader "); - return; - } - Player target = Bukkit.getPlayer(args.get(2).toString()); - if (target == null) { - Text.sendError(sender, "Player not found online."); - return; - } - - target.getInventory().addItem(ArmorUpgrade.ARMOR_UGPRADE); - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}",target.getName()); - } - case "unique" -> { - if (args.getSize() < 4) { - Text.sendError(sender, "Usage: /armorsmp give unique "); - return; - } - final Unique piece = args.get(2).toEnum(Unique.class); - if (piece == null) { - Text.sendMessage(false, Text.Pallet.ERROR,sender,"Error: {0} is not a valid unique piece.",args.get(2).toString()); - return; - } - - OfflinePlayer target = Bukkit.getPlayer(args.get(3).toString()); - - if (target == null) { - Text.sendError(sender, "Player not found online or offline."); - return; - } - - ArmorSMP.getInstance().getManager().uniques.setOwner(piece,target); - ArmorSMP.getInstance().getManager().armor.queueUpdate(target,true); - ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Set the owner of unique {0} to {1}.",piece.getCanonical(), target.getName()); - } - default -> Text.sendError(sender, "Invalid give type! Valid types: upgrader, netherite, mace"); - } - } - case "toggle" -> { - if (args.getSize() < 2) { - Text.sendError(sender, "Usage: /armorsmp toggle "); - return; - } - Config config = ArmorSMP.getInstance().getManager().io.config; - String feature = args.get(1).toString().toLowerCase(); - boolean result = false; - switch (feature) { - case "end" -> { - config.endEnabled = result = !config.endEnabled; - config.save(); - - feature = "The End"; - } - case "nether" -> { - config.netherEnabled = result = !config.netherEnabled; - config.save(); - - feature = "The Nether"; - } - case "mace" -> { - config.maceCraftingEnabled = result = !config.maceCraftingEnabled; - config.save(); - - feature = "Mace Crafting"; - } - case "debug" -> { - config.debugMode = result = !config.debugMode; - config.save(); - - feature = "Debug Mode"; - } - } - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled {0} {1}.",feature,result ? "on" : "off"); - } - case "reset" -> { - if (args.getSize() < 2 || !args.get(1).toString().equalsIgnoreCase("mace")) { - Text.sendError(sender, "Usage: /armorsmp reset mace"); - return; - } - - ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(Unique.MACE); - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); - } - case "remove" -> { - final String type = args.get(1).toString().toLowerCase(); - - switch (type) { - case "unique" -> { - if (args.getSize() < 4) { - Text.sendError(sender, "Usage: /armorsmp remove unique "); - return; - } - final Unique piece = args.get(2).toEnum(Unique.class); - Player target = Bukkit.getPlayer(args.get(3).toString()); - - if (target == null) { - Text.sendError(sender, "Player not found or offline."); - return; - } - - ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(piece); - ArmorSMP.getInstance().getManager().armor.queueUpdate(target,true); - ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); - - Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.getCanonical(), target.getName()); - } - default -> Text.sendError(sender, "Invalid give type! Valid types: netherite"); - } - } + case "change" -> handleChange(sender, args); + case "give" -> handleGive(sender, args); + case "toggle" -> handleToggle(sender, args); + case "reset" -> handleReset(sender, args); + case "remove" -> handleRemove(sender, args); default -> Text.sendError(sender, "Error: Valid sub-commands are: [change, give, toggle, reset, remove]"); } } @@ -201,6 +62,167 @@ public class AdminCommand implements CustomCommand { ).then(b.arg("toggle") .then(b.arg("end","nether","mace","debug"))); } + + private void handleChange(CommandSender sender, Args args) { + if (args.getSize() < 3) { + Text.sendError(sender, "Usage: /armorsmp change "); + return; + } + final ArmorTier tier = args.get(1).toEnum(ArmorTier.class); + final String playerName = args.get(2).toString(); + final OfflinePlayer target = Bukkit.getPlayer(playerName); + + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + if (tier == null) { + Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid armor tier. Please choose from these values: ", args.get(2).toString(), Arrays.toString(ArmorTier.values())); + return; + } + + ArmorSMP.getInstance().getManager().armor.setTier(target, tier); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Changed armor tier to {0} for {1}", tier, target.getName()); + } + + private void handleGive(CommandSender sender, Args args) { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /armorsmp give ..."); + return; + } + final String type = args.get(1).toString().toLowerCase(); + + switch (type) { + case "upgrader" -> handleGiveUpgrader(sender, args); + case "unique" -> handleGiveUnique(sender, args); + default -> Text.sendError(sender, "Invalid give type! Valid types: upgrader, netherite, mace"); + } + } + + private void handleGiveUpgrader(CommandSender sender, Args args) { + if (args.getSize() < 3) { + Text.sendError(sender, "Usage: /armorsmp give upgrader "); + return; + } + Player target = Bukkit.getPlayer(args.get(2).toString()); + if (target == null) { + Text.sendError(sender, "Player not found online."); + return; + } + + target.getInventory().addItem(ArmorUpgrade.ARMOR_UGPRADE); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Given and Upgrader to {0}", target.getName()); + } + + private void handleGiveUnique(CommandSender sender, Args args) { + if (args.getSize() < 4) { + Text.sendError(sender, "Usage: /armorsmp give unique "); + return; + } + final Unique piece = args.get(2).toEnum(Unique.class); + if (piece == null) { + Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid unique piece. Please choose from these values: ", args.get(2).toString(), Arrays.toString(Unique.values())); + return; + } + + OfflinePlayer target = Bukkit.getPlayer(args.get(3).toString()); + + if (target == null) { + Text.sendError(sender, "Player not found online or offline."); + return; + } + + ArmorSMP.getInstance().getManager().uniques.setOwner(piece, target); + ArmorSMP.getInstance().getManager().armor.queueUpdate(target, true); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Set the owner of unique {0} to {1}.", piece.getCanonical(), target.getName()); + } + + private void handleToggle(CommandSender sender, Args args) { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /armorsmp toggle "); + return; + } + Config config = ArmorSMP.getInstance().getManager().io.config; + String feature = args.get(1).toString().toLowerCase(); + + boolean result = false; + switch (feature) { + case "end" -> { + config.endEnabled = result = !config.endEnabled; + config.save(); + feature = "The End"; + } + case "nether" -> { + config.netherEnabled = result = !config.netherEnabled; + config.save(); + feature = "The Nether"; + } + case "mace" -> { + config.maceCraftingEnabled = result = !config.maceCraftingEnabled; + config.save(); + feature = "Mace Crafting"; + } + case "debug" -> { + config.debugMode = result = !config.debugMode; + config.save(); + feature = "Debug Mode"; + } + default -> { + Text.sendMessage(false, Text.Pallet.ERROR, sender, "Error: {0} is not a valid feature.", feature); + + return; + } + } + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Toggled {0} {1}.", feature, result ? "on" : "off"); + } - + + private void handleReset(CommandSender sender, Args args) { + if (args.getSize() < 2 || !args.get(1).toString().equalsIgnoreCase("mace")) { + Text.sendError(sender, "Usage: /armorsmp reset mace"); + return; + } + + ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(Unique.MACE); + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Reset Mace"); + } + + private void handleRemove(CommandSender sender, Args args) { + if (args.getSize() < 2) { + Text.sendError(sender, "Usage: /armorsmp remove unique "); + return; + } + final String type = args.get(1).toString().toLowerCase(); + + switch (type) { + case "unique" -> handleRemoveUnique(sender, args); + default -> Text.sendError(sender,"Invalid argument. Valid args: {0}","unique"); + } + } + + private void handleRemoveUnique(CommandSender sender, Args args) { + if (args.getSize() < 4) { + Text.sendError(sender, "Usage: /armorsmp remove unique "); + return; + } + final Unique piece = args.get(2).toEnum(Unique.class); + Player target = Bukkit.getPlayer(args.get(3).toString()); + + if (target == null) { + Text.sendError(sender, "Player not found or offline."); + return; + } + if (piece == null) { + Text.sendError(sender, "Invalid unique, Please pick form these values: {0}", Arrays.toString(Unique.values())); + return; + } + + ArmorSMP.getInstance().getManager().io.storage.uniques.owners.remove(piece); + ArmorSMP.getInstance().getManager().armor.queueUpdate(target, true); + ArmorSMP.getInstance().getManager().uniques.queueUpdate(target); + + Text.sendMessage(false, Text.Pallet.SUCCESS, sender, "Removed {0} from {1}", piece.getCanonical(), target.getName()); + } } diff --git a/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java index 937b4f1..52ee0a0 100644 --- a/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java +++ b/src/main/java/me/trouper/armorsmp/server/crafting/ArmorUpgrade.java @@ -20,7 +20,7 @@ public class ArmorUpgrade { public static ShapedRecipe recipe = new ShapedRecipe(KEY, ARMOR_UGPRADE); - public static void addRecipe() { + public void addRecipe() { recipe.shape("ABC", "DEF", "GHI"); recipe.setIngredient('A', Material.DIAMOND_BLOCK); @@ -38,7 +38,7 @@ public class ArmorUpgrade { ArmorSMP.getInstance().getServer().addRecipe(recipe); } - public static void removeRecipe() { + public void removeRecipe() { ArmorSMP.getInstance().getServer().removeRecipe(KEY); } } diff --git a/src/main/java/me/trouper/armorsmp/server/events/ItemDestroyEvents.java b/src/main/java/me/trouper/armorsmp/server/events/ItemDestroyEvents.java new file mode 100644 index 0000000..28310c2 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/events/ItemDestroyEvents.java @@ -0,0 +1,37 @@ +package me.trouper.armorsmp.server.events; + +import io.github.itzispyder.pdk.events.CustomListener; +import io.papermc.paper.event.entity.EntityDamageItemEvent; +import me.trouper.armorsmp.data.Unique; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityDamageByBlockEvent; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.ItemDespawnEvent; +import org.bukkit.inventory.ItemStack; + +public class ItemDestroyEvents implements CustomListener { + @EventHandler + public void onDespawn(ItemDespawnEvent e) { + ItemStack i = e.getEntity().getItemStack(); + + if (!Unique.isUnique(i)) return; + e.setCancelled(true); + } + + @EventHandler + public void onBlockDamage(EntityDamageByBlockEvent e) { + if (!(e.getEntity() instanceof Item i)) return; + if (!Unique.isUnique(i.getItemStack())) return; + + e.setCancelled(true); + } + + @EventHandler + public void onBlockDamage(EntityDamageByEntityEvent e) { + if (!(e.getEntity() instanceof Item i)) return; + if (!Unique.isUnique(i.getItemStack())) return; + + e.setCancelled(true); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java index bbda66d..818f248 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/PickUpEvent.java @@ -14,7 +14,10 @@ public class PickUpEvent implements CustomListener { @EventHandler public void onItemPickUp(EntityPickupItemEvent e) { - if (!(e.getEntity() instanceof Player p)) return; + if (!(e.getEntity() instanceof Player p)) { + e.setCancelled(true); + return; + } ItemStack i = e.getItem().getItemStack(); if (!Unique.isUnique(i)) return; @@ -22,7 +25,7 @@ public class PickUpEvent implements CustomListener { ArmorSMP.getInstance().getManager().uniques.setOwner(match,p); Text.sendMessage(true, Text.Pallet.INFO,p,"Congratulations! You have picked up the unique {0}. There is only one of each in the whole server!",match.getCanonical()); - ArmorSMP.getInstance().getServer().broadcast(Text.getMessage(false, Text.Pallet.INFO,"GG, {0}! They are the new owner of the unique {1}",p.getName(),match.getCanonical())); + ArmorSMP.getInstance().getServer().broadcast(Text.getMessage(false, Text.Pallet.INFO,"GG, {0}! They are the new owner of the unique {1}.",p.getName(),match.getCanonical())); if (WorldUtils.isArmor(match.getInGameItem())) { p.getInventory().remove(i); diff --git a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java index ac5abc9..b1a50ca 100644 --- a/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java +++ b/src/main/java/me/trouper/armorsmp/server/events/UpgradeRedeemEvent.java @@ -25,6 +25,8 @@ public class UpgradeRedeemEvent implements CustomListener { if (ArmorSMP.getInstance().getManager().armor.upTier(p)) { holding.setAmount(holding.getAmount() - 1); Text.sendMessage(true, Text.Pallet.INFO,p,"Successfully redeemed armor upgrade! Tier {0} -> Tier {1}",tier,ArmorSMP.getInstance().getManager().armor.getTier(p)); + } else { + Text.sendMessage(true, Text.Pallet.ERROR,p,"Unable to upgrade. You are already at the maximum Armor Tier!"); } } } diff --git a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java index edb2d56..e4dfa15 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/ArmorBackend.java @@ -1,9 +1,8 @@ package me.trouper.armorsmp.server.systems; -import me.trouper.armorsmp.ArmorSMP; import me.trouper.armorsmp.data.ArmorTier; -import me.trouper.armorsmp.data.IO; -import me.trouper.armorsmp.data.Storage; +import me.trouper.armorsmp.data.io.IO; +import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.Unique; import me.trouper.armorsmp.utils.Verbose; import org.bukkit.Material; diff --git a/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java b/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java new file mode 100644 index 0000000..c531159 --- /dev/null +++ b/src/main/java/me/trouper/armorsmp/server/systems/Broadcaster.java @@ -0,0 +1,20 @@ +package me.trouper.armorsmp.server.systems; + +import io.github.itzispyder.pdk.utils.misc.Randomizer; +import me.trouper.armorsmp.ArmorSMP; +import me.trouper.armorsmp.data.io.IO; +import me.trouper.armorsmp.utils.Text; + +public class Broadcaster { + + private final IO io; + + public Broadcaster(IO io) { + this.io = io; + } + + public void broadcastTip() { + String tip = new Randomizer().getRandomElement(io.config.tips.tipList); + ArmorSMP.getInstance().getServer().broadcast(Text.getMessage(false, Text.Pallet.NEUTRAL,tip)); + } +} diff --git a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java index f7f1225..fa71e91 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/TrustBackend.java @@ -1,8 +1,7 @@ package me.trouper.armorsmp.server.systems; -import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.data.IO; -import me.trouper.armorsmp.data.Storage; +import me.trouper.armorsmp.data.io.IO; +import me.trouper.armorsmp.data.io.Storage; import org.bukkit.entity.Player; import java.util.HashSet; diff --git a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java index d62c31b..f2fc4c1 100644 --- a/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java +++ b/src/main/java/me/trouper/armorsmp/server/systems/UniquesBackend.java @@ -1,9 +1,9 @@ package me.trouper.armorsmp.server.systems; -import me.trouper.armorsmp.ArmorSMP; -import me.trouper.armorsmp.data.IO; -import me.trouper.armorsmp.data.Storage; +import me.trouper.armorsmp.data.io.IO; +import me.trouper.armorsmp.data.io.Storage; import me.trouper.armorsmp.data.Unique; +import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -17,7 +17,9 @@ public class UniquesBackend { private void updateUniques(Player p) { if (!storage.uniques.owners.containsValue(p.getUniqueId().toString())) return; - + for (Player player : Bukkit.getOnlinePlayers()) { + + } storage.uniques.owners.forEach((unique,owner)->{ if (unique.equals(Unique.MACE) || unique.equals(Unique.SWORD) || unique.equals(Unique.AXE) && owner.equals(p.getUniqueId().toString()) && !p.getInventory().contains(unique.getInGameItem())) { p.getInventory().addItem(unique.getInGameItem()); @@ -42,4 +44,11 @@ public class UniquesBackend { } }); } + + public void applyPersistence() { + storage.uniques.owners.forEach((unique, owner) -> { + Player p = Bukkit.getPlayer(owner); + if (p != null && p.isOnline()) unique.getPassiveAbility().accept(p); + }); + } }