From 9095707d7740b4b030650348ff32d94b4ed37267 Mon Sep 17 00:00:00 2001 From: Raw Leenc Date: Sun, 12 Dec 2021 20:22:38 +0100 Subject: [PATCH] Implement the Naga class and update some behaviors and effects of other classes --- .../mineclass/classes/BeastMasterClass.java | 2 +- .../rawmod/mineclass/classes/DwarfClass.java | 2 +- .../rawmod/mineclass/classes/ElfClass.java | 2 +- .../mineclass/classes/EnderElfClass.java | 11 +- .../mineclass/classes/FireDwarfClass.java | 17 ++- .../rawmod/mineclass/classes/MineClass.java | 2 +- .../mineclass/classes/MineClassFactory.java | 1 + .../mineclass/classes/MineClassImpl.java | 2 +- .../rawmod/mineclass/classes/NagaClass.java | 106 ++++++++++++++++++ .../listeners/MineClassListeners.java | 22 +++- .../mineclass/utils/PlayerTimerEffects.java | 49 ++++++++ .../rawmod/mineclass/utils/PlayerUtils.java | 14 +++ 12 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 src/main/java/net/rawmod/mineclass/classes/NagaClass.java create mode 100644 src/main/java/net/rawmod/mineclass/utils/PlayerTimerEffects.java create mode 100644 src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java diff --git a/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java b/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java index e5bfa5d..06f14a9 100644 --- a/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/BeastMasterClass.java @@ -50,7 +50,7 @@ public class BeastMasterClass extends MineClassImpl { } @Override - public Map getPotionEffects() { + public Map getPotionEffects(Player player) { return potionEffects; } diff --git a/src/main/java/net/rawmod/mineclass/classes/DwarfClass.java b/src/main/java/net/rawmod/mineclass/classes/DwarfClass.java index 2c3e21f..25e7b2f 100644 --- a/src/main/java/net/rawmod/mineclass/classes/DwarfClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/DwarfClass.java @@ -79,7 +79,7 @@ public class DwarfClass extends MineClassImpl { } @Override - public Map getPotionEffects() { + public Map getPotionEffects(Player player) { return potionEffects; } diff --git a/src/main/java/net/rawmod/mineclass/classes/ElfClass.java b/src/main/java/net/rawmod/mineclass/classes/ElfClass.java index 4318541..8f499d3 100644 --- a/src/main/java/net/rawmod/mineclass/classes/ElfClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/ElfClass.java @@ -58,7 +58,7 @@ public class ElfClass extends MineClassImpl { } @Override - public Map getPotionEffects() { + public Map getPotionEffects(Player player) { return potionEffects; } diff --git a/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java b/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java index 98cf4cb..5fd4287 100644 --- a/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/EnderElfClass.java @@ -64,7 +64,7 @@ public class EnderElfClass extends MineClassImpl { } @Override - public Map getPotionEffects() { + public Map getPotionEffects(Player player) { return potionEffects; } @@ -87,9 +87,12 @@ public class EnderElfClass extends MineClassImpl { public void reapplyEffects(Player player) { super.reapplyEffects(player); if (player.getWorld().getEnvironment().equals(World.Environment.THE_END)) { - PotionEffect saturation = - new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 9, false, false); - player.addPotionEffect(saturation); + player.addPotionEffect( + new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false)); + player.addPotionEffect( + new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false)); + player.addPotionEffect( + new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 0, false, false)); } } diff --git a/src/main/java/net/rawmod/mineclass/classes/FireDwarfClass.java b/src/main/java/net/rawmod/mineclass/classes/FireDwarfClass.java index 52775a2..66b4d4b 100644 --- a/src/main/java/net/rawmod/mineclass/classes/FireDwarfClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/FireDwarfClass.java @@ -2,8 +2,10 @@ package net.rawmod.mineclass.classes; import net.rawmod.mineclass.utils.Pair; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.*; @@ -88,13 +90,26 @@ public class FireDwarfClass extends MineClassImpl { Material.FLINT_AND_STEEL, new ArrayList>())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + @Override + public void reapplyEffects(Player player) { + super.reapplyEffects(player); + if (player.getWorld().getEnvironment().equals(World.Environment.NETHER)) { + player.addPotionEffect( + new PotionEffect(PotionEffectType.SATURATION, Integer.MAX_VALUE, 0, false, false)); + player.addPotionEffect( + new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 0, false, false)); + player.addPotionEffect( + new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, Integer.MAX_VALUE, 0, false, false)); + } + } + @Override public Set getForbiddenItems() { return forbiddenItems; } @Override - public Map getPotionEffects() { + public Map getPotionEffects(Player player) { return potionEffects; } diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClass.java b/src/main/java/net/rawmod/mineclass/classes/MineClass.java index d2bd4bb..c94b87a 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClass.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClass.java @@ -15,7 +15,7 @@ public interface MineClass { Set getForbiddenItems(); - Map getPotionEffects(); + Map getPotionEffects(Player player); Map>> getClassEnchantments(); diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java index 4db2c7c..eadb28a 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassFactory.java @@ -21,6 +21,7 @@ public class MineClassFactory { availableClasses.put("fire_dwarf", new FireDwarfClass()); availableClasses.put("ender_elf", new EnderElfClass()); availableClasses.put("beast_master", new BeastMasterClass()); + availableClasses.put("naga", new NagaClass()); } /** Point d'accès pour l'instance unique du singleton */ diff --git a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java index e56eca8..f4c6d8b 100644 --- a/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java +++ b/src/main/java/net/rawmod/mineclass/classes/MineClassImpl.java @@ -12,7 +12,7 @@ public abstract class MineClassImpl implements MineClass { @Override public void reapplyEffects(Player player) { MineClassFactory.clearAllClassEffects(player); - getPotionEffects() + getPotionEffects(player) .forEach( (key, value) -> { if (player.hasPotionEffect(key)) { diff --git a/src/main/java/net/rawmod/mineclass/classes/NagaClass.java b/src/main/java/net/rawmod/mineclass/classes/NagaClass.java new file mode 100644 index 0000000..d8042ff --- /dev/null +++ b/src/main/java/net/rawmod/mineclass/classes/NagaClass.java @@ -0,0 +1,106 @@ +package net.rawmod.mineclass.classes; + +import net.rawmod.mineclass.utils.Pair; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class NagaClass 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_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); + } + }; + + private static final Map potionEffectsInWater = + Stream.of( + new Object[][] { + {PotionEffectType.WATER_BREATHING, 1}, + {PotionEffectType.HEALTH_BOOST, 2}, + {PotionEffectType.CONDUIT_POWER, 1}, + {PotionEffectType.DOLPHINS_GRACE, 3}, + {PotionEffectType.SATURATION, 1}, + {PotionEffectType.NIGHT_VISION, 1}, + {PotionEffectType.DAMAGE_RESISTANCE, 2}, + {PotionEffectType.INCREASE_DAMAGE, 2}, + {PotionEffectType.FAST_DIGGING, 10}, + }) + .collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1])); + + private static final Map potionEffectsOnEarth = + Stream.of( + new Object[][] { + {PotionEffectType.SLOW, 4}, + {PotionEffectType.SLOW_DIGGING, 1}, + {PotionEffectType.HUNGER, 10}, + {PotionEffectType.WEAKNESS, 1}, + }) + .collect(Collectors.toMap(data -> (PotionEffectType) data[0], data -> (Integer) data[1])); + + private static final Map>> classEnchantments = + Stream.of( + new AbstractMap.SimpleEntry<>( + Material.TRIDENT, + Arrays.asList( + new Pair<>(Enchantment.LOYALTY, 3), + new Pair<>(Enchantment.CHANNELING, 1), + new Pair<>(Enchantment.IMPALING, 5)))) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + @Override + public Set getForbiddenItems() { + return forbiddenItems; + } + + @Override + public Map getPotionEffects(Player player) { + return player.isInWater() ? potionEffectsInWater : potionEffectsOnEarth; + } + + @Override + public Map>> getClassEnchantments() { + return classEnchantments; + } + + @Override + public String getCode() { + return "naga"; + } + + @Override + public String getName() { + return "Naga"; + } + + @Override + public void giveItems(Player player) { + if (!player.getInventory().contains(Material.TRIDENT)) { + ItemStack itemStack = new ItemStack(Material.TRIDENT, 1); + enchantItem(itemStack, player); + player.getInventory().addItem(itemStack); + } + } +} diff --git a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java index cc6c415..04d875c 100644 --- a/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java +++ b/src/main/java/net/rawmod/mineclass/listeners/MineClassListeners.java @@ -26,6 +26,7 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import java.util.HashMap; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -34,6 +35,8 @@ import java.util.stream.Collectors; public class MineClassListeners implements Listener { private final Mineclass plugin; + private final HashMap playerTimerEffectsHashMap = + new HashMap<>(); public MineClassListeners(Mineclass plugin) { this.plugin = plugin; @@ -46,11 +49,26 @@ 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, your class is : %s.", mineClass.get().getName())); } else { player.sendMessage( "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); + playerTimerEffectsHashMap.put(player, playerTimerEffects); + playerTimerEffects.runTaskTimer(this.plugin, 20, 20); + } else { + playerTimerEffectsHashMap.get(player).runTaskTimer(this.plugin, 20, 20); + } + } + + public void on(PlayerQuitEvent event) { + Player player = event.getPlayer(); + if (playerTimerEffectsHashMap.containsKey(player)) { + playerTimerEffectsHashMap.get(player).cancel(); + } } @EventHandler @@ -230,7 +248,7 @@ public class MineClassListeners implements Listener { if (player.getAttackCooldown() == 1) { // Vampirisme if (player.getHealth() < 20) { - player.setHealth(Math.min(player.getHealth() + 1, 20)); + PlayerUtils.heal(player, 1); } } if (PlayerHitCounter.getInstance().getHitCounter(player) == 15) { diff --git a/src/main/java/net/rawmod/mineclass/utils/PlayerTimerEffects.java b/src/main/java/net/rawmod/mineclass/utils/PlayerTimerEffects.java new file mode 100644 index 0000000..b257c26 --- /dev/null +++ b/src/main/java/net/rawmod/mineclass/utils/PlayerTimerEffects.java @@ -0,0 +1,49 @@ +package net.rawmod.mineclass.utils; + +import net.rawmod.mineclass.classes.MineClass; +import net.rawmod.mineclass.classes.MineClassFactory; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Optional; + +public class PlayerTimerEffects extends BukkitRunnable { + + private final Player player; + private boolean inWater; + + public PlayerTimerEffects(Player player) { + this.player = player; + this.inWater = player.isInWater(); + } + + @Override + public void run() { + Optional mineClass = MineClassFactory.getInstance().getRightClass(player); + if (mineClass.isPresent() && mineClass.get().getCode().equals("naga")) { + if (!player.isInWater()) { + player.damage(1); + + } + if (player.isInWater() != inWater) { + inWater = player.isInWater(); + mineClass.get().reapplyEffects(player); + } + } + if (mineClass.isPresent() && mineClass.get().getCode().equals("fire_dwarf")) { + if (player.getFireTicks() > 0) { + PlayerUtils.heal(player, 2); + player.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 40, 3)); + player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE, 40, 1)); + player.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 40, 1)); + } + if (player.isInWater()) { + player.damage(1); + } + } + } +} diff --git a/src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java b/src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java new file mode 100644 index 0000000..b7433c4 --- /dev/null +++ b/src/main/java/net/rawmod/mineclass/utils/PlayerUtils.java @@ -0,0 +1,14 @@ +package net.rawmod.mineclass.utils; + +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeInstance; +import org.bukkit.entity.Player; + +public class PlayerUtils { + public static void heal(Player player, double amount) { + AttributeInstance maxHealh = player.getAttribute(Attribute.GENERIC_MAX_HEALTH); + if (maxHealh != null) { + player.setHealth(Math.min(player.getHealth() + amount, maxHealh.getValue())); + } + } +}