Extra check for prohibiting entering siegable zones.
This commit is contained in:
parent
1b31d4763c
commit
276888201e
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user