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 enchantItem(ItemStack itemStack, Player player);
|
||||||
|
|
||||||
|
void disenchantItem(ItemStack itemStack, Player player);
|
||||||
|
|
||||||
void giveItems(Player player);
|
void giveItems(Player player);
|
||||||
|
|
||||||
String getCode();
|
String getCode();
|
||||||
|
|||||||
@@ -33,6 +33,13 @@ public class MineClassFactory {
|
|||||||
return INSTANCE;
|
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) {
|
public static boolean isSoulBound(ItemStack itemStack, Player player) {
|
||||||
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
|
if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) {
|
||||||
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
|
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) {
|
public static void setUnbreakableAndSoulbound(ItemStack itemStack, Player player) {
|
||||||
if (itemStack.getItemMeta() != null) {
|
if (itemStack.getItemMeta() != null) {
|
||||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
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() {
|
public synchronized Set<String> getAvailableClassCodes() {
|
||||||
return availableClasses.keySet();
|
return availableClasses.keySet();
|
||||||
}
|
}
|
||||||
@@ -92,6 +124,15 @@ public class MineClassFactory {
|
|||||||
return Optional.empty();
|
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) {
|
public void reapplyEffectsByCode(String code, Player player) {
|
||||||
availableClasses.get(code).reapplyEffects(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
|
@Override
|
||||||
public void dropForbiddenItems(Player player) {
|
public void dropForbiddenItems(Player player) {
|
||||||
for (ItemStack content : player.getInventory().getContents()) {
|
for (ItemStack content : player.getInventory().getContents()) {
|
||||||
|
|||||||
@@ -8,9 +8,13 @@ import org.bukkit.command.CommandExecutor;
|
|||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class CommandClass implements CommandExecutor {
|
public class CommandClass implements CommandExecutor {
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
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 {
|
public class MineClassListeners implements Listener {
|
||||||
|
|
||||||
private final Mineclass plugin;
|
private final Mineclass plugin;
|
||||||
private final HashMap<Player, PlayerTimerEffects> playerTimerEffectsHashMap =
|
private final HashMap<Player, PlayerTimerEffects> playerTimerEffectsHashMap = new HashMap<>();
|
||||||
new HashMap<>();
|
|
||||||
|
|
||||||
public MineClassListeners(Mineclass plugin) {
|
public MineClassListeners(Mineclass plugin) {
|
||||||
this.plugin = 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.");
|
"Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command.");
|
||||||
}
|
}
|
||||||
if (!playerTimerEffectsHashMap.containsKey(player)) {
|
if (!playerTimerEffectsHashMap.containsKey(player)) {
|
||||||
PlayerTimerEffects playerTimerEffects =
|
PlayerTimerEffects playerTimerEffects = new PlayerTimerEffects(player);
|
||||||
new PlayerTimerEffects(player);
|
|
||||||
playerTimerEffectsHashMap.put(player, playerTimerEffects);
|
playerTimerEffectsHashMap.put(player, playerTimerEffects);
|
||||||
playerTimerEffects.runTaskTimer(this.plugin, 20, 20);
|
playerTimerEffects.runTaskTimer(this.plugin, 20, 20);
|
||||||
} else {
|
} else {
|
||||||
@@ -313,52 +311,62 @@ public class MineClassListeners implements Listener {
|
|||||||
public void on(PlayerInteractEvent event) {
|
public void on(PlayerInteractEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
ItemStack itemInHand = event.getItem();
|
ItemStack itemInHand = event.getItem();
|
||||||
applyBadEffects(player, itemInHand);
|
boolean effect = false;
|
||||||
if (player.isSneaking()
|
if (player.isSneaking()
|
||||||
&& event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
&& event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
||||||
&& event.useInteractedBlock().equals(Event.Result.ALLOW)
|
&& event.useInteractedBlock().equals(Event.Result.ALLOW)
|
||||||
&& MineClassFactory.getInstance().getClassCode(player).equals("beast_master")
|
&& MineClassFactory.getInstance().getClassCode(player).equals("beast_master")
|
||||||
&& event.getClickedBlock() != null
|
&& event.getClickedBlock() != null
|
||||||
&& event.getItem() != null) {
|
&& itemInHand != null) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
ItemStack itemStack = event.getItem();
|
switch (itemInHand.getType()) {
|
||||||
switch (itemStack.getType()) {
|
|
||||||
case SADDLE:
|
case SADDLE:
|
||||||
invokeHorse(event, player);
|
invokeHorse(event, player);
|
||||||
break;
|
break;
|
||||||
case BONE:
|
case BONE:
|
||||||
try {
|
try {
|
||||||
invokeWolf(event, player, itemStack);
|
invokeWolf(event, player, itemInHand);
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
player.sendMessage(e.getMessage());
|
player.sendMessage(e.getMessage());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SALMON:
|
case SALMON:
|
||||||
invokeCat(event, player, itemStack);
|
invokeCat(event, player, itemInHand);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
effect = true;
|
||||||
}
|
}
|
||||||
if (player.isSneaking()
|
if (player.isSneaking()
|
||||||
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
||||||
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
|
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
|
||||||
&& MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
|
&& MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")
|
||||||
&& event.getItem() != null
|
&& itemInHand != null
|
||||||
&& event.getItem().getType().equals(Material.ENDER_PEARL)) {
|
&& itemInHand.getType().equals(Material.ENDER_PEARL)) {
|
||||||
player.openInventory(player.getEnderChest());
|
player.openInventory(player.getEnderChest());
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
effect = true;
|
||||||
}
|
}
|
||||||
if (player.isSneaking()
|
if (player.isSneaking()
|
||||||
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
&& (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)
|
||||||
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
|
|| event.getAction().equals(Action.RIGHT_CLICK_AIR))
|
||||||
&& event.getItem() != null) {
|
&& itemInHand != null) {
|
||||||
|
System.out.println(itemInHand);
|
||||||
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
|
Optional<MineClass> mineClass = MineClassFactory.getInstance().getRightClass(player);
|
||||||
mineClass.ifPresent(
|
if (MineClassFactory.isSimpleSoulBound(itemInHand)) {
|
||||||
it -> {
|
System.out.println("Clearing");
|
||||||
it.enchantItem(event.getItem(), player);
|
MineClassFactory.clearClassItem(player, itemInHand);
|
||||||
event.setCancelled(true);
|
} 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