// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.objects; import ch.claude_martin.enumbitset.EnumBitSet; import engine.Enum; import engine.Enum.GameObjectType; import engine.Enum.ModType; import engine.Enum.SourceType; import engine.InterestManagement.WorldGrid; import engine.gameManager.ZoneManager; import engine.math.Vector3fImmutable; import engine.mobileAI.Threads.MobAIThread; import engine.net.Dispatch; import engine.net.DispatchMessage; import engine.net.client.msg.PetMsg; import engine.server.MBServerStatics; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; public abstract class AbstractIntelligenceAgent extends AbstractCharacter { protected Vector3fImmutable lastBindLoc; public boolean assist = false; public Enum.AIAgentType agentType = Enum.AIAgentType.MOBILE; public AbstractCharacter guardCaptain; public EnumBitSet notEnemy = EnumBitSet.noneOf(Enum.MonsterType.class); public EnumBitSet enemy = EnumBitSet.noneOf(Enum.MonsterType.class); ; public Enum.MobBehaviourType behaviourType; public ArrayList patrolPoints; public int lastPatrolPointIndex = 0; public long stopPatrolTime = 0; public City guardedCity; public AbstractIntelligenceAgent() { super(); } public AbstractIntelligenceAgent(ResultSet rs) throws SQLException { super(rs); } public AbstractIntelligenceAgent(String firstName, String lastName, short statStrCurrent, short statDexCurrent, short statConCurrent, short statIntCurrent, short statSpiCurrent, short level, int exp, boolean sit, boolean walk, boolean combat, Vector3fImmutable bindLoc, Vector3fImmutable currentLoc, Vector3fImmutable faceDir, short healthCurrent, short manaCurrent, short stamCurrent, Guild guild, byte runningTrains) { super(firstName, lastName, statStrCurrent, statDexCurrent, statConCurrent, statIntCurrent, statSpiCurrent, level, exp, bindLoc, faceDir, guild, runningTrains); } public AbstractIntelligenceAgent(String firstName, String lastName, short statStrCurrent, short statDexCurrent, short statConCurrent, short statIntCurrent, short statSpiCurrent, short level, int exp, boolean sit, boolean walk, boolean combat, Vector3fImmutable bindLoc, Vector3fImmutable currentLoc, Vector3fImmutable faceDir, short healthCurrent, short manaCurrent, short stamCurrent, Guild guild, byte runningTrains, int newUUID) { super(firstName, lastName, statStrCurrent, statDexCurrent, statConCurrent, statIntCurrent, statSpiCurrent, level, exp, bindLoc, currentLoc, faceDir, guild, runningTrains, newUUID); } @Override public void setObjectTypeMask(int mask) { mask |= MBServerStatics.MASK_IAGENT; super.setObjectTypeMask(mask); } /* AI Job Management */ public MobBase getMobBase() { if (this.getObjectType().equals(GameObjectType.Mob)) return this.getMobBase(); return null; } public void setPet(PlayerCharacter owner, boolean summoned) { if (summoned) this.agentType = Enum.AIAgentType.PET; //summoned else this.agentType = Enum.AIAgentType.CHARMED; if (this.getObjectType().equals(GameObjectType.Mob)) { ((Mob) this).guardCaptain = owner; } } public boolean isPet() { return (this.agentType.equals(Enum.AIAgentType.PET) || this.agentType.equals(Enum.AIAgentType.CHARMED)); } public void toggleAssist() { this.assist = !this.assist; } public int getDBID() { if (this.getObjectType().equals(GameObjectType.Mob)) return this.getDBID(); return 0; } public boolean getSafeZone() { ArrayList allIn = ZoneManager.getAllZonesIn(this.getLoc()); for (Zone zone : allIn) if (zone.peace_zone == (byte) 1) return true; return false; } public float getAggroRange() { float ret = MobAIThread.AI_BASE_AGGRO_RANGE; if (this.bonuses != null) ret *= (1 + this.bonuses.getFloatPercentAll(ModType.ScanRange, SourceType.NONE)); return ret; } public void dismiss() { if (this.isPet()) { if ((this.agentType.equals(Enum.AIAgentType.PET))) { //delete summoned pet WorldGrid.RemoveWorldObject(this); if (this.getObjectType() == GameObjectType.Mob) if (((Mob) this).getParentZone() != null) ((Mob) this).getParentZone().zoneMobSet.remove(this); } else { //revert charmed pet this.agentType = Enum.AIAgentType.MOBILE; this.setCombatTarget(null); } // clear owner and set not alive this.isAlive.set(false); PlayerCharacter owner = (PlayerCharacter) this.guardCaptain; //close pet window if (owner != null) { Mob pet = owner.getPet(); PetMsg petMsg = new PetMsg(5, null); Dispatch dispatch = Dispatch.borrow(owner, petMsg); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); if (pet != null && pet.getObjectUUID() == this.getObjectUUID()) owner.setPet(null); if (this.getObjectType().equals(GameObjectType.Mob)) this.guardCaptain = null; } } } }