From 94d1362588edf592753bf4f5cf2e9dd4a995f48d Mon Sep 17 00:00:00 2001
From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Sat, 30 Jun 2018 14:09:20 +0000
Subject: [PATCH] GeoEngine door check improvements. Contributed by Sahar.
---
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 35 +--
.../gameserver/geoengine/GeoEngine.java | 231 +-----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
.../gameserver/ai/L2CharacterAI.java | 12 +-
.../gameserver/geoengine/GeoEngine.java | 227 +----------------
16 files changed, 107 insertions(+), 1832 deletions(-)
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index 2132494923..c5cda5a8c2 100644
--- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_1.0_Ertheia/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index 2132494923..c5cda5a8c2 100644
--- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_2.5_Underground/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index 2132494923..c5cda5a8c2 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_3.0_Helios/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index 2132494923..c5cda5a8c2 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_4.0_GrandCrusade/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index 2348296c6e..b7343930d2 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -42,7 +42,6 @@ import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.actor.templates.L2NpcTemplate;
import com.l2jmobius.gameserver.model.effects.L2EffectType;
@@ -999,36 +998,12 @@ public class L2CharacterAI extends AbstractAI
}
offset += _actor.getTemplate().getCollisionRadius();
- if (target instanceof L2Character)
+ if (target.isCharacter())
{
offset += ((L2Character) target).getTemplate().getCollisionRadius();
}
- final boolean needToMove;
-
- if (target.isDoor())
- {
- final L2DoorInstance dor = (L2DoorInstance) target;
- int xPoint = 0;
- int yPoint = 0;
- for (int i : dor.getTemplate().getNodeX())
- {
- xPoint += i;
- }
- for (int i : dor.getTemplate().getNodeY())
- {
- yPoint += i;
- }
- xPoint /= 4;
- yPoint /= 4;
- needToMove = !_actor.isInsideRadius(xPoint, yPoint, dor.getTemplate().getNodeZ(), offset, false, false);
- }
- else
- {
- needToMove = !_actor.isInsideRadius(target, offset, false, false);
- }
-
- if (needToMove)
+ if (!_actor.isInsideRadius(target, offset, false, false))
{
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (getFollowTarget() != null)
@@ -1042,7 +1017,7 @@ public class L2CharacterAI extends AbstractAI
return false;
}
- if (_actor.isMovementDisabled())
+ if (_actor.isMovementDisabled() || (_actor.getMoveSpeed() <= 0))
{
// If player is trying attack target but he cannot move to attack target
// change his intention to idle
@@ -1055,7 +1030,7 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if ((_actor.getAI().getIntention() == AI_INTENTION_CAST) && (_actor instanceof L2PcInstance) && _actor.isTransformed() && !_actor.getTransformation().isCombat())
+ if ((_actor.getAI().getIntention() == AI_INTENTION_CAST) && _actor.isPlayer() && _actor.isTransformed() && !_actor.getTransformation().isCombat())
{
_actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_STOPPED);
_actor.sendPacket(ActionFailed.STATIC_PACKET);
@@ -1069,7 +1044,7 @@ public class L2CharacterAI extends AbstractAI
}
stopFollow();
- if ((target instanceof L2Character) && !(target instanceof L2DoorInstance))
+ if (target.isCharacter() && !target.isDoor())
{
if (((L2Character) target).isMoving())
{
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index 98be2ed443..a4eb31029e 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,12 +35,10 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.util.MathUtil;
/**
@@ -271,7 +269,7 @@ public class GeoEngine
* @param geoY : Geodata Y
* @return {@link ABlock} : Block of geodata.
*/
- public final ABlock getBlock(int geoX, int geoY)
+ private final ABlock getBlock(int geoX, int geoY)
{
final int x = geoX / GeoStructure.BLOCK_CELLS_X;
final int y = geoY / GeoStructure.BLOCK_CELLS_Y;
@@ -315,20 +313,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- public final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -342,20 +326,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- public final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -389,6 +359,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -397,7 +372,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceId(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceId(), true))
{
return false;
}
@@ -424,8 +399,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -447,7 +421,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceId()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceId());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceId());
}
/**
@@ -466,7 +440,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceId(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceId(), true))
{
return false;
}
@@ -525,7 +499,7 @@ public class GeoEngine
* @param instanceId
* @return {@code boolean} : True, when target can be seen.
*/
- protected final boolean checkSee(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, int instanceId)
+ private final boolean checkSee(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, int instanceId)
{
// get line of sight Z coordinates
double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
@@ -693,189 +667,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instanceId
- * @return {@code boolean} : True, when target can be seen.
- */
- protected final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, int instanceId)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index c1c3724b2d..97947f6b90 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index c1c3724b2d..97947f6b90 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_Classic_2.1_Zaken/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
index c1c3724b2d..97947f6b90 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/ai/L2CharacterAI.java
@@ -958,7 +958,6 @@ public class L2CharacterAI extends AbstractAI
// Caller should be L2Playable and thinkAttack/thinkCast/thinkInteract/thinkPickUp
if (isFollowing())
{
-
// allow larger hit range when the target is moving (check is run only once per second)
if (!_actor.isInsideRadius(target, offset + 100, false, false))
{
@@ -981,14 +980,11 @@ public class L2CharacterAI extends AbstractAI
}
// while flying there is no move to cast
- if (_actor.getAI().getIntention() == AI_INTENTION_CAST)
+ if (_actor.getAI().getIntention() == AI_INTENTION_CAST && _actor.isPlayer() && _actor.checkTransformed(transform -> !transform.isCombat()))
{
- if (_actor.checkTransformed(transform -> !transform.isCombat()))
- {
- _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
- _actor.sendPacket(ActionFailed.STATIC_PACKET);
- return true;
- }
+ _actor.sendPacket(SystemMessageId.THE_DISTANCE_IS_TOO_FAR_AND_SO_THE_CASTING_HAS_BEEN_CANCELLED);
+ _actor.sendPacket(ActionFailed.STATIC_PACKET);
+ return true;
}
// If not running, set the L2Character movement type to run and send Server->Client packet ChangeMoveType to all others L2PcInstance
diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
index f9a522fa9c..5903758cb5 100644
--- a/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
+++ b/L2J_Mobius_Classic_2.2_Antharas/java/com/l2jmobius/gameserver/geoengine/GeoEngine.java
@@ -35,13 +35,11 @@ import com.l2jmobius.gameserver.geoengine.geodata.BlockNull;
import com.l2jmobius.gameserver.geoengine.geodata.GeoFormat;
import com.l2jmobius.gameserver.geoengine.geodata.GeoLocation;
import com.l2jmobius.gameserver.geoengine.geodata.GeoStructure;
-import com.l2jmobius.gameserver.geoengine.geodata.IGeoObject;
import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.actor.L2Character;
-import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance;
import com.l2jmobius.gameserver.model.instancezone.Instance;
import com.l2jmobius.gameserver.util.MathUtil;
@@ -317,20 +315,6 @@ public class GeoEngine
return block != null ? block.getHeightNearest(geoX, geoY, worldZ) : (short) worldZ;
}
- /**
- * Returns the height of cell, which is closest to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell geodata Z coordinate, closest to given coordinates.
- */
- private final short getHeightNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getHeightNearestOriginal(geoX, geoY, worldZ) : (short) worldZ;
- }
-
/**
* Returns the NSWE flag byte of cell, which is closes to given coordinates.
* @param geoX : Cell geodata X coordinate.
@@ -344,20 +328,6 @@ public class GeoEngine
return block != null ? block.getNsweNearest(geoX, geoY, worldZ) : (byte) 0xFF;
}
- /**
- * Returns the NSWE flag byte of cell, which is closes to given coordinates.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * @param geoX : Cell geodata X coordinate.
- * @param geoY : Cell geodata Y coordinate.
- * @param worldZ : Cell world Z coordinate.
- * @return short : Cell NSWE flag byte coordinate, closest to given coordinates.
- */
- private final byte getNsweNearestOriginal(int geoX, int geoY, int worldZ)
- {
- final ABlock block = getBlock(geoX, geoY);
- return block != null ? block.getNsweNearestOriginal(geoX, geoY, worldZ) : (byte) 0xFF;
- }
-
/**
* Check if world coordinates has geo.
* @param worldX : World X
@@ -391,6 +361,11 @@ public class GeoEngine
*/
public final boolean canSeeTarget(L2Object origin, L2Object target)
{
+ if (target.isDoor())
+ {
+ return true;
+ }
+
// get origin and target world coordinates
final int ox = origin.getX();
final int oy = origin.getY();
@@ -399,7 +374,7 @@ public class GeoEngine
final int ty = target.getY();
final int tz = target.getZ();
- if (!target.isDoor() && DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -430,8 +405,7 @@ public class GeoEngine
return true;
}
- final boolean door = target.isDoor();
- final short gtz = door ? getHeightNearestOriginal(gtx, gty, tz) : getHeightNearest(gtx, gty, tz);
+ final short gtz = getHeightNearest(gtx, gty, tz);
// origin and target coordinates are same
if ((gox == gtx) && (goy == gty))
@@ -453,7 +427,7 @@ public class GeoEngine
}
// perform geodata check
- return door ? checkSeeOriginal(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld()) : checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
+ return checkSee(gox, goy, goz, oheight, gtx, gty, gtz, theight, origin.getInstanceWorld());
}
/**
@@ -472,7 +446,7 @@ public class GeoEngine
final int ty = position.getY();
final int tz = position.getZ();
- if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), false))
+ if (DoorData.getInstance().checkIfDoorsBetween(ox, oy, oz, tx, ty, tz, origin.getInstanceWorld(), true))
{
return false;
}
@@ -703,189 +677,6 @@ public class GeoEngine
return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
}
- /**
- * Simple check for origin to target visibility.
- * Geodata without {@link IGeoObject} are taken in consideration.
- * NOTE: When two doors close between each other and the LoS check of one doors is performed through another door, result will not be accurate (the other door are skipped).
- * @param gox : origin X geodata coordinate
- * @param goy : origin Y geodata coordinate
- * @param goz : origin Z geodata coordinate
- * @param oheight : origin height (if instance of {@link Character})
- * @param gtx : target X geodata coordinate
- * @param gty : target Y geodata coordinate
- * @param gtz : target Z geodata coordinate
- * @param theight : target height (if instance of {@link Character} or {@link L2DoorInstance})
- * @param instance
- * @return {@code boolean} : True, when target can be seen.
- */
- private final boolean checkSeeOriginal(int gox, int goy, int goz, double oheight, int gtx, int gty, int gtz, double theight, Instance instance)
- {
- // get line of sight Z coordinates
- double losoz = goz + ((oheight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
- double lostz = gtz + ((theight * Config.PART_OF_CHARACTER_HEIGHT) / 100);
-
- // get X delta and signum
- final int dx = Math.abs(gtx - gox);
- final int sx = gox < gtx ? 1 : -1;
- final byte dirox = sx > 0 ? GeoStructure.CELL_FLAG_E : GeoStructure.CELL_FLAG_W;
- final byte dirtx = sx > 0 ? GeoStructure.CELL_FLAG_W : GeoStructure.CELL_FLAG_E;
-
- // get Y delta and signum
- final int dy = Math.abs(gty - goy);
- final int sy = goy < gty ? 1 : -1;
- final byte diroy = sy > 0 ? GeoStructure.CELL_FLAG_S : GeoStructure.CELL_FLAG_N;
- final byte dirty = sy > 0 ? GeoStructure.CELL_FLAG_N : GeoStructure.CELL_FLAG_S;
-
- // get Z delta
- final int dm = Math.max(dx, dy);
- final double dz = (lostz - losoz) / dm;
-
- // get direction flag for diagonal movement
- final byte diroxy = getDirXY(dirox, diroy);
- final byte dirtxy = getDirXY(dirtx, dirty);
-
- // delta, determines axis to move on (+..X axis, -..Y axis)
- int d = dx - dy;
-
- // NSWE direction of movement
- byte diro;
- byte dirt;
-
- // clearDebugItems();
- // dropDebugItem(728, 0, new GeoLocation(gox, goy, goz)); // blue potion
- // dropDebugItem(728, 0, new GeoLocation(gtx, gty, gtz)); // blue potion
-
- // initialize node values
- int nox = gox;
- int noy = goy;
- int ntx = gtx;
- int nty = gty;
- byte nsweo = getNsweNearestOriginal(gox, goy, goz);
- byte nswet = getNsweNearestOriginal(gtx, gty, gtz);
-
- // loop
- ABlock block;
- int index;
- for (int i = 0; i < ((dm + 1) / 2); i++)
- {
- // dropDebugItem(57, 0, new GeoLocation(gox, goy, goz)); // antidote
- // dropDebugItem(1831, 0, new GeoLocation(gtx, gty, gtz)); // adena
-
- // reset direction flag
- diro = 0;
- dirt = 0;
-
- // calculate next point coordinates
- int e2 = 2 * d;
- if ((e2 > -dy) && (e2 < dx))
- {
- // calculate next point XY coordinates
- d -= dy;
- d += dx;
- nox += sx;
- ntx -= sx;
- noy += sy;
- nty -= sy;
- diro |= diroxy;
- dirt |= dirtxy;
- }
- else if (e2 > -dy)
- {
- // calculate next point X coordinate
- d -= dy;
- nox += sx;
- ntx -= sx;
- diro |= dirox;
- dirt |= dirtx;
- }
- else if (e2 < dx)
- {
- // calculate next point Y coordinate
- d += dx;
- noy += sy;
- nty -= sy;
- diro |= diroy;
- dirt |= dirty;
- }
-
- {
- // get block of the next cell
- block = getBlock(nox, noy);
-
- // get index of particular layer, based on movement conditions
- if ((nsweo & diro) == 0)
- {
- index = block.getIndexAboveOriginal(nox, noy, goz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(nox, noy, goz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- goz = block.getHeightOriginal(index);
- losoz += dz;
-
- // perform line of sight check, return when fails
- if ((goz - losoz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nsweo = block.getNsweOriginal(index);
- }
- {
- // get block of the next cell
- block = getBlock(ntx, nty);
-
- // get index of particular layer, based on movement conditions
- if ((nswet & dirt) == 0)
- {
- index = block.getIndexAboveOriginal(ntx, nty, gtz - GeoStructure.CELL_IGNORE_HEIGHT);
- }
- else
- {
- index = block.getIndexBelowOriginal(ntx, nty, gtz + GeoStructure.CELL_IGNORE_HEIGHT);
- }
-
- // layer does not exist, return
- if (index == -1)
- {
- return false;
- }
-
- // get layer and next line of sight Z coordinate
- gtz = block.getHeightOriginal(index);
- lostz -= dz;
-
- // perform line of sight check, return when fails
- if ((gtz - lostz) > Config.MAX_OBSTACLE_HEIGHT)
- {
- return false;
- }
-
- // get layer nswe
- nswet = block.getNsweOriginal(index);
- }
-
- // update coords
- gox = nox;
- goy = noy;
- gtx = ntx;
- gty = nty;
- }
-
- // when iteration is completed, compare final Z coordinates
- return Math.abs(goz - gtz) < (GeoStructure.CELL_HEIGHT * 4);
- }
-
/**
* Check movement from coordinates to coordinates.
* @param ox : origin X coordinate