From 4b8304934f1f351d7e536c13f6c377768d06beb5 Mon Sep 17 00:00:00 2001 From: Raw Leenc Date: Sun, 12 Dec 2021 21:50:58 +0100 Subject: [PATCH] Add the possibility to disenchant a class item --- .../rawmod/mineclass/classes/MineClass.java | 2 + .../mineclass/classes/MineClassFactory.java | 41 +++++++++++++++++ .../mineclass/classes/MineClassImpl.java | 12 +++++ .../mineclass/commands/CommandClass.java | 4 ++ .../listeners/MineClassListeners.java | 44 +++++++++++-------- 5 files changed, 85 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClass.java b/src/main/java/net/rawmod/mineclass/classes/MineClass.java index c94b87a..1240e2c 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClass.java @@ -25,6 +25,8 @@ public interface MineClass { void enchantItem(ItemStack itemStack, Player player); + void disenchantItem(ItemStack itemStack, Player player); + void giveItems(Player player); String getCode(); diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java index eadb28a..98fa37e 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java @@ -33,6 +33,13 @@ public class MineClassFactory { return INSTANCE; } + public static boolean isSimpleSoulBound(ItemStack itemStack) { + if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) { + return itemStack.getItemMeta().getLore().contains("Soulbound"); + } + return false; + } + public static boolean isSoulBound(ItemStack itemStack, Player player) { if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) { Optional mineClass = MineClassFactory.getInstance().getRightClass(player); @@ -52,6 +59,21 @@ public class MineClassFactory { } } + public static void clearClassItem(Player player, ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta != null) { + List loreList = itemMeta.getLore(); + if (loreList != null && loreList.contains("Soulbound")) { + String mineClassName = loreList.get(2); + System.out.println(mineClassName); + Optional optionalMineClass = + MineClassFactory.getInstance().findClassByName(mineClassName); + optionalMineClass.ifPresent(System.out::println); + optionalMineClass.ifPresent(mineClass -> mineClass.disenchantItem(itemStack, player)); + } + } + } + public static void setUnbreakableAndSoulbound(ItemStack itemStack, Player player) { if (itemStack.getItemMeta() != null) { ItemMeta itemMeta = itemStack.getItemMeta(); @@ -66,6 +88,16 @@ public class MineClassFactory { } } + public static void removeUnbreakableAndSoulbound(ItemStack itemStack, Player player) { + if (itemStack.getItemMeta() != null) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setUnbreakable(false); + List loreList = new ArrayList<>(); + itemMeta.setLore(loreList); + itemStack.setItemMeta(itemMeta); + } + } + public synchronized Set getAvailableClassCodes() { return availableClasses.keySet(); } @@ -92,6 +124,15 @@ public class MineClassFactory { return Optional.empty(); } + public synchronized Optional findClassByName(String name) { + for (Map.Entry stringMineClassEntry : availableClasses.entrySet()) { + if (name != null && name.equals(stringMineClassEntry.getValue().getName())) { + return Optional.of(stringMineClassEntry.getValue()); + } + } + return Optional.empty(); + } + public void reapplyEffectsByCode(String code, Player player) { availableClasses.get(code).reapplyEffects(player); } diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java index f4c6d8b..5339c38 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java @@ -42,6 +42,18 @@ public abstract class MineClassImpl implements MineClass { } } + @Override + public void disenchantItem(ItemStack itemStack, Player player) { + if (getClassEnchantments().containsKey(itemStack.getType())) { + getClassEnchantments() + .getOrDefault(itemStack.getType(), new ArrayList<>()) + .forEach( + enchantmentIntegerPair -> + itemStack.removeEnchantment(enchantmentIntegerPair.getFirst())); + MineClassFactory.removeUnbreakableAndSoulbound(itemStack, player); + } + } + @Override public void dropForbiddenItems(Player player) { for (ItemStack content : player.getInventory().getContents()) { diff --git a/src/main/java/net/rawmod/mineclass/commands/CommandClass.java b/src/main/java/net/rawmod/mineclass/commands/CommandClass.java index 7157242..ae72e2a 100644 --- a/src/main/java/net/rawmod/mineclass/commands/CommandClass.java +++ b/src/main/java/net/rawmod/mineclass/commands/CommandClass.java @@ -8,9 +8,13 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import java.util.Arrays; +import java.util.stream.Collectors; + public class CommandClass implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { diff --git a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java index 04d875c..ac86cd7 100644 --- a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java +++ b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java @@ -35,8 +35,7 @@ import java.util.stream.Collectors; public class MineClassListeners implements Listener { private final Mineclass plugin; - private final HashMap playerTimerEffectsHashMap = - new HashMap<>(); + private final HashMap playerTimerEffectsHashMap = new HashMap<>(); public MineClassListeners(Mineclass plugin) { this.plugin = plugin; @@ -55,8 +54,7 @@ public class MineClassListeners implements Listener { "Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command."); } if (!playerTimerEffectsHashMap.containsKey(player)) { - PlayerTimerEffects playerTimerEffects = - new PlayerTimerEffects(player); + PlayerTimerEffects playerTimerEffects = new PlayerTimerEffects(player); playerTimerEffectsHashMap.put(player, playerTimerEffects); playerTimerEffects.runTaskTimer(this.plugin, 20, 20); } else { @@ -313,52 +311,62 @@ public class MineClassListeners implements Listener { public void on(PlayerInteractEvent event) { Player player = event.getPlayer(); ItemStack itemInHand = event.getItem(); - applyBadEffects(player, itemInHand); + boolean effect = false; if (player.isSneaking() && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && event.useInteractedBlock().equals(Event.Result.ALLOW) && MineClassFactory.getInstance().getClassCode(player).equals("beast_master") && event.getClickedBlock() != null - && event.getItem() != null) { + && itemInHand != null) { event.setCancelled(true); - ItemStack itemStack = event.getItem(); - switch (itemStack.getType()) { + switch (itemInHand.getType()) { case SADDLE: invokeHorse(event, player); break; case BONE: try { - invokeWolf(event, player, itemStack); + invokeWolf(event, player, itemInHand); } catch (IllegalStateException e) { player.sendMessage(e.getMessage()); } break; case SALMON: - invokeCat(event, player, itemStack); + invokeCat(event, player, itemInHand); break; default: break; } + effect = true; } if (player.isSneaking() && (event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR)) && MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") - && event.getItem() != null - && event.getItem().getType().equals(Material.ENDER_PEARL)) { + && itemInHand != null + && itemInHand.getType().equals(Material.ENDER_PEARL)) { player.openInventory(player.getEnderChest()); event.setCancelled(true); + effect = true; } if (player.isSneaking() && (event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR)) - && event.getItem() != null) { + && itemInHand != null) { + System.out.println(itemInHand); Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - mineClass.ifPresent( - it -> { - it.enchantItem(event.getItem(), player); - event.setCancelled(true); - }); + if (MineClassFactory.isSimpleSoulBound(itemInHand)) { + System.out.println("Clearing"); + MineClassFactory.clearClassItem(player, itemInHand); + } else { + if (mineClass.isPresent()) { + mineClass.get().enchantItem(itemInHand, player); + event.setCancelled(true); + } + } + effect = true; + } + if (!effect) { + applyBadEffects(player, itemInHand); } }