Index: trunk/L2_Gameserver/java/net/sf/l2j/Config.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/Config.java (revision 2003) +++ trunk/L2_Gameserver/java/net/sf/l2j/Config.java (revision 2019) @@ -469,4 +469,7 @@ public static int MINIMUM_UPDATE_DISTANCE; + public static int KNOWNLIST_FORGET_DELAY; + public static int MINIMUN_UPDATE_TIME; + public static boolean ANNOUNCE_MAMMON_SPAWN; public static boolean LAZY_CACHE; @@ -601,5 +604,7 @@ MINIMUM_UPDATE_DISTANCE = Integer.parseInt(serverSettings.getProperty("MaximumUpdateDistance", "50")); + MINIMUN_UPDATE_TIME = Integer.parseInt(serverSettings.getProperty("MinimumUpdateTime", "500")); CHECK_KNOWN = Boolean.valueOf(serverSettings.getProperty("CheckKnownList", "false")); + KNOWNLIST_FORGET_DELAY = Integer.parseInt(serverSettings.getProperty("KnownListForgetDelay", "10000")); LAZY_CACHE = Boolean.valueOf(serverSettings.getProperty("LazyCache", "True")); Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/ai/L2DoorAI.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/ai/L2DoorAI.java (revision 1854) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/ai/L2DoorAI.java (revision 2019) @@ -22,5 +22,4 @@ import net.sf.l2j.gameserver.model.L2Character; import net.sf.l2j.gameserver.model.L2DoorInstance; -import net.sf.l2j.gameserver.model.L2NpcInstance; import net.sf.l2j.gameserver.model.L2Object; import net.sf.l2j.gameserver.model.L2SiegeGuardInstance; @@ -60,14 +59,14 @@ @SuppressWarnings("unused") protected void onEvtAttacked(L2Character attacker) { - _actor.updateKnownObjects(); - for (L2Object obj : _actor.getKnownObjects()) { - if (obj == null || !(obj instanceof L2SiegeGuardInstance)) - continue; - - L2NpcInstance npc = (L2NpcInstance)obj; - if (_actor.getDistance(npc.getX(), npc.getY()) < npc.getFactionRange() - && Math.abs(getAttackTarget().getZ()-npc.getZ()) < 200) + + L2DoorInstance me = (L2DoorInstance)_actor; + + me.updateKnownObjects(); + + for (L2SiegeGuardInstance guard : me.getKnownSiegeGuards()) { + if (_actor.getDistance(guard.getX(), guard.getY()) < guard.getFactionRange() + && Math.abs(getAttackTarget().getZ()-guard.getZ()) < 200) { - npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, getAttackTarget(), 1); + guard.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, getAttackTarget(), 1); } } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (revision 2015) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Character.java (revision 2019) @@ -20,5 +20,4 @@ import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -34,5 +33,4 @@ import javolution.util.FastList; import javolution.util.FastMap; -import javolution.util.FastSet; import net.sf.l2j.Config; import net.sf.l2j.gameserver.ClientScheduler; @@ -74,5 +72,4 @@ import net.sf.l2j.gameserver.templates.L2Weapon; import net.sf.l2j.gameserver.templates.L2WeaponType; -import net.sf.l2j.gameserver.util.Util; /** @@ -556,11 +553,4 @@ /** Table of Calculators containing all used calculator */ private Calculator[] _calculators; - - /** L2ObjectHashSet(L2Object) containing all L2Object detected by the L2Character */ - //private L2ObjectSet _knownObjects; - protected Set _knownObjects; - - /** L2ObjectHashSet(L2PcInstance) containing all player ingame detected by the L2Character */ - protected Set _knownPlayer; protected L2CharacterAI _ai; @@ -613,8 +603,5 @@ _isAttacked = false; - _lastAttackChange = 0; - - _knownObjects = Collections.synchronizedSet(new FastSet()); - _knownPlayer = Collections.synchronizedSet(new FastSet()); + _lastAttackChange = 0; if (template != null && this instanceof L2NpcInstance) @@ -3087,30 +3074,5 @@ * */ - public boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper) - { - if (object == null || !this.isVisible()) - return false; - - if (knowsObject(object)) - { - if (!object.isVisible()) - removeKnownObject(object); - return false; - } - - double farAway = getDistanceToWatchObject(object); // Set to 4000 - - if (getDistance(object.getX(), object.getY()) >= farAway) - return false; - - //Add object to L2ObjectHashSet(L2Object) _knownObjects of the L2Character - _knownObjects.add(object); - - //If object is a L2PcInstance, remove object from L2ObjectHashSet(L2PcInstance) _knownPlayer of the L2Character - if (object instanceof L2PcInstance) - _knownPlayer.add((L2PcInstance)object); - - return true; - } + public abstract boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper); @@ -3124,15 +3086,6 @@ * */ - public void removeKnownObject(L2Object object) - { - //Remove object from _knownObjects of the L2Character - _knownObjects.remove(object); - // If object is a L2PcInstance, remove object from _knownPlayer of the L2Character - if (object instanceof L2PcInstance) - _knownPlayer.remove(object); - // If object is targeted by the L2Character, cancel Attack or Cast - if (object == getTarget()) - setTarget(null); - } + + public abstract void removeKnownObject(L2Object object); /** @@ -3142,78 +3095,22 @@ * */ - public final boolean knowsObject(L2Object object) - { - return this == object || _knownObjects.contains(object); - } + public abstract boolean knowsObject(L2Object object); - public Collection getKnownCharactersInRadius(long radius) - { - FastList result = new FastList(); - - if (_knownPlayer != null) - { - for (L2PcInstance player : _knownPlayer) - { - if (player == null) continue; - if (Util.checkIfInRange((int)radius, this, player, true)) - result.add(player); - } - } - - if (_knownObjects != null) - { - for (L2Object obj : _knownObjects) - { - if (obj instanceof L2MonsterInstance) - { - if (Util.checkIfInRange((int)radius, this, obj, true)) - result.add((L2MonsterInstance)obj); - } - else if (obj instanceof L2NpcInstance) - { - if (Util.checkIfInRange((int)radius, this, obj, true)) - result.add((L2NpcInstance)obj); - } - - } - } - - return result; - } - + public abstract Collection getKnownCharactersInRadius(int radius); /** * Remove all L2Object from _knownObjects and _knownPlayer of the L2Character then cancel Attak or Cast and notify AI.

*/ - public final void removeAllKnownObjects() - { - // Remove all L2Object from L2ObjectHashSet(L2Object) containing all L2Object detected by the L2Character - _knownObjects.clear(); - _knownPlayer.clear(); - - // Set _target of the L2Character to null - // Cancel Attack or Cast - setTarget(null); - - // Cancel AI Task - if (this.hasAI()) - _ai = null; - } + public abstract void removeAllKnownObjects(); /** * Return the _knownPlayer containing all players known by the L2Character.

*/ - public final Collection getKnownPlayers() - { - return _knownPlayer; - } + public abstract Collection getKnownPlayers(); /** * Return the _knownObjects containing all L2Object known by the L2Character.

*/ - public final Collection getKnownObjects() - { - return _knownObjects; - } + public abstract Collection getKnownObjects(); /** @@ -3223,45 +3120,5 @@ * */ - public final boolean knowsThePlayer(L2PcInstance player) - { - return this == player || _knownPlayer.contains(player); - } - - /** - * Remove invisible and too far L2Object from _knowObject and if necessary from _knownPlayers.

- */ - private void forgetDistantObjects() - { - //Create an iterator to go through _knownObjects - if (_knownObjects == null || _knownObjects.size() <= 0) - return; - - Iterator iter = _knownObjects.iterator(); - - // Go through _knownObjects - while (iter != null && iter.hasNext()) - { - L2Object object = iter.next(); - - if (object == null) continue; - - // Remove all invisible object from _knownObjects is invisible - if (object != null && !object.isVisible()) { - removeKnownObject(object); - continue; - } - - double dx = getX() - object.getX(); - double dy = getY() - object.getY(); - double farAway = getDistanceToForgetObject(object); - - // Remove all too far object from _knownObjects - if ( dx*dx+dy*dy > farAway*farAway ) { - removeKnownObject(object); - continue; - } - - } - } + public abstract boolean knowsThePlayer(L2PcInstance player); /** @@ -3302,56 +3159,5 @@ */ - public final synchronized void updateKnownObjects() - { - // Remove invisible and too far L2Object from _knowObject and if necessary from _knownPlayers of the L2Character - forgetDistantObjects(); - - // Add visible L2Object near the L2Character to _knowObject and if necessary to _knownPlayers of the L2Character - // Add L2Character to _knowObject and if necessary to _knownPlayers of L2Object alreday known by the L2Character - findCloseObjects(); - } - - /** - * Add visible L2Object near the L2Character to _knowObject and if necessary to _knownPlayers of L2Character. - * Add L2Character to _knowObject and if necessary to _knownPlayers of L2Object alreday known by the L2Character.

- */ - private void findCloseObjects() - { - if (isDead() || !isVisible()) - return; - - // Get all visible L2Object near the L2Character - Collection objects = L2World.getInstance().getVisibleObjects(this); - - // Go through all visible L2Object near the L2Character - for (L2Object object : objects) - { - // Check if the object is already known - if (object != null && knowsObject(object)) - { - if (!(object instanceof L2Character)) - continue; - - // Check if the object already know the L2Character - if (!object.knowsObject(this)) - { - L2Character tgt = (L2Character)object; - // Add the L2Character in _knownObject and if necessary in _knownPlayers of the object - tgt.addKnownObject(this, null); - } - - } - else - { - // Add the object in _knownObject and if necessary in _knownPlayers of the L2Character - addKnownObject(object, null); - - //TODO Why don't we add the L2Character to the object _knowObject and if necessary _knowPlayers - - } - - } - - } + public abstract void updateKnownObjects(); /** @@ -5862,3 +5668,4 @@ } } + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2DoorInstance.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2DoorInstance.java (revision 1901) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2DoorInstance.java (revision 2019) @@ -37,4 +37,5 @@ import net.sf.l2j.gameserver.templates.L2CharTemplate; import net.sf.l2j.gameserver.templates.L2Weapon; +import net.sf.l2j.gameserver.util.knownlist.DoorKnownList; /** @@ -55,4 +56,7 @@ private int _autoActionDelay = -1; private ScheduledFuture _autoActionTask; + + protected final DoorKnownList _knownList = new DoorKnownList(this); + /** This class may be created only by L2Character and only for AI */ @@ -428,3 +432,75 @@ return _name; } + + public boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper) + { + return _knownList.add(object); + } + + public void removeKnownObject(L2Object object) + { + _knownList.remove(object); + + if (object == getTarget()) + setTarget(null); + } + + public boolean knowsObject(L2Object object) + { + return _knownList.knowsObject(object); + } + + public Collection getKnownCharactersInRadius(int radius) + { + return _knownList.getKnownAllCharactersInRadius(radius); + } + + public void removeAllKnownObjects() + { + _knownList.clear(); + + // Set _target of the L2Character to null + // Cancel Attack or Cast + setTarget(null); + + // Cancel AI Task + if (this.hasAI()) + _ai = null; + } + + public Collection getKnownPlayers() + { + return _knownList.getKnownPlayers(); + } + + public Collection getKnownObjects() + { + return _knownList.getKnownObjects(); + } + + public boolean knowsThePlayer(L2PcInstance player) + { + return _knownList.knowsPlayer(player); + } + + public void updateKnownObjects() + { + _knownList.update(); + } + + public Collection getKnownSiegeGuards() + { + return _knownList.getKnownSiegeGuards(); + } + + public Collection getKnownSiegeGuardsInRadius(int radius) + { + return _knownList.getKnownSiegeGuardsInRadius(radius); + } + + public boolean knowsSiegeGuard(L2SiegeGuardInstance guard) + { + return _knownList.knowsSiegeGuard(guard); + } + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2NpcInstance.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2NpcInstance.java (revision 1960) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2NpcInstance.java (revision 2019) @@ -19,4 +19,5 @@ package net.sf.l2j.gameserver.model; +import java.util.Collection; import java.util.List; import java.util.Random; @@ -50,4 +51,5 @@ import net.sf.l2j.gameserver.templates.L2NpcTemplate; import net.sf.l2j.gameserver.templates.L2Weapon; +import net.sf.l2j.gameserver.util.knownlist.NpcKnownList; /** @@ -90,4 +92,6 @@ private int _CastleIndex = -2; private L2Castle _Castle; + + protected final NpcKnownList _knownList = new NpcKnownList(this); /** Task lauching the function onRandomAnimation() */ @@ -1589,3 +1593,60 @@ this.onDecay(); } + + public boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper) + { + return _knownList.add(object); + } + + public void removeKnownObject(L2Object object) + { + _knownList.remove(object); + + if (object == getTarget()) + setTarget(null); + } + + public boolean knowsObject(L2Object object) + { + return _knownList.knowsObject(object); + } + + public Collection getKnownCharactersInRadius(int radius) + { + return _knownList.getKnownAllCharactersInRadius(radius); + } + + public void removeAllKnownObjects() + { + _knownList.clear(); + + // Set _target of the L2Character to null + // Cancel Attack or Cast + setTarget(null); + + // Cancel AI Task + if (this.hasAI()) + _ai = null; + } + + public Collection getKnownPlayers() + { + return _knownList.getKnownPlayers(); + } + + public Collection getKnownObjects() + { + return _knownList.getKnownObjects(); + } + + public boolean knowsThePlayer(L2PcInstance player) + { + return _knownList.knowsPlayer(player); + } + + public void updateKnownObjects() + { + _knownList.update(); + } + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java (revision 2013) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PcInstance.java (revision 2019) @@ -26,4 +26,5 @@ import java.sql.ResultSet; import java.util.Calendar; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -115,4 +116,5 @@ import net.sf.l2j.gameserver.templates.L2WeaponType; import net.sf.l2j.gameserver.util.Broadcast; +import net.sf.l2j.gameserver.util.knownlist.PcKnownList; import net.sf.l2j.util.Point3D; @@ -419,4 +421,7 @@ private long _lastAccess; private int _boatId; + + protected final PcKnownList _knownList = new PcKnownList(this); + /** @@ -3089,5 +3094,5 @@ { // Add a visible L2Object to _knownObjects and if necessary to _knownPlayer of the L2PcInstance - boolean ret = super.addKnownObject(object, dropper); + boolean ret = _knownList.add(object); if (!ret) @@ -3173,20 +3178,20 @@ * */ - public void removeKnownObject(L2Object object) - { - if (knowsObject(object)) - { - // Remove a L2Object from _knownObjects and if necessary from _knownPlayer of the L2PcInstance then cancel Attak or Cast if it was targeted - super.removeKnownObject(object); - - // Send Server-Client Packet DeleteObject to the L2PcInstance - sendPacket(new DeleteObject(object)); - if (Config.CHECK_KNOWN && object instanceof L2NpcInstance) + public void removeKnownObject(L2Object object) + { + if (_knownList.remove(object)) + { + if (object == getTarget()) + setTarget(null); + + // Send Server-Client Packet DeleteObject to the L2PcInstance + sendPacket(new DeleteObject(object)); + if (Config.CHECK_KNOWN && object instanceof L2NpcInstance) { - sendMessage("Removed NPC: "+((L2NpcInstance)object).getName()); + sendMessage("Removed NPC: "+((L2NpcInstance)object).getName()); } - } - - } + } + + } @@ -6644,3 +6649,77 @@ _boatId = boatId; } + + public boolean knowsObject(L2Object object) + { + return _knownList.knowsObject(object); + } + + public Collection getKnownCharactersInRadius(int radius) + { + return _knownList.getKnownAllCharactersInRadius(radius); + } + + public void removeAllKnownObjects() + { + _knownList.clear(); + + // Set _target of the L2Character to null + // Cancel Attack or Cast + setTarget(null); + + // Cancel AI Task + if (this.hasAI()) + _ai = null; + } + + public Collection getKnownPlayers() + { + return _knownList.getKnownPlayers(); + } + + public Collection getKnownObjects() + { + return _knownList.getKnownObjects(); + } + + public boolean knowsThePlayer(L2PcInstance player) + { + return _knownList.knowsPlayer(player); + } + + public void updateKnownObjects() + { + _knownList.update(); + } + + public final Collection getKnownCharacters() + { + return _knownList.getKnownCharacters(); + } + + public final Collection getKnownOthers() + { + return _knownList.getKnownOthers(); + } + + public final Collection getKnownOnlyCharactersInRadius(int radius) + { + return _knownList.getKnownCharactersInRadius(radius); + } + + public final Collection getKnownOthersInRadius(int radius) + { + return _knownList.getKnownOthersInRadius(radius); + } + + public final boolean knowsCharacter(L2Character cha) + { + return _knownList.knowsCharacter(cha); + } + + public final boolean knowsOtherObject(L2Object object) + { + return _knownList.knowsOtherObject(object); + } + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PlayableInstance.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PlayableInstance.java (revision 655) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2PlayableInstance.java (revision 2019) @@ -1,3 +1,5 @@ package net.sf.l2j.gameserver.model; + +import java.util.Collection; import net.sf.l2j.gameserver.templates.L2CharTemplate; @@ -39,3 +41,15 @@ public abstract void removeItemFromInventory(L2ItemInstance item, int count); + + /* KnownList implementation */ + public abstract boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper); + public abstract void removeKnownObject(L2Object object); + public abstract boolean knowsObject(L2Object object); + public abstract Collection getKnownCharactersInRadius(int radius); + public abstract void removeAllKnownObjects(); + public abstract Collection getKnownPlayers(); + public abstract Collection getKnownObjects(); + public abstract boolean knowsThePlayer(L2PcInstance player); + public abstract void updateKnownObjects(); + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Summon.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Summon.java (revision 1765) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/model/L2Summon.java (revision 2019) @@ -19,4 +19,5 @@ package net.sf.l2j.gameserver.model; +import java.util.Collection; import java.util.concurrent.Future; import java.util.logging.Logger; @@ -35,4 +36,5 @@ import net.sf.l2j.gameserver.templates.L2NpcTemplate; import net.sf.l2j.gameserver.templates.L2Weapon; +import net.sf.l2j.gameserver.util.knownlist.NpcKnownList; public abstract class L2Summon extends L2PlayableInstance @@ -55,4 +57,7 @@ private boolean _showSummonAnimation; + protected final NpcKnownList _knownList = new NpcKnownList(this); + + public class AIAccessor extends L2Character.AIAccessor { @@ -393,3 +398,60 @@ super.useMagic(skill); } + + public boolean addKnownObject(L2Object object, @SuppressWarnings("unused") L2Character dropper) + { + return _knownList.add(object); + } + + public void removeKnownObject(L2Object object) + { + _knownList.remove(object); + + if (object == getTarget()) + setTarget(null); + } + + public boolean knowsObject(L2Object object) + { + return _knownList.knowsObject(object); + } + + public Collection getKnownCharactersInRadius(int radius) + { + return _knownList.getKnownAllCharactersInRadius(radius); + } + + public void removeAllKnownObjects() + { + _knownList.clear(); + + // Set _target of the L2Character to null + // Cancel Attack or Cast + setTarget(null); + + // Cancel AI Task + if (this.hasAI()) + _ai = null; + } + + public Collection getKnownPlayers() + { + return _knownList.getKnownPlayers(); + } + + public Collection getKnownObjects() + { + return _knownList.getKnownObjects(); + } + + public boolean knowsThePlayer(L2PcInstance player) + { + return _knownList.knowsPlayer(player); + } + + public void updateKnownObjects() + { + _knownList.update(); + } + } Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/CharacterKnownList.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/CharacterKnownList.java (revision 2013) +++ (revision ) @@ -1,204 +1,0 @@ -/* - * $Header: CharacterKnownList.java, 4/12/2005 16:15:15 luisantonioa Exp $ - * - * $Author: luisantonioa $ - * $Date: 4/12/2005 16:15:15 $ - * $Revision: 1 $ - * $Log: CharacterKnownList.java,v $ - * Revision 1 4/12/2005 16:15:15 luisantonioa - * Added copyright notice - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * http://www.gnu.org/copyleft/gpl.html - */ -package net.sf.l2j.gameserver.util; - -import javolution.util.FastList; -import javolution.util.FastSet; -import javolution.util.FastCollection.Record; -import net.sf.l2j.Config; -import net.sf.l2j.gameserver.model.L2Character; -import net.sf.l2j.gameserver.model.L2Object; -import net.sf.l2j.gameserver.model.L2World; -import net.sf.l2j.util.Point3D; - -/** - * This class ... - * - * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $ - */ - -public class CharacterKnownList extends KnownList -{ - private static final int MINIMUM_UPDATE_DISTANCE_SQUARED = Config.MINIMUM_UPDATE_DISTANCE * Config.MINIMUM_UPDATE_DISTANCE; - - private final L2Character owner; - private final Point3D lastPosition; - - public CharacterKnownList(L2Character owner) - { - this.owner = owner; - this.lastPosition = new Point3D(owner.getPosition().getWorldPosition()); - } - - public void updateKnownObjects() - { - boolean update = false; - - synchronized (this) - { - Point3D worldPosition = owner.getPosition().getWorldPosition(); - if (worldPosition.distanceSquaredTo(lastPosition) > MINIMUM_UPDATE_DISTANCE_SQUARED) - { - lastPosition.setTo(worldPosition); - update = true; - } - } - - if (update) - { - forgetDistantObjects(); - findCloseObjects(); - } - } - - private void forgetDistantObjects() - { - forgetDistantObjects(knownMonsters); - forgetDistantObjects(knownNpcs); - forgetDistantObjects(knownObjects); - forgetDistantObjects(knownPlayers); - forgetDistantObjects(knownCharacters); - } - - private final void forgetDistantObjects(FastSet objectList) - { - FastList toRemove = new FastList(); - - double dx = 0; - double dy = 0; - double distance = 0; - - int currentX = owner.getPosition().getWorldPosition().getX(); - int currentY = owner.getPosition().getWorldPosition().getY(); - - if (objectList == null || objectList.size() <= 0) - return; - - // Go through _knownObjects - Record r = objectList.head(), end = objectList.tail(); - - if (r == null) - return; - - while ((r = r.getNext()) != end && r != null) - { - T object = objectList.valueOf(r); - if (object == null) - continue; - - // Remove all invisible object from _knownObjects is invisible - if (!object.isVisible()) - { - toRemove.add(object); - object.removeKnownObject(owner); - continue; - } - - dx = currentX - object.getX(); - dy = currentY - object.getY(); - distance = owner.getDistanceToForgetObject(object); - - // Remove all too far object from _knownObjects - if ((dx * dx) + (dy * dy) > (distance * distance)) - { - toRemove.add(object); - object.removeKnownObject(owner); - continue; - } - } - - if (!toRemove.isEmpty()) objectList.removeAll(toRemove); - } - - private void findCloseObjects() - { - if (owner.isDead() || !owner.isVisible()) - return; - - // Go through all visible L2Object near the L2Character - for (L2Object object : L2World.getInstance().getVisibleObjects(owner)) - { - //add object to our known list - owner.addKnownObject(object, null); - - //Add owner to added objects 'known' list - object.addKnownObject(owner, null); - } - } - - public void removeAllKnownCharacters() - { - removeKnownObjects(knownPlayers); - removeKnownObjects(knownMonsters); - removeKnownObjects(knownNpcs); - removeKnownObjects(knownCharacters); - } - - public void clear() - { - removeKnownObjects(knownPlayers); - removeKnownObjects(knownMonsters); - removeKnownObjects(knownNpcs); - removeKnownObjects(knownCharacters); - removeKnownObjects(knownObjects); - } - - private final void removeKnownObjects(FastSet set) - { - if (set == null || set.size() <= 0) - return; - - Record r = set.head(), end = set.tail(); - while (r != null && (r = r.getNext()) != end && r != null) - { - T object = set.valueOf(r); - if (object != null) - object.removeKnownObject(owner); - } - if (set != null && set.size() > 0) set.clear(); - } - - public KnownList addObject(L2Object object) - { - if (!object.equals(owner)) - { - super.addObject(object); - } - return this; - } - - public KnownList removeObject(L2Object object) - { - if (!object.equals(owner)) - { - super.removeObject(object); - } - return this; - } -} Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/KnownList.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/KnownList.java (revision 2013) +++ (revision ) @@ -1,318 +1,0 @@ -/* - * $Header: KnownList.java, 21/11/2005 15:53:22 luisantonioa Exp $ - * - * $Author: luisantonioa $ - * $Date: 21/11/2005 15:53:22 $ - * $Revision: 1 $ - * $Log: KnownList.java,v $ - * Revision 1 21/11/2005 15:53:22 luisantonioa - * Added copyright notice - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * http://www.gnu.org/copyleft/gpl.html - */ -package net.sf.l2j.gameserver.util; - -import java.util.Collection; - -import javolution.util.FastCollection; -import javolution.util.FastList; -import javolution.util.FastSet; -import javolution.util.FastCollection.Record; -import net.sf.l2j.gameserver.model.L2Character; -import net.sf.l2j.gameserver.model.L2MonsterInstance; -import net.sf.l2j.gameserver.model.L2NpcInstance; -import net.sf.l2j.gameserver.model.L2Object; -import net.sf.l2j.gameserver.model.L2PcInstance; -import net.sf.l2j.util.Point3D; - -/** - * This class ... - * - * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $ - */ - -public abstract class KnownList -{ - protected final FastSet knownPlayers = new FastSet().preserve(); - protected final FastSet knownObjects = new FastSet().preserve(); - protected final FastSet knownNpcs = new FastSet().preserve(); - protected final FastSet knownCharacters = new FastSet().preserve(); - protected final FastSet knownMonsters = new FastSet().preserve(); - - public KnownList addObject(L2Object object) - { - if (object instanceof L2MonsterInstance) - { - addMonster((L2MonsterInstance) object); - } - else if (object instanceof L2PcInstance) - { - addPlayer((L2PcInstance) object); - } - else if (object instanceof L2NpcInstance) - { - addNpc((L2NpcInstance) object); - } - else if (object instanceof L2Character) - { - addCharacter((L2Character) object); - } - else - { - addOtherObject(object); - } - - return this; - } - - public KnownList addOtherObject(L2Object object) - { - if (object != null) - knownObjects.add(object); - - return this; - } - - public KnownList addPlayer(L2PcInstance player) - { - if (player != null) - knownPlayers.add(player); - - return this; - } - - public KnownList addCharacter(L2Character character) - { - if (character != null) - knownCharacters.add(character); - - return this; - } - - public KnownList addNpc(L2NpcInstance npc) - { - if (npc != null) - knownNpcs.add(npc); - - return this; - } - - public KnownList addMonster(L2MonsterInstance monster) - { - if (monster != null) - knownMonsters.add(monster); - - return this; - } - - public KnownList removeObject(L2Object object) - { - if (object instanceof L2MonsterInstance) - { - removeMonster((L2MonsterInstance) object); - } - else if (object instanceof L2PcInstance) - { - removePlayer((L2PcInstance) object); - } - else if (object instanceof L2NpcInstance) - { - removeNpc((L2NpcInstance) object); - } - else if (object instanceof L2Character) - { - removeCharacter((L2Character) object); - } - else - { - removeOtherObject(object); - } - - return this; - } - - public KnownList removeOtherObject(L2Object object) - { - if (object != null) - knownObjects.remove(object); - - return this; - } - - public KnownList removePlayer(L2PcInstance player) - { - if (player != null) - knownPlayers.remove(player); - - return this; - } - - public KnownList removeCharacter(L2Character character) - { - if (character != null) - knownCharacters.remove(character); - - return this; - } - - public KnownList removeNpc(L2NpcInstance npc) - { - if (npc != null) - knownNpcs.remove(npc); - - return this; - } - - public KnownList removeMonster(L2MonsterInstance monster) - { - if (monster != null) - knownMonsters.remove(monster); - - return this; - } - - public Collection getKnownPlayers() - { - return knownPlayers; - } - - private Collection getKnownCharacters() - { - return knownCharacters; - } - - public Collection getAllKnownCharacters() - { - FastList allObjects = new FastList(); - - if (getKnownPlayers().size() > 0) allObjects.addAll(getKnownPlayers()); - if (getKnownMonsters().size() > 0) allObjects.addAll(getKnownMonsters()); - if (getKnownNpcs().size() > 0) allObjects.addAll(getKnownNpcs()); - if (getKnownCharacters().size() > 0) allObjects.addAll(getKnownCharacters()); - - return allObjects; - } - - public Collection getKnownMonsters() - { - return knownMonsters; - } - - public Collection getKnownNpcs() - { - return knownNpcs; - } - - public Collection getOtherKnownObjects() - { - return knownObjects; - } - - public Collection getAllKnownObjects() - { - FastList allObjects = new FastList(); - - if (getOtherKnownObjects().size() > 0) allObjects.addAll(getOtherKnownObjects()); - if (getKnownPlayers().size() > 0) allObjects.addAll(getKnownPlayers()); - if (getKnownMonsters().size() > 0) allObjects.addAll(getKnownMonsters()); - if (getKnownNpcs().size() > 0) allObjects.addAll(getKnownNpcs()); - if (getKnownCharacters().size() > 0) allObjects.addAll(getKnownCharacters()); - - return allObjects; - } - - public static final Collection getKnownObjectInRange(FastCollection list, int range, Point3D origin) - { - long rangeSquared = range * range; - - FastList objectsInRange = new FastList(); - - Record r = list.head(), end = list.tail(); - while ( (r = r.getNext()) != end && r != null) - { - T object = list.valueOf(r); - if (origin.distanceSquaredTo(object.getPosition().getWorldPosition()) < rangeSquared) - { - objectsInRange.add(object); - } - } - - return objectsInRange; - } - - public Collection getKnownPlayers(int range, Point3D origin) - { - return getKnownObjectInRange(knownPlayers, range, origin); - } - - public Collection getKnownMonsters(int range, Point3D origin) - { - return getKnownObjectInRange(knownMonsters, range, origin); - } - - public Collection getKnownNpcs(int range, Point3D origin) - { - return getKnownObjectInRange(knownNpcs, range, origin); - } - - public Collection getOtherKnownObjects(int range, Point3D origin) - { - return getKnownObjectInRange(knownObjects, range, origin); - } - - public Collection getAllKnownObjects(int range, Point3D origin) - { - return getKnownObjectInRange((FastList)getAllKnownObjects(), range, origin); - } - - public boolean knowsObject(L2Object object) - { - if (object == null) - return false; - - return knownPlayers.contains(object) - || knownMonsters.contains(object) - || knownNpcs.contains(object) - || knownCharacters.contains(object) - || knownObjects.contains(object); - } - - public boolean knowsPlayer(L2PcInstance player) - { - if (player == null) - return false; - return knownPlayers.contains(player); - } - - public void clear() - { - if (knownPlayers.size() > 0) - knownPlayers.clear(); - if (knownMonsters.size() > 0) - knownMonsters.clear(); - if (knownNpcs.size() > 0) - knownNpcs.clear(); - if (knownCharacters.size() > 0) - knownCharacters.clear(); - if (knownObjects.size() > 0) - knownObjects.clear(); - } - - public abstract void updateKnownObjects(); -} Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/DoorKnownList.java =================================================================== --- (revision ) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/DoorKnownList.java (revision 2019) @@ -1,0 +1,202 @@ +/** + * + */ +package net.sf.l2j.gameserver.util.knownlist; + +import static java.util.Collections.EMPTY_LIST; + +import java.util.Collection; + +import javolution.util.FastMap; +import javolution.util.FastList; +import net.sf.l2j.gameserver.model.L2Character; +import net.sf.l2j.gameserver.model.L2DoorInstance; +import net.sf.l2j.gameserver.model.L2PcInstance; +import net.sf.l2j.gameserver.model.L2SiegeGuardInstance; +import net.sf.l2j.gameserver.model.L2Object; +import net.sf.l2j.gameserver.util.Util; + +/** + * @author Layane + * + */ +public class DoorKnownList extends NpcKnownList +{ + protected FastMap _knownSiegeGuards; + + public DoorKnownList(L2DoorInstance door) + { + super(door); + } + + public boolean add(L2Object object) + { + if (object == null || !_owner.isVisible() || object == _owner) + return false; + + if (knowsObject(object)) + { + if (!object.isVisible()) + _owner.removeKnownObject(object); + return false; + } + + if (_owner.getDistance(object.getX(), object.getY()) > _owner.getDistanceToWatchObject(object)) + return false; + + if (object instanceof L2PcInstance) + { + addPlayer((L2PcInstance)object); + } + else if (object instanceof L2SiegeGuardInstance) + { + addSiegeGuard((L2SiegeGuardInstance)object); + } + + return true; + } + + public synchronized final void addSiegeGuard(L2SiegeGuardInstance guard) + { + if (guard == null || guard == _owner) + return; + + if (_knownSiegeGuards == null) + _knownSiegeGuards = new FastMap(); + + startForgetTask(); + _knownSiegeGuards.put(guard,guard); + } + + public boolean remove(L2Object object) + { + if (object instanceof L2PcInstance) + { + return removePlayer((L2PcInstance)object); + } + else if (object instanceof L2SiegeGuardInstance) + { + removeSiegeGuard((L2SiegeGuardInstance)object); + } + + return false; + } + + public final boolean removeSiegeGuard(L2SiegeGuardInstance guard) + { + if (guard == null || _knownSiegeGuards == null) + return false; + + boolean result = (_knownSiegeGuards.remove(guard) != null); + + if (result && size() <= 0) + { + stopForgetTask(); + _knownSiegeGuards = null; + } + + return result; + } + + public boolean knowsObject(L2Object object) + { + if (object == null) + return false; + + if (_knownSiegeGuards != null && _knownSiegeGuards.containsKey(object)) + return true; + + if (_knownPlayers != null && _knownPlayers.containsKey(object)) + return true; + + return false; + } + + public final boolean knowsSiegeGuard(L2SiegeGuardInstance guard) + { + if (guard == null || _knownSiegeGuards == null) + return false; + + return _knownSiegeGuards.containsKey(guard); + } + + @SuppressWarnings("unchecked") + public Collection getKnownObjects() + { + if (_knownPlayers == null && _knownSiegeGuards == null) + return EMPTY_LIST; + + FastList result = new FastList(); + + if (_knownSiegeGuards != null) + result.addAll(_knownSiegeGuards.values()); + + return result; + } + + @SuppressWarnings("unchecked") + public Collection getKnownSiegeGuards() + { + if (_knownSiegeGuards == null) + return EMPTY_LIST; + + return _knownSiegeGuards.values(); + } + + public Collection getKnownAllCharactersInRadius(int radius) + { + FastList result = new FastList(); + + for (L2PcInstance player : _knownPlayers.values()) + { + if (Util.checkIfInRange(radius, _owner, player, true)) + result.add(player); + } + + for (L2SiegeGuardInstance guard : _knownSiegeGuards.values()) + { + if (Util.checkIfInRange(radius, _owner, guard, true)) + result.add(guard); + } + + return result; + } + + public final Collection getKnownSiegeGuardsInRadius(int radius) + { + FastList result = new FastList(); + + for (L2SiegeGuardInstance guard : _knownSiegeGuards.values()) + { + if (Util.checkIfInRange(radius, _owner, guard, true)) + result.add(guard); + } + + return result; + } + + public void clear() + { + stopForgetTask(); + + if (_knownSiegeGuards != null) + _knownSiegeGuards.clear(); + + if (_knownPlayers != null) + _knownPlayers.clear(); + } + + public int size() + { + int result = 0; + + if (_knownSiegeGuards != null) + result = _knownSiegeGuards.size(); + + if (_knownPlayers != null) + result += _knownPlayers.size(); + + return 0; + } + +} Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/NpcKnownList.java =================================================================== --- (revision ) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/NpcKnownList.java (revision 2019) @@ -1,0 +1,225 @@ +/** + * + */ +package net.sf.l2j.gameserver.util.knownlist; + +import static java.util.Collections.EMPTY_LIST; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.Future; + +import javolution.util.FastList; +import javolution.util.FastMap; +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.ClientScheduler; +import net.sf.l2j.gameserver.model.L2Character; +import net.sf.l2j.gameserver.model.L2Object; +import net.sf.l2j.gameserver.model.L2PcInstance; +import net.sf.l2j.gameserver.util.Util; +import net.sf.l2j.util.Point3D; + + +/** + * @author Layane + * $version: $ + */ +public class NpcKnownList +{ + public static final int MINIMUM_UPDATE_DISTANCE_SQUARED = Config.MINIMUM_UPDATE_DISTANCE * Config.MINIMUM_UPDATE_DISTANCE; + + protected Map _knownPlayers; + + protected final L2Character _owner; + + protected long _lastUpdate; + protected Point3D _lastUpdatePosition; + + private Future _forgetTask; + + class ForgetTask implements Runnable + { + public void run() + { + forgetKnownObjects(); + } + } + + + public NpcKnownList(L2Character owner) + { + _owner = owner; + _lastUpdate = System.currentTimeMillis(); + _lastUpdatePosition = new Point3D(owner.getPosition().getWorldPosition()); + } + + public boolean add(L2Object object) + { + if (object == null || !_owner.isVisible() || object == _owner) + return false; + + if (knowsObject(object)) + { + if (!object.isVisible()) + _owner.removeKnownObject(object); + return false; + } + + if (_owner.getDistance(object.getX(), object.getY()) > _owner.getDistanceToWatchObject(object)) + return false; + + if (object instanceof L2PcInstance) + { + addPlayer((L2PcInstance)object); + } + + return true; + } + + public synchronized final void addPlayer(L2PcInstance player) + { + if (player == null) + return; + + if (_knownPlayers == null) + _knownPlayers = new FastMap(); + + startForgetTask(); + _knownPlayers.put(player,player); + } + + public boolean remove(L2Object object) + { + if (object instanceof L2PcInstance) + { + return removePlayer((L2PcInstance)object); + } + return false; + } + + public final boolean removePlayer(L2PcInstance player) + { + if (player == null || _knownPlayers == null) + return false; + + boolean result = (_knownPlayers.remove(player) != null); + + if (result && size() <= 0) + { + stopForgetTask(); + _knownPlayers = null; + } + + return result; + } + + public boolean knowsObject(L2Object object) + { + if (object == null || _knownPlayers == null) + return false; + + return _knownPlayers.containsKey(object); + } + + public final boolean knowsPlayer(L2PcInstance player) + { + if (player == null || _knownPlayers == null) + return false; + + return _knownPlayers.containsKey(player); + } + + @SuppressWarnings("unchecked") + public Collection getKnownObjects() + { + if (_knownPlayers == null) + return EMPTY_LIST; + + return _knownPlayers.keySet(); + } + + @SuppressWarnings("unchecked") + public final Collection getKnownPlayers() + { + if (_knownPlayers == null) + return EMPTY_LIST; + + return _knownPlayers.values(); + } + + public Collection getKnownAllCharactersInRadius(int radius) + { + FastList result = new FastList(); + + for (L2PcInstance player : _knownPlayers.values()) + { + if (Util.checkIfInRange(radius, _owner, player, true)) + result.add(player); + } + + return result; + } + + public final Collection getKnownPlayersInRange(int radius) + { + FastList result = new FastList(); + + for (L2PcInstance player : _knownPlayers.values()) + { + if (Util.checkIfInRange(radius, _owner, player, true)) + result.add(player); + } + + return result; + } + + public void clear() + { + stopForgetTask(); + + if (_knownPlayers != null) + _knownPlayers.clear(); + } + + public int size() + { + if (_knownPlayers != null) + return _knownPlayers.size(); + return 0; + } + + public void update() + { + } + + private void forgetKnownObjects() + { + for (L2PcInstance player : _knownPlayers.values()) + { + // Remove all invisible object from _knownObjects is invisible + if (!player.isVisible()) + { + _owner.removeKnownObject(player); + continue; + } + + long distance = _owner.getDistanceToForgetObject(player); + + if (_owner.getPosition().getWorldPosition().distanceSquaredTo(player.getPosition().getWorldPosition()) > (distance*distance)) + _owner.removeKnownObject(player); + } + } + + protected synchronized void startForgetTask() + { + if (_forgetTask == null) + _forgetTask = ClientScheduler.getInstance().scheduleLowAtFixedRate(new ForgetTask(),Config.KNOWNLIST_FORGET_DELAY,Config.KNOWNLIST_FORGET_DELAY); + } + + protected synchronized void stopForgetTask() + { + if (_forgetTask != null) + _forgetTask.cancel(true); + } + +} Index: trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/PcKnownList.java =================================================================== --- (revision ) +++ trunk/L2_Gameserver/java/net/sf/l2j/gameserver/util/knownlist/PcKnownList.java (revision 2019) @@ -1,0 +1,399 @@ +/** + * + */ +package net.sf.l2j.gameserver.util.knownlist; + +import static java.util.Collections.EMPTY_LIST; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +import javolution.util.FastList; +import javolution.util.FastMap; +import javolution.util.FastSet; +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.model.L2Character; +import net.sf.l2j.gameserver.model.L2Object; +import net.sf.l2j.gameserver.model.L2PcInstance; +import net.sf.l2j.gameserver.model.L2World; +import net.sf.l2j.gameserver.model.L2WorldRegion; +import net.sf.l2j.gameserver.util.Util; +import net.sf.l2j.util.Point3D; + +/** + * @author Layane + * $version: $ + * + * Lot of duplicate code on all redefined classes to optimize the call stack + * because knownlist a critical routine. + */ +public class PcKnownList extends NpcKnownList +{ + protected Map _knownCharacters; + protected Map _knownOthers; + + protected final int _vision; + + public PcKnownList(L2PcInstance owner) + { + super(owner); + _vision = _owner.getDistanceToWatchObject(null); + } + + public boolean add(L2Object object) + { + if (object == null || !_owner.isVisible()) + return false; + + if (!object.isVisible() && knowsObject(object)) + { + _owner.removeKnownObject(object); + return false; + } + + if (_owner.getDistance(object.getX(), object.getY()) > _owner.getDistanceToWatchObject(object)) + return false; + + if (object instanceof L2PcInstance) + { + addPlayer((L2PcInstance)object); + } + else if (object instanceof L2Character) + { + addCharacter((L2Character)object); + } + else + { + addOtherObject(object); + } + + return true; + } + + public final void addCharacter(L2Character cha) + { + if (cha == null) + return; + + if (_knownCharacters == null) + _knownCharacters = new FastMap(); + + startForgetTask(); + _knownCharacters.put(cha,cha); + } + + public final void addOtherObject(L2Object object) + { + if (object == null) + return; + + if (_knownOthers == null) + _knownOthers = new FastMap(); + + startForgetTask(); + _knownOthers.put(object,object); + } + + public boolean remove(L2Object object) + { + if (object instanceof L2PcInstance) + { + return removePlayer((L2PcInstance)object); + } + else if (object instanceof L2Character) + { + return removeCharacter((L2Character)object); + } + + return removeOtherObject(object); + } + + public final boolean removeCharacter(L2Character cha) + { + if (cha == null || _knownCharacters == null) + return false; + + boolean result = (_knownCharacters.remove(cha) != null); + + if (result && size() <= 0) + { + stopForgetTask(); + _knownCharacters = null; + } + + return result; + } + + public final boolean removeOtherObject(L2Object object) + { + if (object == null || _knownOthers == null) + return false; + + boolean result = (_knownOthers.remove(object) != null); + + if (result && size() <= 0) + { + stopForgetTask(); + _knownOthers = null; + } + + return result; + } + + public boolean knowsObject(L2Object object) + { + if (object == null) + return false; + + if (_knownCharacters != null && _knownCharacters.containsKey(object)) + return true; + + if (_knownPlayers != null && _knownPlayers.containsKey(object)) + return true; + + if (_knownOthers != null && _knownOthers.containsKey(object)) + return true; + + return false; + } + + public final boolean knowsCharacter(L2Character cha) + { + if (cha == null || _knownCharacters == null) + return false; + + return _knownCharacters.containsKey(cha); + } + + public final boolean knowsOtherObject(L2Object object) + { + if (object == null || _knownOthers == null) + return false; + + return _knownOthers.containsKey(object); + } + + @SuppressWarnings("unchecked") + public Collection getKnownObjects() + { + if (_knownPlayers == null && _knownCharacters == null) + return EMPTY_LIST; + + FastList result = new FastList(); + + if (_knownCharacters != null) + result.addAll(_knownCharacters.values()); + + if (_knownPlayers != null) + result.addAll(_knownPlayers.values()); + + if (_knownOthers != null) + result.addAll(_knownOthers.values()); + + return result; + } + + @SuppressWarnings("unchecked") + public final Collection getKnownCharacters() + { + if (_knownCharacters == null) + return EMPTY_LIST; + + return _knownCharacters.values(); + } + + @SuppressWarnings("unchecked") + public final Collection getKnownOthers() + { + if (_knownOthers == null) + return EMPTY_LIST; + + return _knownOthers.values(); + } + + public Collection getKnownAllCharactersInRadius(int radius) + { + FastList result = new FastList(); + + for (L2PcInstance player : _knownPlayers.values()) + { + if (Util.checkIfInRange(radius, _owner, player, true)) + result.add(player); + } + + for (L2Character cha : _knownCharacters.values()) + { + if (Util.checkIfInRange(radius, _owner, cha, true)) + result.add(cha); + } + + return result; + } + + public final Collection getKnownCharactersInRadius(int radius) + { + FastList result = new FastList(); + + for (L2Character cha : _knownCharacters.values()) + { + if (Util.checkIfInRange(radius, _owner, cha, true)) + result.add(cha); + } + + return result; + } + + public final Collection getKnownOthersInRadius(int radius) + { + FastList result = new FastList(); + + for (L2Object object : _knownOthers.values()) + { + if (Util.checkIfInRange(radius, _owner, object, true)) + result.add(object); + } + + return result; + } + + public void clear() + { + stopForgetTask(); + + if (_knownPlayers != null) + _knownPlayers.clear(); + + if (_knownCharacters != null) + _knownCharacters.clear(); + + if (_knownOthers != null) + _knownOthers.clear(); + } + + public int size() + { + int result = 0; + + if (_knownPlayers != null) + result = _knownPlayers.size(); + + if (_knownCharacters != null) + result += _knownCharacters.size(); + + if (_knownOthers != null) + result += _knownOthers.size(); + + return result; + } + + public void update() + { + Point3D myPosition; + synchronized (this) + { + //Temporal check to minimize fallout mob problem and limbo fall bugs + if ((System.currentTimeMillis() - _lastUpdate) < Config.MINIMUM_UPDATE_DISTANCE) + return; + + //Coordinate check to evaluate the position + myPosition = _owner.getPosition().getWorldPosition(); + if (myPosition.distanceSquaredTo(_lastUpdatePosition) <= MINIMUM_UPDATE_DISTANCE_SQUARED) + return; + + _lastUpdate = System.currentTimeMillis(); + _lastUpdatePosition.setTo(myPosition); + } + + //Find close objects + L2World world = L2World.getInstance(); + + int x = myPosition.getX(); + int y = myPosition.getY(); + + //Minimized regions to iterate + + FastSet adjZones = new FastSet(); + L2WorldRegion eval; + + adjZones.add(_owner.getPosition().getWorldRegion()); + + //top left + if ((eval = world.getRegion(x - _vision, y + _vision)) != null) + adjZones.add(eval); + + //left + if ((eval = world.getRegion(x - _vision, y)) != null) + adjZones.add(eval); + + //left bottom + if ((eval = world.getRegion(x - _vision, y - _vision)) != null) + adjZones.add(eval); + + //bottom + if ((eval = world.getRegion(x, y - _vision)) != null) + adjZones.add(eval); + + //right bottom + if ((world.getRegion(x + _vision, y - _vision)) != null) + adjZones.add(eval); + + //right + if ((world.getRegion(x + _vision, y)) != null) + adjZones.add(eval); + + //right top + if ((world.getRegion(x + _vision, y + _vision)) != null) + adjZones.add(eval); + + //top + if ((world.getRegion(x, y + _vision)) != null) + adjZones.add(eval); + + + for (L2WorldRegion region : adjZones) + { + L2Object object; + for (Iterator it = region.iterateVisibleObjects();it.hasNext();) + { + object = it.next(); + if (Point3D.distanceLessThan(myPosition,object.getPosition().getWorldPosition(),_vision)) + { + object.addKnownObject(_owner,null); + _owner.addKnownObject(object, null); + } + } + } + + } + + public void forgetKnownObjects() + { + for (L2PcInstance player : _knownPlayers.values()) + { + // Remove all invisible object from _knownObjects is invisible + if (!player.isVisible()) + _owner.removeKnownObject(player); + else if (_owner.getDistanceToForgetObject(player) > MINIMUM_UPDATE_DISTANCE_SQUARED) + _owner.removeKnownObject(player); + } + + for (L2Character cha : _knownCharacters.values()) + { + if (!cha.isVisible()) + _owner.removeKnownObject(cha); + if (_owner.getDistanceToForgetObject(cha) > MINIMUM_UPDATE_DISTANCE_SQUARED) + _owner.removeKnownObject(cha); + } + + for (L2Object object : _knownOthers.values()) + { + if (!object.isVisible()) + _owner.removeKnownObject(object); + if (_owner.getDistanceToForgetObject(object) > MINIMUM_UPDATE_DISTANCE_SQUARED) + _owner.removeKnownObject(object); + } + + } + +} Index: trunk/L2_Gameserver/java/net/sf/l2j/util/Point3D.java =================================================================== --- trunk/L2_Gameserver/java/net/sf/l2j/util/Point3D.java (revision 1925) +++ trunk/L2_Gameserver/java/net/sf/l2j/util/Point3D.java (revision 2019) @@ -89,5 +89,5 @@ public int hashCode() { - return (x+y+z)%Integer.MAX_VALUE; + return x^y^z; }