Extra check for prohibiting entering siegable zones.

This commit is contained in:
MobiusDevelopment 2019-06-02 19:04:53 +00:00
parent 1b31d4763c
commit 276888201e
27 changed files with 1094 additions and 55 deletions

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -872,8 +872,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -872,8 +872,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -22,11 +22,19 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -90,7 +98,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceId(), false))
{
player.stopMove(player.getLastServerPosition());
@ -98,6 +106,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final int teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == 0))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceId()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -134,9 +213,9 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
if (player.getTeleMode() > 0)
if (teleMode > 0)
{
if (player.getTeleMode() == 1)
if (teleMode == 1)
{
player.setTeleMode(0);
}

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{

View File

@ -886,8 +886,8 @@ public class GeoEngine
return new GeoLocation(gtx, gty, gtz);
}
// path found, Z coordinates are not okay, return origin point
return new GeoLocation(gox, goy, goz);
// path found, Z coordinates are not okay, return last good point
return new GeoLocation(gpx, gpy, gpz);
}
}

View File

@ -24,12 +24,20 @@ import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.DoorData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.SayuneType;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.SayuneEntry;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.events.EventDispatcher;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerMoveRequest;
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.model.zone.type.CastleZone;
import org.l2jmobius.gameserver.model.zone.type.FortZone;
import org.l2jmobius.gameserver.model.zone.type.HqZone;
import org.l2jmobius.gameserver.model.zone.type.WaterZone;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
@ -41,6 +49,7 @@ import org.l2jmobius.gameserver.network.serverpackets.StopMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMove;
import org.l2jmobius.gameserver.network.serverpackets.sayune.ExFlyMoveBroadcast;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.Util;
public class MoveBackwardToLocation implements IClientIncomingPacket
{
@ -88,7 +97,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Mobius: Check for possible door logout and move over exploit. Also checked at ValidatePosition.
// Check for possible door logout and move over exploit. Also checked at ValidatePosition.
if (DoorData.getInstance().checkIfDoorsBetween(player.getX(), player.getY(), player.getZ(), _targetX, _targetY, _targetZ, player.getInstanceWorld(), false))
{
player.stopMove(player.getLastServerPosition());
@ -96,6 +105,77 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
return;
}
// Prevent player force moving in or out siege area.
final AdminTeleportType teleMode = player.getTeleMode();
if (!player.isFlying() && (teleMode == AdminTeleportType.NORMAL))
{
final boolean siegable = player.isInsideZone(ZoneId.CASTLE) || player.isInsideZone(ZoneId.FORT);
boolean waterContact = player.isInsideZone(ZoneId.WATER);
if (siegable && !waterContact) // Need to know if player is over water only when siegable.
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_originX, _originY))
{
if ((zone instanceof WaterZone) && ((zone.getZone().getHighZ() + player.getCollisionHeight()) > _originZ))
{
waterContact = true;
break;
}
}
}
if (player.isInsideZone(ZoneId.HQ) || (siegable && waterContact))
{
boolean limited = false;
boolean water = false;
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 1000)
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
limited = true;
}
if (zone instanceof WaterZone)
{
water = true;
}
}
if (limited && !water && !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if (siegable)
{
for (ZoneType zone : ZoneManager.getInstance().getZones(_targetX, _targetY, _targetZ))
{
if ((zone instanceof WaterZone) || (zone instanceof HqZone))
{
if ((Math.abs(_targetZ - _originZ) > 250) || !GeoEngine.getInstance().canSeeTarget(player, new Location(_targetX, _targetY, _targetZ)))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
else if ((zone instanceof CastleZone) || (zone instanceof FortZone))
{
if (((Math.abs(_targetZ - _originZ) < 100) || (Util.calculateDistance(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, false, false) > 2000)) && !GeoEngine.getInstance().canMoveToTarget(_originX, _originY, _originZ, _targetX, _targetY, _targetZ, player.getInstanceWorld()))
{
player.stopMove(player.getLastServerPosition());
player.sendPacket(ActionFailed.STATIC_PACKET);
return;
}
}
}
}
}
// Correcting targetZ from floor level to head level (?)
// Client is giving floor level as targetZ but that floor level doesn't
// match our current geodata and teleport coords as good as head level!
@ -132,7 +212,7 @@ public class MoveBackwardToLocation implements IClientIncomingPacket
}
}
switch (player.getTeleMode())
switch (teleMode)
{
case DEMONIC:
{