From d58733995c187b47efabdd4ce9577dab8d4e2daa Mon Sep 17 00:00:00 2001 From: Mads Boddum Date: Sun, 23 Oct 2016 07:35:01 +0200 Subject: [PATCH] Added support for combat command ranges --- src/resources/commands/CombatCommand.java | 20 +++++- src/resources/commands/Command.java | 6 +- .../objects/creature/CreatureObject.java | 18 ++--- .../objects/tangible/TangibleObject.java | 12 ++-- src/services/combat/CombatManager.java | 65 ++++++++++--------- src/services/commands/CommandService.java | 7 ++ 6 files changed, 74 insertions(+), 54 deletions(-) diff --git a/src/resources/commands/CombatCommand.java b/src/resources/commands/CombatCommand.java index 9c69eba2..28a9c0c2 100644 --- a/src/resources/commands/CombatCommand.java +++ b/src/resources/commands/CombatCommand.java @@ -50,6 +50,8 @@ public class CombatCommand extends Command { private int attackRolls; private float percentAddFromWeapon; private int addedDamage; + private String buffNameTarget; + private String buffNameSelf; public CombatCommand(String name) { super(name); @@ -164,5 +166,21 @@ public class CombatCommand extends Command { public void setAddedDamage(int addedDamage) { this.addedDamage = addedDamage; } - + + public String getBuffNameTarget() { + return buffNameTarget; + } + + public void setBuffNameTarget(String buffNameTarget) { + this.buffNameTarget = buffNameTarget; + } + + public String getBuffNameSelf() { + return buffNameSelf; + } + + public void setBuffNameSelf(String buffNameSelf) { + this.buffNameSelf = buffNameSelf; + } + } diff --git a/src/resources/commands/Command.java b/src/resources/commands/Command.java index a7d31972..64f428b4 100644 --- a/src/resources/commands/Command.java +++ b/src/resources/commands/Command.java @@ -50,7 +50,7 @@ public class Command { private boolean callOnTarget; // command group // disabled - private int maxRange; + private float maxRange; private int godLevel; // display group private boolean combatCommand; @@ -94,8 +94,8 @@ public class Command { public void setTargetType(int targetType) { this.targetType = targetType; } public boolean isCallOnTarget() { return callOnTarget; } public void setCallOnTarget(boolean callOnTarget) { this.callOnTarget = callOnTarget; } - public int getMaxRange() { return maxRange; } - public void setMaxRange(int maxRange) { this.maxRange = maxRange; } + public float getMaxRange() { return maxRange; } + public void setMaxRange(float maxRange) { this.maxRange = maxRange; } public int getGodLevel() { return godLevel; } public void setGodLevel(int godLevel) { this.godLevel = godLevel; } public boolean isCombatCommand() { return combatCommand; } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 237eb431..ee4be70b 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -794,20 +794,16 @@ public class CreatureObject extends TangibleObject { public boolean isEnemy(TangibleObject otherObject) { boolean enemy = super.isEnemy(otherObject); - if(enemy) { - // If these are both creatures, there's a chance both of them are players! - if (this instanceof CreatureObject && otherObject instanceof CreatureObject) { - CreatureObject thisCreature = (CreatureObject) this; - CreatureObject otherCreature = (CreatureObject) otherObject; + if (enemy && otherObject instanceof CreatureObject) { + PvpStatus ourStatus = getPvpStatus(); + PvpStatus theirStatus = otherObject.getPvpStatus(); - // If they're both players, both of them might be special force - if (thisCreature.isPlayer() && otherCreature.isPlayer()) { - // They are enemies if they're both players and members of the special force! - return getPvpStatus() == PvpStatus.SPECIALFORCES && otherObject.getPvpStatus() == PvpStatus.SPECIALFORCES; - } + if (isPlayer() && ((CreatureObject) otherObject).isPlayer()) { + // They are enemies if both players are SF + return ourStatus == PvpStatus.SPECIALFORCES && theirStatus == PvpStatus.SPECIALFORCES; } } - + return enemy; } diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 9ec24a30..6bd236cc 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -257,14 +257,12 @@ public class TangibleObject extends SWGObject { // They CAN be enemies if they're not from the same faction and neither of them are neutral PvpFaction otherFaction = otherObject.getPvpFaction(); - if (otherFaction != PvpFaction.NEUTRAL && getPvpFaction() != otherFaction) { - if (getPvpStatus() != PvpStatus.ONLEAVE && otherObject.getPvpStatus() != PvpStatus.ONLEAVE) { - // Both objects are not players. In this case, both just need to be combatants. - return true; - } + if (hasPvpFlag(PvpFlag.ATTACKABLE) || otherObject.hasPvpFlag(PvpFlag.ATTACKABLE)) { + return true; + } else { + return otherFaction != PvpFaction.NEUTRAL && getPvpFaction() != otherFaction + && getPvpStatus() != PvpStatus.ONLEAVE && otherObject.getPvpStatus() != PvpStatus.ONLEAVE; } - - return false; } public String getCurrentCity() { diff --git a/src/services/combat/CombatManager.java b/src/services/combat/CombatManager.java index 4cd68189..316d7c15 100644 --- a/src/services/combat/CombatManager.java +++ b/src/services/combat/CombatManager.java @@ -239,6 +239,9 @@ public class CombatManager extends Manager { } private void doCombat(CreatureObject source, SWGObject target, CombatCommand command) { + // TODO HitType checking. This will for instance prevent buff commands from behaving as a single target combat command + addBuff(source, source, command.getBuffNameSelf()); // Add self buff if present + CombatAction action = new CombatAction(source.getObjectId()); String anim = command.getRandomAnimation(source.getEquippedWeapon().getType()); action.setActionCrc(CRC.getCrc(anim)); @@ -253,7 +256,6 @@ public class CombatManager extends Manager { damage += calculateWeaponDamage(source, command); damage += command.getAddedDamage(); - addSelfBuff(source, command); if (target instanceof CreatureObject) { if (command.getAttackType() == AttackType.SINGLE_TARGET) @@ -273,7 +275,7 @@ public class CombatManager extends Manager { target.addDefender(source); source.addDefender(target); - addTargetBuff(source, command); + addBuff(source, target, command.getBuffNameTarget()); // Add target buff if (target.getHealth() <= damage) doCreatureDeath(target, source); @@ -281,14 +283,6 @@ public class CombatManager extends Manager { target.modifyHealth(-damage); } - private void addTargetBuff(CreatureObject target, CombatCommand command) { - - } - - private void addSelfBuff(CreatureObject creature, CombatCommand command) { - - } - private void enterCombat(CreatureObject creature) { creature.setInCombat(true); @@ -463,57 +457,56 @@ public class CombatManager extends Manager { private CombatStatus canPerform(CreatureObject source, SWGObject target, CombatCommand c) { if (source.getEquippedWeapon() == null) return CombatStatus.NO_WEAPON; + + if (target == null || source.equals(target)) + return CombatStatus.SUCCESS; + if (!(target instanceof TangibleObject)) return CombatStatus.INVALID_TARGET; + TangibleObject tangibleTarget = (TangibleObject) target; - if(tangibleTarget.getPvpFaction() != PvpFaction.NEUTRAL) { - if(!tangibleTarget.isEnemy(source)) { - return CombatStatus.INVALID_TARGET; - } - } else if ((tangibleTarget.getPvpFlags() & PvpFlag.ATTACKABLE.getBitmask()) == 0) + + if (!tangibleTarget.isEnemy(source)) { return CombatStatus.INVALID_TARGET; + } if(target instanceof CreatureObject) { - CreatureObject creature = (CreatureObject) target; - - switch(creature.getPosture()) { + switch(((CreatureObject) target).getPosture()) { case DEAD: case INCAPACITATED: return CombatStatus.INVALID_TARGET; } } - CombatStatus status; switch (c.getAttackType()) { case AREA: case TARGET_AREA: - status = canPerformArea(source, c); - break; + return canPerformArea(source, c); case SINGLE_TARGET: - status = canPerformSingle(source, target, c); - break; + return canPerformSingle(source, target, c); default: - status = CombatStatus.UNKNOWN; - break; + return CombatStatus.UNKNOWN; } - if (status != CombatStatus.SUCCESS) - return status; - - return status; } private CombatStatus canPerformSingle(CreatureObject source, SWGObject target, CombatCommand c) { - if (target == null || !(target instanceof CreatureObject)) + if (target == null || !(target instanceof TangibleObject)) return CombatStatus.NO_TARGET; + WeaponObject weapon = source.getEquippedWeapon(); double dist = source.getLocation().distanceTo(target.getLocation()); - if (dist > weapon.getMaxRange() || (dist > c.getMaxRange() && c.getMaxRange() > 0)) + float commandRange = c.getMaxRange(); + float range = commandRange > 0 ? commandRange : weapon.getMaxRange(); + + if (dist > range) return CombatStatus.TOO_FAR; + return CombatStatus.SUCCESS; } private CombatStatus canPerformArea(CreatureObject source, CombatCommand c) { - return CombatStatus.SUCCESS; + // TODO implement AoE + return CombatStatus.UNKNOWN; } private int calculateWeaponDamage(CreatureObject source, CombatCommand command) { @@ -524,6 +517,14 @@ public class CombatManager extends Manager { return (int) (weaponDamage * command.getPercentAddFromWeapon()); } + private void addBuff(CreatureObject caster, CreatureObject receiver, String buffName) { + if (buffName.isEmpty()) { + return; + } + + new BuffIntent(buffName, caster, receiver, false).broadcast(); + } + private void showFlyText(TangibleObject obj, String text, Scale scale, Color c, ShowFlyText.Flag ... flags) { obj.sendSelf(new ShowFlyText(obj.getObjectId(), text, scale, new RGB(c), flags)); } diff --git a/src/services/commands/CommandService.java b/src/services/commands/CommandService.java index 33249d41..7024cada 100644 --- a/src/services/commands/CommandService.java +++ b/src/services/commands/CommandService.java @@ -400,6 +400,7 @@ public class CommandService extends Service { cc.setCooldownGroup2(c.getCooldownGroup2()); cc.setCooldownTime(c.getCooldownTime()); cc.setCooldownTime2(c.getCooldownTime2()); + cc.setMaxRange(c.getMaxRange()); return cc; } @@ -417,6 +418,9 @@ public class CommandService extends Service { int animDefault = combatCommands.getColumnFromName("animDefault"); int percentAddFromWeapon = combatCommands.getColumnFromName("percentAddFromWeapon"); int addedDamage = combatCommands.getColumnFromName("addedDamage"); + int buffNameTarget = combatCommands.getColumnFromName("buffNameTarget"); + int buffNameSelf = combatCommands.getColumnFromName("buffNameSelf"); + int maxRange = combatCommands.getColumnFromName("maxRange"); // animDefault anim_unarmed anim_onehandmelee anim_twohandmelee anim_polearm // anim_pistol anim_lightRifle anim_carbine anim_rifle anim_heavyweapon // anim_thrown anim_onehandlightsaber anim_twohandlightsaber anim_polearmlightsaber @@ -440,6 +444,9 @@ public class CommandService extends Service { cc.setDefaultAnimation(getAnimationList((String) cmdRow[animDefault])); cc.setPercentAddFromWeapon((float) cmdRow[percentAddFromWeapon]); cc.setAddedDamage((int) cmdRow[addedDamage]); + cc.setBuffNameTarget((String) cmdRow[buffNameTarget]); + cc.setBuffNameSelf((String) cmdRow[buffNameSelf]); + cc.setMaxRange((float) cmdRow[maxRange]); cc.setAnimations(WeaponType.UNARMED, getAnimationList((String) cmdRow[animDefault+1])); cc.setAnimations(WeaponType.ONE_HANDED_MELEE, getAnimationList((String) cmdRow[animDefault+2])); cc.setAnimations(WeaponType.TWO_HANDED_MELEE, getAnimationList((String) cmdRow[animDefault+3]));