瀏覽代碼

BETA: IPositionable interface update.
* L2Object now extends ObjectPosition.
* No more need to use getPosition().getX(), now is just getX().
* ObjectPosition now extends Point3D.
* IPositionable now includes heading and instance id.
* Changes to teleToLocation method in L2Character.
* 1 main method, with all possible overloads.
* Cleanup of L2Object.
* Point3D no longer implements Serializable.

* Reviewed by: Zoey76, UnAfraid, Nos
* Tested by: zatei

xban1x 11 年之前
父節點
當前提交
9899808a50
共有 31 個文件被更改,包括 351 次插入513 次删除
  1. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java
  2. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ItemsOnGroundManager.java
  3. 5 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/SiegeManager.java
  4. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/CursedWeapon.java
  5. 37 107
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java
  6. 8 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Spawn.java
  7. 8 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/Location.java
  8. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/MobGroup.java
  9. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/WalkInfo.java
  10. 61 73
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java
  11. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Summon.java
  12. 10 8
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Vehicle.java
  13. 27 62
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java
  14. 0 56
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/CharPosition.java
  15. 35 75
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/ObjectPosition.java
  16. 0 45
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/PcPosition.java
  17. 3 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/DimensionalRift.java
  18. 4 3
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Duel.java
  19. 16 0
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/interfaces/IPositionable.java
  20. 14 9
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java
  21. 5 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java
  22. 4 5
      L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2BossZone.java
  23. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java
  24. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java
  25. 2 2
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java
  26. 8 13
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ObservationMode.java
  27. 7 10
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ObservationReturn.java
  28. 4 4
      L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PartyMemberPosition.java
  29. 2 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/MinionList.java
  30. 80 22
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/Point3D.java
  31. 1 1
      L2J_Server_BETA/java/com/l2jserver/gameserver/util/Util.java

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/SevenSignsFestival.java

@@ -2129,7 +2129,7 @@ public class SevenSignsFestival implements SpawnListener
 						}
 						
 						participant.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-						participant.teleToLocation(x, y, _startLocation._z, true);
+						participant.teleToLocation(new Location(x, y, _startLocation._z), true);
 						
 						// Remove all buffs from all participants on entry. Works like the skill Cancel.
 						participant.stopAllEffectsExceptThoseThatLastThroughDeath();
@@ -2415,7 +2415,7 @@ public class SevenSignsFestival implements SpawnListener
 				}
 				
 				participant.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
-				participant.teleToLocation(origPosition._x, origPosition._y, origPosition._z, true);
+				participant.teleToLocation(new Location(origPosition._x, origPosition._y, origPosition._z), true);
 				participant.sendMessage("You have been removed from the festival arena.");
 			}
 			catch (Exception e)

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/ItemsOnGroundManager.java

@@ -117,7 +117,7 @@ public final class ItemsOnGroundManager implements Runnable
 					{
 						item.setEnchantLevel(rs.getInt(4));
 					}
-					item.getPosition().setWorldPosition(rs.getInt(5), rs.getInt(6), rs.getInt(7));
+					item.getPosition().setXYZ(rs.getInt(5), rs.getInt(6), rs.getInt(7));
 					item.getPosition().setWorldRegion(L2World.getInstance().getRegion(item.getPosition().getWorldPosition()));
 					item.getPosition().getWorldRegion().addVisibleObject(item);
 					final long dropTime = rs.getLong(8);

+ 5 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/SiegeManager.java

@@ -275,6 +275,11 @@ public final class SiegeManager
 		return _flagMaxCount;
 	}
 	
+	public final Siege getSiege(Location loc)
+	{
+		return getSiege(loc.getX(), loc.getY(), loc.getZ());
+	}
+	
 	public final Siege getSiege(L2Object activeObject)
 	{
 		return getSiege(activeObject.getX(), activeObject.getY(), activeObject.getZ());

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CursedWeapon.java

@@ -719,12 +719,12 @@ public class CursedWeapon
 		if (_isActivated && (_player != null))
 		{
 			// Go to player holding the weapon
-			player.teleToLocation(_player.getX(), _player.getY(), _player.getZ() + 20, true);
+			player.teleToLocation(_player.getLocation(), true);
 		}
 		else if (_isDropped && (_item != null))
 		{
 			// Go to item on the ground
-			player.teleToLocation(_item.getX(), _item.getY(), _item.getZ() + 20, true);
+			player.teleToLocation(_item.getLocation(), true);
 		}
 		else
 		{

+ 37 - 107
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Object.java

@@ -35,7 +35,6 @@ import com.l2jserver.gameserver.model.actor.poly.ObjectPoly;
 import com.l2jserver.gameserver.model.actor.position.ObjectPosition;
 import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.interfaces.IIdentifiable;
-import com.l2jserver.gameserver.model.interfaces.IPositionable;
 import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
@@ -49,25 +48,24 @@ import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
  * <BR>
  * <li>L2Character</li> <li>L2ItemInstance</li>
  */
-public abstract class L2Object implements IPositionable, IIdentifiable
+public abstract class L2Object extends ObjectPosition implements IIdentifiable
 {
 	private boolean _isVisible; // Object visibility
 	private ObjectKnownList _knownList;
 	private String _name;
 	private int _objectId; // Object identifier
 	private ObjectPoly _poly;
-	private ObjectPosition _position;
-	private int _instanceId = 0;
 	
 	private InstanceType _instanceType = null;
 	private volatile Map<String, Object> _scripts;
 	
 	public L2Object(int objectId)
 	{
+		super();
 		setInstanceType(InstanceType.L2Object);
 		_objectId = objectId;
 		initKnownList();
-		initPosition();
+		setActiveObject(this);
 	}
 	
 	public static enum InstanceType
@@ -298,69 +296,19 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 	{
 	}
 	
-	// Position - Should remove to fully move to L2ObjectPosition
-	public final void setXYZ(int x, int y, int z)
-	{
-		getPosition().setXYZ(x, y, z);
-	}
-	
-	public final void setXYZInvisible(int x, int y, int z)
-	{
-		getPosition().setXYZInvisible(x, y, z);
-	}
-	
-	@Override
-	public final int getX()
-	{
-		assert (getPosition().getWorldRegion() != null) || _isVisible;
-		return getPosition().getX();
-	}
-	
-	@Override
-	public final int getY()
-	{
-		assert (getPosition().getWorldRegion() != null) || _isVisible;
-		return getPosition().getY();
-	}
-	
-	@Override
-	public final int getZ()
-	{
-		assert (getPosition().getWorldRegion() != null) || _isVisible;
-		return getPosition().getZ();
-	}
-	
-	@Override
-	public Location getLocation()
-	{
-		return new Location(getX(), getY(), getZ(), getHeading(), getInstanceId());
-	}
-	
-	public int getHeading()
-	{
-		return 0;
-	}
-	
-	/**
-	 * @return The id of the instance zone the object is in - id 0 is global since everything like dropped items, mobs, players can be in a instanciated area, it must be in l2object
-	 */
-	public int getInstanceId()
-	{
-		return _instanceId;
-	}
-	
 	/**
 	 * UnAfraid: TODO: Add listener here.
 	 * @param instanceId The id of the instance zone the object is in - id 0 is global
 	 */
+	@Override
 	public void setInstanceId(int instanceId)
 	{
-		if ((instanceId < 0) || (_instanceId == instanceId))
+		if ((instanceId < 0) || (getInstanceId() == instanceId))
 		{
 			return;
 		}
 		
-		Instance oldI = InstanceManager.getInstance().getInstance(_instanceId);
+		Instance oldI = InstanceManager.getInstance().getInstance(getInstanceId());
 		Instance newI = InstanceManager.getInstance().getInstance(instanceId);
 		
 		if (newI == null)
@@ -371,7 +319,7 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		if (isPlayer())
 		{
 			L2PcInstance player = getActingPlayer();
-			if ((_instanceId > 0) && (oldI != null))
+			if ((getInstanceId() > 0) && (oldI != null))
 			{
 				oldI.removePlayer(getObjectId());
 				if (oldI.isShowTimer())
@@ -414,7 +362,7 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		else if (isNpc())
 		{
 			L2Npc npc = (L2Npc) this;
-			if ((_instanceId > 0) && (oldI != null))
+			if ((getInstanceId() > 0) && (oldI != null))
 			{
 				oldI.removeNpc(npc);
 			}
@@ -424,7 +372,7 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 			}
 		}
 		
-		_instanceId = instanceId;
+		super.setInstanceId(instanceId);
 		
 		// If we change it for visible objects, me must clear & revalidates knownlists
 		if (_isVisible && (_knownList != null))
@@ -464,14 +412,14 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 	 */
 	public void decayMe()
 	{
-		assert getPosition().getWorldRegion() != null;
+		assert getWorldRegion() != null;
 		
-		L2WorldRegion reg = getPosition().getWorldRegion();
+		L2WorldRegion reg = getWorldRegion();
 		
 		synchronized (this)
 		{
 			_isVisible = false;
-			getPosition().setWorldRegion(null);
+			setWorldRegion(null);
 		}
 		
 		// this can synchronize on others instances, so it's out of
@@ -505,32 +453,32 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 	 */
 	public final void spawnMe()
 	{
-		assert (getPosition().getWorldRegion() == null) && (getPosition().getWorldPosition().getX() != 0) && (getPosition().getWorldPosition().getY() != 0) && (getPosition().getWorldPosition().getZ() != 0);
+		assert (getWorldRegion() == null) && (getWorldPosition().getX() != 0) && (getWorldPosition().getY() != 0) && (getWorldPosition().getZ() != 0);
 		
 		synchronized (this)
 		{
 			// Set the x,y,z position of the L2Object spawn and update its _worldregion
 			_isVisible = true;
-			getPosition().setWorldRegion(L2World.getInstance().getRegion(getPosition().getWorldPosition()));
+			setWorldRegion(L2World.getInstance().getRegion(getWorldPosition()));
 			
 			// Add the L2Object spawn in the _allobjects of L2World
 			L2World.getInstance().storeObject(this);
 			
 			// Add the L2Object spawn to _visibleObjects and if necessary to _allplayers of its L2WorldRegion
-			getPosition().getWorldRegion().addVisibleObject(this);
+			getWorldRegion().addVisibleObject(this);
 		}
 		
 		// this can synchronize on others instances, so it's out of
 		// synchronized, to avoid deadlocks
 		// Add the L2Object spawn in the world as a visible object
-		L2World.getInstance().addVisibleObject(this, getPosition().getWorldRegion());
+		L2World.getInstance().addVisibleObject(this, getWorldRegion());
 		
 		onSpawn();
 	}
 	
 	public final void spawnMe(int x, int y, int z)
 	{
-		assert getPosition().getWorldRegion() == null;
+		assert getWorldRegion() == null;
 		
 		synchronized (this)
 		{
@@ -554,8 +502,8 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 				y = L2World.MAP_MIN_Y + 5000;
 			}
 			
-			getPosition().setWorldPosition(x, y, z);
-			getPosition().setWorldRegion(L2World.getInstance().getRegion(getPosition().getWorldPosition()));
+			setXYZ(x, y, z);
+			setWorldRegion(L2World.getInstance().getRegion(getWorldPosition()));
 			
 			// Add the L2Object spawn in the _allobjects of L2World
 		}
@@ -566,10 +514,10 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		// synchronized, to avoid deadlocks
 		
 		// Add the L2Object spawn to _visibleObjects and if necessary to _allplayers of its L2WorldRegion
-		getPosition().getWorldRegion().addVisibleObject(this);
+		getWorldRegion().addVisibleObject(this);
 		
 		// Add the L2Object spawn in the world as a visible object
-		L2World.getInstance().addVisibleObject(this, getPosition().getWorldRegion());
+		L2World.getInstance().addVisibleObject(this, getWorldRegion());
 		
 		onSpawn();
 	}
@@ -602,7 +550,7 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 	 */
 	public final boolean isVisible()
 	{
-		return getPosition().getWorldRegion() != null;
+		return getWorldRegion() != null;
 	}
 	
 	public final void setIsVisible(boolean value)
@@ -610,7 +558,7 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		_isVisible = value;
 		if (!_isVisible)
 		{
-			getPosition().setWorldRegion(null);
+			setWorldRegion(null);
 		}
 	}
 	
@@ -656,32 +604,6 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		return _poly;
 	}
 	
-	public ObjectPosition getPosition()
-	{
-		return _position;
-	}
-	
-	/**
-	 * Initializes the Position class of the L2Object, is overwritten in classes that require a different position Type. Removes the need for instanceof checks.
-	 */
-	public void initPosition()
-	{
-		_position = new ObjectPosition(this);
-	}
-	
-	public final void setObjectPosition(ObjectPosition value)
-	{
-		_position = value;
-	}
-	
-	/**
-	 * @return reference to region this object is in.
-	 */
-	public L2WorldRegion getWorldRegion()
-	{
-		return getPosition().getWorldRegion();
-	}
-	
 	public L2PcInstance getActingPlayer()
 	{
 		return null;
@@ -709,12 +631,6 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		
 	}
 	
-	@Override
-	public String toString()
-	{
-		return (getClass().getSimpleName() + ":" + getName() + "[" + getObjectId() + "]");
-	}
-	
 	/**
 	 * Not Implemented.<BR>
 	 * <BR>
@@ -783,6 +699,14 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 		return false;
 	}
 	
+	/**
+	 * @return {@code true} if object is instance of L2Attackable
+	 */
+	public boolean isCharacter()
+	{
+		return false;
+	}
+	
 	/**
 	 * @return {@code true} if object is instance of L2DoorInstance
 	 */
@@ -941,4 +865,10 @@ public abstract class L2Object implements IPositionable, IIdentifiable
 	{
 		
 	}
+	
+	@Override
+	public String toString()
+	{
+		return (getClass().getSimpleName() + ":" + getName() + "[" + getObjectId() + "]");
+	}
 }

+ 8 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Spawn.java

@@ -174,6 +174,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	 * Set the X position of the spawn point.
 	 * @param x the x coordinate
 	 */
+	@Override
 	public void setX(int x)
 	{
 		_location.setX(x);
@@ -189,6 +190,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	 * Set the Y position of the spawn point.
 	 * @param y the y coordinate
 	 */
+	@Override
 	public void setY(int y)
 	{
 		_location.setY(y);
@@ -204,6 +206,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	 * Set the Z position of the spawn point.
 	 * @param z the z coordinate
 	 */
+	@Override
 	public void setZ(int z)
 	{
 		_location.setZ(z);
@@ -212,6 +215,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	/**
 	 * @return the heading of L2NpcInstance when they are spawned.
 	 */
+	@Override
 	public int getHeading()
 	{
 		return _location.getHeading();
@@ -221,6 +225,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	 * Set the heading of L2NpcInstance when they are spawned.
 	 * @param heading
 	 */
+	@Override
 	public void setHeading(int heading)
 	{
 		_location.setHeading(heading);
@@ -230,6 +235,7 @@ public class L2Spawn implements IPositionable, IIdentifiable
 	 * Set the XYZ position of the spawn point.
 	 * @param loc
 	 */
+	@Override
 	public void setLocation(Location loc)
 	{
 		_location = loc;
@@ -653,11 +659,13 @@ public class L2Spawn implements IPositionable, IIdentifiable
 		return _template;
 	}
 	
+	@Override
 	public int getInstanceId()
 	{
 		return _instanceId;
 	}
 	
+	@Override
 	public void setInstanceId(int instanceId)
 	{
 		_instanceId = instanceId;

+ 8 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/Location.java

@@ -71,6 +71,7 @@ public class Location implements IPositionable
 	 * Set the x coordinate.
 	 * @param x the x coordinate
 	 */
+	@Override
 	public void setX(int x)
 	{
 		_x = x;
@@ -90,6 +91,7 @@ public class Location implements IPositionable
 	 * Set the y coordinate.
 	 * @param y the x coordinate
 	 */
+	@Override
 	public void setY(int y)
 	{
 		_y = y;
@@ -109,6 +111,7 @@ public class Location implements IPositionable
 	 * Set the z coordinate.
 	 * @param z the z coordinate
 	 */
+	@Override
 	public void setZ(int z)
 	{
 		_z = z;
@@ -118,6 +121,7 @@ public class Location implements IPositionable
 	 * Get the heading.
 	 * @return the heading
 	 */
+	@Override
 	public int getHeading()
 	{
 		return _heading;
@@ -127,6 +131,7 @@ public class Location implements IPositionable
 	 * Set the heading.
 	 * @param heading the heading
 	 */
+	@Override
 	public void setHeading(int heading)
 	{
 		_heading = heading;
@@ -136,6 +141,7 @@ public class Location implements IPositionable
 	 * Get the instance Id.
 	 * @return the instance Id
 	 */
+	@Override
 	public int getInstanceId()
 	{
 		return _instanceId;
@@ -145,6 +151,7 @@ public class Location implements IPositionable
 	 * Set the instance Id.
 	 * @param instanceId the instance Id to set
 	 */
+	@Override
 	public void setInstanceId(int instanceId)
 	{
 		_instanceId = instanceId;
@@ -156,6 +163,7 @@ public class Location implements IPositionable
 		return this;
 	}
 	
+	@Override
 	public void setLocation(Location loc)
 	{
 		_x = loc.getX();

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/MobGroup.java

@@ -181,7 +181,7 @@ public final class MobGroup
 				int x = player.getX() + Rnd.nextInt(50);
 				int y = player.getY() + Rnd.nextInt(50);
 				
-				mobInst.teleToLocation(x, y, player.getZ(), true);
+				mobInst.teleToLocation(new Location(x, y, player.getZ()), true);
 				L2ControllableMobAI ai = (L2ControllableMobAI) mobInst.getAI();
 				ai.follow(player);
 			}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/WalkInfo.java

@@ -125,7 +125,7 @@ public class WalkInfo
 					}
 					case WalkingManager.REPEAT_TELE_FIRST:
 					{
-						npc.teleToLocation(npc.getSpawn().getLocation(), 0);
+						npc.teleToLocation(npc.getSpawn().getLocation());
 						_currentNode = 0;
 						break;
 					}

+ 61 - 73
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -71,7 +71,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2RiftInvaderInstance;
 import com.l2jserver.gameserver.model.actor.knownlist.CharKnownList;
-import com.l2jserver.gameserver.model.actor.position.CharPosition;
 import com.l2jserver.gameserver.model.actor.stat.CharStat;
 import com.l2jserver.gameserver.model.actor.status.CharStatus;
 import com.l2jserver.gameserver.model.actor.tasks.character.FlyToLocationTask;
@@ -92,6 +91,7 @@ import com.l2jserver.gameserver.model.entity.Instance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.holders.SkillUseHolder;
 import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
+import com.l2jserver.gameserver.model.interfaces.IPositionable;
 import com.l2jserver.gameserver.model.interfaces.ISkillsHolder;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.items.L2Item;
@@ -500,7 +500,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			{
 				return;
 			}
-			spawnMe(getPosition().getX(), getPosition().getY(), getPosition().getZ());
+			spawnMe(getX(), getY(), getZ());
 			setIsTeleporting(false);
 			getEvents().onTeleported();
 		}
@@ -650,11 +650,27 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 * @param y
 	 * @param z
 	 * @param heading
+	 * @param instanceId
 	 * @param randomOffset
 	 */
-	public void teleToLocation(int x, int y, int z, int heading, int randomOffset)
+	public void teleToLocation(int x, int y, int z, int heading, int instanceId, int randomOffset)
 	{
-		// Stop movement
+		setInstanceId(instanceId);
+		
+		if (isPlayer() && DimensionalRiftManager.getInstance().checkIfInRiftZone(getX(), getY(), getZ(), true)) // true -> ignore waiting room :)
+		{
+			L2PcInstance player = getActingPlayer();
+			player.sendMessage("You have been sent to the waiting room.");
+			if (player.isInParty() && player.getParty().isInDimensionalRift())
+			{
+				player.getParty().getDimensionalRift().usedTeleport(player);
+			}
+			int[] newCoords = DimensionalRiftManager.getInstance().getRoom((byte) 0, (byte) 0).getTeleportCoorinates();
+			x = newCoords[0];
+			y = newCoords[1];
+			z = newCoords[2];
+		}
+		
 		stopMove(null, false);
 		abortAttack();
 		abortCast();
@@ -679,12 +695,12 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		decayMe();
 		
 		// Set the x,y,z position of the L2Object and if necessary modify its _worldRegion
-		getPosition().setXYZ(x, y, z);
+		setXYZ(x, y, z);
 		
 		// temporary fix for heading on teleports
 		if (heading != 0)
 		{
-			getPosition().setHeading(heading);
+			setHeading(heading);
 		}
 		
 		// allow recall of the detached characters
@@ -696,77 +712,54 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		revalidateZone(true);
 	}
 	
-	public void teleToLocation(int x, int y, int z)
+	public void teleToLocation(int x, int y, int z, int heading, int instanceId, boolean randomOffset)
 	{
-		teleToLocation(x, y, z, getHeading(), 0);
+		teleToLocation(x, y, z, heading, instanceId, (randomOffset) ? Config.MAX_OFFSET_ON_TELEPORT : 0);
 	}
 	
-	public void teleToLocation(int x, int y, int z, int randomOffset)
+	public void teleToLocation(int x, int y, int z, int heading, int instanceId)
 	{
-		teleToLocation(x, y, z, getHeading(), randomOffset);
+		teleToLocation(x, y, z, heading, instanceId, 0);
 	}
 	
-	/**
-	 * Teleports a character to the given location and set its instance Id.
-	 * @param loc the location to teleport the character
-	 * @param randomOffset the random offset for the teleport location
-	 */
-	public void teleToLocation(Location loc, int randomOffset)
+	public void teleToLocation(int x, int y, int z, int heading, boolean randomOffset)
 	{
-		setInstanceId(loc.getInstanceId());
-		
-		int x = loc.getX();
-		int y = loc.getY();
-		int z = loc.getZ();
-		
-		if (isPlayer() && DimensionalRiftManager.getInstance().checkIfInRiftZone(getX(), getY(), getZ(), true)) // true -> ignore waiting room :)
-		{
-			L2PcInstance player = getActingPlayer();
-			player.sendMessage("You have been sent to the waiting room.");
-			if (player.isInParty() && player.getParty().isInDimensionalRift())
-			{
-				player.getParty().getDimensionalRift().usedTeleport(player);
-			}
-			int[] newCoords = DimensionalRiftManager.getInstance().getRoom((byte) 0, (byte) 0).getTeleportCoorinates();
-			x = newCoords[0];
-			y = newCoords[1];
-			z = newCoords[2];
-		}
-		teleToLocation(x, y, z, getHeading(), randomOffset);
+		teleToLocation(x, y, z, heading, 0, (randomOffset) ? Config.MAX_OFFSET_ON_TELEPORT : 0);
 	}
 	
-	public void teleToLocation(TeleportWhereType teleportWhere)
+	public void teleToLocation(int x, int y, int z, int heading)
 	{
-		teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, teleportWhere), true);
+		teleToLocation(x, y, z, heading, 0, 0);
 	}
 	
-	public void teleToLocation(Location loc, boolean allowRandomOffset)
+	public void teleToLocation(int x, int y, int z, boolean randomOffset)
 	{
-		teleToLocation(loc, (allowRandomOffset ? Config.MAX_OFFSET_ON_TELEPORT : 0));
+		teleToLocation(x, y, z, 0, 0, (randomOffset) ? Config.MAX_OFFSET_ON_TELEPORT : 0);
 	}
 	
-	public void teleToLocation(int x, int y, int z, boolean allowRandomOffset)
+	public void teleToLocation(int x, int y, int z)
 	{
-		if (allowRandomOffset)
-		{
-			teleToLocation(x, y, z, Config.MAX_OFFSET_ON_TELEPORT);
-		}
-		else
-		{
-			teleToLocation(x, y, z, 0);
-		}
+		teleToLocation(x, y, z, 0, 0, 0);
 	}
 	
-	public void teleToLocation(int x, int y, int z, int heading, boolean allowRandomOffset)
+	public void teleToLocation(IPositionable loc, int randomOffset)
 	{
-		if (allowRandomOffset)
-		{
-			teleToLocation(x, y, z, heading, Config.MAX_OFFSET_ON_TELEPORT);
-		}
-		else
-		{
-			teleToLocation(x, y, z, heading, 0);
-		}
+		teleToLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), loc.getInstanceId(), randomOffset);
+	}
+	
+	public void teleToLocation(IPositionable loc, boolean randomOffset)
+	{
+		teleToLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), loc.getInstanceId(), (randomOffset) ? Config.MAX_OFFSET_ON_TELEPORT : 0);
+	}
+	
+	public void teleToLocation(IPositionable loc)
+	{
+		teleToLocation(loc.getX(), loc.getY(), loc.getZ(), loc.getHeading(), loc.getInstanceId(), 0);
+	}
+	
+	public void teleToLocation(TeleportWhereType teleportWhere)
+	{
+		teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, teleportWhere), true);
 	}
 	
 	/**
@@ -2893,18 +2886,6 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		_status = value;
 	}
 	
-	@Override
-	public CharPosition getPosition()
-	{
-		return (CharPosition) super.getPosition();
-	}
-	
-	@Override
-	public void initPosition()
-	{
-		setObjectPosition(new CharPosition(this));
-	}
-	
 	public void initCharEvents()
 	{
 		_events = new CharEvents(this);
@@ -3885,6 +3866,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	 * Set the orientation of the L2Character.
 	 * @param heading
 	 */
+	@Override
 	public final void setHeading(int heading)
 	{
 		_heading = heading;
@@ -4186,7 +4168,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		if (distFraction > 1)
 		{
 			// Set the position of the L2Character to the destination
-			super.getPosition().setXYZ(m._xDestination, m._yDestination, m._zDestination);
+			super.setXYZ(m._xDestination, m._yDestination, m._zDestination);
 		}
 		else
 		{
@@ -4194,7 +4176,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 			m._yAccurate += dy * distFraction;
 			
 			// Set the position of the L2Character to estimated after parcial move
-			super.getPosition().setXYZ((int) (m._xAccurate), (int) (m._yAccurate), zPrev + (int) ((dz * distFraction) + 0.5));
+			super.setXYZ((int) (m._xAccurate), (int) (m._yAccurate), zPrev + (int) ((dz * distFraction) + 0.5));
 		}
 		revalidateZone(false);
 		
@@ -4261,7 +4243,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 		// All data are contained in a Location object
 		if (loc != null)
 		{
-			getPosition().setXYZ(loc.getX(), loc.getY(), loc.getZ());
+			setXYZ(loc.getX(), loc.getY(), loc.getZ());
 			setHeading(loc.getHeading());
 			revalidateZone(true);
 		}
@@ -7344,4 +7326,10 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 	{
 		return false;
 	}
+	
+	@Override
+	public boolean isCharacter()
+	{
+		return true;
+	}
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Summon.java

@@ -970,7 +970,7 @@ public abstract class L2Summon extends L2Playable
 	public void onTeleported()
 	{
 		super.onTeleported();
-		sendPacket(new TeleportToLocation(this, getPosition().getX(), getPosition().getY(), getPosition().getZ(), getPosition().getHeading()));
+		sendPacket(new TeleportToLocation(this, getX(), getY(), getZ(), getHeading()));
 	}
 	
 	@Override

+ 10 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Vehicle.java

@@ -40,6 +40,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.knownlist.VehicleKnownList;
 import com.l2jserver.gameserver.model.actor.stat.VehicleStat;
 import com.l2jserver.gameserver.model.actor.templates.L2CharTemplate;
+import com.l2jserver.gameserver.model.interfaces.IPositionable;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -133,7 +134,8 @@ public abstract class L2Vehicle extends L2Character
 				{
 					if (point.getMoveSpeed() == 0)
 					{
-						teleToLocation(point.getX(), point.getY(), point.getZ(), point.getRotationSpeed(), false);
+						point.setHeading(point.getRotationSpeed());
+						teleToLocation(point, false);
 						_currentPath = null;
 					}
 					else
@@ -326,7 +328,7 @@ public abstract class L2Vehicle extends L2Character
 						if ((ticket == null) || (player.getInventory().destroyItem("Boat", ticket, count, player, this) == null))
 						{
 							player.sendPacket(SystemMessageId.NOT_CORRECT_BOAT_TICKET);
-							player.teleToLocation(oustX, oustY, oustZ, true);
+							player.teleToLocation(new Location(oustX, oustY, oustZ), true);
 							continue;
 						}
 						iu = new InventoryUpdate();
@@ -348,7 +350,7 @@ public abstract class L2Vehicle extends L2Character
 		{
 			if ((player != null) && (player.getVehicle() == this))
 			{
-				player.getPosition().setXYZ(getX(), getY(), getZ());
+				player.setXYZ(getX(), getY(), getZ());
 				player.revalidateZone(false);
 			}
 		}
@@ -357,7 +359,7 @@ public abstract class L2Vehicle extends L2Character
 	}
 	
 	@Override
-	public void teleToLocation(int x, int y, int z, int heading, boolean allowRandomOffset)
+	public void teleToLocation(IPositionable loc, boolean allowRandomOffset)
 	{
 		if (isMoving())
 		{
@@ -372,17 +374,17 @@ public abstract class L2Vehicle extends L2Character
 		{
 			if (player != null)
 			{
-				player.teleToLocation(x, y, z);
+				player.teleToLocation(loc, false);
 			}
 		}
 		
 		decayMe();
-		setXYZ(x, y, z);
+		setXYZ(loc.getX(), loc.getY(), loc.getZ());
 		
 		// temporary fix for heading on teleports
-		if (heading != 0)
+		if (loc.getHeading() != 0)
 		{
-			getPosition().setHeading(heading);
+			setHeading(loc.getHeading());
 		}
 		
 		onTeleported();

+ 27 - 62
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -154,7 +154,6 @@ import com.l2jserver.gameserver.model.actor.L2Vehicle;
 import com.l2jserver.gameserver.model.actor.appearance.PcAppearance;
 import com.l2jserver.gameserver.model.actor.events.PlayerEvents;
 import com.l2jserver.gameserver.model.actor.knownlist.PcKnownList;
-import com.l2jserver.gameserver.model.actor.position.PcPosition;
 import com.l2jserver.gameserver.model.actor.stat.PcStat;
 import com.l2jserver.gameserver.model.actor.status.PcStatus;
 import com.l2jserver.gameserver.model.actor.tasks.player.DismountTask;
@@ -202,6 +201,7 @@ import com.l2jserver.gameserver.model.fishing.L2Fish;
 import com.l2jserver.gameserver.model.fishing.L2Fishing;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.holders.SkillUseHolder;
+import com.l2jserver.gameserver.model.interfaces.IPositionable;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.itemcontainer.ItemContainer;
 import com.l2jserver.gameserver.model.itemcontainer.PcFreight;
@@ -572,9 +572,7 @@ public final class L2PcInstance extends L2Playable
 	private boolean _waitTypeSitting;
 	
 	/** Location before entering Observer Mode */
-	private int _lastX;
-	private int _lastY;
-	private int _lastZ;
+	private Location _lastLoc;
 	private boolean _observerMode = false;
 	
 	/** Stored from last ValidatePosition **/
@@ -1183,18 +1181,6 @@ public final class L2PcInstance extends L2Playable
 		return (PlayerEvents) super.getEvents();
 	}
 	
-	@Override
-	public PcPosition getPosition()
-	{
-		return (PcPosition) super.getPosition();
-	}
-	
-	@Override
-	public void initPosition()
-	{
-		setObjectPosition(new PcPosition(this));
-	}
-	
 	public final PcAppearance getAppearance()
 	{
 		return _appearance;
@@ -7724,9 +7710,9 @@ public final class L2PcInstance extends L2Playable
 			statement.setInt(10, getAppearance().getHairColor());
 			statement.setInt(11, getAppearance().getSex() ? 1 : 0);
 			statement.setInt(12, getHeading());
-			statement.setInt(13, _observerMode ? _lastX : getX());
-			statement.setInt(14, _observerMode ? _lastY : getY());
-			statement.setInt(15, _observerMode ? _lastZ : getZ());
+			statement.setInt(13, _observerMode ? _lastLoc.getX() : getX());
+			statement.setInt(14, _observerMode ? _lastLoc.getY() : getY());
+			statement.setInt(15, _observerMode ? _lastLoc.getZ() : getZ());
 			statement.setLong(16, exp);
 			statement.setLong(17, getExpBeforeDeath());
 			statement.setInt(18, sp);
@@ -9820,11 +9806,9 @@ public final class L2PcInstance extends L2Playable
 		sendPacket(SystemMessage.sendString(message));
 	}
 	
-	public void enterObserverMode(int x, int y, int z)
+	public void enterObserverMode(Location loc)
 	{
-		_lastX = getX();
-		_lastY = getY();
-		_lastZ = getZ();
+		_lastLoc = loc;
 		
 		stopEffects(L2EffectType.HIDE);
 		
@@ -9835,17 +9819,15 @@ public final class L2PcInstance extends L2Playable
 		setIsInvul(true);
 		getAppearance().setInvisible();
 		// sendPacket(new GMHide(1));
-		sendPacket(new ObservationMode(x, y, z));
+		sendPacket(new ObservationMode(loc));
 		getKnownList().removeAllKnownObjects(); // reinit knownlist
-		setXYZ(x, y, z);
+		setLocation(loc);
 		broadcastUserInfo();
 	}
 	
-	public void setLastCords(int x, int y, int z)
+	public void setLastLocation(Location loc)
 	{
-		_lastX = getX();
-		_lastY = getY();
-		_lastZ = getZ();
+		_lastLoc = loc;
 	}
 	
 	public void enterOlympiadObserverMode(Location loc, int id)
@@ -9879,9 +9861,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		if (!_observerMode)
 		{
-			_lastX = getX();
-			_lastY = getY();
-			_lastZ = getZ();
+			_lastLoc = loc;
 		}
 		
 		_observerMode = true;
@@ -9898,7 +9878,7 @@ public final class L2PcInstance extends L2Playable
 	{
 		setTarget(null);
 		getKnownList().removeAllKnownObjects(); // reinit knownlist
-		setXYZ(_lastX, _lastY, _lastZ);
+		setLocation(_lastLoc);
 		setIsParalyzed(false);
 		if (!isGM())
 		{
@@ -9912,8 +9892,8 @@ public final class L2PcInstance extends L2Playable
 		
 		setFalling(); // prevent receive falling damage
 		_observerMode = false;
-		setLastCords(0, 0, 0);
-		sendPacket(new ObservationReturn(this));
+		setLastLocation(null);
+		sendPacket(new ObservationReturn(getLastLocation()));
 		broadcastUserInfo();
 	}
 	
@@ -9928,7 +9908,7 @@ public final class L2PcInstance extends L2Playable
 		setTarget(null);
 		sendPacket(new ExOlympiadMode(0));
 		setInstanceId(0);
-		teleToLocation(_lastX, _lastY, _lastZ, true);
+		teleToLocation(_lastLoc, true);
 		if (!isGM())
 		{
 			getAppearance().setVisible();
@@ -9938,7 +9918,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
 		}
-		setLastCords(0, 0, 0);
+		setLastLocation(null);
 		broadcastUserInfo();
 	}
 	
@@ -9962,19 +9942,9 @@ public final class L2PcInstance extends L2Playable
 		return _olympiadGameId;
 	}
 	
-	public int getLastX()
+	public Location getLastLocation()
 	{
-		return _lastX;
-	}
-	
-	public int getLastY()
-	{
-		return _lastY;
-	}
-	
-	public int getLastZ()
-	{
-		return _lastZ;
+		return _lastLoc;
 	}
 	
 	public boolean inObserverMode()
@@ -11066,19 +11036,19 @@ public final class L2PcInstance extends L2Playable
 	}
 	
 	@Override
-	public void teleToLocation(int x, int y, int z, int heading, boolean allowRandomOffset)
+	public void teleToLocation(IPositionable loc, boolean allowRandomOffset)
 	{
 		if ((getVehicle() != null) && !getVehicle().isTeleporting())
 		{
 			setVehicle(null);
 		}
 		
-		if (isFlyingMounted() && (z < -1005))
+		if (isFlyingMounted() && (loc.getZ() < -1005))
 		{
-			z = -1005;
+			loc.setZ(-1005);
 		}
 		
-		super.teleToLocation(x, y, z, heading, allowRandomOffset);
+		super.teleToLocation(loc, allowRandomOffset);
 	}
 	
 	@Override
@@ -11115,7 +11085,7 @@ public final class L2PcInstance extends L2Playable
 		if (hasSummon())
 		{
 			getSummon().setFollowStatus(false);
-			getSummon().teleToLocation(getPosition().getX(), getPosition().getY(), getPosition().getZ(), false);
+			getSummon().teleToLocation(getLocation(), false);
 			((L2SummonAI) getSummon().getAI()).setStartFollowController(true);
 			getSummon().setFollowStatus(true);
 			getSummon().updateAndBroadcastStatus(0);
@@ -11782,7 +11752,7 @@ public final class L2PcInstance extends L2Playable
 			// before entering in observer mode
 			if (inObserverMode())
 			{
-				setXYZInvisible(_lastX, _lastY, _lastZ);
+				setLocationInvisible(_lastLoc);
 			}
 			
 			if (getVehicle() != null)
@@ -13581,7 +13551,7 @@ public final class L2PcInstance extends L2Playable
 	{
 		if (isInBoat())
 		{
-			getPosition().setWorldPosition(getBoat().getPosition().getWorldPosition());
+			setWorldPosition(getBoat().getWorldPosition());
 			
 			activeChar.sendPacket(new CharInfo(this));
 			activeChar.sendPacket(new ExBrExtraUserInfo(this));
@@ -13609,7 +13579,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		else if (isInAirShip())
 		{
-			getPosition().setWorldPosition(getAirShip().getPosition().getWorldPosition());
+			setWorldPosition(getAirShip().getWorldPosition());
 			
 			activeChar.sendPacket(new CharInfo(this));
 			activeChar.sendPacket(new ExBrExtraUserInfo(this));
@@ -14993,9 +14963,4 @@ public final class L2PcInstance extends L2Playable
 	{
 		return 0;
 	}
-	
-	public boolean isNewbie()
-	{
-		return getAccountVariables().hasVariable(NEWBIE_KEY) ? getAccountVariables().getInteger(NEWBIE_KEY) == getObjectId() : false;
-	}
 }

+ 0 - 56
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/CharPosition.java

@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server 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 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server 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, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.actor.position;
-
-import com.l2jserver.gameserver.model.L2WorldRegion;
-import com.l2jserver.gameserver.model.actor.L2Character;
-
-/**
- * @author Erb
- */
-public class CharPosition extends ObjectPosition
-{
-	public CharPosition(L2Character activeObject)
-	{
-		super(activeObject);
-	}
-	
-	@Override
-	protected void badCoords()
-	{
-		getActiveObject().decayMe();
-	}
-	
-	@Override
-	public final void setWorldRegion(L2WorldRegion value)
-	{
-		if ((getWorldRegion() != null) && (getActiveObject() instanceof L2Character)) // confirm revalidation of old region's zones
-		{
-			if (value != null)
-			{
-				getWorldRegion().revalidateZones((L2Character) getActiveObject()); // at world region change
-			}
-			else
-			{
-				getWorldRegion().removeFromZones((L2Character) getActiveObject()); // at world region change
-			}
-		}
-		super.setWorldRegion(value);
-	}
-}

+ 35 - 75
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/ObjectPosition.java

@@ -23,21 +23,20 @@ import java.util.logging.Logger;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2WorldRegion;
+import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.util.Point3D;
 
-public class ObjectPosition
+public class ObjectPosition extends Point3D
 {
 	private static final Logger _log = Logger.getLogger(ObjectPosition.class.getName());
 	
-	private final L2Object _activeObject;
-	private int _heading = 0;
-	private Point3D _worldPosition;
+	private L2Object _activeObject;
 	private L2WorldRegion _worldRegion; // Object localization : Used for items/chars that are seen in the world
 	
-	public ObjectPosition(L2Object activeObject)
+	public ObjectPosition()
 	{
-		_activeObject = activeObject;
+		super(0, 0, 0);
 		setWorldRegion(L2World.getInstance().getRegion(getWorldPosition()));
 	}
 	
@@ -55,11 +54,12 @@ public class ObjectPosition
 	 * @param y
 	 * @param z
 	 */
+	@Override
 	public final void setXYZ(int x, int y, int z)
 	{
 		assert getWorldRegion() != null;
 		
-		setWorldPosition(x, y, z);
+		super.setXYZ(x, y, z);
 		
 		try
 		{
@@ -84,7 +84,15 @@ public class ObjectPosition
 	 */
 	protected void badCoords()
 	{
-		
+		if (_activeObject.isCharacter())
+		{
+			getActiveObject().decayMe();
+		}
+		else if (_activeObject.isPlayer())
+		{
+			((L2Character) getActiveObject()).teleToLocation(new Location(0, 0, 0), false);
+			((L2Character) getActiveObject()).sendMessage("Error with your coords, Please ask a GM for help!");
+		}
 	}
 	
 	/**
@@ -125,10 +133,15 @@ public class ObjectPosition
 			y = L2World.MAP_MIN_Y + 5000;
 		}
 		
-		setWorldPosition(x, y, z);
+		setXYZ(x, y, z);
 		getActiveObject().setIsVisible(false);
 	}
 	
+	public final void setLocationInvisible(Location loc)
+	{
+		setXYZInvisible(loc.getX(), loc.getY(), loc.getZ());
+	}
+	
 	/**
 	 * checks if current object changed its region, if so, update references
 	 */
@@ -151,77 +164,19 @@ public class ObjectPosition
 		}
 	}
 	
-	public L2Object getActiveObject()
-	{
-		return _activeObject;
-	}
-	
-	public final int getHeading()
-	{
-		return _heading;
-	}
-	
-	public final void setHeading(int value)
-	{
-		_heading = value;
-	}
-	
-	/**
-	 * @return the x position of the L2Object.
-	 */
-	public final int getX()
-	{
-		return getWorldPosition().getX();
-	}
-	
-	public final void setX(int value)
-	{
-		getWorldPosition().setX(value);
-	}
-	
-	/**
-	 * @return the y position of the L2Object.
-	 */
-	public final int getY()
-	{
-		return getWorldPosition().getY();
-	}
-	
-	public final void setY(int value)
-	{
-		getWorldPosition().setY(value);
-	}
-	
-	/**
-	 * @return the z position of the L2Object.
-	 */
-	public final int getZ()
-	{
-		return getWorldPosition().getZ();
-	}
-	
-	public final void setZ(int value)
+	public void setActiveObject(L2Object activeObject)
 	{
-		getWorldPosition().setZ(value);
-	}
-	
-	public final Point3D getWorldPosition()
-	{
-		if (_worldPosition == null)
-		{
-			_worldPosition = new Point3D(0, 0, 0);
-		}
-		return _worldPosition;
+		_activeObject = activeObject;
 	}
 	
-	public final void setWorldPosition(int x, int y, int z)
+	public L2Object getActiveObject()
 	{
-		getWorldPosition().setXYZ(x, y, z);
+		return _activeObject;
 	}
 	
 	public final void setWorldPosition(Point3D newPosition)
 	{
-		setWorldPosition(newPosition.getX(), newPosition.getY(), newPosition.getZ());
+		setXYZ(newPosition.getX(), newPosition.getY(), newPosition.getZ());
 	}
 	
 	public final L2WorldRegion getWorldRegion()
@@ -229,17 +184,22 @@ public class ObjectPosition
 		return _worldRegion;
 	}
 	
+	public final ObjectPosition getPosition()
+	{
+		return this;
+	}
+	
 	public void setWorldRegion(L2WorldRegion value)
 	{
-		if ((_worldRegion != null) && (getActiveObject() instanceof L2Character)) // confirm revalidation of old region's zones
+		if ((getWorldRegion() != null) && (getActiveObject() instanceof L2Character)) // confirm revalidation of old region's zones
 		{
 			if (value != null)
 			{
-				_worldRegion.revalidateZones((L2Character) getActiveObject()); // at world region change
+				getWorldRegion().revalidateZones((L2Character) getActiveObject()); // at world region change
 			}
 			else
 			{
-				_worldRegion.removeFromZones((L2Character) getActiveObject()); // at world region change
+				getWorldRegion().removeFromZones((L2Character) getActiveObject()); // at world region change
 			}
 		}
 		

+ 0 - 45
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/position/PcPosition.java

@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J Server
- * 
- * This file is part of L2J Server.
- * 
- * L2J Server 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 3 of the License, or
- * (at your option) any later version.
- * 
- * L2J Server 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, see <http://www.gnu.org/licenses/>.
- */
-package com.l2jserver.gameserver.model.actor.position;
-
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-
-/**
- * @author Erb
- */
-public class PcPosition extends CharPosition
-{
-	public PcPosition(L2PcInstance activeObject)
-	{
-		super(activeObject);
-	}
-	
-	@Override
-	public L2PcInstance getActiveObject()
-	{
-		return ((L2PcInstance) super.getActiveObject());
-	}
-	
-	@Override
-	protected void badCoords()
-	{
-		getActiveObject().teleToLocation(0, 0, 0, false);
-		getActiveObject().sendMessage("Error with your coords, Please ask a GM for help!");
-	}
-}

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/DimensionalRift.java

@@ -29,6 +29,7 @@ import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.instancemanager.DimensionalRiftManager;
 import com.l2jserver.gameserver.instancemanager.QuestManager;
 import com.l2jserver.gameserver.model.L2Party;
+import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.Quest;
@@ -84,7 +85,7 @@ public class DimensionalRift
 					qs.startQuest();
 				}
 			}
-			p.teleToLocation(coords[0], coords[1], coords[2]);
+			p.teleToLocation(new Location(coords[0], coords[1], coords[2]));
 		}
 		createSpawnTimer(_choosenRoom);
 		createTeleporterTimer(true);
@@ -322,7 +323,7 @@ public class DimensionalRift
 		DimensionalRiftManager.getInstance().getRoom(_type, _choosenRoom).setPartyInside(true);
 		checkBossRoom(_choosenRoom);
 		int[] coords = getRoomCoord(_choosenRoom);
-		player.teleToLocation(coords[0], coords[1], coords[2]);
+		player.teleToLocation(new Location(coords[0], coords[1], coords[2]));
 	}
 	
 	protected void teleportToWaitingRoom(L2PcInstance player)

+ 4 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Duel.java

@@ -27,6 +27,7 @@ import javolution.util.FastList;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.instancemanager.DuelManager;
+import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.zone.ZoneId;
@@ -177,7 +178,7 @@ public class Duel
 		{
 			if (_paDuel)
 			{
-				_player.teleToLocation(_x, _y, _z);
+				_player.teleToLocation(new Location(_x, _y, _z));
 			}
 		}
 		
@@ -576,13 +577,13 @@ public class Duel
 		
 		for (L2PcInstance temp : _playerA.getParty().getMembers())
 		{
-			temp.teleToLocation((x + offset) - 180, y - 150, z);
+			temp.teleToLocation(new Location((x + offset) - 180, y - 150, z));
 			offset += 40;
 		}
 		offset = 0;
 		for (L2PcInstance temp : _playerB.getParty().getMembers())
 		{
-			temp.teleToLocation((x + offset) - 180, y + 150, z);
+			temp.teleToLocation(new Location((x + offset) - 180, y + 150, z));
 			offset += 40;
 		}
 	}

+ 16 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/interfaces/IPositionable.java

@@ -32,5 +32,21 @@ public interface IPositionable
 	
 	public int getZ();
 	
+	public int getHeading();
+	
+	public int getInstanceId();
+	
 	public Location getLocation();
+	
+	public void setX(int x);
+	
+	public void setY(int y);
+	
+	public void setZ(int z);
+	
+	public void setHeading(int heading);
+	
+	public void setInstanceId(int instanceId);
+	
+	public void setLocation(Location loc);
 }

+ 14 - 9
L2J_Server_BETA/java/com/l2jserver/gameserver/model/items/instance/L2ItemInstance.java

@@ -272,9 +272,9 @@ public final class L2ItemInstance extends L2Object
 		{
 			return;
 		}
-		assert getPosition().getWorldRegion() != null;
+		assert getWorldRegion() != null;
 		
-		L2WorldRegion oldregion = getPosition().getWorldRegion();
+		L2WorldRegion oldregion = getWorldRegion();
 		
 		// Create a server->client GetItem packet to pick up the L2ItemInstance
 		player.broadcastPacket(new GetItem(this, player.getObjectId()));
@@ -282,7 +282,7 @@ public final class L2ItemInstance extends L2Object
 		synchronized (this)
 		{
 			setIsVisible(false);
-			getPosition().setWorldRegion(null);
+			setWorldRegion(null);
 		}
 		
 		// if this item is a mercenary ticket, remove the spawns!
@@ -1582,7 +1582,7 @@ public final class L2ItemInstance extends L2Object
 		@Override
 		public final void run()
 		{
-			assert _itm.getPosition().getWorldRegion() == null;
+			assert _itm.getWorldRegion() == null;
 			
 			if ((Config.GEODATA > 0) && (_dropper != null))
 			{
@@ -1605,20 +1605,20 @@ public final class L2ItemInstance extends L2Object
 			{
 				// Set the x,y,z position of the L2ItemInstance dropped and update its _worldregion
 				_itm.setIsVisible(true);
-				_itm.getPosition().setWorldPosition(_x, _y, _z);
-				_itm.getPosition().setWorldRegion(L2World.getInstance().getRegion(getPosition().getWorldPosition()));
+				_itm.setXYZ(_x, _y, _z);
+				_itm.setWorldRegion(L2World.getInstance().getRegion(getWorldPosition()));
 				
 				// Add the L2ItemInstance dropped to _visibleObjects of its L2WorldRegion
 			}
 			
-			_itm.getPosition().getWorldRegion().addVisibleObject(_itm);
+			_itm.getWorldRegion().addVisibleObject(_itm);
 			_itm.setDropTime(System.currentTimeMillis());
 			_itm.setDropperObjectId(_dropper != null ? _dropper.getObjectId() : 0); // Set the dropper Id for the knownlist packets in sendInfo
 			
 			// this can synchronize on others instances, so it's out of
 			// synchronized, to avoid deadlocks
 			// Add the L2ItemInstance dropped in the world as a visible object
-			L2World.getInstance().addVisibleObject(_itm, _itm.getPosition().getWorldRegion());
+			L2World.getInstance().addVisibleObject(_itm, _itm.getWorldRegion());
 			if (Config.SAVE_DROPPED_ITEM)
 			{
 				ItemsOnGroundManager.getInstance().save(_itm);
@@ -2304,7 +2304,7 @@ public final class L2ItemInstance extends L2Object
 			ItemPickupEvent event = new ItemPickupEvent();
 			event.setItem(this);
 			event.setPicker(actor);
-			event.setLocation(new Location(getPosition().getX(), getPosition().getY(), getPosition().getZ()));
+			event.setLocation(new Location(getX(), getY(), getZ()));
 			for (DropListener listener : dropListeners)
 			{
 				if (!listener.onPickup(event))
@@ -2411,4 +2411,9 @@ public final class L2ItemInstance extends L2Object
 	{
 		dropListeners.remove(listener);
 	}
+	
+	@Override
+	public void setHeading(int heading)
+	{
+	}
 }

+ 5 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/olympiad/AbstractOlympiadGame.java

@@ -191,7 +191,7 @@ public abstract class AbstractOlympiadGame
 		
 		try
 		{
-			player.setLastCords(player.getX(), player.getY(), player.getZ());
+			player.setLastLocation(player.getLocation());
 			if (player.isSitting())
 			{
 				player.standUp();
@@ -430,15 +430,15 @@ public abstract class AbstractOlympiadGame
 		{
 			return;
 		}
-		
-		if ((player.getLastX() == 0) && (player.getLastY() == 0))
+		final Location loc = player.getLastLocation();
+		if ((loc.getX() == 0) && (loc.getY() == 0))
 		{
 			return;
 		}
 		
 		player.setInstanceId(0);
-		player.teleToLocation(player.getLastX(), player.getLastY(), player.getLastZ());
-		player.setLastCords(0, 0, 0);
+		player.teleToLocation(loc);
+		player.setLastLocation(null);
 	}
 	
 	public static final void rewardParticipant(L2PcInstance player, int[][] reward)

+ 4 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2BossZone.java

@@ -25,6 +25,7 @@ import javolution.util.FastMap;
 import com.l2jserver.gameserver.GameServer;
 import com.l2jserver.gameserver.instancemanager.GrandBossManager;
 import com.l2jserver.gameserver.instancemanager.ZoneManager;
+import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.PcCondOverride;
 import com.l2jserver.gameserver.model.TeleportWhereType;
 import com.l2jserver.gameserver.model.actor.L2Attackable;
@@ -355,11 +356,9 @@ public class L2BossZone extends L2ZoneType
 	
 	/**
 	 * Some GrandBosses send all players in zone to a specific part of the zone, rather than just removing them all. If this is the case, this command should be used. If this is no the case, then use oustAllPlayers().
-	 * @param x
-	 * @param y
-	 * @param z
+	 * @param loc
 	 */
-	public void movePlayersTo(int x, int y, int z)
+	public void movePlayersTo(Location loc)
 	{
 		if (_characterList.isEmpty())
 		{
@@ -373,7 +372,7 @@ public class L2BossZone extends L2ZoneType
 				L2PcInstance player = character.getActingPlayer();
 				if (player.isOnline())
 				{
-					player.teleToLocation(x, y, z);
+					player.teleToLocation(loc);
 				}
 			}
 		}

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/DlgAnswer.java

@@ -98,7 +98,7 @@ public final class DlgAnswer extends L2GameClientPacket
 			final SummonRequestHolder holder = activeChar.removeScript(SummonRequestHolder.class);
 			if ((_answer == 1) && (holder != null) && (holder.getTarget().getObjectId() == _requesterId))
 			{
-				activeChar.teleToLocation(holder.getTarget().getX(), holder.getTarget().getY(), holder.getTarget().getZ(), true);
+				activeChar.teleToLocation(holder.getTarget().getLocation(), true);
 			}
 		}
 		else if (_messageId == SystemMessageId.WOULD_YOU_LIKE_TO_OPEN_THE_GATE.getId())

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/MoveBackwardToLocation.java

@@ -122,7 +122,7 @@ public class MoveBackwardToLocation extends L2GameClientPacket
 				activeChar.setTeleMode(0);
 			}
 			activeChar.sendPacket(ActionFailed.STATIC_PACKET);
-			activeChar.teleToLocation(_targetX, _targetY, _targetZ, false);
+			activeChar.teleToLocation(new Location(_targetX, _targetY, _targetZ));
 			return;
 		}
 		

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java

@@ -22,7 +22,7 @@ import com.l2jserver.Config;
 import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.position.PcPosition;
+import com.l2jserver.gameserver.model.actor.position.ObjectPosition;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
@@ -101,7 +101,7 @@ public final class RequestMagicSkillUse extends L2GameClientPacket
 		// Stop if use self-buff (except if on AirShip or Boat).
 		if (((skill.getSkillType() == L2SkillType.BUFF) && (skill.getTargetType() == L2TargetType.SELF)) && (!activeChar.isInAirShip() || !activeChar.isInBoat()))
 		{
-			final PcPosition charPos = activeChar.getPosition();
+			final ObjectPosition charPos = activeChar.getPosition();
 			activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(charPos.getX(), charPos.getY(), charPos.getZ(), charPos.getHeading()));
 		}
 	}

+ 8 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ObservationMode.java

@@ -18,29 +18,24 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
+import com.l2jserver.gameserver.model.Location;
+
 public class ObservationMode extends L2GameServerPacket
 {
-	private final int _x, _y, _z;
+	private final Location _loc;
 	
-	/**
-	 * @param x
-	 * @param y
-	 * @param z
-	 */
-	public ObservationMode(int x, int y, int z)
+	public ObservationMode(Location loc)
 	{
-		_x = x;
-		_y = y;
-		_z = z;
+		_loc = loc;
 	}
 	
 	@Override
 	protected final void writeImpl()
 	{
 		writeC(0xEB);
-		writeD(_x);
-		writeD(_y);
-		writeD(_z);
+		writeD(_loc.getX());
+		writeD(_loc.getY());
+		writeD(_loc.getZ());
 		writeC(0x00); // ?
 		writeC(0xc0); // ?
 		writeC(0x00); // ?

+ 7 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/ObservationReturn.java

@@ -18,26 +18,23 @@
  */
 package com.l2jserver.gameserver.network.serverpackets;
 
-import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.Location;
 
 public class ObservationReturn extends L2GameServerPacket
 {
-	private final L2PcInstance _activeChar;
+	private final Location _loc;
 	
-	/**
-	 * @param observer
-	 */
-	public ObservationReturn(L2PcInstance observer)
+	public ObservationReturn(Location loc)
 	{
-		_activeChar = observer;
+		_loc = loc;
 	}
 	
 	@Override
 	protected final void writeImpl()
 	{
 		writeC(0xEC);
-		writeD(_activeChar.getLastX());
-		writeD(_activeChar.getLastY());
-		writeD(_activeChar.getLastZ());
+		writeD(_loc.getX());
+		writeD(_loc.getY());
+		writeD(_loc.getZ());
 	}
 }

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/network/serverpackets/PartyMemberPosition.java

@@ -23,14 +23,14 @@ import java.util.Map;
 
 import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
-import com.l2jserver.gameserver.model.actor.position.PcPosition;
+import com.l2jserver.gameserver.model.actor.position.ObjectPosition;
 
 /**
  * @author zabbix
  */
 public class PartyMemberPosition extends L2GameServerPacket
 {
-	private final Map<Integer, PcPosition> locations = new HashMap<>();
+	private final Map<Integer, ObjectPosition> locations = new HashMap<>();
 	
 	public PartyMemberPosition(L2Party party)
 	{
@@ -55,9 +55,9 @@ public class PartyMemberPosition extends L2GameServerPacket
 	{
 		writeC(0xba);
 		writeD(locations.size());
-		for (Map.Entry<Integer, PcPosition> entry : locations.entrySet())
+		for (Map.Entry<Integer, ObjectPosition> entry : locations.entrySet())
 		{
-			PcPosition loc = entry.getValue();
+			ObjectPosition loc = entry.getValue();
 			writeD(entry.getKey());
 			writeD(loc.getX());
 			writeD(loc.getY());

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/util/MinionList.java

@@ -31,6 +31,7 @@ import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.datatables.NpcTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
 import com.l2jserver.gameserver.model.L2MinionData;
+import com.l2jserver.gameserver.model.Location;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
@@ -264,7 +265,7 @@ public class MinionList
 					newY = (_master.getY() - newY) + minRadius;
 				}
 				
-				minion.teleToLocation(newX, newY, _master.getZ());
+				minion.teleToLocation(new Location(newX, newY, _master.getZ()));
 			}
 		}
 	}

+ 80 - 22
L2J_Server_BETA/java/com/l2jserver/gameserver/util/Point3D.java

@@ -18,7 +18,6 @@
  */
 package com.l2jserver.gameserver.util;
 
-import java.io.Serializable;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import com.l2jserver.gameserver.model.Location;
@@ -27,13 +26,13 @@ import com.l2jserver.gameserver.model.interfaces.IPositionable;
 /**
  * @author Unknown, UnAfraid
  */
-public class Point3D implements Serializable, IPositionable
+public class Point3D implements IPositionable
 {
-	private static final long serialVersionUID = 4638345252031872576L;
-	
 	private final AtomicInteger _x = new AtomicInteger();
 	private final AtomicInteger _y = new AtomicInteger();
 	private final AtomicInteger _z = new AtomicInteger();
+	private final AtomicInteger _heading = new AtomicInteger();
+	private final AtomicInteger _instanceId = new AtomicInteger();
 	
 	public Point3D(int x, int y, int z)
 	{
@@ -42,6 +41,23 @@ public class Point3D implements Serializable, IPositionable
 		_z.set(z);
 	}
 	
+	public Point3D(int x, int y, int z, int heading)
+	{
+		_x.set(x);
+		_y.set(y);
+		_z.set(z);
+		_heading.set(heading);
+	}
+	
+	public Point3D(int x, int y, int z, int heading, int instanceId)
+	{
+		_x.set(x);
+		_y.set(y);
+		_z.set(z);
+		_heading.set(heading);
+		_instanceId.set(instanceId);
+	}
+	
 	public boolean equals(int x, int y, int z)
 	{
 		return (getX() == x) && (getY() == y) && (getZ() == z);
@@ -53,56 +69,86 @@ public class Point3D implements Serializable, IPositionable
 		return _x.get();
 	}
 	
-	public void setX(int x)
+	@Override
+	public int getY()
 	{
-		_x.set(x);
+		return _y.get();
 	}
 	
 	@Override
-	public int getY()
+	public int getZ()
 	{
-		return _y.get();
+		return _z.get();
 	}
 	
-	public void setY(int y)
+	@Override
+	public int getHeading()
 	{
-		_y.set(y);
+		return _heading.get();
 	}
 	
 	@Override
-	public int getZ()
+	public int getInstanceId()
 	{
-		return _z.get();
+		return _instanceId.get();
 	}
 	
-	public void setZ(int z)
+	@Override
+	public Location getLocation()
 	{
-		_z.set(z);
+		return new Location(getX(), getY(), getZ(), getHeading(), getInstanceId());
 	}
 	
-	public void setXYZ(int x, int y, int z)
+	@Override
+	public void setX(int x)
 	{
 		_x.set(x);
+	}
+	
+	@Override
+	public void setY(int y)
+	{
 		_y.set(y);
+	}
+	
+	@Override
+	public void setZ(int z)
+	{
 		_z.set(z);
 	}
 	
 	@Override
-	public Location getLocation()
+	public void setHeading(int heading)
 	{
-		return new Location(getX(), getY(), getZ());
+		_heading.set(heading);
 	}
 	
 	@Override
-	public String toString()
+	public void setInstanceId(int instanceId)
 	{
-		return "(" + _x + ", " + _y + ", " + _z + ")";
+		_instanceId.set(instanceId);
 	}
 	
 	@Override
-	public int hashCode()
+	public void setLocation(Location loc)
 	{
-		return getX() ^ getY() ^ getZ();
+		_x.set(loc.getX());
+		_y.set(loc.getY());
+		_z.set(loc.getZ());
+		_heading.set(loc.getHeading());
+		_instanceId.set(loc.getInstanceId());
+	}
+	
+	public void setXYZ(int x, int y, int z)
+	{
+		_x.set(x);
+		_y.set(y);
+		_z.set(z);
+	}
+	
+	public final Point3D getWorldPosition()
+	{
+		return this;
 	}
 	
 	@Override
@@ -115,8 +161,20 @@ public class Point3D implements Serializable, IPositionable
 		if (o instanceof Point3D)
 		{
 			final Point3D point3D = (Point3D) o;
-			return (point3D.getX() == getX()) && (point3D.getY() == getY()) && (point3D.getZ() == getZ());
+			return (point3D.getX() == getX()) && (point3D.getY() == getY()) && ((point3D.getZ() == getZ()) && (point3D.getHeading() == getHeading()) && (point3D.getInstanceId() == getInstanceId()));
 		}
 		return false;
 	}
+	
+	@Override
+	public int hashCode()
+	{
+		return getX() ^ getY() ^ getZ();
+	}
+	
+	@Override
+	public String toString()
+	{
+		return "(" + _x + ", " + _y + ", " + _z + ")";
+	}
 }

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/util/Util.java

@@ -174,7 +174,7 @@ public final class Util
 			return 1000000;
 		}
 		
-		return calculateDistance(obj1.getPosition().getX(), obj1.getPosition().getY(), obj1.getPosition().getZ(), obj2.getPosition().getX(), obj2.getPosition().getY(), obj2.getPosition().getZ(), includeZAxis);
+		return calculateDistance(obj1.getX(), obj1.getY(), obj1.getZ(), obj2.getX(), obj2.getY(), obj2.getZ(), includeZAxis);
 	}
 	
 	/**