Merge remote-tracking branch 'origin/master' into feature-hotzone-rolls
This commit is contained in:
@@ -458,7 +458,7 @@ public enum InterestManager implements Runnable {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||||
//MobileFSM.setAwake(awonpc, false);
|
//MobAI.setAwake(awonpc, false);
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
||||||
// awonpc.enableIntelligence();
|
// awonpc.enableIntelligence();
|
||||||
@@ -475,7 +475,7 @@ public enum InterestManager implements Runnable {
|
|||||||
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false);
|
||||||
|
|
||||||
if (awonpc.isMob())
|
if (awonpc.isMob())
|
||||||
//MobileFSM.setAwake(awonpc, false);
|
//MobAI.setAwake(awonpc, false);
|
||||||
((Mob) awonpc).setCombatTarget(null);
|
((Mob) awonpc).setCombatTarget(null);
|
||||||
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
||||||
// awonpc.enableIntelligence();
|
// awonpc.enableIntelligence();
|
||||||
|
|||||||
@@ -1,888 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
package engine.ai;
|
|
||||||
|
|
||||||
import engine.Enum;
|
|
||||||
import engine.Enum.DispatchChannel;
|
|
||||||
import engine.InterestManagement.WorldGrid;
|
|
||||||
import engine.ai.utilities.CombatUtilities;
|
|
||||||
import engine.ai.utilities.MovementUtilities;
|
|
||||||
import engine.gameManager.*;
|
|
||||||
import engine.math.Vector3f;
|
|
||||||
import engine.math.Vector3fImmutable;
|
|
||||||
import engine.net.DispatchMessage;
|
|
||||||
import engine.net.client.msg.PerformActionMsg;
|
|
||||||
import engine.net.client.msg.PowerProjectileMsg;
|
|
||||||
import engine.net.client.msg.UpdateStateMsg;
|
|
||||||
import engine.objects.*;
|
|
||||||
import engine.powers.ActionsBase;
|
|
||||||
import engine.powers.PowersBase;
|
|
||||||
import engine.server.MBServerStatics;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
import static engine.math.FastMath.sqr;
|
|
||||||
|
|
||||||
public class MobileFSM {
|
|
||||||
|
|
||||||
|
|
||||||
private static void AttackTarget(Mob mob, AbstractWorldObject target) {
|
|
||||||
if (mob == null)
|
|
||||||
return;
|
|
||||||
if (target == null || !target.isAlive()) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (target.getObjectType() == Enum.GameObjectType.PlayerCharacter && canCast(mob)) {
|
|
||||||
if (MobCast(mob)) {
|
|
||||||
mob.updateLocation();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!CombatUtilities.inRangeToAttack(mob, target))
|
|
||||||
return;
|
|
||||||
switch (target.getObjectType()) {
|
|
||||||
case PlayerCharacter:
|
|
||||||
PlayerCharacter targetPlayer = (PlayerCharacter) target;
|
|
||||||
AttackPlayer(mob, targetPlayer);
|
|
||||||
break;
|
|
||||||
case Building:
|
|
||||||
Building targetBuilding = (Building) target;
|
|
||||||
AttackBuilding(mob, targetBuilding);
|
|
||||||
break;
|
|
||||||
case Mob:
|
|
||||||
Mob targetMob = (Mob) target;
|
|
||||||
AttackMob(mob, targetMob);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
mob.updateLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AttackPlayer(Mob mob, PlayerCharacter target) {
|
|
||||||
if (!mob.canSee(target)) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.BehaviourType.callsForHelp)
|
|
||||||
MobCallForHelp(mob);
|
|
||||||
if (!MovementUtilities.inRangeDropAggro(mob, target)) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (CombatUtilities.inRange2D(mob, target, mob.getRange())) {
|
|
||||||
//no weapons, default mob attack speed 3 seconds.
|
|
||||||
if (System.currentTimeMillis() < mob.getLastAttackTime())
|
|
||||||
return;
|
|
||||||
// ranged mobs cant attack while running. skip until they finally stop.
|
|
||||||
if (mob.isMoving() && mob.getRange() > 20)
|
|
||||||
return;
|
|
||||||
// add timer for last attack.
|
|
||||||
ItemBase mainHand = mob.getWeaponItemBase(true);
|
|
||||||
ItemBase offHand = mob.getWeaponItemBase(false);
|
|
||||||
if (mainHand == null && offHand == null) {
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, null);
|
|
||||||
int delay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
delay = 11000;
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
|
||||||
} else if (mob.getWeaponItemBase(true) != null) {
|
|
||||||
int delay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
delay = 11000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
|
||||||
} else if (mob.getWeaponItemBase(false) != null) {
|
|
||||||
int attackDelay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
attackDelay = 11000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(target.getPet() != null){
|
|
||||||
if(target.getPet().getCombatTarget() == null && target.getPet().assist() == true){
|
|
||||||
target.getPet().setCombatTarget(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AttackBuilding(Mob mob, Building target) {
|
|
||||||
if (target.getRank() == -1 || !target.isVulnerable() || BuildingManager.getBuildingFromCache(target.getObjectUUID()) == null) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
City playercity = ZoneManager.getCityAtLocation(mob.getLoc());
|
|
||||||
if (playercity != null)
|
|
||||||
for (Mob guard : playercity.getParent().zoneMobSet)
|
|
||||||
if (guard.BehaviourType != null && guard.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal())
|
|
||||||
if (guard.getCombatTarget() == null && !guard.getGuild().equals(mob.getGuild()))
|
|
||||||
guard.setCombatTarget(mob);
|
|
||||||
if (mob.isSiege())
|
|
||||||
MovementManager.sendRWSSMsg(mob);
|
|
||||||
ItemBase mainHand = mob.getWeaponItemBase(true);
|
|
||||||
ItemBase offHand = mob.getWeaponItemBase(false);
|
|
||||||
if (mainHand == null && offHand == null) {
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, null);
|
|
||||||
int delay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
delay = 15000;
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
|
||||||
} else if (mob.getWeaponItemBase(true) != null) {
|
|
||||||
int attackDelay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
attackDelay = 15000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
|
||||||
} else if (mob.getWeaponItemBase(false) != null) {
|
|
||||||
int attackDelay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
attackDelay = 15000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
|
||||||
}
|
|
||||||
if (mob.isSiege()) {
|
|
||||||
PowerProjectileMsg ppm = new PowerProjectileMsg(mob, target);
|
|
||||||
ppm.setRange(50);
|
|
||||||
DispatchMessage.dispatchMsgToInterestArea(mob, ppm, DispatchChannel.SECONDARY, MBServerStatics.CHARACTER_LOAD_RANGE, false, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void AttackMob(Mob mob, Mob target) {
|
|
||||||
if (mob.getRange() >= 30 && mob.isMoving())
|
|
||||||
return;
|
|
||||||
//no weapons, default mob attack speed 3 seconds.
|
|
||||||
ItemBase mainHand = mob.getWeaponItemBase(true);
|
|
||||||
ItemBase offHand = mob.getWeaponItemBase(false);
|
|
||||||
if (mainHand == null && offHand == null) {
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, null);
|
|
||||||
int delay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
delay = 11000;
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + delay);
|
|
||||||
} else if (mob.getWeaponItemBase(true) != null) {
|
|
||||||
int attackDelay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
attackDelay = 11000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, true, mob.getWeaponItemBase(true));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
|
||||||
} else if (mob.getWeaponItemBase(false) != null) {
|
|
||||||
int attackDelay = 3000;
|
|
||||||
if (mob.isSiege())
|
|
||||||
attackDelay = 11000;
|
|
||||||
CombatUtilities.combatCycle(mob, target, false, mob.getWeaponItemBase(false));
|
|
||||||
mob.setLastAttackTime(System.currentTimeMillis() + attackDelay);
|
|
||||||
if(target.combatTarget == null){
|
|
||||||
target.combatTarget = mob;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Patrol(Mob mob) {
|
|
||||||
//make sure mob is out of combat stance
|
|
||||||
if (mob.isCombat() && mob.getCombatTarget() == null) {
|
|
||||||
mob.setCombat(false);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(mob);
|
|
||||||
DispatchMessage.sendToAllInRange(mob, rwss);
|
|
||||||
}
|
|
||||||
int patrolDelay = ThreadLocalRandom.current().nextInt((int) (MobileFSMManager.AI_PATROL_DIVISOR * 0.5f), MobileFSMManager.AI_PATROL_DIVISOR) + MobileFSMManager.AI_PATROL_DIVISOR;
|
|
||||||
if (mob.stopPatrolTime + (patrolDelay * 1000) > System.currentTimeMillis())
|
|
||||||
//early exit while waiting to patrol again
|
|
||||||
return;
|
|
||||||
//guard captains inherit barracks patrol points dynamically
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
|
||||||
Building barracks = mob.building;
|
|
||||||
if (barracks != null && barracks.patrolPoints != null && !barracks.getPatrolPoints().isEmpty()) {
|
|
||||||
mob.patrolPoints = barracks.patrolPoints;
|
|
||||||
} else {
|
|
||||||
randomGuardPatrolPoint(mob);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mob.lastPatrolPointIndex > mob.patrolPoints.size() - 1) {
|
|
||||||
mob.lastPatrolPointIndex = 0;
|
|
||||||
}
|
|
||||||
mob.destination = mob.patrolPoints.get(mob.lastPatrolPointIndex);
|
|
||||||
mob.lastPatrolPointIndex += 1;
|
|
||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
|
||||||
//make sure mob is out of combat stance
|
|
||||||
if (minion.getKey().despawned == false) {
|
|
||||||
if (minion.getKey().isCombat() && minion.getKey().getCombatTarget() == null) {
|
|
||||||
minion.getKey().setCombat(false);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(minion.getKey());
|
|
||||||
DispatchMessage.sendToAllInRange(minion.getKey(), rwss);
|
|
||||||
}
|
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
|
||||||
minion.getKey().updateLocation();
|
|
||||||
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
|
||||||
MovementUtilities.aiMove(minion.getKey(), formationPatrolPoint, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean canCast(Mob mob) {
|
|
||||||
// Performs validation to determine if a
|
|
||||||
// mobile in the proper state to cast.
|
|
||||||
if (mob == null)
|
|
||||||
return false;
|
|
||||||
if (mob.mobPowers.isEmpty())
|
|
||||||
return false;
|
|
||||||
if (!mob.canSee((PlayerCharacter) mob.getCombatTarget())) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int castRoll = ThreadLocalRandom.current().nextInt(101);
|
|
||||||
if(castRoll <= MobileFSMManager.AI_POWER_DIVISOR){
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (mob.nextCastTime == 0)
|
|
||||||
mob.nextCastTime = System.currentTimeMillis();
|
|
||||||
|
|
||||||
return mob.nextCastTime <= System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean MobCast(Mob mob) {
|
|
||||||
// Method picks a random spell from a mobile's list of powers
|
|
||||||
// and casts it on the current target (or itself). Validation
|
|
||||||
// (including empty lists) is done previously within canCast();
|
|
||||||
|
|
||||||
ArrayList<Integer> powerTokens;
|
|
||||||
ArrayList<Integer> purgeTokens;
|
|
||||||
PlayerCharacter target = (PlayerCharacter) mob.getCombatTarget();
|
|
||||||
if (mob.BehaviourType.callsForHelp)
|
|
||||||
MobCallForHelp(mob);
|
|
||||||
// Generate a list of tokens from the mob powers for this mobile.
|
|
||||||
powerTokens = new ArrayList<>(mob.mobPowers.keySet());
|
|
||||||
purgeTokens = new ArrayList<>();
|
|
||||||
// If player has this effect on them currently then remove
|
|
||||||
// this token from our list.
|
|
||||||
for (int powerToken : powerTokens) {
|
|
||||||
PowersBase powerBase = PowersManager.getPowerByToken(powerToken);
|
|
||||||
for (ActionsBase actionBase : powerBase.getActions()) {
|
|
||||||
String stackType = actionBase.stackType;
|
|
||||||
if (target.getEffects() != null && target.getEffects().containsKey(stackType))
|
|
||||||
purgeTokens.add(powerToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
powerTokens.removeAll(purgeTokens);
|
|
||||||
// Sanity check
|
|
||||||
if (powerTokens.isEmpty())
|
|
||||||
return false;
|
|
||||||
// Pick random spell from our list of powers
|
|
||||||
int powerToken = powerTokens.get(ThreadLocalRandom.current().nextInt(powerTokens.size()));
|
|
||||||
int powerRank = mob.mobPowers.get(powerToken);
|
|
||||||
PowersBase mobPower = PowersManager.getPowerByToken(powerToken);
|
|
||||||
//check for hit-roll
|
|
||||||
if (mobPower.requiresHitRoll) {
|
|
||||||
if (CombatUtilities.triggerDefense(mob, mob.getCombatTarget())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (CombatUtilities.triggerDodge(mob, mob.getCombatTarget())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (CombatUtilities.triggerBlock(mob, mob.getCombatTarget())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (CombatUtilities.triggerParry(mob, mob.getCombatTarget())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Cast the spell
|
|
||||||
if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mobPower.getRange())) {
|
|
||||||
PowersManager.useMobPower(mob, (AbstractCharacter) mob.getCombatTarget(), mobPower, powerRank);
|
|
||||||
PerformActionMsg msg;
|
|
||||||
if (!mobPower.isHarmful() || mobPower.targetSelf)
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, mob);
|
|
||||||
else
|
|
||||||
msg = PowersManager.createPowerMsg(mobPower, powerRank, mob, target);
|
|
||||||
msg.setUnknown04(2);
|
|
||||||
PowersManager.finishUseMobPower(msg, mob, 0, 0);
|
|
||||||
// Default minimum seconds between cast = 10
|
|
||||||
float randomCooldown = (ThreadLocalRandom.current().nextInt(150) + 100) * 0.01f;
|
|
||||||
mob.nextCastTime = System.currentTimeMillis() + (long)((mobPower.getCooldown() + (MobileFSMManager.AI_POWER_DIVISOR * 1000)) * randomCooldown);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void MobCallForHelp(Mob mob) {
|
|
||||||
boolean callGotResponse = false;
|
|
||||||
if (mob.nextCallForHelp == 0) {
|
|
||||||
mob.nextCallForHelp = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
if (mob.nextCallForHelp < System.currentTimeMillis())
|
|
||||||
return;
|
|
||||||
//mob sends call for help message
|
|
||||||
ChatManager.chatSayInfo(null, mob.getName() + " calls for help!");
|
|
||||||
Zone mobCamp = mob.getParentZone();
|
|
||||||
for (Mob helper : mobCamp.zoneMobSet) {
|
|
||||||
if (helper.BehaviourType.respondsToCallForHelp && helper.BehaviourType.BehaviourHelperType.equals(mob.BehaviourType)) {
|
|
||||||
helper.setCombatTarget(mob.getCombatTarget());
|
|
||||||
callGotResponse = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (callGotResponse)
|
|
||||||
//wait 60 seconds to call for help again
|
|
||||||
mob.nextCallForHelp = System.currentTimeMillis() + 60000;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void DetermineAction(Mob mob) {
|
|
||||||
//always check the respawn que, respawn 1 mob max per second to not flood the client
|
|
||||||
|
|
||||||
if (mob == null)
|
|
||||||
return;
|
|
||||||
if (mob.despawned && mob.getMobBase().getLoadID() == 13171) {
|
|
||||||
//trebuchet spawn handler
|
|
||||||
CheckForRespawn(mob);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.despawned && mob.isPlayerGuard) {
|
|
||||||
//override for guards
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) {
|
|
||||||
if (mob.npcOwner.isAlive() == false || ((Mob) mob.npcOwner).despawned == true) {
|
|
||||||
//minions don't respawn while guard captain is dead
|
|
||||||
if (mob.isAlive() == false) {
|
|
||||||
mob.deathTime = System.currentTimeMillis();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CheckForRespawn(mob);
|
|
||||||
//check to send mob home for player guards to prevent exploit of dragging guards away and then teleporting
|
|
||||||
if(mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()){
|
|
||||||
CheckToSendMobHome(mob);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!mob.isAlive()) {
|
|
||||||
//no need to continue if mob is dead, check for respawn and move on
|
|
||||||
CheckForRespawn(mob);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.playerAgroMap.isEmpty() && mob.isPlayerGuard == false && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
|
|
||||||
//no players loaded, no need to proceed
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.isCombat() && mob.getCombatTarget() == null) {
|
|
||||||
mob.setCombat(false);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(mob);
|
|
||||||
DispatchMessage.sendToAllInRange(mob, rwss);
|
|
||||||
}
|
|
||||||
if(mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
|
|
||||||
CheckToSendMobHome(mob);
|
|
||||||
}
|
|
||||||
if (mob.combatTarget != null) {
|
|
||||||
if(mob.getCombatTarget().isAlive() == false){
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mob.getCombatTarget().getObjectTypeMask() == MBServerStatics.MASK_PLAYER){
|
|
||||||
if(mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false){
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(mob.canSee((PlayerCharacter)mob.getCombatTarget()) == false) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//if(mob.getTimestamps().containsKey("LOCATIONSYNC") == false){
|
|
||||||
// mob.getTimestamps().put("LOCATIONSYNC",System.currentTimeMillis());
|
|
||||||
//}
|
|
||||||
switch (mob.BehaviourType) {
|
|
||||||
case GuardCaptain:
|
|
||||||
GuardCaptainLogic(mob);
|
|
||||||
break;
|
|
||||||
case GuardMinion:
|
|
||||||
GuardMinionLogic(mob);
|
|
||||||
break;
|
|
||||||
case GuardWallArcher:
|
|
||||||
GuardWallArcherLogic(mob);
|
|
||||||
break;
|
|
||||||
case Pet1:
|
|
||||||
PetLogic(mob);
|
|
||||||
break;
|
|
||||||
case HamletGuard:
|
|
||||||
HamletGuardLogic(mob);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DefaultLogic(mob);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckForAggro(Mob aiAgent) {
|
|
||||||
//looks for and sets mobs combatTarget
|
|
||||||
if (!aiAgent.isAlive())
|
|
||||||
return;
|
|
||||||
ConcurrentHashMap<Integer, Boolean> loadedPlayers = aiAgent.playerAgroMap;
|
|
||||||
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
|
||||||
int playerID = (int) playerEntry.getKey();
|
|
||||||
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
|
|
||||||
//Player is null, let's remove them from the list.
|
|
||||||
if (loadedPlayer == null) {
|
|
||||||
loadedPlayers.remove(playerID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
|
||||||
if (!loadedPlayer.isAlive()) {
|
|
||||||
loadedPlayers.remove(playerID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//Can't see target, skip aggro.
|
|
||||||
if (!aiAgent.canSee(loadedPlayer))
|
|
||||||
continue;
|
|
||||||
// No aggro for this race type
|
|
||||||
if (aiAgent.notEnemy.size() > 0 && aiAgent.notEnemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == true)
|
|
||||||
continue;
|
|
||||||
//mob has enemies and this player race is not it
|
|
||||||
if(aiAgent.enemy.size() > 0 && aiAgent.enemy.contains(loadedPlayer.getRace().getRaceType().getMonsterType()) == false){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (MovementUtilities.inRangeToAggro(aiAgent, loadedPlayer)) {
|
|
||||||
aiAgent.setCombatTarget(loadedPlayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(aiAgent.combatTarget == null) {
|
|
||||||
//look for pets to aggro if no players found to aggro
|
|
||||||
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(aiAgent, MobileFSMManager.AI_BASE_AGGRO_RANGE, MBServerStatics.MASK_PET);
|
|
||||||
for (AbstractWorldObject awoMob : awoList) {
|
|
||||||
//dont scan self.
|
|
||||||
if (aiAgent.equals(awoMob))
|
|
||||||
continue;
|
|
||||||
Mob aggroMob = (Mob) awoMob;
|
|
||||||
aiAgent.setCombatTarget(aggroMob);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckMobMovement(Mob mob) {
|
|
||||||
if (!MovementUtilities.canMove(mob))
|
|
||||||
return;
|
|
||||||
mob.updateLocation();
|
|
||||||
switch (mob.BehaviourType) {
|
|
||||||
case Pet1:
|
|
||||||
if(mob.getOwner() == null){
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!mob.playerAgroMap.containsKey(mob.getOwner().getObjectUUID())) {
|
|
||||||
//mob no longer has its owner loaded, translocate pet to owner
|
|
||||||
MovementManager.translocate(mob, mob.getOwner().getLoc(), null);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
//move back to owner
|
|
||||||
if (CombatUtilities.inRange2D(mob, mob.getOwner(), 6))
|
|
||||||
return;
|
|
||||||
mob.destination = mob.getOwner().getLoc();
|
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, 5);
|
|
||||||
} else
|
|
||||||
chaseTarget(mob);
|
|
||||||
break;
|
|
||||||
case GuardMinion:
|
|
||||||
if (!mob.npcOwner.isAlive() || ((Mob) mob.npcOwner).despawned)
|
|
||||||
randomGuardPatrolPoint(mob);
|
|
||||||
else {
|
|
||||||
if (mob.getCombatTarget() != null) {
|
|
||||||
chaseTarget(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
if (!mob.isMoving()) {
|
|
||||||
Patrol(mob);
|
|
||||||
} else {
|
|
||||||
mob.stopPatrolTime = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
chaseTarget(mob);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckForRespawn(Mob aiAgent) {
|
|
||||||
if (aiAgent.deathTime == 0) {
|
|
||||||
aiAgent.setDeathTime(System.currentTimeMillis());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//handles checking for respawn of dead mobs even when no players have mob loaded
|
|
||||||
//Despawn Timer with Loot currently in inventory.
|
|
||||||
if (!aiAgent.despawned) {
|
|
||||||
if (aiAgent.getCharItemManager().getInventoryCount() > 0) {
|
|
||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_WITH_LOOT) {
|
|
||||||
aiAgent.despawn();
|
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//No items in inventory.
|
|
||||||
} else {
|
|
||||||
//Mob's Loot has been looted.
|
|
||||||
if (aiAgent.isHasLoot()) {
|
|
||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER_ONCE_LOOTED) {
|
|
||||||
aiAgent.despawn();
|
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//Mob never had Loot.
|
|
||||||
} else {
|
|
||||||
if (System.currentTimeMillis() > aiAgent.deathTime + MBServerStatics.DESPAWN_TIMER) {
|
|
||||||
aiAgent.despawn();
|
|
||||||
aiAgent.deathTime = System.currentTimeMillis();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (System.currentTimeMillis() > (aiAgent.deathTime + (aiAgent.spawnTime * 1000))) {
|
|
||||||
//aiAgent.respawn();
|
|
||||||
aiAgent.getParentZone().respawnQue.add(aiAgent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void CheckForAttack(Mob mob) {
|
|
||||||
//checks if mob can attack based on attack timer and range
|
|
||||||
if (mob.isAlive() == false)
|
|
||||||
return;
|
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter) && MovementUtilities.inRangeDropAggro(mob, (PlayerCharacter) mob.getCombatTarget()) == false && mob.BehaviourType.ordinal() != Enum.MobBehaviourType.Pet1.ordinal()) {
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
if (mob.isCombat()) {
|
|
||||||
mob.setCombat(false);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(mob);
|
|
||||||
DispatchMessage.sendToAllInRange(mob, rwss);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!mob.isCombat()) {
|
|
||||||
mob.setCombat(true);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(mob);
|
|
||||||
DispatchMessage.sendToAllInRange(mob, rwss);
|
|
||||||
}
|
|
||||||
if (System.currentTimeMillis() > mob.getLastAttackTime())
|
|
||||||
AttackTarget(mob, mob.getCombatTarget());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void CheckToSendMobHome(Mob mob) {
|
|
||||||
if (mob.BehaviourType.isAgressive) {
|
|
||||||
if (mob.isPlayerGuard()) {
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
|
||||||
CheckForPlayerGuardAggro(mob);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
CheckForAggro(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (mob.getCombatTarget() != null && CombatUtilities.inRange2D(mob, mob.getCombatTarget(), MobileFSMManager.AI_BASE_AGGRO_RANGE * 0.5f)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (mob.isPlayerGuard() && !mob.despawned) {
|
|
||||||
City current = ZoneManager.getCityAtLocation(mob.getLoc());
|
|
||||||
if (current == null || current.equals(mob.getGuild().getOwnedCity()) == false) {
|
|
||||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
|
||||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal() && mob.isAlive()) {
|
|
||||||
//guard captain pulls his minions home with him
|
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
|
||||||
PowersManager.useMobPower(minion.getKey(), minion.getKey(), recall, 40);
|
|
||||||
minion.getKey().setCombatTarget(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (MovementUtilities.inRangeOfBindLocation(mob) == false) {
|
|
||||||
|
|
||||||
PowersBase recall = PowersManager.getPowerByToken(-1994153779);
|
|
||||||
PowersManager.useMobPower(mob, mob, recall, 40);
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
for (Entry playerEntry : mob.playerAgroMap.entrySet()) {
|
|
||||||
PlayerCharacter.getFromCache((int) playerEntry.getKey()).setHateValue(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void chaseTarget(Mob mob) {
|
|
||||||
mob.updateMovementState();
|
|
||||||
mob.updateLocation();
|
|
||||||
if (CombatUtilities.inRange2D(mob, mob.getCombatTarget(), mob.getRange()) == false) {
|
|
||||||
if (mob.getRange() > 15) {
|
|
||||||
mob.destination = mob.getCombatTarget().getLoc();
|
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, 0);
|
|
||||||
} else {
|
|
||||||
//check if building
|
|
||||||
switch (mob.getCombatTarget().getObjectType()) {
|
|
||||||
case PlayerCharacter:
|
|
||||||
case Mob:
|
|
||||||
mob.destination = MovementUtilities.GetDestinationToCharacter(mob, (AbstractCharacter) mob.getCombatTarget());
|
|
||||||
MovementUtilities.moveToLocation(mob, mob.destination, mob.getRange());
|
|
||||||
break;
|
|
||||||
case Building:
|
|
||||||
mob.destination = mob.getCombatTarget().getLoc();
|
|
||||||
MovementUtilities.moveToLocation(mob,mob.getCombatTarget().getLoc(),0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void SafeGuardAggro(Mob mob) {
|
|
||||||
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(mob, 100, MBServerStatics.MASK_MOB);
|
|
||||||
for (AbstractWorldObject awoMob : awoList) {
|
|
||||||
//dont scan self.
|
|
||||||
if (mob.equals(awoMob) || mob.isGuard() == true)
|
|
||||||
continue;
|
|
||||||
Mob aggroMob = (Mob) awoMob;
|
|
||||||
//dont attack other guards
|
|
||||||
if (aggroMob.isGuard())
|
|
||||||
continue;
|
|
||||||
if (mob.getLoc().distanceSquared2D(aggroMob.getLoc()) > sqr(50))
|
|
||||||
continue;
|
|
||||||
mob.setCombatTarget(aggroMob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GuardCaptainLogic(Mob mob) {
|
|
||||||
if (mob.getCombatTarget() == null)
|
|
||||||
CheckForPlayerGuardAggro(mob);
|
|
||||||
CheckMobMovement(mob);
|
|
||||||
CheckForAttack(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GuardMinionLogic(Mob mob) {
|
|
||||||
if (!mob.npcOwner.isAlive() && mob.getCombatTarget() == null) {
|
|
||||||
CheckForPlayerGuardAggro(mob);
|
|
||||||
}
|
|
||||||
if (mob.npcOwner.getCombatTarget() != null)
|
|
||||||
mob.setCombatTarget(mob.npcOwner.getCombatTarget());
|
|
||||||
else
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
CheckMobMovement(mob);
|
|
||||||
CheckForAttack(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void GuardWallArcherLogic(Mob mob) {
|
|
||||||
if (mob.getCombatTarget() == null)
|
|
||||||
CheckForPlayerGuardAggro(mob);
|
|
||||||
else
|
|
||||||
CheckForAttack(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void PetLogic(Mob mob) {
|
|
||||||
if(mob.getOwner() == null && mob.isNecroPet() == false && mob.isSiege() == false){
|
|
||||||
if(ZoneManager.getSeaFloor().zoneMobSet.contains(mob)){
|
|
||||||
mob.killCharacter("no owner");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (MovementUtilities.canMove(mob) && mob.BehaviourType.canRoam)
|
|
||||||
CheckMobMovement(mob);
|
|
||||||
CheckForAttack(mob);
|
|
||||||
//recover health
|
|
||||||
if(mob.getTimestamps().containsKey("HEALTHRECOVERED") == false){
|
|
||||||
mob.getTimestamps().put("HEALTHRECOVERED", System.currentTimeMillis());
|
|
||||||
}
|
|
||||||
if(mob.isSit() && mob.getTimeStamp("HEALTHRECOVERED") < System.currentTimeMillis() + 3000){
|
|
||||||
if(mob.getHealth() < mob.getHealthMax()) {
|
|
||||||
float recoveredHealth = mob.getHealthMax() * ((1 + mob.getBonuses().getFloatPercentAll(Enum.ModType.HealthRecoverRate, Enum.SourceType.None))* 0.01f);
|
|
||||||
mob.setHealth(mob.getHealth() + recoveredHealth);
|
|
||||||
mob.getTimestamps().put("HEALTHRECOVERED",System.currentTimeMillis());
|
|
||||||
if(mob.getHealth() > mob.getHealthMax()){
|
|
||||||
mob.setHealth(mob.getHealthMax());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void HamletGuardLogic(Mob mob) {
|
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
//safehold guard
|
|
||||||
SafeGuardAggro(mob);
|
|
||||||
} else {
|
|
||||||
if (mob.combatTarget.isAlive() == false) {
|
|
||||||
SafeGuardAggro(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CheckForAttack(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void DefaultLogic(Mob mob) {
|
|
||||||
//check for players that can be aggroed if mob is agressive and has no target
|
|
||||||
if(mob.getCombatTarget() != null && mob.playerAgroMap.containsKey(mob.getCombatTarget().getObjectUUID()) == false){
|
|
||||||
mob.setCombatTarget(null);
|
|
||||||
}
|
|
||||||
if (mob.BehaviourType.isAgressive) {
|
|
||||||
AbstractWorldObject newTarget = ChangeTargetFromHateValue(mob);
|
|
||||||
if (newTarget != null) {
|
|
||||||
mob.setCombatTarget(newTarget);
|
|
||||||
} else {
|
|
||||||
if (mob.getCombatTarget() == null) {
|
|
||||||
if (mob.BehaviourType == Enum.MobBehaviourType.HamletGuard)
|
|
||||||
//safehold guard
|
|
||||||
SafeGuardAggro(mob);
|
|
||||||
else
|
|
||||||
//normal aggro
|
|
||||||
CheckForAggro(mob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//check if mob can move for patrol or moving to target
|
|
||||||
if (mob.BehaviourType.canRoam)
|
|
||||||
CheckMobMovement(mob);
|
|
||||||
//check if mob can attack if it isn't wimpy
|
|
||||||
if (!mob.BehaviourType.isWimpy && mob.combatTarget != null)
|
|
||||||
CheckForAttack(mob);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void CheckForPlayerGuardAggro(Mob mob) {
|
|
||||||
//looks for and sets mobs combatTarget
|
|
||||||
if (!mob.isAlive())
|
|
||||||
return;
|
|
||||||
ConcurrentHashMap<Integer, Boolean> loadedPlayers = mob.playerAgroMap;
|
|
||||||
for (Entry playerEntry : loadedPlayers.entrySet()) {
|
|
||||||
int playerID = (int) playerEntry.getKey();
|
|
||||||
PlayerCharacter loadedPlayer = PlayerCharacter.getFromCache(playerID);
|
|
||||||
//Player is null, let's remove them from the list.
|
|
||||||
if (loadedPlayer == null) {
|
|
||||||
loadedPlayers.remove(playerID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//Player is Dead, Mob no longer needs to attempt to aggro. Remove them from aggro map.
|
|
||||||
if (!loadedPlayer.isAlive()) {
|
|
||||||
loadedPlayers.remove(playerID);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
//Can't see target, skip aggro.
|
|
||||||
if (!mob.canSee(loadedPlayer))
|
|
||||||
continue;
|
|
||||||
// No aggro for this player
|
|
||||||
if (GuardCanAggro(mob, loadedPlayer) == false)
|
|
||||||
continue;
|
|
||||||
if (MovementUtilities.inRangeToAggro(mob, loadedPlayer)) {
|
|
||||||
mob.setCombatTarget(loadedPlayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Boolean GuardCanAggro(Mob mob, PlayerCharacter target) {
|
|
||||||
if (mob.getGuild().getNation().equals(target.getGuild().getNation()))
|
|
||||||
return false;
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardMinion.ordinal()) {
|
|
||||||
if (((Mob) mob.npcOwner).building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
} else if (mob.building.getCity().cityOutlaws.contains(target.getObjectUUID()) == true) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//first check condemn list for aggro allowed (allies button is checked)
|
|
||||||
if (ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().reverseKOS) {
|
|
||||||
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) {
|
|
||||||
if (entry.getValue().getPlayerUID() == target.getObjectUUID() && entry.getValue().isActive())
|
|
||||||
//target is listed individually
|
|
||||||
return false;
|
|
||||||
if (Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild())
|
|
||||||
//target's guild is listed
|
|
||||||
return false;
|
|
||||||
if (Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild().getNation())
|
|
||||||
//target's nation is listed
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
//allies button is not checked
|
|
||||||
for (Entry<Integer, Condemned> entry : ZoneManager.getCityAtLocation(mob.getLoc()).getTOL().getCondemned().entrySet()) {
|
|
||||||
if (entry.getValue().getPlayerUID() == target.getObjectUUID() && entry.getValue().isActive())
|
|
||||||
//target is listed individually
|
|
||||||
return true;
|
|
||||||
if (Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild())
|
|
||||||
//target's guild is listed
|
|
||||||
return true;
|
|
||||||
if (Guild.getGuild(entry.getValue().getGuildUID()) == target.getGuild().getNation())
|
|
||||||
//target's nation is listed
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void randomGuardPatrolPoint(Mob mob) {
|
|
||||||
if (mob.isMoving() == true) {
|
|
||||||
//early exit for a mob who is already moving to a patrol point
|
|
||||||
//while mob moving, update lastPatrolTime so that when they stop moving the 10 second timer can begin
|
|
||||||
mob.stopPatrolTime = System.currentTimeMillis();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//wait between 10 and 15 seconds after reaching patrol point before moving
|
|
||||||
int patrolDelay = ThreadLocalRandom.current().nextInt(10000) + 5000;
|
|
||||||
if (mob.stopPatrolTime + patrolDelay > System.currentTimeMillis())
|
|
||||||
//early exit while waiting to patrol again
|
|
||||||
return;
|
|
||||||
float xPoint = ThreadLocalRandom.current().nextInt(400) - 200;
|
|
||||||
float zPoint = ThreadLocalRandom.current().nextInt(400) - 200;
|
|
||||||
Vector3fImmutable TreePos = mob.getGuild().getOwnedCity().getLoc();
|
|
||||||
mob.destination = new Vector3fImmutable(TreePos.x + xPoint, TreePos.y, TreePos.z + zPoint);
|
|
||||||
MovementUtilities.aiMove(mob, mob.destination, true);
|
|
||||||
if (mob.BehaviourType.ordinal() == Enum.MobBehaviourType.GuardCaptain.ordinal()) {
|
|
||||||
for (Entry<Mob, Integer> minion : mob.siegeMinionMap.entrySet()) {
|
|
||||||
//make sure mob is out of combat stance
|
|
||||||
if (minion.getKey().despawned == false) {
|
|
||||||
if (minion.getKey().isCombat() && minion.getKey().getCombatTarget() == null) {
|
|
||||||
minion.getKey().setCombat(false);
|
|
||||||
UpdateStateMsg rwss = new UpdateStateMsg();
|
|
||||||
rwss.setPlayer(minion.getKey());
|
|
||||||
DispatchMessage.sendToAllInRange(minion.getKey(), rwss);
|
|
||||||
}
|
|
||||||
if (MovementUtilities.canMove(minion.getKey())) {
|
|
||||||
Vector3f minionOffset = Formation.getOffset(2, minion.getValue() + 3);
|
|
||||||
minion.getKey().updateLocation();
|
|
||||||
Vector3fImmutable formationPatrolPoint = new Vector3fImmutable(mob.destination.x + minionOffset.x, mob.destination.y, mob.destination.z + minionOffset.z);
|
|
||||||
MovementUtilities.aiMove(minion.getKey(), formationPatrolPoint, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AbstractWorldObject ChangeTargetFromHateValue(Mob mob) {
|
|
||||||
float CurrentHateValue = 0;
|
|
||||||
if (mob.getCombatTarget() != null && mob.getCombatTarget().getObjectType().equals(Enum.GameObjectType.PlayerCharacter)) {
|
|
||||||
CurrentHateValue = ((PlayerCharacter) mob.getCombatTarget()).getHateValue();
|
|
||||||
}
|
|
||||||
AbstractWorldObject mostHatedTarget = null;
|
|
||||||
for (Entry playerEntry : mob.playerAgroMap.entrySet()) {
|
|
||||||
PlayerCharacter potentialTarget = PlayerCharacter.getFromCache((int) playerEntry.getKey());
|
|
||||||
if (potentialTarget.equals(mob.getCombatTarget())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (potentialTarget != null && potentialTarget.getHateValue() > CurrentHateValue && MovementUtilities.inRangeToAggro(mob, potentialTarget)) {
|
|
||||||
CurrentHateValue = potentialTarget.getHateValue();
|
|
||||||
mostHatedTarget = potentialTarget;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mostHatedTarget;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,128 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.ai;
|
|
||||||
|
|
||||||
import engine.gameManager.ConfigManager;
|
|
||||||
import engine.gameManager.ZoneManager;
|
|
||||||
import engine.objects.Mob;
|
|
||||||
import engine.objects.Zone;
|
|
||||||
import engine.util.ThreadUtils;
|
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
|
|
||||||
import java.time.Duration;
|
|
||||||
import java.time.Instant;
|
|
||||||
|
|
||||||
|
|
||||||
public class MobileFSMManager {
|
|
||||||
|
|
||||||
private static final MobileFSMManager INSTANCE = new MobileFSMManager();
|
|
||||||
public static Duration executionTime = Duration.ofNanos(1);
|
|
||||||
public static Duration executionMax = Duration.ofNanos(1);
|
|
||||||
//AI variables moved form mb_server_statics
|
|
||||||
public static int AI_BASE_AGGRO_RANGE = 60;
|
|
||||||
public static int AI_DROP_AGGRO_RANGE = 60;
|
|
||||||
public static int AI_RECALL_RANGE = 400;
|
|
||||||
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
|
||||||
public static int AI_THREAD_SLEEP = 1000;
|
|
||||||
public static int AI_PATROL_DIVISOR = 15;
|
|
||||||
public static int AI_POWER_DIVISOR = 20;
|
|
||||||
public static float AI_MAX_ANGLE = 10f;
|
|
||||||
private volatile boolean alive;
|
|
||||||
private long timeOfKill = -1;
|
|
||||||
|
|
||||||
|
|
||||||
private MobileFSMManager() {
|
|
||||||
|
|
||||||
Runnable worker = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
execution();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
alive = true;
|
|
||||||
|
|
||||||
//assign the AI varibales base don difficulty scaling from config file:
|
|
||||||
|
|
||||||
float difficulty = Float.parseFloat(ConfigManager.MB_AI_AGGRO_RANGE.getValue());
|
|
||||||
AI_BASE_AGGRO_RANGE = (int) (100 * difficulty); // range at which aggressive mobs will attack you
|
|
||||||
|
|
||||||
difficulty = Float.parseFloat(ConfigManager.MB_AI_CAST_FREQUENCY.getValue());
|
|
||||||
AI_POWER_DIVISOR = (int) (20 * (1.5f - difficulty)); //duration between mob casts
|
|
||||||
|
|
||||||
Thread t = new Thread(worker, "MobileFSMManager");
|
|
||||||
t.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static MobileFSMManager getInstance() {
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stops the MobileFSMManager
|
|
||||||
*/
|
|
||||||
public void shutdown() {
|
|
||||||
if (alive) {
|
|
||||||
alive = false;
|
|
||||||
timeOfKill = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isAlive() {
|
|
||||||
return this.alive;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void execution() {
|
|
||||||
|
|
||||||
//Load zone threshold once.
|
|
||||||
|
|
||||||
long mobPulse = System.currentTimeMillis() + AI_PULSE_MOB_THRESHOLD;
|
|
||||||
Instant startTime;
|
|
||||||
|
|
||||||
while (alive) {
|
|
||||||
|
|
||||||
ThreadUtils.sleep(1);
|
|
||||||
|
|
||||||
if (System.currentTimeMillis() > mobPulse) {
|
|
||||||
|
|
||||||
startTime = Instant.now();
|
|
||||||
|
|
||||||
for (Zone zone : ZoneManager.getAllZones()) {
|
|
||||||
|
|
||||||
if(zone.respawnQue.size() > 0 && zone.lastRespawn + 100 < System.currentTimeMillis()){
|
|
||||||
zone.respawnQue.get(0).respawn();
|
|
||||||
zone.respawnQue.remove(0);
|
|
||||||
zone.lastRespawn = System.currentTimeMillis();
|
|
||||||
}
|
|
||||||
for (Mob mob : zone.zoneMobSet) {
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (mob != null)
|
|
||||||
MobileFSM.DetermineAction(mob);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
executionTime = Duration.between(startTime, Instant.now());
|
|
||||||
|
|
||||||
if (executionTime.compareTo(executionMax) > 0)
|
|
||||||
executionMax = executionTime;
|
|
||||||
|
|
||||||
mobPulse = System.currentTimeMillis() + AI_PULSE_MOB_THRESHOLD;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.ai.utilities;
|
|
||||||
|
|
||||||
public class PowerUtilities {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,6 @@
|
|||||||
package engine.db.handlers;
|
package engine.db.handlers;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.ai.MobileFSMManager;
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.objects.MobBase;
|
import engine.objects.MobBase;
|
||||||
import engine.objects.MobBaseEffects;
|
import engine.objects.MobBaseEffects;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds;
|
package engine.devcmd.cmds;
|
||||||
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
import engine.devcmd.AbstractDevCmd;
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.devcmd.cmds;
|
|
||||||
|
|
||||||
import engine.ai.MobileFSMManager;
|
|
||||||
import engine.devcmd.AbstractDevCmd;
|
|
||||||
import engine.gameManager.SimulationManager;
|
|
||||||
import engine.objects.AbstractGameObject;
|
|
||||||
import engine.objects.PlayerCharacter;
|
|
||||||
|
|
||||||
public class HeartbeatCmd extends AbstractDevCmd {
|
|
||||||
|
|
||||||
public HeartbeatCmd() {
|
|
||||||
super("heartbeat");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void _doCmd(PlayerCharacter pc, String[] words,
|
|
||||||
AbstractGameObject target) {
|
|
||||||
|
|
||||||
this.throwbackInfo(pc, "Heartbeat : " + SimulationManager.executionTime.toMillis() + "ms");
|
|
||||||
this.throwbackInfo(pc, "Heartbeat Max: " + SimulationManager.executionMax.toMillis() + "ms");
|
|
||||||
|
|
||||||
this.throwbackInfo(pc, "FSM: " + MobileFSMManager.executionTime.toMillis() + "ms");
|
|
||||||
this.throwbackInfo(pc, "FSM max: " + MobileFSMManager.executionMax.toMillis() + "ms");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getHelpString() {
|
|
||||||
return "Displays simulation metrics";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String _getUsageString() {
|
|
||||||
return "' ./heartbeat";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -135,7 +135,6 @@ public enum DevCmdManager {
|
|||||||
DevCmdManager.registerDevCmd(new SetNpcEquipSetCmd());
|
DevCmdManager.registerDevCmd(new SetNpcEquipSetCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetBuildingAltitudeCmd());
|
DevCmdManager.registerDevCmd(new SetBuildingAltitudeCmd());
|
||||||
DevCmdManager.registerDevCmd(new ResetLevelCmd());
|
DevCmdManager.registerDevCmd(new ResetLevelCmd());
|
||||||
DevCmdManager.registerDevCmd(new HeartbeatCmd());
|
|
||||||
DevCmdManager.registerDevCmd(new SetNpcNameCmd());
|
DevCmdManager.registerDevCmd(new SetNpcNameCmd());
|
||||||
DevCmdManager.registerDevCmd(new SetNpcMobbaseCmd());
|
DevCmdManager.registerDevCmd(new SetNpcMobbaseCmd());
|
||||||
DevCmdManager.registerDevCmd(new DespawnCmd());
|
DevCmdManager.registerDevCmd(new DespawnCmd());
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.jobs;
|
package engine.jobs;
|
||||||
|
|
||||||
import engine.Enum.DoorState;
|
import engine.Enum.DoorState;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,46 @@
|
|||||||
|
package engine.mobileAI.Threads;
|
||||||
|
|
||||||
|
import engine.mobileAI.MobAI;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
|
import engine.objects.Mob;
|
||||||
|
import engine.objects.Zone;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
public class MobAIThread implements Runnable{
|
||||||
|
public static int AI_BASE_AGGRO_RANGE = 60;
|
||||||
|
public static int AI_DROP_AGGRO_RANGE = 60;
|
||||||
|
public static int AI_PULSE_MOB_THRESHOLD = 200;
|
||||||
|
public static int AI_PATROL_DIVISOR = 15;
|
||||||
|
public static int AI_POWER_DIVISOR = 20;
|
||||||
|
// Thread constructor
|
||||||
|
|
||||||
|
public MobAIThread() {
|
||||||
|
Logger.info(" MobAIThread thread has started!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (true) {
|
||||||
|
for (Zone zone : ZoneManager.getAllZones()) {
|
||||||
|
|
||||||
|
for (Mob mob : zone.zoneMobSet) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mob != null)
|
||||||
|
MobAI.DetermineAction(mob);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error("Mob: " + mob.getName() + " UUID: " + mob.getObjectUUID() + " ERROR: " + e);
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void startAIThread() {
|
||||||
|
Thread aiThread;
|
||||||
|
aiThread = new Thread(new MobAIThread());
|
||||||
|
aiThread.setName("aiThread");
|
||||||
|
aiThread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||||
|
// Magicbane Emulator Project © 2013 - 2022
|
||||||
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
|
package engine.mobileAI.Threads;
|
||||||
|
import engine.gameManager.ZoneManager;
|
||||||
|
import engine.objects.Mob;
|
||||||
|
import engine.objects.Zone;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thread blocks until MagicBane dispatch messages are
|
||||||
|
* enqueued then processes them in FIFO order. The collection
|
||||||
|
* is thread safe.
|
||||||
|
* <p>
|
||||||
|
* Any large messages not time sensitive such as load object
|
||||||
|
* sent to more than a single individual should be spawned
|
||||||
|
* individually on a DispatchMessageThread.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class MobRespawnThread implements Runnable {
|
||||||
|
|
||||||
|
// Instance variables
|
||||||
|
|
||||||
|
// Thread constructor
|
||||||
|
|
||||||
|
public MobRespawnThread() {
|
||||||
|
Logger.info(" MobRespawnThread thread has started!");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (Zone zone : ZoneManager.getAllZones()) {
|
||||||
|
|
||||||
|
if (zone.respawnQue.isEmpty() == false && zone.lastRespawn + 100 < System.currentTimeMillis()) {
|
||||||
|
|
||||||
|
Mob respawner = zone.respawnQue.iterator().next();
|
||||||
|
|
||||||
|
if (respawner == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
respawner.respawn();
|
||||||
|
zone.respawnQue.remove(respawner);
|
||||||
|
zone.lastRespawn = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static void startRespawnThread() {
|
||||||
|
Thread respawnThread;
|
||||||
|
respawnThread = new Thread(new MobRespawnThread());
|
||||||
|
respawnThread.setName("respawnThread");
|
||||||
|
respawnThread.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -7,7 +7,7 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
package engine.ai.utilities;
|
package engine.mobileAI.utilities;
|
||||||
|
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.gameManager.ChatManager;
|
import engine.gameManager.ChatManager;
|
||||||
+4
-4
@@ -7,13 +7,13 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
package engine.ai.utilities;
|
package engine.mobileAI.utilities;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
import engine.ai.MobileFSMManager;
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.MovementManager;
|
import engine.gameManager.MovementManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
@@ -79,7 +79,7 @@ public class MovementUtilities {
|
|||||||
zoneRange = agent.getSpawnRadius();
|
zoneRange = agent.getSpawnRadius();
|
||||||
|
|
||||||
|
|
||||||
return distanceSquaredToTarget < sqr(MobileFSMManager.AI_DROP_AGGRO_RANGE + zoneRange);
|
return distanceSquaredToTarget < sqr(MobAIThread.AI_DROP_AGGRO_RANGE + zoneRange);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ public class MovementUtilities {
|
|||||||
Vector3fImmutable tl = target.getLoc();
|
Vector3fImmutable tl = target.getLoc();
|
||||||
|
|
||||||
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
|
float distanceSquaredToTarget = sl.distanceSquared2D(tl) - sqr(agent.calcHitBox() + target.calcHitBox()); //distance to center of target
|
||||||
float range = MobileFSMManager.AI_BASE_AGGRO_RANGE;
|
float range = MobAIThread.AI_BASE_AGGRO_RANGE;
|
||||||
|
|
||||||
if (agent.isPlayerGuard())
|
if (agent.isPlayerGuard())
|
||||||
range = 150;
|
range = 150;
|
||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net;
|
package engine.net;
|
||||||
|
|
||||||
import engine.objects.PlayerCharacter;
|
import engine.objects.PlayerCharacter;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net;
|
package engine.net;
|
||||||
|
|
||||||
import engine.Enum.DispatchChannel;
|
import engine.Enum.DispatchChannel;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net;
|
package engine.net;
|
||||||
|
|
||||||
import engine.objects.ProducedItem;
|
import engine.objects.ProducedItem;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net;
|
package engine.net;
|
||||||
|
|
||||||
import engine.Enum.DispatchChannel;
|
import engine.Enum.DispatchChannel;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.handlers;
|
package engine.net.client.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.handlers;
|
package engine.net.client.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.handlers;
|
package engine.net.client.handlers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.handlers;
|
package engine.net.client.handlers;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ public class PlaceAssetMsgHandler extends AbstractClientMsgHandler {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Realm serverRealm = RealmMap.getRealmAtLocation(player.getLoc());
|
Realm serverRealm = RealmMap.getRealmAtLocation(city.getLoc());
|
||||||
|
|
||||||
// Cannot place buildings on seafloor or other restricted realms
|
// Cannot place buildings on seafloor or other restricted realms
|
||||||
|
|
||||||
|
|||||||
@@ -16,24 +16,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg;
|
package engine.net.client.msg;
|
||||||
|
|
||||||
import engine.net.AbstractConnection;
|
import engine.net.AbstractConnection;
|
||||||
|
|||||||
@@ -16,24 +16,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg.guild;
|
package engine.net.client.msg.guild;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
|
|||||||
@@ -16,24 +16,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg.guild;
|
package engine.net.client.msg.guild;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg.guild;
|
package engine.net.client.msg.guild;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.net.client.msg.login;
|
package engine.net.client.msg.login;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import engine.Enum.GameObjectType;
|
|||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
import engine.Enum.SourceType;
|
import engine.Enum.SourceType;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.ai.MobileFSMManager;
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.gameManager.ZoneManager;
|
import engine.gameManager.ZoneManager;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.Dispatch;
|
import engine.net.Dispatch;
|
||||||
@@ -190,7 +190,7 @@ public abstract class AbstractIntelligenceAgent extends AbstractCharacter {
|
|||||||
public abstract AbstractWorldObject getFearedObject();
|
public abstract AbstractWorldObject getFearedObject();
|
||||||
|
|
||||||
public float getAggroRange() {
|
public float getAggroRange() {
|
||||||
float ret = MobileFSMManager.AI_BASE_AGGRO_RANGE;
|
float ret = MobAIThread.AI_BASE_AGGRO_RANGE;
|
||||||
if (this.bonuses != null)
|
if (this.bonuses != null)
|
||||||
ret *= (1 + this.bonuses.getFloatPercentAll(ModType.ScanRange, SourceType.None));
|
ret *= (1 + this.bonuses.getFloatPercentAll(ModType.ScanRange, SourceType.None));
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum.DamageType;
|
import engine.Enum.DamageType;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.objects;
|
package engine.objects;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import ch.claude_martin.enumbitset.EnumBitSet;
|
|||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.Enum.*;
|
import engine.Enum.*;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.ai.MobileFSMManager;
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
import engine.exception.SerializationException;
|
import engine.exception.SerializationException;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.*;
|
||||||
import engine.job.JobScheduler;
|
import engine.job.JobScheduler;
|
||||||
@@ -630,7 +630,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
|||||||
|
|
||||||
public static void HandleAssistedAggro(PlayerCharacter source, PlayerCharacter target) {
|
public static void HandleAssistedAggro(PlayerCharacter source, PlayerCharacter target) {
|
||||||
|
|
||||||
HashSet<AbstractWorldObject> mobsInRange = WorldGrid.getObjectsInRangePartial(source, MobileFSMManager.AI_DROP_AGGRO_RANGE, MBServerStatics.MASK_MOB);
|
HashSet<AbstractWorldObject> mobsInRange = WorldGrid.getObjectsInRangePartial(source, MobAIThread.AI_DROP_AGGRO_RANGE, MBServerStatics.MASK_MOB);
|
||||||
|
|
||||||
for (AbstractWorldObject awo : mobsInRange) {
|
for (AbstractWorldObject awo : mobsInRange) {
|
||||||
Mob mob = (Mob) awo;
|
Mob mob = (Mob) awo;
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ public class Zone extends AbstractGameObject {
|
|||||||
private String hash;
|
private String hash;
|
||||||
private float worldAltitude = 0;
|
private float worldAltitude = 0;
|
||||||
private float seaLevel = 0;
|
private float seaLevel = 0;
|
||||||
public static ArrayList<Mob> respawnQue = new ArrayList<>();
|
//public static ArrayList<Mob> respawnQue = new ArrayList<>();
|
||||||
|
public static final Set<Mob> respawnQue = Collections.newSetFromMap(new ConcurrentHashMap<>());
|
||||||
public static long lastRespawn = 0;
|
public static long lastRespawn = 0;
|
||||||
/**
|
/**
|
||||||
* ResultSet Constructor
|
* ResultSet Constructor
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.powers;
|
package engine.powers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.powers.effectmodifiers;
|
package engine.powers.effectmodifiers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.powers.effectmodifiers;
|
package engine.powers.effectmodifiers;
|
||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
|
|||||||
@@ -7,15 +7,6 @@
|
|||||||
// www.magicbane.com
|
// www.magicbane.com
|
||||||
|
|
||||||
|
|
||||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
|
||||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
|
||||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
|
||||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
|
||||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
|
||||||
// Magicbane Emulator Project © 2013 - 2022
|
|
||||||
// www.magicbane.com
|
|
||||||
|
|
||||||
|
|
||||||
package engine.powers.poweractions;
|
package engine.powers.poweractions;
|
||||||
import engine.Enum.GameObjectType;
|
import engine.Enum.GameObjectType;
|
||||||
import engine.Enum.ModType;
|
import engine.Enum.ModType;
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package engine.powers.poweractions;
|
|||||||
|
|
||||||
import engine.Enum;
|
import engine.Enum;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.ai.utilities.MovementUtilities;
|
|
||||||
import engine.gameManager.DbManager;
|
import engine.gameManager.DbManager;
|
||||||
import engine.gameManager.MovementManager;
|
import engine.gameManager.MovementManager;
|
||||||
import engine.gameManager.NPCManager;
|
import engine.gameManager.NPCManager;
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class MobRecallPowerAction extends AbstractPowerAction {
|
|||||||
|
|
||||||
MovementManager.translocate(awoac, awoac.getBindLoc(), null);
|
MovementManager.translocate(awoac, awoac.getBindLoc(), null);
|
||||||
if (awoac.getObjectType() == GameObjectType.Mob) {
|
if (awoac.getObjectType() == GameObjectType.Mob) {
|
||||||
//MobileFSM.setAwake((Mob)awoac,true);
|
//MobAI.setAwake((Mob)awoac,true);
|
||||||
((Mob) awoac).setCombatTarget(null);
|
((Mob) awoac).setCombatTarget(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ import engine.Enum.SupportMsgType;
|
|||||||
import engine.InterestManagement.HeightMap;
|
import engine.InterestManagement.HeightMap;
|
||||||
import engine.InterestManagement.RealmMap;
|
import engine.InterestManagement.RealmMap;
|
||||||
import engine.InterestManagement.WorldGrid;
|
import engine.InterestManagement.WorldGrid;
|
||||||
import engine.ai.MobileFSMManager;
|
import engine.mobileAI.Threads.MobAIThread;
|
||||||
|
import engine.mobileAI.Threads.MobRespawnThread;
|
||||||
import engine.db.archive.DataWarehouse;
|
import engine.db.archive.DataWarehouse;
|
||||||
import engine.exception.MsgSendException;
|
import engine.exception.MsgSendException;
|
||||||
import engine.gameManager.*;
|
import engine.gameManager.*;
|
||||||
@@ -57,6 +58,7 @@ import java.net.InetAddress;
|
|||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -457,8 +459,9 @@ public class WorldServer {
|
|||||||
Logger.info("Running Heraldry Audit for Deleted Players");
|
Logger.info("Running Heraldry Audit for Deleted Players");
|
||||||
Heraldry.AuditHeraldry();
|
Heraldry.AuditHeraldry();
|
||||||
|
|
||||||
Logger.info("Starting Mobile AI FSM");
|
//intiate mob ai thread
|
||||||
MobileFSMManager.getInstance();
|
Logger.info("Starting Mob AI Thread");
|
||||||
|
MobAIThread.startAIThread();
|
||||||
|
|
||||||
for (Zone zone : ZoneManager.getAllZones()) {
|
for (Zone zone : ZoneManager.getAllZones()) {
|
||||||
if (zone.getHeightMap() != null) {
|
if (zone.getHeightMap() != null) {
|
||||||
@@ -479,6 +482,10 @@ public class WorldServer {
|
|||||||
|
|
||||||
Logger.info("Initializing Client Connection Manager");
|
Logger.info("Initializing Client Connection Manager");
|
||||||
initClientConnectionManager();
|
initClientConnectionManager();
|
||||||
|
|
||||||
|
//intiate mob respawn thread
|
||||||
|
Logger.info("Starting Mob Respawn Thread");
|
||||||
|
MobRespawnThread.startRespawnThread();
|
||||||
|
|
||||||
// Run maintenance
|
// Run maintenance
|
||||||
|
|
||||||
@@ -494,7 +501,7 @@ public class WorldServer {
|
|||||||
|
|
||||||
// Calculate bootstrap time and rest boot time to current time.
|
// Calculate bootstrap time and rest boot time to current time.
|
||||||
|
|
||||||
java.time.Duration bootDuration = java.time.Duration.between(LocalDateTime.now(), bootTime);
|
Duration bootDuration = Duration.between(LocalDateTime.now(), bootTime);
|
||||||
long bootSeconds = Math.abs(bootDuration.getSeconds());
|
long bootSeconds = Math.abs(bootDuration.getSeconds());
|
||||||
String boottime = String.format("%d hours %02d minutes %02d seconds", bootSeconds / 3600, (bootSeconds % 3600) / 60, (bootSeconds % 60));
|
String boottime = String.format("%d hours %02d minutes %02d seconds", bootSeconds / 3600, (bootSeconds % 3600) / 60, (bootSeconds % 60));
|
||||||
Logger.info("Bootstrap time was " + boottime);
|
Logger.info("Bootstrap time was " + boottime);
|
||||||
@@ -697,7 +704,11 @@ public class WorldServer {
|
|||||||
Logger.error("Unable to find PlayerCharacter to logout");
|
Logger.error("Unable to find PlayerCharacter to logout");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
//remove player from loaded mobs agro maps
|
||||||
|
for(AbstractWorldObject awo : WorldGrid.getObjectsInRangePartial(player.getLoc(),MBServerStatics.CHARACTER_LOAD_RANGE,MBServerStatics.MASK_MOB)) {
|
||||||
|
Mob loadedMob = (Mob) awo;
|
||||||
|
loadedMob.playerAgroMap.remove(player.getObjectUUID());
|
||||||
|
}
|
||||||
player.getTimestamps().put("logout", System.currentTimeMillis());
|
player.getTimestamps().put("logout", System.currentTimeMillis());
|
||||||
player.setEnteredWorld(false);
|
player.setEnteredWorld(false);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user