Added ability command, and prevented unique destruction by lava, cactus, tnt, etc...

This commit is contained in:
2025-03-27 12:24:06 -05:00
parent d54f340e2d
commit 1f6b172158
17 changed files with 384 additions and 179 deletions

View File

@@ -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();
}

View File

@@ -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;
}
}

View File

@@ -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<Player> passiveAbility;
private final Consumer<Player> ability;
private final int abilityCooldownTicks;
Unique(ItemStack inGame, String canonical) {
Unique(ItemStack inGame, String canonical, Consumer<Player> passiveAbility, Consumer<Player> 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<Player> getAbility() {
return ability;
}
public Consumer<Player> getPassiveAbility() {
return passiveAbility;
}
public int getAbilityCooldownTicks() {
return abilityCooldownTicks;
}
}

View File

@@ -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<Config> {
public Tips tips = new Tips();
public class Tips {
public boolean tipsEnabled = true;
public boolean broadcastTips = true;
public int tipInterval = 1200;
public List<String> 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!",

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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();
}
}

View File

@@ -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<Pair<Unique, UUID>> 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));
}
}

View File

@@ -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 <tier> <player>");
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 <upgrader|netherite|mace> ...");
return;
}
final String type = args.get(1).toString().toLowerCase();
switch (type) {
case "upgrader" -> {
if (args.getSize() < 3) {
Text.sendError(sender, "Usage: /armorsmp give upgrader <player>");
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 <piece> <player>");
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 <end|nether|mace>");
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 <piece> <player>");
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 <tier> <player>");
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 <upgrader|netherite|mace> ...");
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 <player>");
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 <piece> <player>");
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 <end|nether|mace>");
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 <piece> <player>");
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 <piece> <player>");
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());
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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!");
}
}
}

View File

@@ -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;

View File

@@ -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));
}
}

View File

@@ -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;

View File

@@ -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);
});
}
}