|
|
@ -30,12 +30,13 @@ import org.pmw.tinylog.Logger; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.HashSet; |
|
|
|
import java.util.HashSet; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static engine.math.FastMath.sqr; |
|
|
|
|
|
|
|
|
|
|
|
public enum InterestManager implements Runnable { |
|
|
|
public enum InterestManager implements Runnable { |
|
|
|
|
|
|
|
|
|
|
|
INTERESTMANAGER; |
|
|
|
INTERESTMANAGER; |
|
|
|
|
|
|
|
|
|
|
|
private static long lastTime; |
|
|
|
private static long lastTime; |
|
|
|
private static boolean keepGoing = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
InterestManager() { |
|
|
|
InterestManager() { |
|
|
|
Logger.info(" Interest Management thread is running."); |
|
|
|
Logger.info(" Interest Management thread is running."); |
|
|
@ -155,10 +156,6 @@ public enum InterestManager implements Runnable { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void shutdown() { |
|
|
|
|
|
|
|
this.keepGoing = false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void run() { |
|
|
|
public void run() { |
|
|
|
beginLoadJob(); |
|
|
|
beginLoadJob(); |
|
|
@ -168,7 +165,7 @@ public enum InterestManager implements Runnable { |
|
|
|
|
|
|
|
|
|
|
|
InterestManager.lastTime = System.currentTimeMillis(); |
|
|
|
InterestManager.lastTime = System.currentTimeMillis(); |
|
|
|
|
|
|
|
|
|
|
|
while (InterestManager.keepGoing) { |
|
|
|
while (true) { |
|
|
|
try { |
|
|
|
try { |
|
|
|
updateAllPlayers(); |
|
|
|
updateAllPlayers(); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
@ -232,11 +229,26 @@ public enum InterestManager implements Runnable { |
|
|
|
|
|
|
|
|
|
|
|
private void updateStaticList(PlayerCharacter player, ClientConnection origin) { |
|
|
|
private void updateStaticList(PlayerCharacter player, ClientConnection origin) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Only update if we've moved far enough to warrant it
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float distanceSquared = player.getLoc().distanceSquared2D(player.getLastStaticLoc()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (distanceSquared > sqr(25)) { |
|
|
|
|
|
|
|
player.setLastStaticLoc(player.getLoc()); |
|
|
|
|
|
|
|
player.dirtyLoad = true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (player.dirtyLoad == false) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// Get Statics in range
|
|
|
|
// Get Statics in range
|
|
|
|
|
|
|
|
|
|
|
|
HashSet<AbstractWorldObject> toLoad = WorldGrid.getObjectsInRangePartial(player.getLoc(), MBServerStatics.STRUCTURE_LOAD_RANGE, |
|
|
|
HashSet<AbstractWorldObject> toLoad = WorldGrid.getObjectsInRangePartial(player.getLoc(), MBServerStatics.STRUCTURE_LOAD_RANGE, |
|
|
|
MBServerStatics.MASK_STATIC); |
|
|
|
MBServerStatics.MASK_STATIC); |
|
|
|
|
|
|
|
|
|
|
|
// get list of obects loaded that need removed
|
|
|
|
// get list of obects loaded that need removed
|
|
|
|
|
|
|
|
|
|
|
|
HashSet<AbstractWorldObject> loadedStaticObjects = player.getLoadedStaticObjects(); |
|
|
|
HashSet<AbstractWorldObject> loadedStaticObjects = player.getLoadedStaticObjects(); |
|
|
|
|
|
|
|
|
|
|
|
HashSet<AbstractWorldObject> toRemove = null; |
|
|
|
HashSet<AbstractWorldObject> toRemove = null; |
|
|
@ -246,11 +258,16 @@ public enum InterestManager implements Runnable { |
|
|
|
toRemove.removeAll(toLoad); |
|
|
|
toRemove.removeAll(toLoad); |
|
|
|
|
|
|
|
|
|
|
|
// unload static objects now out of range
|
|
|
|
// unload static objects now out of range
|
|
|
|
|
|
|
|
|
|
|
|
if (toRemove.size() > 0) { |
|
|
|
if (toRemove.size() > 0) { |
|
|
|
|
|
|
|
|
|
|
|
UnloadObjectsMsg uom = new UnloadObjectsMsg(); |
|
|
|
UnloadObjectsMsg uom = new UnloadObjectsMsg(); |
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject obj : toRemove) { |
|
|
|
for (AbstractWorldObject obj : toRemove) { |
|
|
|
|
|
|
|
|
|
|
|
if (obj.getObjectType().equals(GameObjectType.Building)) |
|
|
|
if (obj.getObjectType().equals(GameObjectType.Building)) |
|
|
|
InterestManager.HandleSpecialUnload((Building) obj, origin); |
|
|
|
InterestManager.HandleSpecialUnload((Building) obj, origin); |
|
|
|
|
|
|
|
|
|
|
|
if (obj != null && !obj.equals(player)) |
|
|
|
if (obj != null && !obj.equals(player)) |
|
|
|
uom.addObject(obj); |
|
|
|
uom.addObject(obj); |
|
|
|
} |
|
|
|
} |
|
|
@ -262,6 +279,7 @@ public enum InterestManager implements Runnable { |
|
|
|
loadedStaticObjects.removeAll(toRemove); |
|
|
|
loadedStaticObjects.removeAll(toRemove); |
|
|
|
|
|
|
|
|
|
|
|
// remove any object to load that are already loaded
|
|
|
|
// remove any object to load that are already loaded
|
|
|
|
|
|
|
|
|
|
|
|
toLoad.removeAll(loadedStaticObjects); |
|
|
|
toLoad.removeAll(loadedStaticObjects); |
|
|
|
|
|
|
|
|
|
|
|
LoadStructureMsg lsm = new LoadStructureMsg(); |
|
|
|
LoadStructureMsg lsm = new LoadStructureMsg(); |
|
|
@ -269,6 +287,7 @@ public enum InterestManager implements Runnable { |
|
|
|
ArrayList<LoadCharacterMsg> lcmList = new ArrayList<>(); |
|
|
|
ArrayList<LoadCharacterMsg> lcmList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject awo : toLoad) { |
|
|
|
for (AbstractWorldObject awo : toLoad) { |
|
|
|
|
|
|
|
|
|
|
|
if (awo.getObjectType().equals(GameObjectType.Building)) |
|
|
|
if (awo.getObjectType().equals(GameObjectType.Building)) |
|
|
|
lsm.addObject((Building) awo); |
|
|
|
lsm.addObject((Building) awo); |
|
|
|
else if (awo.getObjectType().equals(GameObjectType.Corpse)) { |
|
|
|
else if (awo.getObjectType().equals(GameObjectType.Corpse)) { |
|
|
@ -278,7 +297,6 @@ public enum InterestManager implements Runnable { |
|
|
|
Dispatch dispatch = Dispatch.borrow(player, lcm); |
|
|
|
Dispatch dispatch = Dispatch.borrow(player, lcm); |
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); |
|
|
|
DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.PRIMARY); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} else if (awo.getObjectType().equals(GameObjectType.NPC)) { |
|
|
|
} else if (awo.getObjectType().equals(GameObjectType.NPC)) { |
|
|
|
NPC npc = (NPC) awo; |
|
|
|
NPC npc = (NPC) awo; |
|
|
|
lcm = new LoadCharacterMsg(npc, PlayerCharacter.hideNonAscii()); |
|
|
|
lcm = new LoadCharacterMsg(npc, PlayerCharacter.hideNonAscii()); |
|
|
@ -299,6 +317,7 @@ public enum InterestManager implements Runnable { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
loadedStaticObjects.addAll(toLoad); |
|
|
|
loadedStaticObjects.addAll(toLoad); |
|
|
|
|
|
|
|
player.dirtyLoad = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private void updateMobileList(PlayerCharacter player, ClientConnection origin) { |
|
|
|
private void updateMobileList(PlayerCharacter player, ClientConnection origin) { |
|
|
@ -407,17 +426,20 @@ public enum InterestManager implements Runnable { |
|
|
|
ArrayList<AbstractWorldObject> addToList = new ArrayList<>(); |
|
|
|
ArrayList<AbstractWorldObject> addToList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
for (AbstractWorldObject awo : toLoadToPlayer) { |
|
|
|
for (AbstractWorldObject awo : toLoadToPlayer) { |
|
|
|
// dont load yourself
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
if (awo.equals(player)) |
|
|
|
if (awo.equals(player)) // dont load yourself
|
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
if ((awo.getObjectTypeMask() & MBServerStatics.MASK_PLAYER) != 0) { |
|
|
|
if ((awo.getObjectTypeMask() & MBServerStatics.MASK_PLAYER) != 0) { |
|
|
|
|
|
|
|
|
|
|
|
// object to load is a player
|
|
|
|
// object to load is a player
|
|
|
|
|
|
|
|
|
|
|
|
PlayerCharacter awopc = (PlayerCharacter) awo; |
|
|
|
PlayerCharacter awopc = (PlayerCharacter) awo; |
|
|
|
|
|
|
|
|
|
|
|
// dont load if invis
|
|
|
|
// dont load if invis
|
|
|
|
|
|
|
|
|
|
|
|
if (player.getSeeInvis() < awopc.getHidden()) |
|
|
|
if (player.getSeeInvis() < awopc.getHidden()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
@ -444,15 +466,14 @@ public enum InterestManager implements Runnable { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
//removed, interest manager should still load mob corpses
|
|
|
|
//removed, interest manager should still load mob corpses
|
|
|
|
|
|
|
|
|
|
|
|
if (awonpc.despawned == true) |
|
|
|
if (awonpc.despawned == true) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false); |
|
|
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false); |
|
|
|
//MobAI.setAwake(awonpc, false);
|
|
|
|
|
|
|
|
((Mob) awonpc).setCombatTarget(null); |
|
|
|
((Mob) awonpc).setCombatTarget(null); |
|
|
|
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
|
|
|
|
|
|
|
// awonpc.enableIntelligence();
|
|
|
|
|
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
|
|
|
|
|
|
|
|
|
} else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_NPC) != 0) { |
|
|
|
} else if ((awo.getObjectTypeMask() & MBServerStatics.MASK_NPC) != 0) { |
|
|
|
NPC awonpc = (NPC) awo; |
|
|
|
NPC awonpc = (NPC) awo; |
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
@ -465,10 +486,8 @@ public enum InterestManager implements Runnable { |
|
|
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false); |
|
|
|
awonpc.playerAgroMap.put(player.getObjectUUID(), false); |
|
|
|
|
|
|
|
|
|
|
|
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE))) |
|
|
|
if ((awonpc.agentType.equals(Enum.AIAgentType.MOBILE))) |
|
|
|
//MobAI.setAwake(awonpc, false);
|
|
|
|
|
|
|
|
((Mob) awonpc).setCombatTarget(null); |
|
|
|
((Mob) awonpc).setCombatTarget(null); |
|
|
|
// IVarController.setVariable(awonpc, "IntelligenceDisableDelay", (double) (System.currentTimeMillis() + 5000));
|
|
|
|
|
|
|
|
// awonpc.enableIntelligence();
|
|
|
|
|
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
|
lcm = new LoadCharacterMsg(awonpc, PlayerCharacter.hideNonAscii()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -504,6 +523,7 @@ public enum InterestManager implements Runnable { |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
//Update static list
|
|
|
|
//Update static list
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
updateStaticList(player, origin); |
|
|
|
updateStaticList(player, origin); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
@ -511,6 +531,7 @@ public enum InterestManager implements Runnable { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//Update mobile list
|
|
|
|
//Update mobile list
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
updateMobileList(player, origin); |
|
|
|
updateMobileList(player, origin); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
@ -529,6 +550,7 @@ public enum InterestManager implements Runnable { |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
//Update static list
|
|
|
|
//Update static list
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
updateStaticList(player, origin); |
|
|
|
updateStaticList(player, origin); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
@ -536,6 +558,7 @@ public enum InterestManager implements Runnable { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//Update mobile list
|
|
|
|
//Update mobile list
|
|
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
updateMobileList(player, origin); |
|
|
|
updateMobileList(player, origin); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|