From f8b7ac20b32c47b694e45e438baa2262b3cd3004 Mon Sep 17 00:00:00 2001 From: Indyuce Date: Sat, 26 Dec 2020 15:57:29 +0100 Subject: [PATCH] Buff based skills can now be cast on party members --- .../api/skill/result/LocationSkillResult.java | 23 ++++++++++--- .../api/skill/result/TargetSkillResult.java | 17 +++++++++- .../mmocore/api/util/MMOCoreUtils.java | 32 ++++++++++++++++--- .../mmocore/skill/Greater_Healings.java | 2 +- .../Indyuce/mmocore/skill/Human_Shield.java | 2 +- .../Indyuce/mmocore/skill/Minor_Healings.java | 2 +- 6 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/Indyuce/mmocore/api/skill/result/LocationSkillResult.java b/src/main/java/net/Indyuce/mmocore/api/skill/result/LocationSkillResult.java index 4a6bf89b..e13acc22 100644 --- a/src/main/java/net/Indyuce/mmocore/api/skill/result/LocationSkillResult.java +++ b/src/main/java/net/Indyuce/mmocore/api/skill/result/LocationSkillResult.java @@ -12,19 +12,34 @@ import net.Indyuce.mmocore.api.util.MMOCoreUtils; public class LocationSkillResult extends SkillResult { private Location loc; - /* - * this SkillResult is only available for 1.13+ users. + /** + * @param data Player casting the skill + * @param skill Skill being cast + * @param range Skill raycast range */ public LocationSkillResult(PlayerData data, SkillInfo skill, double range) { + this(data, skill, range, false); + } + + /** + * @param data Player casting the skill + * @param skill Skill being cast + * @param range Skill raycast range + * @param buff If the skill is a buff ie if it can be cast on party members + */ + public LocationSkillResult(PlayerData data, SkillInfo skill, double range, boolean buff) { super(data, skill); if (isSuccessful()) { - RayTraceResult result = data.getPlayer().getWorld().rayTrace(data.getPlayer().getEyeLocation(), data.getPlayer().getEyeLocation().getDirection(), range, FluidCollisionMode.ALWAYS, true, 1.0D, entity -> MMOCoreUtils.canTarget(data, entity)); + RayTraceResult result = data.getPlayer().getWorld().rayTrace(data.getPlayer().getEyeLocation(), + data.getPlayer().getEyeLocation().getDirection(), range, FluidCollisionMode.ALWAYS, true, 1.0D, + entity -> MMOCoreUtils.canTarget(data, entity, buff)); if (result == null) abort(CancelReason.OTHER); else - loc = result.getHitBlock() != null ? result.getHitBlock().getLocation() : result.getHitEntity() != null ? result.getHitEntity().getLocation() : null; + loc = result.getHitBlock() != null ? result.getHitBlock().getLocation() + : result.getHitEntity() != null ? result.getHitEntity().getLocation() : null; } } diff --git a/src/main/java/net/Indyuce/mmocore/api/skill/result/TargetSkillResult.java b/src/main/java/net/Indyuce/mmocore/api/skill/result/TargetSkillResult.java index f2927fd3..1a09b392 100644 --- a/src/main/java/net/Indyuce/mmocore/api/skill/result/TargetSkillResult.java +++ b/src/main/java/net/Indyuce/mmocore/api/skill/result/TargetSkillResult.java @@ -12,12 +12,27 @@ import net.mmogroup.mmolib.api.MMORayTraceResult; public class TargetSkillResult extends SkillResult { private LivingEntity target; + /** + * @param data Player casting the skill + * @param skill Skill being cast + * @param range Skill raycast range + */ public TargetSkillResult(PlayerData data, SkillInfo skill, double range) { + this(data, skill, range, false); + } + + /** + * @param data Player casting the skill + * @param skill Skill being cast + * @param range Skill raycast range + * @param buff If the skill is a buff ie if it can be cast on party members + */ + public TargetSkillResult(PlayerData data, SkillInfo skill, double range, boolean buff) { super(data, skill); if (isSuccessful()) { MMORayTraceResult result = MMOLib.plugin.getVersion().getWrapper().rayTrace(data.getPlayer(), range, - entity -> MMOCoreUtils.canTarget(data, entity)); + entity -> MMOCoreUtils.canTarget(data, entity, buff)); if (!result.hasHit()) abort(); else diff --git a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java index 99bcfea0..f5fd82c4 100644 --- a/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java +++ b/src/main/java/net/Indyuce/mmocore/api/util/MMOCoreUtils.java @@ -42,7 +42,8 @@ public class MMOCoreUtils { if (isLastSpace && ch >= 'a' && ch <= 'z') { builder.setCharAt(item, (char) (ch + ('A' - 'a'))); isLastSpace = false; - } else isLastSpace = ch == ' '; + } else + isLastSpace = ch == ' '; } return builder.toString(); } @@ -145,16 +146,37 @@ public class MMOCoreUtils { return entities; } - // TODO worldguard flags support for no target + /** + * @param player Player casting a spell/basic attack + * @param target The target entity + * @return If the player can target the entity given the attack type + * (buff or attack) + */ public static boolean canTarget(PlayerData player, Entity target) { - if(!player.isOnline()) return false; + return canTarget(player, target, false); + } + + /** + * @param player Player casting a spell/basic attack + * @param target The target entity + * @param buff Used when the attack is not an attack but a positive buff. + * Buffs or heals can be applied on party members, whereas + * attacks can't target party members. + * @return If the player can target the entity given the attack type + * (buff or attack) + */ + // TODO worldguard flags support for no target + public static boolean canTarget(PlayerData player, Entity target, boolean buff) { + if (!player.isOnline()) + return false; // basic checks - if (!(target instanceof LivingEntity) || player.getPlayer().equals(target) || target.isDead() || MMOLib.plugin.getEntities().findCustom(target)) + if (!(target instanceof LivingEntity) || player.getPlayer().equals(target) || target.isDead() + || MMOLib.plugin.getEntities().findCustom(target)) return false; // party check - if (target instanceof Player) { + if (!buff && target instanceof Player) { PlayerData targetData = PlayerData.get((Player) target); return !targetData.hasParty() || !targetData.getParty().getMembers().has(player); } diff --git a/src/main/java/net/Indyuce/mmocore/skill/Greater_Healings.java b/src/main/java/net/Indyuce/mmocore/skill/Greater_Healings.java index b78af40b..0a2ddcb1 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Greater_Healings.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Greater_Healings.java @@ -26,7 +26,7 @@ public class Greater_Healings extends Skill { @Override public SkillResult whenCast(PlayerData data, SkillInfo skill) { - SkillResult cast = data.getPlayer().isSneaking() ? new SkillResult(data, skill) : new TargetSkillResult(data, skill, 50); + SkillResult cast = data.getPlayer().isSneaking() ? new SkillResult(data, skill) : new TargetSkillResult(data, skill, 50, true); if (!cast.isSuccessful()) return cast; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java b/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java index 9b867e89..6d7aab74 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Human_Shield.java @@ -35,7 +35,7 @@ public class Human_Shield extends Skill { @Override public SkillResult whenCast(PlayerData data, SkillInfo skill) { - TargetSkillResult cast = new TargetSkillResult(data, skill, 7); + TargetSkillResult cast = new TargetSkillResult(data, skill, 7, true); if (!cast.isSuccessful()) return cast; diff --git a/src/main/java/net/Indyuce/mmocore/skill/Minor_Healings.java b/src/main/java/net/Indyuce/mmocore/skill/Minor_Healings.java index 4ceaa149..44f23cbc 100644 --- a/src/main/java/net/Indyuce/mmocore/skill/Minor_Healings.java +++ b/src/main/java/net/Indyuce/mmocore/skill/Minor_Healings.java @@ -26,7 +26,7 @@ public class Minor_Healings extends Skill { @Override public SkillResult whenCast(PlayerData data, SkillInfo skill) { - SkillResult cast = data.getPlayer().isSneaking() ? new SkillResult(data, skill) : new TargetSkillResult(data, skill, 50); + SkillResult cast = data.getPlayer().isSneaking() ? new SkillResult(data, skill) : new TargetSkillResult(data, skill, 50, true); if (!cast.isSuccessful()) return cast;