From 762e41d1a97dd790aa56f076b1abf7b9f2599a19 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 31 Aug 2019 22:03:58 +0200 Subject: [PATCH] damage api refactor to add support for MM skill damage --- .../Indyuce/mmoitems/api/AttackResult.java | 13 ++++++- .../mmoitems/comp/RealDualWieldHook.java | 10 ++--- .../mmoitems/comp/mmocore/MMOCoreHook.java | 21 +++++++--- .../comp/mmocore/MMOItemsDamageHandler.java | 5 +-- .../mmoitems/comp/rpg/BattleLevelsHook.java | 6 --- .../mmoitems/comp/rpg/DefaultHook.java | 6 --- .../Indyuce/mmoitems/comp/rpg/HeroesHook.java | 27 +++++++++++-- .../Indyuce/mmoitems/comp/rpg/McMMOHook.java | 6 --- .../Indyuce/mmoitems/comp/rpg/McRPGHook.java | 6 --- .../Indyuce/mmoitems/comp/rpg/RPGHandler.java | 4 -- .../comp/rpg/RPGPlayerLevelingHook.java | 7 ---- .../mmoitems/comp/rpg/SkillAPIHook.java | 6 --- .../Indyuce/mmoitems/comp/rpg/SkillsHook.java | 6 --- .../comp/rpg/damage/DamageHandler.java | 9 +++++ .../mmoitems/comp/rpg/damage/DamageInfo.java | 37 ++++++++++++++++++ .../Indyuce/mmoitems/listener/ItemUse.java | 8 ++-- .../mmoitems/listener/PlayerListener.java | 26 +++++++------ .../mmoitems/manager/DamageManager.java | 38 ++++++++++++++----- 18 files changed, 148 insertions(+), 93 deletions(-) create mode 100644 src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageHandler.java create mode 100644 src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageInfo.java diff --git a/src/main/java/net/Indyuce/mmoitems/api/AttackResult.java b/src/main/java/net/Indyuce/mmoitems/api/AttackResult.java index 73bb896d..8b82f5a2 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/AttackResult.java +++ b/src/main/java/net/Indyuce/mmoitems/api/AttackResult.java @@ -16,6 +16,7 @@ import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.Ability.CastingMode; import net.Indyuce.mmoitems.api.item.NBTItem; import net.Indyuce.mmoitems.api.player.PlayerStats.TemporaryStats; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageInfo; import net.Indyuce.mmoitems.stat.type.ItemStat; public class AttackResult { @@ -37,13 +38,17 @@ public class AttackResult { } public AttackResult(boolean successful, double damage, DamageType... types) { - Validate.isTrue(types.length > 0, "Attack must have at least one damage type!"); + this(successful, damage, Arrays.asList(types)); + } + + public AttackResult(boolean successful, double damage, List types) { + Validate.isTrue(types.size() > 0, "Attack must have at least one damage type!"); this.successful = successful; this.initial = damage; this.damage = damage; - this.damageTypes = Arrays.asList(types); + this.damageTypes = types; } public AttackResult(AttackResult result) { @@ -162,6 +167,10 @@ public class AttackResult { return this; } + public DamageInfo toDamageInfo() { + return new DamageInfo(damage, damageTypes); + } + public enum DamageType { /* diff --git a/src/main/java/net/Indyuce/mmoitems/comp/RealDualWieldHook.java b/src/main/java/net/Indyuce/mmoitems/comp/RealDualWieldHook.java index 4fc4cf3f..000e7158 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/RealDualWieldHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/RealDualWieldHook.java @@ -11,27 +11,23 @@ import com.evill4mer.RealDualWield.Api.PlayerDamageEntityWithOffhandEvent; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.AttackResult; -import net.Indyuce.mmoitems.api.TypeSet; import net.Indyuce.mmoitems.api.AttackResult.DamageType; +import net.Indyuce.mmoitems.api.TypeSet; import net.Indyuce.mmoitems.api.interaction.weapon.Weapon; import net.Indyuce.mmoitems.api.item.NBTItem; import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.PlayerStats.TemporaryStats; public class RealDualWieldHook implements Listener { - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void a(PlayerDamageEntityWithOffhandEvent event) { // check for npc // safety checks - if (event.getEntity().hasMetadata("NPC") || event.isCancelled() || !(event.getEntity() instanceof LivingEntity) || event.getDamage() == 0) + if (event.getEntity().hasMetadata("NPC") || !(event.getEntity() instanceof LivingEntity) || event.getDamage() == 0) return; - // custom damage check LivingEntity target = (LivingEntity) event.getEntity(); - if (MMOItems.plugin.getDamage().isDamaged(target) || !MMOItems.plugin.getRPG().canBeDamaged(target)) - return; - Player player = (Player) event.getPlayer(); TemporaryStats stats = null; diff --git a/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOCoreHook.java b/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOCoreHook.java index 999926f0..b2d95718 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOCoreHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOCoreHook.java @@ -1,5 +1,7 @@ package net.Indyuce.mmoitems.comp.mmocore; +import java.util.stream.Collectors; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -7,7 +9,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.inventory.ItemStack; - import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent; import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent; @@ -15,14 +16,17 @@ import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; import net.Indyuce.mmocore.api.player.stats.StatType; import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.player.RPGPlayer; import net.Indyuce.mmoitems.comp.mmocore.stat.Required_Attribute; import net.Indyuce.mmoitems.comp.rpg.RPGHandler; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageHandler; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageInfo; import net.Indyuce.mmoitems.stat.type.DoubleStat; import net.Indyuce.mmoitems.stat.type.ItemStat; import net.Indyuce.mmoitems.version.VersionMaterial; -public class MMOCoreHook implements RPGHandler, Listener { +public class MMOCoreHook implements RPGHandler, Listener, DamageHandler { private final ItemStat manaRegen = new DoubleStat(VersionMaterial.LAPIS_LAZULI.toItem(), "Mana Regeneration", new String[] { "Increases mana regen." }, "mana-regen"); private final ItemStat maxStamina = new DoubleStat(VersionMaterial.LIGHT_BLUE_DYE.toItem(), "Max Stamina", new String[] { "Adds stamina to your max stamina bar." }, "max-stamina"); @@ -40,7 +44,8 @@ public class MMOCoreHook implements RPGHandler, Listener { /* * register custom damage */ - MMOCore.plugin.damage.registerHandler(new MMOCoreDamageHandler()); + MMOCore.plugin.damage.registerHandler(new MMOItemsDamageHandler()); + MMOItems.plugin.getDamage().registerHandler(this); MMOItems.plugin.getStats().register("MANA_REGENERATION", manaRegen); MMOItems.plugin.getStats().register("MAX_STAMINA", maxStamina); @@ -57,8 +62,14 @@ public class MMOCoreHook implements RPGHandler, Listener { } @Override - public boolean canBeDamaged(Entity entity) { - return !MMOCore.plugin.damage.hasDamage(entity); + public boolean hasDamage(Entity entity) { + return MMOCore.plugin.damage.hasDamage(entity); + } + + @Override + public DamageInfo getDamage(Entity entity) { + net.Indyuce.mmocore.comp.rpg.damage.DamageInfo info = MMOCore.plugin.damage.getDamage(entity); + return new DamageInfo(info.getValue(), info.getTypes().stream().map((type) -> DamageType.valueOf(type.name())).collect(Collectors.toList())); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOItemsDamageHandler.java b/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOItemsDamageHandler.java index 03fbc691..30433c1b 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOItemsDamageHandler.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/mmocore/MMOItemsDamageHandler.java @@ -8,14 +8,13 @@ import net.Indyuce.mmocore.comp.rpg.damage.DamageHandler; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo; import net.Indyuce.mmocore.comp.rpg.damage.DamageInfo.DamageType; import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.AttackResult; public class MMOItemsDamageHandler implements DamageHandler { @Override public DamageInfo getDamage(Entity entity) { - AttackResult result = MMOItems.plugin.getDamage().getDamage(entity); - return new DamageInfo(result.getDamage(), result.getTypes().stream().map((type) -> DamageType.valueOf(type.name())).collect(Collectors.toSet())); + net.Indyuce.mmoitems.comp.rpg.damage.DamageInfo result = MMOItems.plugin.getDamage().getDamage(entity); + return new DamageInfo(result.getValue(), result.getTypes().stream().map((type) -> DamageType.valueOf(type.name())).collect(Collectors.toSet())); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/BattleLevelsHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/BattleLevelsHook.java index 0b5919f0..56e359ce 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/BattleLevelsHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/BattleLevelsHook.java @@ -1,7 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -30,11 +29,6 @@ public class BattleLevelsHook implements RPGHandler, Listener { public void refreshStats(PlayerData data) { } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - public class BattleLevelsPlayer extends RPGPlayer { public BattleLevelsPlayer(PlayerData playerData) { super(playerData); diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/DefaultHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/DefaultHook.java index a8821998..abe526a0 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/DefaultHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/DefaultHook.java @@ -1,7 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerLevelChangeEvent; @@ -15,11 +14,6 @@ public class DefaultHook implements RPGHandler, Listener { Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin); } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - @Override public void refreshStats(PlayerData data) { } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java index 494f5b67..11db4043 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/HeroesHook.java @@ -1,5 +1,9 @@ package net.Indyuce.mmoitems.comp.rpg; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -7,24 +11,41 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import com.herocraftonline.heroes.Heroes; +import com.herocraftonline.heroes.api.SkillUseInfo; import com.herocraftonline.heroes.api.events.HeroChangeLevelEvent; import com.herocraftonline.heroes.api.events.SkillDamageEvent; import com.herocraftonline.heroes.characters.Hero; import com.herocraftonline.heroes.characters.skill.SkillType; import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.RPGPlayer; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageHandler; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageInfo; import net.Indyuce.mmoitems.stat.type.ItemStat; -public class HeroesHook implements RPGHandler, Listener { +public class HeroesHook implements RPGHandler, Listener, DamageHandler { + private final Map damages = new HashMap<>(); + public HeroesHook() { Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin); + MMOItems.plugin.getDamage().registerHandler(this); + + damages.put(SkillType.ABILITY_PROPERTY_PHYSICAL, DamageType.PHYSICAL); + damages.put(SkillType.ABILITY_PROPERTY_MAGICAL, DamageType.MAGICAL); + damages.put(SkillType.ABILITY_PROPERTY_PROJECTILE, DamageType.PROJECTILE); } @Override - public boolean canBeDamaged(Entity player) { - return !Heroes.getInstance().getDamageManager().isSpellTarget(player); + public boolean hasDamage(Entity entity) { + return Heroes.getInstance().getDamageManager().isSpellTarget(entity); + } + + @Override + public DamageInfo getDamage(Entity entity) { + SkillUseInfo info = Heroes.getInstance().getDamageManager().getSpellTargetInfo(entity); + return new DamageInfo(0, info.getSkill().getTypes().stream().filter(type -> damages.containsKey(type)).map(type -> damages.get(type)).collect(Collectors.toList())); } @Override diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/McMMOHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/McMMOHook.java index 13927f06..2c942f35 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/McMMOHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/McMMOHook.java @@ -1,7 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -38,11 +37,6 @@ public class McMMOHook implements RPGHandler, Listener { public void refreshStats(PlayerData data) { } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - public class McMMOPlayer extends RPGPlayer { public McMMOPlayer(PlayerData playerData) { super(playerData); diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/McRPGHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/McRPGHook.java index 7a91419c..9b0cd87d 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/McRPGHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/McRPGHook.java @@ -1,7 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -30,11 +29,6 @@ public class McRPGHook implements RPGHandler, Listener { public void refreshStats(PlayerData data) { } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - public class McRPGPlayer extends RPGPlayer { public McRPGPlayer(PlayerData playerData) { super(playerData); diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGHandler.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGHandler.java index d1502394..7fa30000 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGHandler.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGHandler.java @@ -2,8 +2,6 @@ package net.Indyuce.mmoitems.comp.rpg; import java.util.logging.Level; -import org.bukkit.entity.Entity; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.RPGPlayer; @@ -14,8 +12,6 @@ public interface RPGHandler { public void refreshStats(PlayerData data); - public boolean canBeDamaged(Entity entity); - public enum PluginEnum { MMOCORE("MMOCore", MMOCoreHook.class), HEROES("Heroes", HeroesHook.class), diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGPlayerLevelingHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGPlayerLevelingHook.java index ecec4f0c..42310ff1 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGPlayerLevelingHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/RPGPlayerLevelingHook.java @@ -1,18 +1,11 @@ package net.Indyuce.mmoitems.comp.rpg; -import org.bukkit.entity.Entity; - import me.baks.rpl.PlayerList; import me.baks.rpl.api.API; import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.RPGPlayer; public class RPGPlayerLevelingHook implements RPGHandler { - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - @Override public void refreshStats(PlayerData data) { } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java index 3854af0c..67a35266 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillAPIHook.java @@ -1,7 +1,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -40,11 +39,6 @@ public class SkillAPIHook implements RPGHandler, Listener { net.Indyuce.mmoitems.api.player.PlayerData.get(event.getPlayerData().getPlayer()).scheduleDelayedInventoryUpdate(); } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - @Override public void refreshStats(net.Indyuce.mmoitems.api.player.PlayerData data) { } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsHook.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsHook.java index ed0b4ee7..99d65a9a 100644 --- a/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsHook.java +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/SkillsHook.java @@ -2,7 +2,6 @@ package net.Indyuce.mmoitems.comp.rpg; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; -import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -26,11 +25,6 @@ public class SkillsHook implements RPGHandler, Listener { PlayerData.get(player).scheduleDelayedInventoryUpdate(); } - @Override - public boolean canBeDamaged(Entity entity) { - return true; - } - @Override public void refreshStats(PlayerData data) { } diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageHandler.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageHandler.java new file mode 100644 index 00000000..572927ba --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageHandler.java @@ -0,0 +1,9 @@ +package net.Indyuce.mmoitems.comp.rpg.damage; + +import org.bukkit.entity.Entity; + +public interface DamageHandler { + public DamageInfo getDamage(Entity entity); + + public boolean hasDamage(Entity entity); +} diff --git a/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageInfo.java b/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageInfo.java new file mode 100644 index 00000000..0e147f0c --- /dev/null +++ b/src/main/java/net/Indyuce/mmoitems/comp/rpg/damage/DamageInfo.java @@ -0,0 +1,37 @@ +package net.Indyuce.mmoitems.comp.rpg.damage; + +import java.util.Arrays; +import java.util.List; + +import net.Indyuce.mmoitems.api.AttackResult; +import net.Indyuce.mmoitems.api.AttackResult.DamageType; + +public class DamageInfo { + private final double damage; + private final List damageTypes; + + public DamageInfo(double damage, DamageType... damageTypes) { + this(damage, Arrays.asList(damageTypes)); + } + + public DamageInfo(double damage, List damageTypes) { + this.damage = damage; + this.damageTypes = damageTypes; + } + + public double getValue() { + return damage; + } + + public List getTypes() { + return damageTypes; + } + + public boolean hasType(DamageType type) { + return damageTypes.contains(type); + } + + public AttackResult toAttackResult() { + return new AttackResult(true, damage, damageTypes); + } +} diff --git a/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java b/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java index 24af7c98..a02f26be 100644 --- a/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java +++ b/src/main/java/net/Indyuce/mmoitems/listener/ItemUse.java @@ -26,9 +26,9 @@ import org.bukkit.inventory.EquipmentSlot; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.AttackResult; +import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.TypeSet; -import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.interaction.Consumable; import net.Indyuce.mmoitems.api.interaction.GemStone; import net.Indyuce.mmoitems.api.interaction.GemStone.ApplyResult; @@ -96,17 +96,17 @@ public class ItemUse implements Listener { } } - @EventHandler(priority = EventPriority.HIGH) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void b(EntityDamageByEntityEvent event) { // check for npc // safety checks - if (event.getEntity().hasMetadata("NPC") || event.isCancelled() || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof LivingEntity) || event.getDamage() == 0 || event.getCause() != DamageCause.ENTITY_ATTACK) + if (event.getEntity().hasMetadata("NPC") || !(event.getDamager() instanceof Player) || !(event.getEntity() instanceof LivingEntity) || event.getDamage() == 0 || event.getCause() != DamageCause.ENTITY_ATTACK) return; // custom damage check LivingEntity target = (LivingEntity) event.getEntity(); - if (MMOItems.plugin.getDamage().isDamaged(target) || !MMOItems.plugin.getRPG().canBeDamaged(target)) + if (MMOItems.plugin.getDamage().findInfo(target) != null) return; Player player = (Player) event.getDamager(); diff --git a/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java b/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java index e0f26cd0..c04104e7 100644 --- a/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java +++ b/src/main/java/net/Indyuce/mmoitems/listener/PlayerListener.java @@ -23,8 +23,8 @@ import org.bukkit.inventory.ItemStack; import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.ability.Magical_Shield; import net.Indyuce.mmoitems.api.Ability.CastingMode; -import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.AttackResult; +import net.Indyuce.mmoitems.api.AttackResult.DamageType; import net.Indyuce.mmoitems.api.SoulboundInfo; import net.Indyuce.mmoitems.api.player.PlayerData; import net.Indyuce.mmoitems.api.player.PlayerStats; @@ -46,19 +46,21 @@ public class PlayerListener implements Listener { event.setDamage(event.getDamage() * (1 - Math.max(values[1], 1))); } - // damage reduction stats + /* + * damage reduction + */ + if (MMOItems.plugin.getDamage().findInfo(player) != null) + return; PlayerStats stats = PlayerData.get(player).getStats(); - if (MMOItems.plugin.getRPG().canBeDamaged(player) && !MMOItems.plugin.getDamage().isDamaged(player)) { - if (event.getCause() == DamageCause.FIRE) - event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FIRE_DAMAGE_REDUCTION) / 100)); - else if (event.getCause() == DamageCause.FALL) - event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FALL_DAMAGE_REDUCTION) / 100)); - else if (event.getCause() == DamageCause.MAGIC) - event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.MAGIC_DAMAGE_REDUCTION) / 100)); - else if (event.getCause() == DamageCause.ENTITY_ATTACK || event.getCause() == DamageCause.ENTITY_SWEEP_ATTACK || event.getCause() == DamageCause.PROJECTILE) - event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.PHYSICAL_DAMAGE_REDUCTION) / 100)); - } + if (event.getCause() == DamageCause.FIRE) + event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FIRE_DAMAGE_REDUCTION) / 100)); + else if (event.getCause() == DamageCause.FALL) + event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.FALL_DAMAGE_REDUCTION) / 100)); + else if (event.getCause() == DamageCause.MAGIC) + event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.MAGIC_DAMAGE_REDUCTION) / 100)); + else if (event.getCause() == DamageCause.ENTITY_ATTACK || event.getCause() == DamageCause.ENTITY_SWEEP_ATTACK || event.getCause() == DamageCause.PROJECTILE) + event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.PHYSICAL_DAMAGE_REDUCTION) / 100)); event.setDamage(event.getDamage() * (1 - stats.getStat(ItemStat.DAMAGE_REDUCTION) / 100)); } diff --git a/src/main/java/net/Indyuce/mmoitems/manager/DamageManager.java b/src/main/java/net/Indyuce/mmoitems/manager/DamageManager.java index 834eb14e..5683a422 100644 --- a/src/main/java/net/Indyuce/mmoitems/manager/DamageManager.java +++ b/src/main/java/net/Indyuce/mmoitems/manager/DamageManager.java @@ -1,30 +1,45 @@ package net.Indyuce.mmoitems.manager; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.bukkit.attribute.Attribute; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Wither; -import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityDamageByEntityEvent; import net.Indyuce.mmoitems.api.AttackResult; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageHandler; +import net.Indyuce.mmoitems.comp.rpg.damage.DamageInfo; -public class DamageManager implements Listener { - private final Map customDamage = new HashMap<>(); +public class DamageManager implements Listener, DamageHandler { + private final Map customDamage = new HashMap<>(); + private final List handlers = new ArrayList<>(); + + public DamageManager() { + handlers.add(this); + } + + public void registerHandler(DamageHandler handler) { + handlers.add(handler); + } public boolean isDamaged(Entity entity) { return customDamage.containsKey(entity.getEntityId()); } - public AttackResult getDamage(Entity entity) { + @Override + public boolean hasDamage(Entity entity) { + return customDamage.containsKey(entity.getEntityId()); + } + + public DamageInfo getDamage(Entity entity) { return customDamage.get(entity.getEntityId()); } @@ -40,7 +55,7 @@ public class DamageManager implements Listener { * calculate extra damage depending on the type of attack and the entity * that is being damaged */ - customDamage.put(target.getEntityId(), result); + customDamage.put(target.getEntityId(), result.toDamageInfo()); if (!knockback) { final double baseKnockbackValue = target.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE).getBaseValue(); @@ -51,13 +66,16 @@ public class DamageManager implements Listener { e.printStackTrace(); } target.getAttribute(Attribute.GENERIC_KNOCKBACK_RESISTANCE).setBaseValue(baseKnockbackValue); - + } else target.damage(result.getDamage(), player); } - public boolean isUndead(Entity entity) { - return entity instanceof Zombie || entity instanceof Skeleton || entity instanceof Wither; + public DamageInfo findInfo(Entity entity) { + for (DamageHandler handler : handlers) + if (handler.hasDamage(entity)) + return handler.getDamage(entity); + return null; } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false)