Add the possibility to disenchant a class item
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user