diff --git a/src/engine/Enum.java b/src/engine/Enum.java index 180ecbda..ccd2db53 100644 --- a/src/engine/Enum.java +++ b/src/engine/Enum.java @@ -2636,8 +2636,9 @@ public class Enum { TEMPLEGUARD(1575,1652, MinionClass.MELEE,"Guard","Temple"), TEMPLEMAGE(1577, 1656, MinionClass.MAGE,"Confessor","Temple"), UNDEADGUARD(980100,1674,MinionClass.MELEE,"Guard","Undead"), - UNDEADMAGE(980102,1675,MinionClass.MAGE,"Adept","Undead"); - + UNDEADMAGE(980102,1675,MinionClass.MAGE,"Adept","Undead"), + WEREWOLFGUARD(980104,0,MinionClass.MELEE,"Guard","Werewolf"), + WEREBEARGUARD(980103,0,MinionClass.MELEE,"Guard","Werebear"); private final int captainContractID; private final int equipSetID; private final MinionClass minionClass; diff --git a/src/engine/ai/MobileFSM.java b/src/engine/ai/MobileFSM.java index 6023032e..caae9949 100644 --- a/src/engine/ai/MobileFSM.java +++ b/src/engine/ai/MobileFSM.java @@ -199,7 +199,7 @@ public class MobileFSM { mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex); MovementUtilities.aiMove(mob, mob.destination, true); mob.lastPatrolPointIndex += 1; - if (mob.isPlayerGuard()) { + if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) { for (Entry minion : mob.siegeMinionMap.entrySet()) { //make sure mob is out of combat stance if (minion.getKey().isCombat() && minion.getKey().getCombatTarget() == null) { @@ -320,6 +320,12 @@ public class MobileFSM { if (mob.playerAgroMap.isEmpty()) //no players loaded, no need to proceed return; + if (mob.isCombat() && mob.getCombatTarget() == null) { + mob.setCombat(false); + UpdateStateMsg rwss = new UpdateStateMsg(); + rwss.setPlayer(mob); + DispatchMessage.sendToAllInRange(mob, rwss); + } CheckToSendMobHome(mob); mob.updateLocation(); switch (mob.BehaviourType) { @@ -378,10 +384,16 @@ public class MobileFSM { return; mob.updateLocation(); if (mob.BehaviourType != Enum.MobBehaviourType.Pet1) { - if (mob.getCombatTarget() == null) + if (mob.getCombatTarget() == null) { + if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) { + if (mob.npcOwner.isAlive() == true) { + return; + } + } Patrol(mob); - else + }else { chaseTarget(mob); + } } else { //pet logic if (!mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID())) { @@ -505,11 +517,6 @@ public class MobileFSM { CheckForAttack(mob); } public static void GuardMinionLogic(Mob mob) { - if (mob.despawned || !mob.isAlive()) { - if (System.currentTimeMillis() > mob.deathTime + (mob.spawnTime * 1000)) - mob.respawn(); - return; - } if (!mob.npcOwner.isAlive() && mob.getCombatTarget() == null) { CheckForPlayerGuardAggro(mob); return; diff --git a/src/engine/gameManager/BuildingManager.java b/src/engine/gameManager/BuildingManager.java index 1f2141e8..9a3c79b4 100644 --- a/src/engine/gameManager/BuildingManager.java +++ b/src/engine/gameManager/BuildingManager.java @@ -297,7 +297,7 @@ public enum BuildingManager { for (AbstractCharacter slottedNPC : building.getHirelings().keySet()) { if (slottedNPC.getObjectType() == Enum.GameObjectType.NPC) - ((NPC) slottedNPC).remove(); + ((NPC)slottedNPC).remove(); else if (slottedNPC.getObjectType() == Enum.GameObjectType.Mob) NPCManager.removeMobileFromBuilding(((Mob) slottedNPC), building); } @@ -475,7 +475,7 @@ public enum BuildingManager { NPC npc = null; - npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, false, zone, (short) rank, building); + npc = NPC.createNPC(pirateName, NpcID.getObjectUUID(), NpcLoc, null, false, zone, (short)rank, building); if (npc == null) return false; @@ -508,7 +508,7 @@ public enum BuildingManager { if (NPC.ISWallArcher(contract)) { - mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank * 10); + mob = Mob.createMob(contract.getMobbaseID(), Vector3fImmutable.ZERO, contractOwner.getGuild(), true, zone, building, contract.getContractID(), pirateName, rank); if (mob == null) return false; diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index abe71aa8..2b2603a4 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -67,7 +67,6 @@ public class Mob extends AbstractIntelligenceAgent { public boolean isPlayerGuard = false; public AbstractCharacter npcOwner; public long deathTime = 0; - public String nameOverride = ""; public int equipmentSetID = 0; public int runeSet = 0; public int bootySet = 0; @@ -120,7 +119,9 @@ public class Mob extends AbstractIntelligenceAgent { if (contractID == 0) this.contract = null; else this.contract = DbManager.ContractQueries.GET_CONTRACT(contractID); - + if(building != null && building.getOwner()!= null){ + this.lastName = "the " + contract.getName(); + } clearStatic(); } @@ -253,13 +254,16 @@ public class Mob extends AbstractIntelligenceAgent { this.notEnemy = EnumBitSet.asEnumBitSet(rs.getLong("notEnemy"), Enum.MonsterType.class); this.enemy = EnumBitSet.asEnumBitSet(rs.getLong("enemy"), Enum.MonsterType.class); - + this.firstName = rs.getString("mob_name"); + if(this.firstName.isEmpty()){ + this.firstName = this.mobBase.getFirstName(); + } if (this.contract != null) { this.equipmentSetID = this.contract.getEquipmentSet(); - this.nameOverride = this.getContract().getName(); + this.lastName = this.getContract().getName(); } else { this.equipmentSetID = rs.getInt("equipmentSet"); - this.nameOverride = rs.getString("mob_name"); + } if (rs.getString("fsm").length() > 1) this.BehaviourType = MobBehaviourType.valueOf(rs.getString("fsm")); @@ -328,14 +332,11 @@ public class Mob extends AbstractIntelligenceAgent { writer.putInt(0xFF665EC3); //Spi writer.putInt(0); - if (!mob.nameOverride.isEmpty()) { - writer.putString(mob.nameOverride); - writer.putInt(0); - } else { + writer.putString(mob.firstName); writer.putString(mob.lastName); - } + writer.putInt(0); writer.putInt(0); @@ -706,10 +707,8 @@ public class Mob extends AbstractIntelligenceAgent { else if (guardCaptain.getRank() == 6) rank = MBServerStatics.VETERAN; else rank = MBServerStatics.ELITE; - if (rank.isEmpty()) - mob.nameOverride = pirateName + " " + minionType.getRace() + " " + minionType.getName(); - else - mob.nameOverride = pirateName + " " + minionType.getRace() + " " + rank + " " + minionType.getName(); + mob.firstName = NPC.getPirateName(mob.getMobBaseID()); + mob.lastName = rank + " " + minionType.getRace() + " " + minionType.getName(); } } @@ -717,6 +716,7 @@ public class Mob extends AbstractIntelligenceAgent { // mob.setMob(); mob.isPlayerGuard = true; + DbManager.addToCache(mob); RuneBase guardRune = RuneBase.getRuneBase(252621); @@ -762,7 +762,8 @@ public class Mob extends AbstractIntelligenceAgent { mob.spawnTime = 900; mob.npcOwner = guardCaptain; mob.BehaviourType = Enum.MobBehaviourType.GuardMinion; - + //add mob to zone set of captain + guardCaptain.getParentZone().zoneMobSet.add(mob); return mob; } @@ -887,11 +888,6 @@ public class Mob extends AbstractIntelligenceAgent { this.mana.set(this.manaMax); this.stamina.set(this.staminaMax); - if (!this.nameOverride.isEmpty()) - this.firstName = this.nameOverride; - else - this.firstName = this.mobBase.getFirstName(); - if (isPet) this.setObjectTypeMask(MBServerStatics.MASK_PET | this.getTypeMasks()); @@ -916,7 +912,10 @@ public class Mob extends AbstractIntelligenceAgent { this.charItemManager.load(); //load AI for general mobs. - + if(this.contract != null && NPC.ISWallArcher(this.contract)){ + this.BehaviourType = MobBehaviourType.GuardWallArcher; + this.isPlayerGuard = true; + } if (isPet || isSiege || (isGuard && this.contract == null)) this.currentID = (--Mob.staticID); else this.currentID = this.dbID; @@ -1281,7 +1280,6 @@ public class Mob extends AbstractIntelligenceAgent { public void respawn() { //Commenting out Mob ID rotation. - this.despawned = false; this.playerAgroMap.clear(); this.setCombatTarget(null); @@ -1300,7 +1298,7 @@ public class Mob extends AbstractIntelligenceAgent { this.recalculateStats(); this.setHealth(this.healthMax); - + this.region = BuildingManager.GetRegion(this.building, bindLoc.x, bindLoc.y, bindLoc.z); if (!this.isSiege && !this.isPlayerGuard && contract == null) loadInventory(); } @@ -1987,7 +1985,7 @@ public class Mob extends AbstractIntelligenceAgent { } public String getNameOverride() { - return nameOverride; + return firstName + " " + lastName; } public void processUpgradeMob(PlayerCharacter player) { diff --git a/src/engine/objects/NPC.java b/src/engine/objects/NPC.java index 6971a3eb..a705e08b 100644 --- a/src/engine/objects/NPC.java +++ b/src/engine/objects/NPC.java @@ -87,7 +87,6 @@ public class NPC extends AbstractCharacter { public ArrayList forgedItems = new ArrayList<>(); public HashMap equip = null; - private String nameOverride = ""; private int equipmentSetID = 0; public int runeSetID = 0; @@ -240,8 +239,10 @@ public class NPC extends AbstractCharacter { if (this.upgradeDateTime != null) submitUpgradeJob(); - this.name = this.contract.getName(); - this.nameOverride = rs.getString("npc_name"); + this.name = rs.getString("npc_name"); + if(this.building != null && this.building.getOwner().getObjectType().equals(GameObjectType.PlayerCharacter)){ + this.name += " the " + this.contract.getName(); + } }catch(Exception e){ Logger.error(e); @@ -620,23 +621,8 @@ public class NPC extends AbstractCharacter { writer.putInt(0xFF665EC3); //Spi writer.putInt(0); - if (!npc.nameOverride.isEmpty()){ - writer.putString(npc.nameOverride); - writer.putInt(0); - }else - if (npc.contract != null) { - - if (npc.contract.isTrainer()) { - writer.putString(npc.name + ", " + npc.contract.getName()); - writer.putString(""); - } else { - writer.putString(npc.name); - writer.putString(npc.contract.getName()); - } - } else { - writer.putString(npc.name); - writer.putString(""); - } + writer.putString(npc.name); + writer.putString(""); writer.putInt(0); writer.putInt(0); @@ -1473,7 +1459,7 @@ public class NPC extends AbstractCharacter { } public String getNameOverride() { - return nameOverride; + return name; } public static NPCProfits GetNPCProfits(NPC npc){