From 3afa2d1f2a5826c7d278cf71519b939488efa48b Mon Sep 17 00:00:00 2001 From: Barazok Date: Sat, 24 Oct 2020 17:16:03 +0200 Subject: [PATCH] Refactor code and implement ender elf --- .../java/net/babamod/mineclass/Mineclass.java | 15 +++- .../babamod/mineclass/classes/ElfClass.java | 1 + .../mineclass/classes/EnderElfClass.java | 77 ++++++++++++++++ .../babamod/mineclass/classes/MineClass.java | 2 - .../mineclass/classes/MineClassFactory.java | 5 +- .../mineclass/classes/MineClassImpl.java | 23 +++-- .../listeners/MineClassListeners.java | 88 +++++++++++++++---- .../mineclass/utils/AppliedStatus.java | 4 - .../mineclass/utils/EndCooldownTask.java | 18 ++++ .../mineclass/utils/PlayerHitCounter.java | 39 ++++++++ .../utils/PlayerLaunchedEnderPearl.java | 40 +++++++++ 11 files changed, 268 insertions(+), 44 deletions(-) create mode 100644 src/main/java/net/babamod/mineclass/classes/EnderElfClass.java create mode 100644 src/main/java/net/babamod/mineclass/utils/EndCooldownTask.java create mode 100644 src/main/java/net/babamod/mineclass/utils/PlayerHitCounter.java create mode 100644 src/main/java/net/babamod/mineclass/utils/PlayerLaunchedEnderPearl.java diff --git a/src/main/java/net/babamod/mineclass/Mineclass.java b/src/main/java/net/babamod/mineclass/Mineclass.java index d236146..8c600bf 100644 --- a/src/main/java/net/babamod/mineclass/Mineclass.java +++ b/src/main/java/net/babamod/mineclass/Mineclass.java @@ -4,6 +4,7 @@ import net.babamod.mineclass.classes.MineClassFactory; import net.babamod.mineclass.commands.CommandClass; import net.babamod.mineclass.listeners.MineClassListeners; import net.babamod.mineclass.utils.AppliedStatus; +import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; import org.bukkit.event.Listener; import org.bukkit.plugin.java.JavaPlugin; @@ -19,14 +20,20 @@ public final class Mineclass extends JavaPlugin implements Listener { new MineClassListeners(this); PluginCommand pluginCommand = this.getCommand("class"); if (pluginCommand != null) { - List arguments = new ArrayList<>(MineClassFactory.getInstance().getAvailableClassCodes()); + List arguments = + new ArrayList<>(MineClassFactory.getInstance().getAvailableClassCodes()); arguments.add("clear"); arguments.add("whoami"); - pluginCommand.setTabCompleter( - (sender, command, alias, args) -> - arguments); + pluginCommand.setTabCompleter((sender, command, alias, args) -> arguments); pluginCommand.setExecutor(new CommandClass()); } + System.out.println(Bukkit.getOnlinePlayers()); + Bukkit.getOnlinePlayers() + .forEach( + player -> + MineClassFactory.getInstance() + .getRightClass(player) + .ifPresent(aClass -> aClass.reapplyEffects(player))); } @Override diff --git a/src/main/java/net/babamod/mineclass/classes/ElfClass.java b/src/main/java/net/babamod/mineclass/classes/ElfClass.java index c094e72..7b43133 100644 --- a/src/main/java/net/babamod/mineclass/classes/ElfClass.java +++ b/src/main/java/net/babamod/mineclass/classes/ElfClass.java @@ -28,6 +28,7 @@ public class ElfClass extends MineClassImpl { add(Material.NETHERITE_SHOVEL); add(Material.CROSSBOW); add(Material.TRIDENT); + add(Material.ENDER_PEARL); } }; diff --git a/src/main/java/net/babamod/mineclass/classes/EnderElfClass.java b/src/main/java/net/babamod/mineclass/classes/EnderElfClass.java new file mode 100644 index 0000000..ab0d009 --- /dev/null +++ b/src/main/java/net/babamod/mineclass/classes/EnderElfClass.java @@ -0,0 +1,77 @@ +package net.babamod.mineclass.classes; + +import net.babamod.mineclass.utils.Pair; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class EnderElfClass extends MineClassImpl { + + private static final Set forbiddenItems = + new HashSet() { + { + add(Material.DIAMOND_SWORD); + add(Material.GOLDEN_SWORD); + add(Material.IRON_SWORD); + add(Material.NETHERITE_SWORD); + add(Material.DIAMOND_PICKAXE); + add(Material.GOLDEN_PICKAXE); + add(Material.IRON_PICKAXE); + add(Material.NETHERITE_PICKAXE); + add(Material.DIAMOND_SHOVEL); + add(Material.GOLDEN_SHOVEL); + add(Material.IRON_SHOVEL); + add(Material.NETHERITE_SHOVEL); + add(Material.DIAMOND_HOE); + add(Material.GOLDEN_HOE); + add(Material.IRON_HOE); + add(Material.NETHERITE_HOE); + add(Material.DIAMOND_AXE); + add(Material.GOLDEN_AXE); + add(Material.IRON_AXE); + add(Material.NETHERITE_AXE); + add(Material.CROSSBOW); + add(Material.BOW); + add(Material.TRIDENT); + } + }; + + private static final Map potionEffects = + Stream.of( + new Object[][] { + {PotionEffectType.HUNGER, 10}, + {PotionEffectType.NIGHT_VISION, 1}, + {PotionEffectType.ABSORPTION, 1}, + }) + .collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1])); + + private static final Map>> classEnchantments = + Stream.of( + new AbstractMap.SimpleEntry<>( + Material.ENDER_PEARL, new ArrayList>())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + @Override + public Set getForbiddenItems() { + return forbiddenItems; + } + + @Override + public Map getPotionEffects() { + return potionEffects; + } + + @Override + public Map>> getClassEnchantments() { + return classEnchantments; + } + + @Override + public String getCode() { + return "ender_elf"; + } +} diff --git a/src/main/java/net/babamod/mineclass/classes/MineClass.java b/src/main/java/net/babamod/mineclass/classes/MineClass.java index 89a7230..f5c6fbf 100644 --- a/src/main/java/net/babamod/mineclass/classes/MineClass.java +++ b/src/main/java/net/babamod/mineclass/classes/MineClass.java @@ -25,8 +25,6 @@ public interface MineClass { boolean isItemForbidden(Material type); - boolean isItemEnchantable(Material type); - void enchantItem(ItemStack itemStack); String getCode(); diff --git a/src/main/java/net/babamod/mineclass/classes/MineClassFactory.java b/src/main/java/net/babamod/mineclass/classes/MineClassFactory.java index ce33091..fa64dc8 100644 --- a/src/main/java/net/babamod/mineclass/classes/MineClassFactory.java +++ b/src/main/java/net/babamod/mineclass/classes/MineClassFactory.java @@ -18,6 +18,7 @@ public class MineClassFactory { availableClasses.put("dwarf", new DwarfClass()); availableClasses.put("elf", new ElfClass()); availableClasses.put("fire_dwarf", new FireDwarfClass()); + availableClasses.put("ender_elf", new EnderElfClass()); } /** Point d'accès pour l'instance unique du singleton */ @@ -29,10 +30,6 @@ public class MineClassFactory { return INSTANCE; } - public synchronized Collection getAvailableClasses() { - return availableClasses.values(); - } - public synchronized Set getAvailableClassCodes() { return availableClasses.keySet(); } diff --git a/src/main/java/net/babamod/mineclass/classes/MineClassImpl.java b/src/main/java/net/babamod/mineclass/classes/MineClassImpl.java index 8f3a107..20d5f87 100644 --- a/src/main/java/net/babamod/mineclass/classes/MineClassImpl.java +++ b/src/main/java/net/babamod/mineclass/classes/MineClassImpl.java @@ -1,5 +1,6 @@ package net.babamod.mineclass.classes; +import net.babamod.mineclass.utils.AppliedStatus; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -29,6 +30,7 @@ public abstract class MineClassImpl implements MineClass { player.addPotionEffect( new PotionEffect(key, Integer.MAX_VALUE, value - 1, false, false)); }); + AppliedStatus.getInstance().setStatus(player.getName(), getCode()); } @Override @@ -36,19 +38,16 @@ public abstract class MineClassImpl implements MineClass { return getForbiddenItems().contains(type); } - @Override - public boolean isItemEnchantable(Material type) { - return getClassEnchantments().containsKey(type); - } - @Override public void enchantItem(ItemStack itemStack) { - getClassEnchantments() - .getOrDefault(itemStack.getType(), new ArrayList<>()) - .forEach( - enchantmentIntegerPair -> - itemStack.addUnsafeEnchantment( - enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond())); - MineClassFactory.setUnbreakableAndSoulbound(itemStack); + if (getClassEnchantments().containsKey(itemStack.getType())) { + getClassEnchantments() + .getOrDefault(itemStack.getType(), new ArrayList<>()) + .forEach( + enchantmentIntegerPair -> + itemStack.addUnsafeEnchantment( + enchantmentIntegerPair.getFirst(), enchantmentIntegerPair.getSecond())); + MineClassFactory.setUnbreakableAndSoulbound(itemStack); + } } } diff --git a/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java b/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java index 6595445..5f86032 100644 --- a/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java +++ b/src/main/java/net/babamod/mineclass/listeners/MineClassListeners.java @@ -3,24 +3,28 @@ package net.babamod.mineclass.listeners; import net.babamod.mineclass.Mineclass; import net.babamod.mineclass.classes.MineClass; import net.babamod.mineclass.classes.MineClassFactory; -import net.babamod.mineclass.utils.AppliedStatus; -import net.babamod.mineclass.utils.ApplyClassStatusTask; -import net.babamod.mineclass.utils.ClassItemPossessed; -import net.babamod.mineclass.utils.SmeltingEngine; +import net.babamod.mineclass.utils.*; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.AbstractArrow; +import org.bukkit.entity.EnderPearl; import org.bukkit.entity.Player; +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.BlockDropItemEvent; import org.bukkit.event.entity.*; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; import java.util.List; import java.util.Optional; @@ -41,8 +45,7 @@ public class MineClassListeners implements Listener { Optional mineClass = MineClassFactory.getInstance().getRightClass(player); if (mineClass.isPresent()) { mineClass.get().reapplyEffects(player); - player.sendMessage( - String.format("Reminder : You are a %s.", mineClass.get().getCode())); + player.sendMessage(String.format("Reminder : You are a %s.", mineClass.get().getCode())); } else { player.sendMessage( "Hello ! The amazing MineClass mod is available on this server ! You can pick a class with the /class command."); @@ -52,9 +55,7 @@ public class MineClassListeners implements Listener { @EventHandler public void on(PlayerItemConsumeEvent event) { if (event.getItem().getType().equals(Material.MILK_BUCKET)) { - if (AppliedStatus.getInstance().hasAClass(event.getPlayer().getName())) { - new ApplyClassStatusTask(event.getPlayer()).runTaskLater(this.plugin, 10); - } + new ApplyClassStatusTask(event.getPlayer()).runTaskLater(this.plugin, 10); } } @@ -67,9 +68,7 @@ public class MineClassListeners implements Listener { if (mineClass.get().isItemForbidden(event.getItem().getItemStack().getType())) { event.setCancelled(true); } - if (mineClass.get().isItemEnchantable(event.getItem().getItemStack().getType())) { - mineClass.get().enchantItem(event.getItem().getItemStack()); - } + mineClass.get().enchantItem(event.getItem().getItemStack()); } } } @@ -120,7 +119,7 @@ public class MineClassListeners implements Listener { private boolean isForbiddenItem(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - if (mineClass.isPresent() && AppliedStatus.getInstance().hasAClass(player.getName())) { + if (mineClass.isPresent()) { if (event.getCurrentItem() != null && mineClass.get().isItemForbidden(event.getCurrentItem().getType())) { return true; @@ -134,7 +133,7 @@ public class MineClassListeners implements Listener { private void enchantItem(InventoryClickEvent event) { Player player = (Player) event.getWhoClicked(); Optional mineClass = MineClassFactory.getInstance().getRightClass(player); - if (mineClass.isPresent() && AppliedStatus.getInstance().hasAClass(player.getName())) { + if (mineClass.isPresent()) { if (event.getCurrentItem() != null && !MineClassFactory.isSoulBound(event.getCurrentItem())) { mineClass.get().enchantItem(event.getCurrentItem()); } @@ -151,9 +150,10 @@ public class MineClassListeners implements Listener { event .getItems() .forEach( - item -> SmeltingEngine.getInstance() - .smelt(player, event.getBlock().getLocation(), item.getItemStack()) - .ifPresent(item::setItemStack)); + item -> + SmeltingEngine.getInstance() + .smelt(player, event.getBlock().getLocation(), item.getItemStack()) + .ifPresent(item::setItemStack)); } } @@ -180,7 +180,8 @@ public class MineClassListeners implements Listener { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); if (event.getCause().equals(EntityDamageEvent.DamageCause.FALL) - && AppliedStatus.getInstance().getStatus(player.getName()).equals("elf")) { + && (AppliedStatus.getInstance().getStatus(player.getName()).equals("elf") + || AppliedStatus.getInstance().getStatus(player.getName()).equals("ender_elf"))) { event.setCancelled(true); } } @@ -195,4 +196,55 @@ public class MineClassListeners implements Listener { } } } + + @EventHandler + public void on(EntityDamageByEntityEvent event) { + if (event.getDamager() instanceof Player) { + Player player = (Player) event.getDamager(); + if (AppliedStatus.getInstance().getStatus(player.getName()).equals("ender_elf") + && player.getInventory().getItemInMainHand().getType().equals(Material.ENDER_PEARL)) { + PlayerHitCounter.getInstance().increaseHitCount(player); + if (player.getAttackCooldown() == 1) { + // Vampirisme + if (player.getHealth() <= 19) { + player.setHealth(player.getHealth() + 1); + } + } + if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) { + // Absorption + PlayerHitCounter.getInstance().resetHitCounter(player); + PotionEffect absorption = + new PotionEffect(PotionEffectType.ABSORPTION, Integer.MAX_VALUE, 0); + player.removePotionEffect(PotionEffectType.ABSORPTION); + player.addPotionEffect(absorption); + } + // Damage + event.setDamage(event.getDamage() * (player.getAttackCooldown() * 10)); + } + } + } + + @EventHandler + public void on(PlayerInteractEvent event) { + Player player = event.getPlayer(); + if (AppliedStatus.getInstance().getStatus(player.getName()).equals("ender_elf") + && event.getItem() != null + && event.getItem().getType().equals(Material.ENDER_PEARL)) { + if (event.getAction().equals(Action.RIGHT_CLICK_AIR) + || event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + if (!PlayerLaunchedEnderPearl.getInstance().getCooldown(player)) { + PlayerLaunchedEnderPearl.getInstance().setCooldown(player, this.plugin); + player.launchProjectile(EnderPearl.class); + } + event.setCancelled(true); + } + } + } + + @EventHandler + public void on(CreatureSpawnEvent event) { + if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.ENDER_PEARL)) { + event.setCancelled(true); + } + } } diff --git a/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java b/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java index 10c9250..8b943de 100644 --- a/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java +++ b/src/main/java/net/babamod/mineclass/utils/AppliedStatus.java @@ -32,10 +32,6 @@ public class AppliedStatus implements Serializable { return appliedStatus.getOrDefault(playerName, "none"); } - public synchronized boolean hasAClass(String playerName) { - return appliedStatus.getOrDefault(playerName, null) != null; - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/net/babamod/mineclass/utils/EndCooldownTask.java b/src/main/java/net/babamod/mineclass/utils/EndCooldownTask.java new file mode 100644 index 0000000..0c498a4 --- /dev/null +++ b/src/main/java/net/babamod/mineclass/utils/EndCooldownTask.java @@ -0,0 +1,18 @@ +package net.babamod.mineclass.utils; + +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class EndCooldownTask extends BukkitRunnable { + + private final Player player; + + public EndCooldownTask(Player player) { + this.player = player; + } + + @Override + public void run() { + PlayerLaunchedEnderPearl.getInstance().resetCooldown(player); + } +} diff --git a/src/main/java/net/babamod/mineclass/utils/PlayerHitCounter.java b/src/main/java/net/babamod/mineclass/utils/PlayerHitCounter.java new file mode 100644 index 0000000..2525d31 --- /dev/null +++ b/src/main/java/net/babamod/mineclass/utils/PlayerHitCounter.java @@ -0,0 +1,39 @@ +package net.babamod.mineclass.utils; + +import org.bukkit.entity.Player; + +import java.util.HashMap; + +public class PlayerHitCounter { + /** Instance unique pré-initialisée */ + private static PlayerHitCounter INSTANCE; + + private final HashMap byPlayerCounter; + + /** Constructeur privé */ + private PlayerHitCounter() { + byPlayerCounter = new HashMap<>(); + } + + /** Point d'accès pour l'instance unique du singleton */ + public static synchronized PlayerHitCounter getInstance() { + if (INSTANCE == null) { + INSTANCE = new PlayerHitCounter(); + } + + return INSTANCE; + } + + public synchronized void increaseHitCount(Player player) { + Integer counter = byPlayerCounter.getOrDefault(player.getName(), 0); + byPlayerCounter.put(player.getName(), counter+1); + } + + public synchronized void resetHitCounter(Player player) { + byPlayerCounter.put(player.getName(), 0); + } + + public synchronized Integer getHitCounter(Player player) { + return byPlayerCounter.getOrDefault(player.getName(), 0); + } +} diff --git a/src/main/java/net/babamod/mineclass/utils/PlayerLaunchedEnderPearl.java b/src/main/java/net/babamod/mineclass/utils/PlayerLaunchedEnderPearl.java new file mode 100644 index 0000000..7aef7ed --- /dev/null +++ b/src/main/java/net/babamod/mineclass/utils/PlayerLaunchedEnderPearl.java @@ -0,0 +1,40 @@ +package net.babamod.mineclass.utils; + +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.util.HashMap; + +public class PlayerLaunchedEnderPearl { + /** Instance unique pré-initialisée */ + private static PlayerLaunchedEnderPearl INSTANCE; + + private final HashMap playerLaunchedEnderPearl; + + /** Constructeur privé */ + private PlayerLaunchedEnderPearl() { + playerLaunchedEnderPearl = new HashMap<>(); + } + + /** Point d'accès pour l'instance unique du singleton */ + public static synchronized PlayerLaunchedEnderPearl getInstance() { + if (INSTANCE == null) { + INSTANCE = new PlayerLaunchedEnderPearl(); + } + + return INSTANCE; + } + + public void setCooldown(Player player, Plugin plugin) { + playerLaunchedEnderPearl.put(player.getName(), true); + new EndCooldownTask(player).runTaskLater(plugin, 20); + } + + public void resetCooldown(Player player) { + playerLaunchedEnderPearl.put(player.getName(), false); + } + + public boolean getCooldown(Player player) { + return playerLaunchedEnderPearl.getOrDefault(player.getName(), false); + } +}