diff --git a/build.gradle b/build.gradle index 769e6e1..caebdc1 100644 --- a/build.gradle +++ b/build.gradle @@ -5,9 +5,6 @@ apply plugin: 'java' group = 'net.rawmod' version = '0.1.5' -sourceCompatibility = '1.8' -targetCompatibility = '1.8' - repositories { mavenCentral() maven { diff --git a/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java b/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java index fe7701e..30bd204 100644 --- a/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java @@ -68,17 +68,17 @@ public class BeastMasterClass extends MineClassImpl { public void giveItems(Player player) { if (!player.getInventory().contains(Material.BONE)) { ItemStack itemStack = new ItemStack(Material.BONE, 1); - enchantItem(itemStack); + enchantItem(itemStack, player); player.getInventory().addItem(itemStack); } if (!player.getInventory().contains(Material.SALMON)) { ItemStack itemStack = new ItemStack(Material.SALMON, 1); - enchantItem(itemStack); + enchantItem(itemStack, player); player.getInventory().addItem(itemStack); } if (!player.getInventory().contains(Material.SADDLE)) { ItemStack itemStack = new ItemStack(Material.SADDLE, 1); - enchantItem(itemStack); + enchantItem(itemStack, player); player.getInventory().addItem(itemStack); } } diff --git a/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java b/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java index e4dd7a4..230d4cc 100644 --- a/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java @@ -92,7 +92,7 @@ public class EnderElfClass extends MineClassImpl { public void giveItems(Player player) { if (!player.getInventory().contains(Material.ENDER_PEARL)) { ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 2); - enchantItem(itemStack); + enchantItem(itemStack, player); player.getInventory().addItem(itemStack); } } diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClass.java b/src/main/java/net/rawmod/mineclass/classes/MineClass.java index 42de9e8..0e6dbe0 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClass.java @@ -23,7 +23,7 @@ public interface MineClass { boolean isItemForbidden(Material type); - void enchantItem(ItemStack itemStack); + void enchantItem(ItemStack itemStack, Player player); void giveItems(Player player); diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java index 5b37285..d2cb4c2 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java @@ -32,9 +32,10 @@ public class MineClassFactory { return INSTANCE; } - public static boolean isSoulBound(ItemStack itemStack) { + public static boolean isSoulBound(ItemStack itemStack, Player player) { if (itemStack.getItemMeta() != null && itemStack.getItemMeta().getLore() != null) { - return itemStack.getItemMeta().getLore().contains("Soulbound"); + return itemStack.getItemMeta().getLore().contains("Soulbound") + && itemStack.getItemMeta().getLore().contains(player.getName()); } return false; } @@ -47,11 +48,14 @@ public class MineClassFactory { } } - public static void setUnbreakableAndSoulbound(ItemStack itemStack) { + public static void setUnbreakableAndSoulbound(ItemStack itemStack, Player player) { if (itemStack.getItemMeta() != null) { ItemMeta itemMeta = itemStack.getItemMeta(); itemMeta.setUnbreakable(true); - itemMeta.setLore(Collections.singletonList("Soulbound")); + List loreList = new ArrayList<>(); + loreList.add("Soulbound"); + loreList.add(player.getName()); + itemMeta.setLore(loreList); itemStack.setItemMeta(itemMeta); } } diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java index c0c45ed..e56eca8 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java @@ -30,7 +30,7 @@ public abstract class MineClassImpl implements MineClass { } @Override - public void enchantItem(ItemStack itemStack) { + public void enchantItem(ItemStack itemStack, Player player) { if (getClassEnchantments().containsKey(itemStack.getType())) { getClassEnchantments() .getOrDefault(itemStack.getType(), new ArrayList<>()) @@ -38,7 +38,7 @@ public abstract class MineClassImpl implements MineClass { enchantmentIntegerPair -> itemStack.addUnsafeEnchantment( enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond())); - MineClassFactory.setUnbreakableAndSoulbound(itemStack); + MineClassFactory.setUnbreakableAndSoulbound(itemStack, player); } } diff --git a/src/main/java/net/rawmod/mineclass/commands/CommandClass.java b/src/main/java/net/rawmod/mineclass/commands/CommandClass.java index f9a5c81..7157242 100644 --- a/src/main/java/net/rawmod/mineclass/commands/CommandClass.java +++ b/src/main/java/net/rawmod/mineclass/commands/CommandClass.java @@ -40,7 +40,6 @@ public class CommandClass implements CommandExecutor { MineClassFactory.clearAllClassEffects(player); MineClassFactory.getInstance().reapplyEffectsByCode(args[0], player); MineClassFactory.getInstance().giveItemsForClassByCode(args[0], player); - MineClassFactory.getInstance().dropForbiddenItemsForClassByCode(args[0], player); MineClassFactory.getInstance().setClassCode(player, args[0]); if (!player.hasPotionEffect(PotionEffectType.SATURATION)) { player.addPotionEffect(new PotionEffect(PotionEffectType.SATURATION, 200, 9)); diff --git a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java index 9c493da..3515216 100644 --- a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java +++ b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java @@ -14,9 +14,10 @@ import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockDropItemEvent; import org.bukkit.event.entity.*; -import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.CraftItemEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; @@ -59,24 +60,62 @@ public class MineClassListeners implements Listener { } @EventHandler - public void on(EntityPickupItemEvent event) { - if (event.getEntity() instanceof Player) { - Player player = (Player) event.getEntity(); + public void on(CraftItemEvent event) { + if (event.getWhoClicked() instanceof Player) { + Player player = (Player) event.getWhoClicked(); Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - if (mineClass.isPresent()) { - if (mineClass.get().isItemForbidden(event.getItem().getItemStack().getType())) { - event.setCancelled(true); - } - mineClass.get().enchantItem(event.getItem().getItemStack()); + mineClass.ifPresent(it -> enchantItem(event)); + } + } + + @EventHandler + public void on(BlockDamageEvent event) { + Player player = event.getPlayer(); + ItemStack itemInHand = event.getItemInHand(); + applyBadEffects(player, itemInHand); + } + + @EventHandler + public void on(PlayerItemDamageEvent event) { + Player player = event.getPlayer(); + ItemStack itemInHand = event.getItem(); + applyBadEffects(player, itemInHand); + } + + private void applyBadEffects(Player player, ItemStack itemInHand) { + Optional mineClass = MineClassFactory.getInstance().getRightClass(player); + if (mineClass.isPresent() && mineClass.get().isItemForbidden(itemInHand.getType())) { + player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 200, 0)); + if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) { + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 3)); + } else { + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 200, 1)); } + player.addPotionEffect(new PotionEffect(PotionEffectType.HUNGER, 200, 9)); + player.setFoodLevel(Math.max(player.getFoodLevel() - 2, 0)); + player.setSaturation(0); + } + } + + @EventHandler + public void on(PlayerItemHeldEvent event) { + Player player = event.getPlayer(); + ItemStack itemStack = player.getInventory().getItem(event.getNewSlot()); + player.sendMessage(String.valueOf(itemStack)); + Optional mineClass = MineClassFactory.getInstance().getRightClass(player); + if (itemStack != null + && mineClass.isPresent() + && mineClass.get().isItemForbidden(itemStack.getType())) { + player.sendMessage("Warning : You are unable to use this item efficiently."); } } @EventHandler public void on(PlayerDeathEvent event) { + Player player = event.getEntity(); List itemStackList = event.getDrops().stream() - .filter(MineClassFactory::isSoulBound) + .filter(it -> MineClassFactory.isSoulBound(it, player)) .collect(Collectors.toList()); event.getDrops().removeAll(itemStackList); ClassItemPossessed.getInstance().addItems(event.getEntity().getName(), itemStackList); @@ -91,41 +130,14 @@ public class MineClassListeners implements Listener { ClassItemPossessed.getInstance().clearItems(event.getPlayer().getName()); } - @EventHandler - public void on(InventoryClickEvent event) { - if (event.getWhoClicked() instanceof Player) { - if (isForbiddenItem(event)) { - event.setCancelled(true); - return; - } - enchantItem(event); - } - } - - private boolean isForbiddenItem(InventoryClickEvent event) { + private void enchantItem(CraftItemEvent event) { Player player = (Player) event.getWhoClicked(); Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - if (mineClass.isPresent()) { - if (event.getCurrentItem() != null - && mineClass.get().isItemForbidden(event.getCurrentItem().getType())) { - return true; - } - return event.getCursor() != null - && mineClass.get().isItemForbidden(event.getCursor().getType()); + if (event.getCurrentItem() != null) { + mineClass.ifPresent(it -> it.enchantItem(event.getCurrentItem(), player)); } - return false; - } - - private void enchantItem(InventoryClickEvent event) { - Player player = (Player) event.getWhoClicked(); - Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - if (mineClass.isPresent()) { - if (event.getCurrentItem() != null && !MineClassFactory.isSoulBound(event.getCurrentItem())) { - mineClass.get().enchantItem(event.getCurrentItem()); - } - if (event.getCursor() != null && !MineClassFactory.isSoulBound(event.getCursor())) { - mineClass.get().enchantItem(event.getCursor()); - } + if (event.getCursor() != null) { + mineClass.ifPresent(it -> it.enchantItem(event.getCursor(), player)); } } @@ -182,16 +194,17 @@ public class MineClassListeners implements Listener { public void on(FoodLevelChangeEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); - if (MineClassFactory.getInstance().getClassCode(player).equals("elf")) { - int difference = player.getFoodLevel() - event.getFoodLevel(); + if (MineClassFactory.getInstance().getClassCode(player).equals("elf") + && player.getPotionEffect(PotionEffectType.HUNGER) == null) { + int difference = event.getFoodLevel() - player.getFoodLevel(); if (difference > 0) { - event.setCancelled(true); + event.setFoodLevel(player.getFoodLevel() + (difference * 2)); } } if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf")) { int difference = player.getFoodLevel() - event.getFoodLevel(); if (difference > 0) { - event.setFoodLevel(player.getFoodLevel() - (difference * 2)); + event.setFoodLevel(Math.max(player.getFoodLevel() - (difference * 2), 0)); } } } @@ -201,13 +214,14 @@ public class MineClassListeners implements Listener { public void on(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { Player player = (Player) event.getDamager(); + ItemStack itemInMainHand = player.getInventory().getItemInMainHand(); if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") - && player.getInventory().getItemInMainHand().getType().equals(Material.ENDER_PEARL)) { + && itemInMainHand.getType().equals(Material.ENDER_PEARL)) { PlayerHitCounter.getInstance().increaseHitCount(player); if (player.getAttackCooldown() == 1) { // Vampirisme - if (player.getHealth() <= 19) { - player.setHealth(player.getHealth() + 1); + if (player.getHealth() < 20) { + player.setHealth(Math.min(player.getHealth() + 1, 20)); } } if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) { @@ -219,7 +233,10 @@ public class MineClassListeners implements Listener { player.addPotionEffect(absorption); } // Damage - event.setDamage(event.getDamage() * (player.getAttackCooldown() * 10)); + event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 10), 1)); + } else if (MineClassFactory.getInstance().getClassCode(player).equals("elf") + && itemInMainHand.getType().equals(Material.BOW)) { + event.setDamage(Math.max(event.getDamage() * (player.getAttackCooldown() * 4), 1)); } } else if (event.getDamager().hasMetadata("beastMasterWolfType")) { event.getDamager().getMetadata("beastMasterWolfType").stream() @@ -251,7 +268,7 @@ public class MineClassListeners implements Listener { if (MineClassFactory.getInstance().getClassCode(player).equals("ender_elf") && event.getEntity() instanceof EnderPearl) { ItemStack itemStack = new ItemStack(Material.ENDER_PEARL, 1); - MineClassFactory.setUnbreakableAndSoulbound(itemStack); + MineClassFactory.setUnbreakableAndSoulbound(itemStack, player); player.getInventory().addItem(itemStack); } }