Add the possibility to disenchant a class item

This commit is contained in:
2021-12-12 21:50:58 +01:00
parent 3a321fd49b
commit 4b8304934f
5 changed files with 85 additions and 18 deletions

View File

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

View File

@@ -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> 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<String> loreList = itemMeta.getLore();
if (loreList != null && loreList.contains("Soulbound")) {
String mineClassName = loreList.get(2);
System.out.println(mineClassName);
Optional<MineClass> 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<String> loreList = new ArrayList<>();
itemMeta.setLore(loreList);
itemStack.setItemMeta(itemMeta);
}
}
public synchronized Set<String> getAvailableClassCodes() {
return availableClasses.keySet();
}
@@ -92,6 +124,15 @@ public class MineClassFactory {
return Optional.empty();
}
public synchronized Optional<MineClass> findClassByName(String name) {
for (Map.Entry<String, MineClass> 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);
}

View File

@@ -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()) {

View File

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

View File

@@ -35,8 +35,7 @@ import java.util.stream.Collectors;
public class MineClassListeners implements Listener {
private final Mineclass plugin;
private final HashMap<Player, PlayerTimerEffects> playerTimerEffectsHashMap =
new HashMap<>();
private final HashMap<Player, PlayerTimerEffects> 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> 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);
}
}