diff --git a/src/engine/gameManager/CombatManager.java b/src/engine/gameManager/CombatManager.java index b1157a25..7f0126ef 100644 --- a/src/engine/gameManager/CombatManager.java +++ b/src/engine/gameManager/CombatManager.java @@ -14,6 +14,7 @@ import engine.jobs.AttackJob; import engine.jobs.DeferredPowerJob; import engine.mbEnums; import engine.net.client.ClientConnection; +import engine.net.client.msg.PowerProjectileMsg; import engine.net.client.msg.TargetedActionMsg; import engine.net.client.msg.UpdateStateMsg; import engine.objects.*; @@ -319,7 +320,7 @@ public enum CombatManager { DispatchManager.sendToAllInRange(attacker, msg); //we need to send the animation even if the attacker misses - TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot)); + TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon == null ? null : weapon.template, null, slot)); DispatchManager.sendToAllInRange(target, cmm); //set auto attack job @@ -359,7 +360,7 @@ public enum CombatManager { DispatchManager.dispatchMsgToInterestArea(target, msg, mbEnums.DispatchChannel.PRIMARY, MBServerStatics.CHARACTER_LOAD_RANGE, true, false); //we need to send the animation even if the attacker misses - TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot)); + TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon == null ? null : weapon.template, null, slot)); DispatchManager.sendToAllInRange(target, cmm); //set auto attack job setAutoAttackJob(attacker, slot, delay); @@ -447,7 +448,7 @@ public enum CombatManager { if (resists.immuneTo(damageType)) { //set auto attack job //we need to send the animation even if the attacker misses - TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon.template, null, slot)); + TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) 0, getSwingAnimation(weapon == null ? null : weapon.template, null, slot)); DispatchManager.sendToAllInRange(target, cmm); setAutoAttackJob(attacker, slot, delay); return; @@ -479,6 +480,15 @@ public enum CombatManager { } TargetedActionMsg cmm = new TargetedActionMsg(attacker, target, (float) damage, attackAnim); DispatchManager.sendToAllInRange(target, cmm); + + //siege projectile is sent once per hit, not per AI pulse + + if (attacker.getObjectType().equals(mbEnums.GameObjectType.Mob) && ((Mob) attacker).isSiege() + && target.getObjectType().equals(mbEnums.GameObjectType.Building)) { + PowerProjectileMsg ppm = new PowerProjectileMsg(attacker, target); + ppm.setRange(50); + DispatchManager.dispatchMsgToInterestArea(attacker, ppm, mbEnums.DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); + } } } diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index 07dac563..733f691e 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -14,12 +14,10 @@ import engine.gameManager.*; import engine.math.Vector3f; import engine.math.Vector3fImmutable; import engine.mbEnums; -import engine.mbEnums.DispatchChannel; import engine.mobileAI.Threads.MobAIThread; import engine.mobileAI.Threads.ReSpawner; import engine.mobileAI.utilities.MovementUtilities; import engine.net.client.msg.PerformActionMsg; -import engine.net.client.msg.PowerProjectileMsg; import engine.objects.*; import engine.powers.ActionsBase; import engine.powers.PowersBase; @@ -93,7 +91,7 @@ public class MobAI { mob.updateLocation(); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget"); } } @@ -133,7 +131,7 @@ public class MobAI { target.getPet().setCombatTarget(mob); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer"); } } @@ -161,14 +159,8 @@ public class MobAI { CombatManager.combatCycle(mob, target); - if (mob.isSiege()) { - PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target); - ppm.setRange(50); - DispatchManager.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false); - } - } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackBuilding"); } } @@ -186,7 +178,7 @@ public class MobAI { CombatManager.combatCycle(mob, target); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackMob"); } } @@ -248,7 +240,7 @@ public class MobAI { MovementUtilities.aiMove(mob, mob.destination, true); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackTarget" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: Patrol"); } } @@ -290,7 +282,7 @@ public class MobAI { return mob.nextCastTime <= System.currentTimeMillis(); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: canCast" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: canCast"); } return false; } @@ -387,7 +379,7 @@ public class MobAI { return true; } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCast"); } return false; } @@ -452,7 +444,7 @@ public class MobAI { mob.nextCallForHelp = System.currentTimeMillis() + 60000; } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCallForHelp" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: MobCallForHelp"); } } @@ -575,7 +567,7 @@ public class MobAI { break; } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: DetermineAction"); } } @@ -649,7 +641,7 @@ public class MobAI { } } } catch (Exception e) { - Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForAggro" + " " + e.getMessage()); + Logger.error(e, aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForAggro"); } } @@ -702,7 +694,7 @@ public class MobAI { } } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckMobMovement"); } } @@ -746,7 +738,7 @@ public class MobAI { ReSpawner.respawnQueue.put(aiAgent); } } catch (Exception e) { - Logger.info(aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn" + " " + e.getMessage()); + Logger.error(e, aiAgent.getObjectUUID() + " " + aiAgent.getName() + " Failed At: CheckForRespawn"); } } @@ -769,7 +761,7 @@ public class MobAI { attackTarget(mob, mob.getCombatTarget()); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForAttack" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForAttack"); } } @@ -812,7 +804,7 @@ public class MobAI { mob.playerAgroMap.replaceAll((e, v) -> 0f); } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckToSendMobHome"); } } @@ -851,7 +843,7 @@ public class MobAI { mob.updateMovementState(); mob.updateLocation(); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: chaseTarget"); } } @@ -883,7 +875,7 @@ public class MobAI { mob.setCombatTarget(aggroMob); } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: SafeGuardAggro" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: SafeGuardAggro"); } } @@ -913,7 +905,7 @@ public class MobAI { checkForAttack(mob); //only check to attack if combat target is not null } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardLogic" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardLogic"); } } @@ -946,7 +938,7 @@ public class MobAI { mob.setHealth(mob.getHealthMax()); } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: PetLogic"); } } @@ -970,7 +962,7 @@ public class MobAI { } checkForAttack(mob); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: HamletGuardLogic"); } } @@ -1043,7 +1035,7 @@ public class MobAI { checkForAttack(mob); } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic"); } } @@ -1117,7 +1109,7 @@ public class MobAI { } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForPlayerGuardAggro" + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: CheckForPlayerGuardAggro"); } } @@ -1180,7 +1172,7 @@ public class MobAI { } } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCanAggro" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: GuardCanAggro"); } return false; } @@ -1232,7 +1224,7 @@ public class MobAI { } } } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints" + " " + e); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: randomGuardPatrolPoints"); } } @@ -1267,7 +1259,7 @@ public class MobAI { } return mostHatedTarget; } catch (Exception e) { - Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: ChangeTargetFromMostHated" + " " + e.getMessage()); + Logger.error(e, mob.getObjectUUID() + " " + mob.getName() + " Failed At: ChangeTargetFromMostHated"); } return null; } diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index 479bc552..c95e402b 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -395,8 +395,10 @@ public class Building extends AbstractWorldObject { //friendly building has been attacked, add attacker to city outlaw list if (!playerCity.cityOutlaws.contains(attacker.getObjectUUID()) && attacker.getObjectType().equals(GameObjectType.PlayerCharacter)) playerCity.cityOutlaws.add(attacker.getObjectUUID()); + //only city guards respond; siege engines and pets in the zone are left alone + for (Mob guard : playerCity.getParent().zoneMobSet) - if (guard.combatTarget == null) + if (guard.isPlayerGuard() && guard.combatTarget == null) guard.setCombatTarget(attacker); } }