From ddd8cefe282e10c0fbdeb0953d251039e3847249 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Mon, 26 Jun 2017 21:26:14 +0000 Subject: [PATCH] Geodata related classes are moved in gameserver geodata folder. --- .../admincommandhandlers/AdminPathNode.java | 4 +- .../com/l2jmobius/gameserver/GameServer.java | 2 +- .../com/l2jmobius/gameserver/GeoData.java | 4 +- .../gameserver/data/xml/impl/DoorData.java | 2 +- .../geodata}/geodriver/Cell.java | 2 +- .../geodata}/geodriver/GeoDriver.java | 378 +++---- .../gameserver/geodata}/geodriver/IBlock.java | 2 +- .../geodata}/geodriver/IRegion.java | 2 +- .../geodriver/blocks/ComplexBlock.java | 4 +- .../geodata}/geodriver/blocks/FlatBlock.java | 4 +- .../geodriver/blocks/MultilayerBlock.java | 4 +- .../geodriver/regions/NullRegion.java | 4 +- .../geodata}/geodriver/regions/Region.java | 12 +- .../geodata}/pathfinding/AbstractNode.java | 172 ++-- .../geodata}/pathfinding/AbstractNodeLoc.java | 66 +- .../geodata}/pathfinding/PathFinding.java | 422 ++++---- .../pathfinding/cellnodes/CellNode.java | 136 +-- .../pathfinding/cellnodes/CellNodeBuffer.java | 720 +++++++------- .../cellnodes/CellPathFinding.java | 880 ++++++++-------- .../pathfinding/cellnodes/NodeLoc.java | 368 +++---- .../pathfinding/geonodes/GeoNode.java | 124 +-- .../pathfinding/geonodes/GeoNodeLoc.java | 218 ++-- .../pathfinding/geonodes/GeoPathFinding.java | 940 +++++++++--------- .../pathfinding/utils/BinaryNodeHeap.java | 248 ++--- .../instancemanager/WarpedSpaceManager.java | 2 +- .../gameserver/model/actor/L2Character.java | 4 +- .../l2jmobius/gameserver/util/GeoUtils.java | 2 +- .../admincommandhandlers/AdminPathNode.java | 4 +- .../com/l2jmobius/gameserver/GameServer.java | 2 +- .../com/l2jmobius/gameserver/GeoData.java | 4 +- .../gameserver/data/xml/impl/DoorData.java | 2 +- .../gameserver/geodata}/geodriver/Cell.java | 2 +- .../geodata}/geodriver/GeoDriver.java | 378 +++---- .../gameserver/geodata}/geodriver/IBlock.java | 2 +- .../geodata}/geodriver/IRegion.java | 2 +- .../geodriver/blocks/ComplexBlock.java | 4 +- .../geodata}/geodriver/blocks/FlatBlock.java | 4 +- .../geodriver/blocks/MultilayerBlock.java | 4 +- .../geodriver/regions/NullRegion.java | 4 +- .../geodata}/geodriver/regions/Region.java | 12 +- .../geodata}/pathfinding/AbstractNode.java | 172 ++-- .../geodata}/pathfinding/AbstractNodeLoc.java | 66 +- .../geodata}/pathfinding/PathFinding.java | 422 ++++---- .../pathfinding/cellnodes/CellNode.java | 136 +-- .../pathfinding/cellnodes/CellNodeBuffer.java | 720 +++++++------- .../cellnodes/CellPathFinding.java | 880 ++++++++-------- .../pathfinding/cellnodes/NodeLoc.java | 368 +++---- .../pathfinding/geonodes/GeoNode.java | 124 +-- .../pathfinding/geonodes/GeoNodeLoc.java | 218 ++-- .../pathfinding/geonodes/GeoPathFinding.java | 940 +++++++++--------- .../pathfinding/utils/BinaryNodeHeap.java | 248 ++--- .../instancemanager/WarpedSpaceManager.java | 2 +- .../gameserver/model/actor/L2Character.java | 4 +- .../l2jmobius/gameserver/util/GeoUtils.java | 2 +- .../admincommandhandlers/AdminPathNode.java | 4 +- .../com/l2jmobius/gameserver/GameServer.java | 2 +- .../com/l2jmobius/gameserver/GeoData.java | 4 +- .../gameserver/data/xml/impl/DoorData.java | 2 +- .../gameserver/geodata}/geodriver/Cell.java | 2 +- .../geodata}/geodriver/GeoDriver.java | 6 +- .../gameserver/geodata}/geodriver/IBlock.java | 2 +- .../geodata}/geodriver/IRegion.java | 2 +- .../geodriver/blocks/ComplexBlock.java | 4 +- .../geodata}/geodriver/blocks/FlatBlock.java | 4 +- .../geodriver/blocks/MultilayerBlock.java | 4 +- .../geodriver/regions/NullRegion.java | 4 +- .../geodata}/geodriver/regions/Region.java | 12 +- .../geodata}/pathfinding/AbstractNode.java | 2 +- .../pathfinding/AbstractNodeLoc.java | 2 +- .../pathfinding/PathFinding.java | 6 +- .../pathfinding/cellnodes/CellNode.java | 4 +- .../pathfinding/cellnodes/CellNodeBuffer.java | 2 +- .../cellnodes/CellPathFinding.java | 8 +- .../pathfinding/cellnodes/NodeLoc.java | 6 +- .../pathfinding/geonodes/GeoNode.java | 4 +- .../pathfinding/geonodes/GeoNodeLoc.java | 4 +- .../pathfinding/geonodes/GeoPathFinding.java | 8 +- .../pathfinding/utils/BinaryNodeHeap.java | 4 +- .../instancemanager/WarpedSpaceManager.java | 2 +- .../gameserver/model/actor/L2Character.java | 4 +- .../l2jmobius/gameserver/util/GeoUtils.java | 2 +- 81 files changed, 4781 insertions(+), 4781 deletions(-) rename L2J_Mobius_Classic/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/Cell.java (94%) rename L2J_Mobius_Classic/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/GeoDriver.java (93%) rename {L2J_Mobius_Helios/java/com/l2jmobius/commons => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/geodriver/IBlock.java (93%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/geodriver/IRegion.java (93%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/geodriver/blocks/ComplexBlock.java (91%) rename L2J_Mobius_Classic/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/FlatBlock.java (88%) rename L2J_Mobius_Classic/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/MultilayerBlock.java (94%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/geodriver/regions/NullRegion.java (88%) rename {L2J_Mobius_Helios/java/com/l2jmobius/commons => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/geodriver/regions/Region.java (82%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/AbstractNode.java (92%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/AbstractNodeLoc.java (91%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/PathFinding.java (92%) rename {L2J_Mobius_Underground/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellNode.java (87%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellNodeBuffer.java (94%) rename L2J_Mobius_Classic/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/cellnodes/CellPathFinding.java (93%) rename L2J_Mobius_Classic/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/cellnodes/NodeLoc.java (89%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/geonodes/GeoNode.java (87%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/geonodes/GeoNodeLoc.java (88%) rename L2J_Mobius_Classic/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/geonodes/GeoPathFinding.java (94%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata}/pathfinding/utils/BinaryNodeHeap.java (89%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/geodriver/Cell.java (94%) rename L2J_Mobius_Helios/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/GeoDriver.java (93%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/geodriver/IBlock.java (93%) rename L2J_Mobius_Helios/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/IRegion.java (93%) rename {L2J_Mobius_Classic/java/com/l2jmobius/commons => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/geodriver/blocks/ComplexBlock.java (91%) rename L2J_Mobius_Helios/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/FlatBlock.java (88%) rename L2J_Mobius_Helios/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/MultilayerBlock.java (94%) rename L2J_Mobius_Helios/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/regions/NullRegion.java (88%) rename {L2J_Mobius_Underground/java/com/l2jmobius/commons => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/geodriver/regions/Region.java (82%) rename {L2J_Mobius_Underground/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/AbstractNode.java (92%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/AbstractNodeLoc.java (91%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/PathFinding.java (92%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellNode.java (87%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellNodeBuffer.java (94%) rename {L2J_Mobius_Underground/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellPathFinding.java (93%) rename {L2J_Mobius_Underground/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/NodeLoc.java (89%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/geonodes/GeoNode.java (87%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/geonodes/GeoNodeLoc.java (88%) rename L2J_Mobius_Helios/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/geonodes/GeoPathFinding.java (94%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata}/pathfinding/utils/BinaryNodeHeap.java (89%) rename {L2J_Mobius_Helios/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/Cell.java (94%) rename L2J_Mobius_Underground/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/GeoDriver.java (96%) rename {L2J_Mobius_Classic/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/IBlock.java (93%) rename {L2J_Mobius_Classic/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/IRegion.java (93%) rename {L2J_Mobius_Helios/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/blocks/ComplexBlock.java (91%) rename L2J_Mobius_Underground/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/FlatBlock.java (88%) rename L2J_Mobius_Underground/java/com/l2jmobius/{commons => gameserver/geodata}/geodriver/blocks/MultilayerBlock.java (94%) rename {L2J_Mobius_Classic/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/regions/NullRegion.java (88%) rename {L2J_Mobius_Classic/java/com/l2jmobius/commons => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/geodriver/regions/Region.java (82%) rename {L2J_Mobius_Classic/java/com/l2jmobius/gameserver => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/pathfinding/AbstractNode.java (96%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/AbstractNodeLoc.java (94%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/PathFinding.java (95%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellNode.java (91%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/cellnodes/CellNodeBuffer.java (99%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/CellPathFinding.java (97%) rename {L2J_Mobius_Helios/java/com/l2jmobius/gameserver => L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata}/pathfinding/cellnodes/NodeLoc.java (94%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/geonodes/GeoNode.java (91%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/geonodes/GeoNodeLoc.java (93%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/geonodes/GeoPathFinding.java (98%) rename L2J_Mobius_Underground/java/com/l2jmobius/gameserver/{ => geodata}/pathfinding/utils/BinaryNodeHeap.java (94%) diff --git a/L2J_Mobius_Classic/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java b/L2J_Mobius_Classic/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java index 962d1456f7..03b3ca8902 100644 --- a/L2J_Mobius_Classic/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java +++ b/L2J_Mobius_Classic/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java @@ -19,10 +19,10 @@ package handlers.admincommandhandlers; import java.util.List; import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.IAdminCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; public class AdminPathNode implements IAdminCommandHandler { diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GameServer.java index b2d25cde09..6bad121fcb 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GameServer.java @@ -98,6 +98,7 @@ import com.l2jmobius.gameserver.datatables.BotReportTable; import com.l2jmobius.gameserver.datatables.EventDroplist; import com.l2jmobius.gameserver.datatables.ItemTable; import com.l2jmobius.gameserver.datatables.MerchantPriceConfigTable; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.ConditionHandler; import com.l2jmobius.gameserver.handler.DailyMissionHandler; import com.l2jmobius.gameserver.handler.EffectHandler; @@ -143,7 +144,6 @@ import com.l2jmobius.gameserver.model.votereward.VoteSystem; import com.l2jmobius.gameserver.network.ClientNetworkManager; import com.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager; import com.l2jmobius.gameserver.network.telnet.TelnetServer; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.scripting.ScriptEngineManager; import com.l2jmobius.gameserver.taskmanager.TaskManager; import com.l2jmobius.gameserver.util.Broadcast; diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GeoData.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GeoData.java index 41007ee949..bbf22617b9 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GeoData.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/GeoData.java @@ -22,9 +22,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jmobius.Config; -import com.l2jmobius.commons.geodriver.Cell; -import com.l2jmobius.commons.geodriver.GeoDriver; import com.l2jmobius.gameserver.data.xml.impl.DoorData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.geodriver.GeoDriver; import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.L2World; diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java index 551fb76d54..973c82b4a8 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java @@ -34,12 +34,12 @@ import org.w3c.dom.Node; import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.commons.util.IXmlReader; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance; import com.l2jmobius.gameserver.model.actor.templates.L2DoorTemplate; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; /** * This class loads and hold info about doors. diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/Cell.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java similarity index 94% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/Cell.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java index 7c7c441cac..4914b1d72e 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/Cell.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/GeoDriver.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java similarity index 93% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/GeoDriver.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java index c02d85891d..2dc266df46 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/GeoDriver.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java @@ -1,189 +1,189 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.commons.geodriver; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteOrder; -import java.nio.channels.FileChannel.MapMode; -import java.nio.file.Path; -import java.util.concurrent.atomic.AtomicReferenceArray; - -import com.l2jmobius.commons.geodriver.regions.NullRegion; -import com.l2jmobius.commons.geodriver.regions.Region; - -/** - * @author HorridoJoho - */ -public final class GeoDriver -{ - // world dimensions: 1048576 * 1048576 = 1099511627776 - private static final int WORLD_MIN_X = -655360; - private static final int WORLD_MAX_X = 393215; - private static final int WORLD_MIN_Y = -589824; - private static final int WORLD_MAX_Y = 458751; - private static final int WORLD_MIN_Z = -16384; - private static final int WORLD_MAX_Z = 16384; - - /** Regions in the world on the x axis */ - public static final int GEO_REGIONS_X = 32; - /** Regions in the world on the y axis */ - public static final int GEO_REGIONS_Y = 32; - /** Region in the world */ - public static final int GEO_REGIONS = GEO_REGIONS_X * GEO_REGIONS_Y; - - /** Blocks in the world on the x axis */ - public static final int GEO_BLOCKS_X = GEO_REGIONS_X * IRegion.REGION_BLOCKS_X; - /** Blocks in the world on the y axis */ - public static final int GEO_BLOCKS_Y = GEO_REGIONS_Y * IRegion.REGION_BLOCKS_Y; - /** Blocks in the world */ - public static final int GEO_BLOCKS = GEO_REGIONS * IRegion.REGION_BLOCKS; - - /** Cells in the world on the x axis */ - public static final int GEO_CELLS_X = GEO_BLOCKS_X * IBlock.BLOCK_CELLS_X; - /** Cells in the world in the y axis */ - public static final int GEO_CELLS_Y = GEO_BLOCKS_Y * IBlock.BLOCK_CELLS_Y; - /** Cells in the world in the z axis */ - public static final int GEO_CELLS_Z = (Math.abs(WORLD_MIN_Z) + Math.abs(WORLD_MAX_Z)) / 16; - - /** The regions array */ - private final AtomicReferenceArray _regions = new AtomicReferenceArray<>(GEO_REGIONS); - - public GeoDriver() - { - for (int i = 0; i < _regions.length(); i++) - { - _regions.set(i, NullRegion.INSTANCE); - } - } - - private void checkGeoX(int geoX) - { - if ((geoX < 0) || (geoX >= GEO_CELLS_X)) - { - throw new IllegalArgumentException(); - } - } - - private void checkGeoY(int geoY) - { - if ((geoY < 0) || (geoY >= GEO_CELLS_Y)) - { - throw new IllegalArgumentException(); - } - } - - private void checkGeoZ(int geoZ) - { - if ((geoZ < 0) || (geoZ >= GEO_CELLS_Z)) - { - throw new IllegalArgumentException(); - } - } - - private IRegion getRegion(int geoX, int geoY) - { - checkGeoX(geoX); - checkGeoY(geoY); - return _regions.get(((geoX / IRegion.REGION_CELLS_X) * GEO_REGIONS_Y) + (geoY / IRegion.REGION_CELLS_Y)); - } - - public void loadRegion(Path filePath, int regionX, int regionY) throws IOException - { - final int regionOffset = (regionX * GEO_REGIONS_Y) + regionY; - - try (RandomAccessFile raf = new RandomAccessFile(filePath.toFile(), "r")) - { - _regions.set(regionOffset, new Region(raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()).load().order(ByteOrder.LITTLE_ENDIAN))); - } - } - - public void unloadRegion(int regionX, int regionY) - { - _regions.set((regionX * GEO_REGIONS_Y) + regionY, NullRegion.INSTANCE); - } - - public boolean hasGeoPos(int geoX, int geoY) - { - return getRegion(geoX, geoY).hasGeo(); - } - - public boolean checkNearestNswe(int geoX, int geoY, int worldZ, int nswe) - { - return getRegion(geoX, geoY).checkNearestNswe(geoX, geoY, worldZ, nswe); - } - - public int getNearestZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNearestZ(geoX, geoY, worldZ); - } - - public int getNextLowerZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNextLowerZ(geoX, geoY, worldZ); - } - - public int getNextHigherZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNextHigherZ(geoX, geoY, worldZ); - } - - public int getGeoX(int worldX) - { - if ((worldX < WORLD_MIN_X) || (worldX > WORLD_MAX_X)) - { - throw new IllegalArgumentException(); - } - return (worldX - WORLD_MIN_X) / 16; - } - - public int getGeoY(int worldY) - { - if ((worldY < WORLD_MIN_Y) || (worldY > WORLD_MAX_Y)) - { - throw new IllegalArgumentException(); - } - return (worldY - WORLD_MIN_Y) / 16; - } - - public int getGeoZ(int worldZ) - { - if ((worldZ < WORLD_MIN_Z) || (worldZ > WORLD_MAX_Z)) - { - throw new IllegalArgumentException(); - } - return (worldZ - WORLD_MIN_Z) / 16; - } - - public int getWorldX(int geoX) - { - checkGeoX(geoX); - return (geoX * 16) + WORLD_MIN_X + 8; - } - - public int getWorldY(int geoY) - { - checkGeoY(geoY); - return (geoY * 16) + WORLD_MIN_Y + 8; - } - - public int getWorldZ(int geoZ) - { - checkGeoZ(geoZ); - return (geoZ * 16) + WORLD_MIN_Z + 8; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.geodriver; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel.MapMode; +import java.nio.file.Path; +import java.util.concurrent.atomic.AtomicReferenceArray; + +import com.l2jmobius.gameserver.geodata.geodriver.regions.NullRegion; +import com.l2jmobius.gameserver.geodata.geodriver.regions.Region; + +/** + * @author HorridoJoho + */ +public final class GeoDriver +{ + // world dimensions: 1048576 * 1048576 = 1099511627776 + private static final int WORLD_MIN_X = -655360; + private static final int WORLD_MAX_X = 393215; + private static final int WORLD_MIN_Y = -589824; + private static final int WORLD_MAX_Y = 458751; + private static final int WORLD_MIN_Z = -16384; + private static final int WORLD_MAX_Z = 16384; + + /** Regions in the world on the x axis */ + public static final int GEO_REGIONS_X = 32; + /** Regions in the world on the y axis */ + public static final int GEO_REGIONS_Y = 32; + /** Region in the world */ + public static final int GEO_REGIONS = GEO_REGIONS_X * GEO_REGIONS_Y; + + /** Blocks in the world on the x axis */ + public static final int GEO_BLOCKS_X = GEO_REGIONS_X * IRegion.REGION_BLOCKS_X; + /** Blocks in the world on the y axis */ + public static final int GEO_BLOCKS_Y = GEO_REGIONS_Y * IRegion.REGION_BLOCKS_Y; + /** Blocks in the world */ + public static final int GEO_BLOCKS = GEO_REGIONS * IRegion.REGION_BLOCKS; + + /** Cells in the world on the x axis */ + public static final int GEO_CELLS_X = GEO_BLOCKS_X * IBlock.BLOCK_CELLS_X; + /** Cells in the world in the y axis */ + public static final int GEO_CELLS_Y = GEO_BLOCKS_Y * IBlock.BLOCK_CELLS_Y; + /** Cells in the world in the z axis */ + public static final int GEO_CELLS_Z = (Math.abs(WORLD_MIN_Z) + Math.abs(WORLD_MAX_Z)) / 16; + + /** The regions array */ + private final AtomicReferenceArray _regions = new AtomicReferenceArray<>(GEO_REGIONS); + + public GeoDriver() + { + for (int i = 0; i < _regions.length(); i++) + { + _regions.set(i, NullRegion.INSTANCE); + } + } + + private void checkGeoX(int geoX) + { + if ((geoX < 0) || (geoX >= GEO_CELLS_X)) + { + throw new IllegalArgumentException(); + } + } + + private void checkGeoY(int geoY) + { + if ((geoY < 0) || (geoY >= GEO_CELLS_Y)) + { + throw new IllegalArgumentException(); + } + } + + private void checkGeoZ(int geoZ) + { + if ((geoZ < 0) || (geoZ >= GEO_CELLS_Z)) + { + throw new IllegalArgumentException(); + } + } + + private IRegion getRegion(int geoX, int geoY) + { + checkGeoX(geoX); + checkGeoY(geoY); + return _regions.get(((geoX / IRegion.REGION_CELLS_X) * GEO_REGIONS_Y) + (geoY / IRegion.REGION_CELLS_Y)); + } + + public void loadRegion(Path filePath, int regionX, int regionY) throws IOException + { + final int regionOffset = (regionX * GEO_REGIONS_Y) + regionY; + + try (RandomAccessFile raf = new RandomAccessFile(filePath.toFile(), "r")) + { + _regions.set(regionOffset, new Region(raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()).load().order(ByteOrder.LITTLE_ENDIAN))); + } + } + + public void unloadRegion(int regionX, int regionY) + { + _regions.set((regionX * GEO_REGIONS_Y) + regionY, NullRegion.INSTANCE); + } + + public boolean hasGeoPos(int geoX, int geoY) + { + return getRegion(geoX, geoY).hasGeo(); + } + + public boolean checkNearestNswe(int geoX, int geoY, int worldZ, int nswe) + { + return getRegion(geoX, geoY).checkNearestNswe(geoX, geoY, worldZ, nswe); + } + + public int getNearestZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNearestZ(geoX, geoY, worldZ); + } + + public int getNextLowerZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNextLowerZ(geoX, geoY, worldZ); + } + + public int getNextHigherZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNextHigherZ(geoX, geoY, worldZ); + } + + public int getGeoX(int worldX) + { + if ((worldX < WORLD_MIN_X) || (worldX > WORLD_MAX_X)) + { + throw new IllegalArgumentException(); + } + return (worldX - WORLD_MIN_X) / 16; + } + + public int getGeoY(int worldY) + { + if ((worldY < WORLD_MIN_Y) || (worldY > WORLD_MAX_Y)) + { + throw new IllegalArgumentException(); + } + return (worldY - WORLD_MIN_Y) / 16; + } + + public int getGeoZ(int worldZ) + { + if ((worldZ < WORLD_MIN_Z) || (worldZ > WORLD_MAX_Z)) + { + throw new IllegalArgumentException(); + } + return (worldZ - WORLD_MIN_Z) / 16; + } + + public int getWorldX(int geoX) + { + checkGeoX(geoX); + return (geoX * 16) + WORLD_MIN_X + 8; + } + + public int getWorldY(int geoY) + { + checkGeoY(geoY); + return (geoY * 16) + WORLD_MIN_Y + 8; + } + + public int getWorldZ(int geoZ) + { + checkGeoZ(geoZ); + return (geoZ * 16) + WORLD_MIN_Z + 8; + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IBlock.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java similarity index 93% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IBlock.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java index 93680fdc94..21df97c40d 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IBlock.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IRegion.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java similarity index 93% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IRegion.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java index a17e6a0c5f..3eb23da03e 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IRegion.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java similarity index 91% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java index 068914d7f3..4d6410672e 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java similarity index 88% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java index 5f924bc835..d5bcff094b 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java similarity index 94% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java index c9e8f0b8f5..313131bd5a 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java similarity index 88% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java index 97beba4ee4..60ecac873a 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; -import com.l2jmobius.commons.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/Region.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java similarity index 82% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/Region.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java index 299f4691f7..d2d02481ed 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/Region.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java @@ -14,15 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; -import com.l2jmobius.commons.geodriver.IRegion; -import com.l2jmobius.commons.geodriver.blocks.ComplexBlock; -import com.l2jmobius.commons.geodriver.blocks.FlatBlock; -import com.l2jmobius.commons.geodriver.blocks.MultilayerBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.ComplexBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.FlatBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.MultilayerBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java similarity index 92% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java index 0975c5a975..83d0131910 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java @@ -1,87 +1,87 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -public abstract class AbstractNode -{ - private T _loc; - private AbstractNode _parent; - - public AbstractNode(T loc) - { - _loc = loc; - } - - public void setParent(AbstractNode p) - { - _parent = p; - } - - public AbstractNode getParent() - { - return _parent; - } - - public T getLoc() - { - return _loc; - } - - public void setLoc(T l) - { - _loc = l; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + ((_loc == null) ? 0 : _loc.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof AbstractNode)) - { - return false; - } - final AbstractNode other = (AbstractNode) obj; - if (_loc == null) - { - if (other._loc != null) - { - return false; - } - } - else if (!_loc.equals(other._loc)) - { - return false; - } - return true; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +public abstract class AbstractNode +{ + private T _loc; + private AbstractNode _parent; + + public AbstractNode(T loc) + { + _loc = loc; + } + + public void setParent(AbstractNode p) + { + _parent = p; + } + + public AbstractNode getParent() + { + return _parent; + } + + public T getLoc() + { + return _loc; + } + + public void setLoc(T l) + { + _loc = l; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + ((_loc == null) ? 0 : _loc.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof AbstractNode)) + { + return false; + } + final AbstractNode other = (AbstractNode) obj; + if (_loc == null) + { + if (other._loc != null) + { + return false; + } + } + else if (!_loc.equals(other._loc)) + { + return false; + } + return true; + } } \ No newline at end of file diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java similarity index 91% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java index 4197a02155..0678b3cb3a 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java @@ -1,33 +1,33 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -/** - * @author -Nemesiss- - */ -public abstract class AbstractNodeLoc -{ - public abstract int getX(); - - public abstract int getY(); - - public abstract int getZ(); - - public abstract int getNodeX(); - - public abstract int getNodeY(); -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +/** + * @author -Nemesiss- + */ +public abstract class AbstractNodeLoc +{ + public abstract int getX(); + + public abstract int getY(); + + public abstract int getZ(); + + public abstract int getNodeX(); + + public abstract int getNodeY(); +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java similarity index 92% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java index fedfbf55fb..e7b3093081 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java @@ -1,211 +1,211 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -import java.util.List; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.cellnodes.CellPathFinding; -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoPathFinding; - -/** - * @author -Nemesiss- - */ -public abstract class PathFinding -{ - public static PathFinding getInstance() - { - if (Config.PATHFINDING == 1) - { - // Higher Memory Usage, Smaller Cpu Usage - return GeoPathFinding.getInstance(); - } - // Cell pathfinding, calculated directly from geodata files - return CellPathFinding.getInstance(); - } - - public abstract boolean pathNodesExist(short regionoffset); - - public abstract List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable); - - // @formatter:off - /* - public List search(AbstractNode start, AbstractNode end, int instanceId) - { - // The simplest grid-based pathfinding. - // Drawback is not having higher cost for diagonal movement (means funny routes) - // Could be optimized e.g. not to calculate backwards as far as forwards. - - // List of Visited Nodes - LinkedList visited = new LinkedList(); - - // List of Nodes to Visit - LinkedList to_visit = new LinkedList(); - to_visit.add(start); - - int i = 0; - while (i < 800) - { - AbstractNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) //path found! - return constructPath(node, instanceId); - else - { - i++; - visited.add(node); - node.attachNeighbors(); - Node[] neighbors = node.getNeighbors(); - if (neighbors == null) - continue; - for (Node n : neighbors) - { - if (!visited.contains(n) && !to_visit.contains(n)) - { - n.setParent(node); - to_visit.add(n); - } - } - } - } - //No Path found - return null; - } - */ - /* - public List searchAStar(Node start, Node end, int instanceId) - { - // Not operational yet? - int start_x = start.getLoc().getX(); - int start_y = start.getLoc().getY(); - int end_x = end.getLoc().getX(); - int end_y = end.getLoc().getY(); - //List of Visited Nodes - FastNodeList visited = new FastNodeList(800);//TODO! Add limit to cfg - - // List of Nodes to Visit - BinaryNodeHeap to_visit = new BinaryNodeHeap(800); - to_visit.add(start); - - int i = 0; - while (i < 800)//TODO! Add limit to cfg - { - AbstractNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) //path found! - return constructPath(node, instanceId); - else - { - visited.add(node); - node.attachNeighbors(); - for (Node n : node.getNeighbors()) - { - if (!visited.contains(n) && !to_visit.contains(n)) - { - i++; - n.setParent(node); - n.setCost(Math.abs(start_x - n.getLoc().getNodeX()) + Math.abs(start_y - n.getLoc().getNodeY()) - + Math.abs(end_x - n.getLoc().getNodeX()) + Math.abs(end_y - n.getLoc().getNodeY())); - to_visit.add(n); - } - } - } - } - //No Path found - return null; - } - */ - // @formatter:on - - /** - * Convert geodata position to pathnode position - * @param geo_pos - * @return pathnode position - */ - public short getNodePos(int geo_pos) - { - return (short) (geo_pos >> 3); // OK? - } - - /** - * Convert node position to pathnode block position - * @param node_pos - * @return pathnode block position (0...255) - */ - public short getNodeBlock(int node_pos) - { - return (short) (node_pos % 256); - } - - public byte getRegionX(int node_pos) - { - return (byte) ((node_pos >> 8) + L2World.TILE_X_MIN); - } - - public byte getRegionY(int node_pos) - { - return (byte) ((node_pos >> 8) + L2World.TILE_Y_MIN); - } - - public short getRegionOffset(byte rx, byte ry) - { - return (short) ((rx << 5) + ry); - } - - /** - * Convert pathnode x to World x position - * @param node_x rx - * @return - */ - public int calculateWorldX(short node_x) - { - return L2World.MAP_MIN_X + (node_x * 128) + 48; - } - - /** - * Convert pathnode y to World y position - * @param node_y - * @return - */ - public int calculateWorldY(short node_y) - { - return L2World.MAP_MIN_Y + (node_y * 128) + 48; - } - - public String[] getStat() - { - return null; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +import java.util.List; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.cellnodes.CellPathFinding; +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoPathFinding; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.instancezone.Instance; + +/** + * @author -Nemesiss- + */ +public abstract class PathFinding +{ + public static PathFinding getInstance() + { + if (Config.PATHFINDING == 1) + { + // Higher Memory Usage, Smaller Cpu Usage + return GeoPathFinding.getInstance(); + } + // Cell pathfinding, calculated directly from geodata files + return CellPathFinding.getInstance(); + } + + public abstract boolean pathNodesExist(short regionoffset); + + public abstract List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable); + + // @formatter:off + /* + public List search(AbstractNode start, AbstractNode end, int instanceId) + { + // The simplest grid-based pathfinding. + // Drawback is not having higher cost for diagonal movement (means funny routes) + // Could be optimized e.g. not to calculate backwards as far as forwards. + + // List of Visited Nodes + LinkedList visited = new LinkedList(); + + // List of Nodes to Visit + LinkedList to_visit = new LinkedList(); + to_visit.add(start); + + int i = 0; + while (i < 800) + { + AbstractNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) //path found! + return constructPath(node, instanceId); + else + { + i++; + visited.add(node); + node.attachNeighbors(); + Node[] neighbors = node.getNeighbors(); + if (neighbors == null) + continue; + for (Node n : neighbors) + { + if (!visited.contains(n) && !to_visit.contains(n)) + { + n.setParent(node); + to_visit.add(n); + } + } + } + } + //No Path found + return null; + } + */ + /* + public List searchAStar(Node start, Node end, int instanceId) + { + // Not operational yet? + int start_x = start.getLoc().getX(); + int start_y = start.getLoc().getY(); + int end_x = end.getLoc().getX(); + int end_y = end.getLoc().getY(); + //List of Visited Nodes + FastNodeList visited = new FastNodeList(800);//TODO! Add limit to cfg + + // List of Nodes to Visit + BinaryNodeHeap to_visit = new BinaryNodeHeap(800); + to_visit.add(start); + + int i = 0; + while (i < 800)//TODO! Add limit to cfg + { + AbstractNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) //path found! + return constructPath(node, instanceId); + else + { + visited.add(node); + node.attachNeighbors(); + for (Node n : node.getNeighbors()) + { + if (!visited.contains(n) && !to_visit.contains(n)) + { + i++; + n.setParent(node); + n.setCost(Math.abs(start_x - n.getLoc().getNodeX()) + Math.abs(start_y - n.getLoc().getNodeY()) + + Math.abs(end_x - n.getLoc().getNodeX()) + Math.abs(end_y - n.getLoc().getNodeY())); + to_visit.add(n); + } + } + } + } + //No Path found + return null; + } + */ + // @formatter:on + + /** + * Convert geodata position to pathnode position + * @param geo_pos + * @return pathnode position + */ + public short getNodePos(int geo_pos) + { + return (short) (geo_pos >> 3); // OK? + } + + /** + * Convert node position to pathnode block position + * @param node_pos + * @return pathnode block position (0...255) + */ + public short getNodeBlock(int node_pos) + { + return (short) (node_pos % 256); + } + + public byte getRegionX(int node_pos) + { + return (byte) ((node_pos >> 8) + L2World.TILE_X_MIN); + } + + public byte getRegionY(int node_pos) + { + return (byte) ((node_pos >> 8) + L2World.TILE_Y_MIN); + } + + public short getRegionOffset(byte rx, byte ry) + { + return (short) ((rx << 5) + ry); + } + + /** + * Convert pathnode x to World x position + * @param node_x rx + * @return + */ + public int calculateWorldX(short node_x) + { + return L2World.MAP_MIN_X + (node_x * 128) + 48; + } + + /** + * Convert pathnode y to World y position + * @param node_y + * @return + */ + public int calculateWorldY(short node_y) + { + return L2World.MAP_MIN_Y + (node_y * 128) + 48; + } + + public String[] getStat() + { + return null; + } +} diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java similarity index 87% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java index daf6ae3edb..f903507286 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java @@ -1,69 +1,69 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import com.l2jmobius.gameserver.pathfinding.AbstractNode; - -public class CellNode extends AbstractNode -{ - private CellNode _next = null; - private boolean _isInUse = true; - private float _cost = -1000; - - public CellNode(NodeLoc loc) - { - super(loc); - } - - public boolean isInUse() - { - return _isInUse; - } - - public void setInUse() - { - _isInUse = true; - } - - public CellNode getNext() - { - return _next; - } - - public void setNext(CellNode next) - { - _next = next; - } - - public float getCost() - { - return _cost; - } - - public void setCost(double cost) - { - _cost = (float) cost; - } - - public void free() - { - setParent(null); - _cost = -1000; - _isInUse = false; - _next = null; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; + +public class CellNode extends AbstractNode +{ + private CellNode _next = null; + private boolean _isInUse = true; + private float _cost = -1000; + + public CellNode(NodeLoc loc) + { + super(loc); + } + + public boolean isInUse() + { + return _isInUse; + } + + public void setInUse() + { + _isInUse = true; + } + + public CellNode getNext() + { + return _next; + } + + public void setNext(CellNode next) + { + _next = next; + } + + public float getCost() + { + return _cost; + } + + public void setCost(double cost) + { + _cost = (float) cost; + } + + public void free() + { + setParent(null); + _cost = -1000; + _isInUse = false; + _next = null; + } } \ No newline at end of file diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java similarity index 94% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java index 8f8a87a079..4eef566183 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java @@ -1,361 +1,361 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.locks.ReentrantLock; - -import com.l2jmobius.Config; - -/** - * @author DS Credits to Diamond - */ -public class CellNodeBuffer -{ - private static final int MAX_ITERATIONS = 3500; - - private final ReentrantLock _lock = new ReentrantLock(); - private final int _mapSize; - private final CellNode[][] _buffer; - - private int _baseX = 0; - private int _baseY = 0; - - private int _targetX = 0; - private int _targetY = 0; - private int _targetZ = 0; - - private long _timeStamp = 0; - private long _lastElapsedTime = 0; - - private CellNode _current = null; - - public CellNodeBuffer(int size) - { - _mapSize = size; - _buffer = new CellNode[_mapSize][_mapSize]; - } - - public final boolean lock() - { - return _lock.tryLock(); - } - - public final CellNode findPath(int x, int y, int z, int tx, int ty, int tz) - { - _timeStamp = System.currentTimeMillis(); - _baseX = x + ((tx - x - _mapSize) / 2); // middle of the line (x,y) - (tx,ty) - _baseY = y + ((ty - y - _mapSize) / 2); // will be in the center of the buffer - _targetX = tx; - _targetY = ty; - _targetZ = tz; - _current = getNode(x, y, z); - _current.setCost(getCost(x, y, z, Config.HIGH_WEIGHT)); - - for (int count = 0; count < MAX_ITERATIONS; count++) - { - if ((_current.getLoc().getNodeX() == _targetX) && (_current.getLoc().getNodeY() == _targetY) && (Math.abs(_current.getLoc().getZ() - _targetZ) < 64)) - { - return _current; // found - } - - getNeighbors(); - if (_current.getNext() == null) - { - return null; // no more ways - } - - _current = _current.getNext(); - } - return null; - } - - public final void free() - { - _current = null; - - CellNode node; - for (int i = 0; i < _mapSize; i++) - { - for (int j = 0; j < _mapSize; j++) - { - node = _buffer[i][j]; - if (node != null) - { - node.free(); - } - } - } - - _lock.unlock(); - _lastElapsedTime = System.currentTimeMillis() - _timeStamp; - } - - public final long getElapsedTime() - { - return _lastElapsedTime; - } - - public final List debugPath() - { - final List result = new LinkedList<>(); - - for (CellNode n = _current; n.getParent() != null; n = (CellNode) n.getParent()) - { - result.add(n); - n.setCost(-n.getCost()); - } - - for (int i = 0; i < _mapSize; i++) - { - for (int j = 0; j < _mapSize; j++) - { - final CellNode n = _buffer[i][j]; - if ((n == null) || !n.isInUse() || (n.getCost() <= 0)) - { - continue; - } - - result.add(n); - } - } - - return result; - } - - private void getNeighbors() - { - if (!_current.getLoc().canGoAll()) - { - return; - } - - final int x = _current.getLoc().getNodeX(); - final int y = _current.getLoc().getNodeY(); - final int z = _current.getLoc().getZ(); - - CellNode nodeE = null; - CellNode nodeS = null; - CellNode nodeW = null; - CellNode nodeN = null; - - // East - if (_current.getLoc().canGoEast()) - { - nodeE = addNode(x + 1, y, z, false); - } - - // South - if (_current.getLoc().canGoSouth()) - { - nodeS = addNode(x, y + 1, z, false); - } - - // West - if (_current.getLoc().canGoWest()) - { - nodeW = addNode(x - 1, y, z, false); - } - - // North - if (_current.getLoc().canGoNorth()) - { - nodeN = addNode(x, y - 1, z, false); - } - - if (Config.ADVANCED_DIAGONAL_STRATEGY) - { - // SouthEast - if ((nodeE != null) && (nodeS != null)) - { - if (nodeE.getLoc().canGoSouth() && nodeS.getLoc().canGoEast()) - { - addNode(x + 1, y + 1, z, true); - } - } - - // SouthWest - if ((nodeS != null) && (nodeW != null)) - { - if (nodeW.getLoc().canGoSouth() && nodeS.getLoc().canGoWest()) - { - addNode(x - 1, y + 1, z, true); - } - } - - // NorthEast - if ((nodeN != null) && (nodeE != null)) - { - if (nodeE.getLoc().canGoNorth() && nodeN.getLoc().canGoEast()) - { - addNode(x + 1, y - 1, z, true); - } - } - - // NorthWest - if ((nodeN != null) && (nodeW != null)) - { - if (nodeW.getLoc().canGoNorth() && nodeN.getLoc().canGoWest()) - { - addNode(x - 1, y - 1, z, true); - } - } - } - } - - private CellNode getNode(int x, int y, int z) - { - final int aX = x - _baseX; - if ((aX < 0) || (aX >= _mapSize)) - { - return null; - } - - final int aY = y - _baseY; - if ((aY < 0) || (aY >= _mapSize)) - { - return null; - } - - CellNode result = _buffer[aX][aY]; - if (result == null) - { - result = new CellNode(new NodeLoc(x, y, z)); - _buffer[aX][aY] = result; - } - else if (!result.isInUse()) - { - result.setInUse(); - // reinit node if needed - if (result.getLoc() != null) - { - result.getLoc().set(x, y, z); - } - else - { - result.setLoc(new NodeLoc(x, y, z)); - } - } - - return result; - } - - private CellNode addNode(int x, int y, int z, boolean diagonal) - { - final CellNode newNode = getNode(x, y, z); - if (newNode == null) - { - return null; - } - if (newNode.getCost() >= 0) - { - return newNode; - } - - final int geoZ = newNode.getLoc().getZ(); - - final int stepZ = Math.abs(geoZ - _current.getLoc().getZ()); - float weight = diagonal ? Config.DIAGONAL_WEIGHT : Config.LOW_WEIGHT; - - if (!newNode.getLoc().canGoAll() || (stepZ > 16)) - { - weight = Config.HIGH_WEIGHT; - } - else if (isHighWeight(x + 1, y, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x - 1, y, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x, y + 1, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x, y - 1, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - - newNode.setParent(_current); - newNode.setCost(getCost(x, y, geoZ, weight)); - - CellNode node = _current; - int count = 0; - while ((node.getNext() != null) && (count < (MAX_ITERATIONS * 4))) - { - count++; - if (node.getNext().getCost() > newNode.getCost()) - { - // insert node into a chain - newNode.setNext(node.getNext()); - break; - } - node = node.getNext(); - } - if (count == (MAX_ITERATIONS * 4)) - { - System.err.println("Pathfinding: too long loop detected, cost:" + newNode.getCost()); - } - - node.setNext(newNode); // add last - - return newNode; - } - - private boolean isHighWeight(int x, int y, int z) - { - final CellNode result = getNode(x, y, z); - if (result == null) - { - return true; - } - - if (!result.getLoc().canGoAll()) - { - return true; - } - if (Math.abs(result.getLoc().getZ() - z) > 16) - { - return true; - } - - return false; - } - - private double getCost(int x, int y, int z, float weight) - { - final int dX = x - _targetX; - final int dY = y - _targetY; - final int dZ = z - _targetZ; - // Math.abs(dx) + Math.abs(dy) + Math.abs(dz) / 16 - double result = Math.sqrt((dX * dX) + (dY * dY) + ((dZ * dZ) / 256.0)); - if (result > weight) - { - result += weight; - } - - if (result > Float.MAX_VALUE) - { - result = Float.MAX_VALUE; - } - - return result; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +import com.l2jmobius.Config; + +/** + * @author DS Credits to Diamond + */ +public class CellNodeBuffer +{ + private static final int MAX_ITERATIONS = 3500; + + private final ReentrantLock _lock = new ReentrantLock(); + private final int _mapSize; + private final CellNode[][] _buffer; + + private int _baseX = 0; + private int _baseY = 0; + + private int _targetX = 0; + private int _targetY = 0; + private int _targetZ = 0; + + private long _timeStamp = 0; + private long _lastElapsedTime = 0; + + private CellNode _current = null; + + public CellNodeBuffer(int size) + { + _mapSize = size; + _buffer = new CellNode[_mapSize][_mapSize]; + } + + public final boolean lock() + { + return _lock.tryLock(); + } + + public final CellNode findPath(int x, int y, int z, int tx, int ty, int tz) + { + _timeStamp = System.currentTimeMillis(); + _baseX = x + ((tx - x - _mapSize) / 2); // middle of the line (x,y) - (tx,ty) + _baseY = y + ((ty - y - _mapSize) / 2); // will be in the center of the buffer + _targetX = tx; + _targetY = ty; + _targetZ = tz; + _current = getNode(x, y, z); + _current.setCost(getCost(x, y, z, Config.HIGH_WEIGHT)); + + for (int count = 0; count < MAX_ITERATIONS; count++) + { + if ((_current.getLoc().getNodeX() == _targetX) && (_current.getLoc().getNodeY() == _targetY) && (Math.abs(_current.getLoc().getZ() - _targetZ) < 64)) + { + return _current; // found + } + + getNeighbors(); + if (_current.getNext() == null) + { + return null; // no more ways + } + + _current = _current.getNext(); + } + return null; + } + + public final void free() + { + _current = null; + + CellNode node; + for (int i = 0; i < _mapSize; i++) + { + for (int j = 0; j < _mapSize; j++) + { + node = _buffer[i][j]; + if (node != null) + { + node.free(); + } + } + } + + _lock.unlock(); + _lastElapsedTime = System.currentTimeMillis() - _timeStamp; + } + + public final long getElapsedTime() + { + return _lastElapsedTime; + } + + public final List debugPath() + { + final List result = new LinkedList<>(); + + for (CellNode n = _current; n.getParent() != null; n = (CellNode) n.getParent()) + { + result.add(n); + n.setCost(-n.getCost()); + } + + for (int i = 0; i < _mapSize; i++) + { + for (int j = 0; j < _mapSize; j++) + { + final CellNode n = _buffer[i][j]; + if ((n == null) || !n.isInUse() || (n.getCost() <= 0)) + { + continue; + } + + result.add(n); + } + } + + return result; + } + + private void getNeighbors() + { + if (!_current.getLoc().canGoAll()) + { + return; + } + + final int x = _current.getLoc().getNodeX(); + final int y = _current.getLoc().getNodeY(); + final int z = _current.getLoc().getZ(); + + CellNode nodeE = null; + CellNode nodeS = null; + CellNode nodeW = null; + CellNode nodeN = null; + + // East + if (_current.getLoc().canGoEast()) + { + nodeE = addNode(x + 1, y, z, false); + } + + // South + if (_current.getLoc().canGoSouth()) + { + nodeS = addNode(x, y + 1, z, false); + } + + // West + if (_current.getLoc().canGoWest()) + { + nodeW = addNode(x - 1, y, z, false); + } + + // North + if (_current.getLoc().canGoNorth()) + { + nodeN = addNode(x, y - 1, z, false); + } + + if (Config.ADVANCED_DIAGONAL_STRATEGY) + { + // SouthEast + if ((nodeE != null) && (nodeS != null)) + { + if (nodeE.getLoc().canGoSouth() && nodeS.getLoc().canGoEast()) + { + addNode(x + 1, y + 1, z, true); + } + } + + // SouthWest + if ((nodeS != null) && (nodeW != null)) + { + if (nodeW.getLoc().canGoSouth() && nodeS.getLoc().canGoWest()) + { + addNode(x - 1, y + 1, z, true); + } + } + + // NorthEast + if ((nodeN != null) && (nodeE != null)) + { + if (nodeE.getLoc().canGoNorth() && nodeN.getLoc().canGoEast()) + { + addNode(x + 1, y - 1, z, true); + } + } + + // NorthWest + if ((nodeN != null) && (nodeW != null)) + { + if (nodeW.getLoc().canGoNorth() && nodeN.getLoc().canGoWest()) + { + addNode(x - 1, y - 1, z, true); + } + } + } + } + + private CellNode getNode(int x, int y, int z) + { + final int aX = x - _baseX; + if ((aX < 0) || (aX >= _mapSize)) + { + return null; + } + + final int aY = y - _baseY; + if ((aY < 0) || (aY >= _mapSize)) + { + return null; + } + + CellNode result = _buffer[aX][aY]; + if (result == null) + { + result = new CellNode(new NodeLoc(x, y, z)); + _buffer[aX][aY] = result; + } + else if (!result.isInUse()) + { + result.setInUse(); + // reinit node if needed + if (result.getLoc() != null) + { + result.getLoc().set(x, y, z); + } + else + { + result.setLoc(new NodeLoc(x, y, z)); + } + } + + return result; + } + + private CellNode addNode(int x, int y, int z, boolean diagonal) + { + final CellNode newNode = getNode(x, y, z); + if (newNode == null) + { + return null; + } + if (newNode.getCost() >= 0) + { + return newNode; + } + + final int geoZ = newNode.getLoc().getZ(); + + final int stepZ = Math.abs(geoZ - _current.getLoc().getZ()); + float weight = diagonal ? Config.DIAGONAL_WEIGHT : Config.LOW_WEIGHT; + + if (!newNode.getLoc().canGoAll() || (stepZ > 16)) + { + weight = Config.HIGH_WEIGHT; + } + else if (isHighWeight(x + 1, y, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x - 1, y, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x, y + 1, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x, y - 1, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + + newNode.setParent(_current); + newNode.setCost(getCost(x, y, geoZ, weight)); + + CellNode node = _current; + int count = 0; + while ((node.getNext() != null) && (count < (MAX_ITERATIONS * 4))) + { + count++; + if (node.getNext().getCost() > newNode.getCost()) + { + // insert node into a chain + newNode.setNext(node.getNext()); + break; + } + node = node.getNext(); + } + if (count == (MAX_ITERATIONS * 4)) + { + System.err.println("Pathfinding: too long loop detected, cost:" + newNode.getCost()); + } + + node.setNext(newNode); // add last + + return newNode; + } + + private boolean isHighWeight(int x, int y, int z) + { + final CellNode result = getNode(x, y, z); + if (result == null) + { + return true; + } + + if (!result.getLoc().canGoAll()) + { + return true; + } + if (Math.abs(result.getLoc().getZ() - z) > 16) + { + return true; + } + + return false; + } + + private double getCost(int x, int y, int z, float weight) + { + final int dX = x - _targetX; + final int dY = y - _targetY; + final int dZ = z - _targetZ; + // Math.abs(dx) + Math.abs(dy) + Math.abs(dz) / 16 + double result = Math.sqrt((dX * dX) + (dY * dY) + ((dZ * dZ) / 256.0)); + if (result > weight) + { + result += weight; + } + + if (result > Float.MAX_VALUE) + { + result = Float.MAX_VALUE; + } + + return result; + } } \ No newline at end of file diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java similarity index 93% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java index 80643e2131..f36ec872ba 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java @@ -1,440 +1,440 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.idfactory.IdFactory; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.model.itemcontainer.Inventory; -import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; - -/** - * @author Sami, DS Credits to Diamond - */ -public class CellPathFinding extends PathFinding -{ - private static final Logger _log = Logger.getLogger(CellPathFinding.class.getName()); - private BufferInfo[] _allBuffers; - private int _findSuccess = 0; - private int _findFails = 0; - private int _postFilterUses = 0; - private int _postFilterPlayableUses = 0; - private int _postFilterPasses = 0; - private long _postFilterElapsed = 0; - - private List _debugItems = null; - - public static CellPathFinding getInstance() - { - return SingletonHolder._instance; - } - - protected CellPathFinding() - { - try - { - final String[] array = Config.PATHFIND_BUFFERS.split(";"); - - _allBuffers = new BufferInfo[array.length]; - - String buf; - String[] args; - for (int i = 0; i < array.length; i++) - { - buf = array[i]; - args = buf.split("x"); - if (args.length != 2) - { - throw new Exception("Invalid buffer definition: " + buf); - } - - _allBuffers[i] = new BufferInfo(Integer.parseInt(args[0]), Integer.parseInt(args[1])); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "CellPathFinding: Problem during buffer init: " + e.getMessage(), e); - throw new Error("CellPathFinding: load aborted"); - } - } - - @Override - public boolean pathNodesExist(short regionoffset) - { - return false; - } - - @Override - public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) - { - final int gx = GeoData.getInstance().getGeoX(x); - final int gy = GeoData.getInstance().getGeoY(y); - if (!GeoData.getInstance().hasGeo(x, y)) - { - return null; - } - final int gz = GeoData.getInstance().getHeight(x, y, z); - final int gtx = GeoData.getInstance().getGeoX(tx); - final int gty = GeoData.getInstance().getGeoY(ty); - if (!GeoData.getInstance().hasGeo(tx, ty)) - { - return null; - } - final int gtz = GeoData.getInstance().getHeight(tx, ty, tz); - final CellNodeBuffer buffer = alloc(64 + (2 * Math.max(Math.abs(gx - gtx), Math.abs(gy - gty))), playable); - if (buffer == null) - { - return null; - } - - final boolean debug = playable && Config.DEBUG_PATH; - - if (debug) - { - if (_debugItems == null) - { - _debugItems = new CopyOnWriteArrayList<>(); - } - else - { - for (L2ItemInstance item : _debugItems) - { - if (item == null) - { - continue; - } - item.decayMe(); - } - - _debugItems.clear(); - } - } - - List path = null; - try - { - final CellNode result = buffer.findPath(gx, gy, gz, gtx, gty, gtz); - - if (debug) - { - for (CellNode n : buffer.debugPath()) - { - if (n.getCost() < 0) - { - dropDebugItem(1831, (int) (-n.getCost() * 10), n.getLoc()); - } - else - { - // known nodes - dropDebugItem(Inventory.ADENA_ID, (int) (n.getCost() * 10), n.getLoc()); - } - } - } - - if (result == null) - { - _findFails++; - return null; - } - - path = constructPath(result); - } - catch (Exception e) - { - _log.log(Level.WARNING, "", e); - return null; - } - finally - { - buffer.free(); - } - - if ((path.size() < 3) || (Config.MAX_POSTFILTER_PASSES <= 0)) - { - _findSuccess++; - return path; - } - - final long timeStamp = System.currentTimeMillis(); - _postFilterUses++; - if (playable) - { - _postFilterPlayableUses++; - } - - int currentX, currentY, currentZ; - ListIterator middlePoint; - boolean remove; - int pass = 0; - do - { - pass++; - _postFilterPasses++; - - remove = false; - middlePoint = path.listIterator(); - currentX = x; - currentY = y; - currentZ = z; - - while (middlePoint.hasNext()) - { - final AbstractNodeLoc locMiddle = middlePoint.next(); - if (!middlePoint.hasNext()) - { - break; - } - - final AbstractNodeLoc locEnd = path.get(middlePoint.nextIndex()); - if (GeoData.getInstance().canMove(currentX, currentY, currentZ, locEnd.getX(), locEnd.getY(), locEnd.getZ(), instance)) - { - middlePoint.remove(); - remove = true; - if (debug) - { - dropDebugItem(735, 1, locMiddle); - } - } - else - { - currentX = locMiddle.getX(); - currentY = locMiddle.getY(); - currentZ = locMiddle.getZ(); - } - } - } - // only one postfilter pass for AI - while (playable && remove && (path.size() > 2) && (pass < Config.MAX_POSTFILTER_PASSES)); - - if (debug) - { - path.forEach(n -> dropDebugItem(65, 1, n)); - } - - _findSuccess++; - _postFilterElapsed += System.currentTimeMillis() - timeStamp; - return path; - } - - private List constructPath(AbstractNode node) - { - final LinkedList path = new LinkedList<>(); - int previousDirectionX = Integer.MIN_VALUE; - int previousDirectionY = Integer.MIN_VALUE; - int directionX, directionY; - - while (node.getParent() != null) - { - if (!Config.ADVANCED_DIAGONAL_STRATEGY && (node.getParent().getParent() != null)) - { - final int tmpX = node.getLoc().getNodeX() - node.getParent().getParent().getLoc().getNodeX(); - final int tmpY = node.getLoc().getNodeY() - node.getParent().getParent().getLoc().getNodeY(); - if (Math.abs(tmpX) == Math.abs(tmpY)) - { - directionX = tmpX; - directionY = tmpY; - } - else - { - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - } - } - else - { - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - } - - // only add a new route point if moving direction changes - if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) - { - previousDirectionX = directionX; - previousDirectionY = directionY; - - path.addFirst(node.getLoc()); - node.setLoc(null); - } - - node = node.getParent(); - } - - return path; - } - - private CellNodeBuffer alloc(int size, boolean playable) - { - CellNodeBuffer current = null; - for (BufferInfo i : _allBuffers) - { - if (i.mapSize >= size) - { - for (CellNodeBuffer buf : i.bufs) - { - if (buf.lock()) - { - i.uses++; - if (playable) - { - i.playableUses++; - } - i.elapsed += buf.getElapsedTime(); - current = buf; - break; - } - } - if (current != null) - { - break; - } - - // not found, allocate temporary buffer - current = new CellNodeBuffer(i.mapSize); - current.lock(); - if (i.bufs.size() < i.count) - { - i.bufs.add(current); - i.uses++; - if (playable) - { - i.playableUses++; - } - break; - } - - i.overflows++; - if (playable) - { - i.playableOverflows++; - // System.err.println("Overflow, size requested: " + size + " playable:"+playable); - } - } - } - - return current; - } - - private void dropDebugItem(int itemId, int num, AbstractNodeLoc loc) - { - final L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); - item.setCount(num); - item.spawnMe(loc.getX(), loc.getY(), loc.getZ()); - _debugItems.add(item); - } - - private static final class BufferInfo - { - final int mapSize; - final int count; - ArrayList bufs; - int uses = 0; - int playableUses = 0; - int overflows = 0; - int playableOverflows = 0; - long elapsed = 0; - - public BufferInfo(int size, int cnt) - { - mapSize = size; - count = cnt; - bufs = new ArrayList<>(count); - } - - @Override - public String toString() - { - final StringBuilder sb = new StringBuilder(100); - sb.append(mapSize); - sb.append("x"); - sb.append(mapSize); - sb.append(" num:"); - sb.append(bufs.size()); - sb.append("/"); - sb.append(count); - sb.append(" uses:"); - sb.append(uses); - sb.append("/"); - sb.append(playableUses); - if (uses > 0) - { - sb.append(" total/avg(ms):"); - sb.append(elapsed); - sb.append("/"); - sb.append(String.format("%1.2f", (double) elapsed / uses)); - } - - sb.append(" ovf:"); - sb.append(overflows); - sb.append("/"); - sb.append(playableOverflows); - - return sb.toString(); - } - } - - @Override - public String[] getStat() - { - final String[] result = new String[_allBuffers.length + 1]; - for (int i = 0; i < _allBuffers.length; i++) - { - result[i] = _allBuffers[i].toString(); - } - - final StringBuilder sb = new StringBuilder(128); - sb.append("LOS postfilter uses:"); - sb.append(_postFilterUses); - sb.append("/"); - sb.append(_postFilterPlayableUses); - if (_postFilterUses > 0) - { - sb.append(" total/avg(ms):"); - sb.append(_postFilterElapsed); - sb.append("/"); - sb.append(String.format("%1.2f", (double) _postFilterElapsed / _postFilterUses)); - sb.append(" passes total/avg:"); - sb.append(_postFilterPasses); - sb.append("/"); - sb.append(String.format("%1.1f", (double) _postFilterPasses / _postFilterUses)); - sb.append(Config.EOL); - } - sb.append("Pathfind success/fail:"); - sb.append(_findSuccess); - sb.append("/"); - sb.append(_findFails); - result[result.length - 1] = sb.toString(); - - return result; - } - - private static class SingletonHolder - { - protected static final CellPathFinding _instance = new CellPathFinding(); - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; +import com.l2jmobius.gameserver.idfactory.IdFactory; +import com.l2jmobius.gameserver.model.instancezone.Instance; +import com.l2jmobius.gameserver.model.itemcontainer.Inventory; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; + +/** + * @author Sami, DS Credits to Diamond + */ +public class CellPathFinding extends PathFinding +{ + private static final Logger _log = Logger.getLogger(CellPathFinding.class.getName()); + private BufferInfo[] _allBuffers; + private int _findSuccess = 0; + private int _findFails = 0; + private int _postFilterUses = 0; + private int _postFilterPlayableUses = 0; + private int _postFilterPasses = 0; + private long _postFilterElapsed = 0; + + private List _debugItems = null; + + public static CellPathFinding getInstance() + { + return SingletonHolder._instance; + } + + protected CellPathFinding() + { + try + { + final String[] array = Config.PATHFIND_BUFFERS.split(";"); + + _allBuffers = new BufferInfo[array.length]; + + String buf; + String[] args; + for (int i = 0; i < array.length; i++) + { + buf = array[i]; + args = buf.split("x"); + if (args.length != 2) + { + throw new Exception("Invalid buffer definition: " + buf); + } + + _allBuffers[i] = new BufferInfo(Integer.parseInt(args[0]), Integer.parseInt(args[1])); + } + } + catch (Exception e) + { + _log.log(Level.WARNING, "CellPathFinding: Problem during buffer init: " + e.getMessage(), e); + throw new Error("CellPathFinding: load aborted"); + } + } + + @Override + public boolean pathNodesExist(short regionoffset) + { + return false; + } + + @Override + public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) + { + final int gx = GeoData.getInstance().getGeoX(x); + final int gy = GeoData.getInstance().getGeoY(y); + if (!GeoData.getInstance().hasGeo(x, y)) + { + return null; + } + final int gz = GeoData.getInstance().getHeight(x, y, z); + final int gtx = GeoData.getInstance().getGeoX(tx); + final int gty = GeoData.getInstance().getGeoY(ty); + if (!GeoData.getInstance().hasGeo(tx, ty)) + { + return null; + } + final int gtz = GeoData.getInstance().getHeight(tx, ty, tz); + final CellNodeBuffer buffer = alloc(64 + (2 * Math.max(Math.abs(gx - gtx), Math.abs(gy - gty))), playable); + if (buffer == null) + { + return null; + } + + final boolean debug = playable && Config.DEBUG_PATH; + + if (debug) + { + if (_debugItems == null) + { + _debugItems = new CopyOnWriteArrayList<>(); + } + else + { + for (L2ItemInstance item : _debugItems) + { + if (item == null) + { + continue; + } + item.decayMe(); + } + + _debugItems.clear(); + } + } + + List path = null; + try + { + final CellNode result = buffer.findPath(gx, gy, gz, gtx, gty, gtz); + + if (debug) + { + for (CellNode n : buffer.debugPath()) + { + if (n.getCost() < 0) + { + dropDebugItem(1831, (int) (-n.getCost() * 10), n.getLoc()); + } + else + { + // known nodes + dropDebugItem(Inventory.ADENA_ID, (int) (n.getCost() * 10), n.getLoc()); + } + } + } + + if (result == null) + { + _findFails++; + return null; + } + + path = constructPath(result); + } + catch (Exception e) + { + _log.log(Level.WARNING, "", e); + return null; + } + finally + { + buffer.free(); + } + + if ((path.size() < 3) || (Config.MAX_POSTFILTER_PASSES <= 0)) + { + _findSuccess++; + return path; + } + + final long timeStamp = System.currentTimeMillis(); + _postFilterUses++; + if (playable) + { + _postFilterPlayableUses++; + } + + int currentX, currentY, currentZ; + ListIterator middlePoint; + boolean remove; + int pass = 0; + do + { + pass++; + _postFilterPasses++; + + remove = false; + middlePoint = path.listIterator(); + currentX = x; + currentY = y; + currentZ = z; + + while (middlePoint.hasNext()) + { + final AbstractNodeLoc locMiddle = middlePoint.next(); + if (!middlePoint.hasNext()) + { + break; + } + + final AbstractNodeLoc locEnd = path.get(middlePoint.nextIndex()); + if (GeoData.getInstance().canMove(currentX, currentY, currentZ, locEnd.getX(), locEnd.getY(), locEnd.getZ(), instance)) + { + middlePoint.remove(); + remove = true; + if (debug) + { + dropDebugItem(735, 1, locMiddle); + } + } + else + { + currentX = locMiddle.getX(); + currentY = locMiddle.getY(); + currentZ = locMiddle.getZ(); + } + } + } + // only one postfilter pass for AI + while (playable && remove && (path.size() > 2) && (pass < Config.MAX_POSTFILTER_PASSES)); + + if (debug) + { + path.forEach(n -> dropDebugItem(65, 1, n)); + } + + _findSuccess++; + _postFilterElapsed += System.currentTimeMillis() - timeStamp; + return path; + } + + private List constructPath(AbstractNode node) + { + final LinkedList path = new LinkedList<>(); + int previousDirectionX = Integer.MIN_VALUE; + int previousDirectionY = Integer.MIN_VALUE; + int directionX, directionY; + + while (node.getParent() != null) + { + if (!Config.ADVANCED_DIAGONAL_STRATEGY && (node.getParent().getParent() != null)) + { + final int tmpX = node.getLoc().getNodeX() - node.getParent().getParent().getLoc().getNodeX(); + final int tmpY = node.getLoc().getNodeY() - node.getParent().getParent().getLoc().getNodeY(); + if (Math.abs(tmpX) == Math.abs(tmpY)) + { + directionX = tmpX; + directionY = tmpY; + } + else + { + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + } + } + else + { + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + } + + // only add a new route point if moving direction changes + if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) + { + previousDirectionX = directionX; + previousDirectionY = directionY; + + path.addFirst(node.getLoc()); + node.setLoc(null); + } + + node = node.getParent(); + } + + return path; + } + + private CellNodeBuffer alloc(int size, boolean playable) + { + CellNodeBuffer current = null; + for (BufferInfo i : _allBuffers) + { + if (i.mapSize >= size) + { + for (CellNodeBuffer buf : i.bufs) + { + if (buf.lock()) + { + i.uses++; + if (playable) + { + i.playableUses++; + } + i.elapsed += buf.getElapsedTime(); + current = buf; + break; + } + } + if (current != null) + { + break; + } + + // not found, allocate temporary buffer + current = new CellNodeBuffer(i.mapSize); + current.lock(); + if (i.bufs.size() < i.count) + { + i.bufs.add(current); + i.uses++; + if (playable) + { + i.playableUses++; + } + break; + } + + i.overflows++; + if (playable) + { + i.playableOverflows++; + // System.err.println("Overflow, size requested: " + size + " playable:"+playable); + } + } + } + + return current; + } + + private void dropDebugItem(int itemId, int num, AbstractNodeLoc loc) + { + final L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); + item.setCount(num); + item.spawnMe(loc.getX(), loc.getY(), loc.getZ()); + _debugItems.add(item); + } + + private static final class BufferInfo + { + final int mapSize; + final int count; + ArrayList bufs; + int uses = 0; + int playableUses = 0; + int overflows = 0; + int playableOverflows = 0; + long elapsed = 0; + + public BufferInfo(int size, int cnt) + { + mapSize = size; + count = cnt; + bufs = new ArrayList<>(count); + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(100); + sb.append(mapSize); + sb.append("x"); + sb.append(mapSize); + sb.append(" num:"); + sb.append(bufs.size()); + sb.append("/"); + sb.append(count); + sb.append(" uses:"); + sb.append(uses); + sb.append("/"); + sb.append(playableUses); + if (uses > 0) + { + sb.append(" total/avg(ms):"); + sb.append(elapsed); + sb.append("/"); + sb.append(String.format("%1.2f", (double) elapsed / uses)); + } + + sb.append(" ovf:"); + sb.append(overflows); + sb.append("/"); + sb.append(playableOverflows); + + return sb.toString(); + } + } + + @Override + public String[] getStat() + { + final String[] result = new String[_allBuffers.length + 1]; + for (int i = 0; i < _allBuffers.length; i++) + { + result[i] = _allBuffers[i].toString(); + } + + final StringBuilder sb = new StringBuilder(128); + sb.append("LOS postfilter uses:"); + sb.append(_postFilterUses); + sb.append("/"); + sb.append(_postFilterPlayableUses); + if (_postFilterUses > 0) + { + sb.append(" total/avg(ms):"); + sb.append(_postFilterElapsed); + sb.append("/"); + sb.append(String.format("%1.2f", (double) _postFilterElapsed / _postFilterUses)); + sb.append(" passes total/avg:"); + sb.append(_postFilterPasses); + sb.append("/"); + sb.append(String.format("%1.1f", (double) _postFilterPasses / _postFilterUses)); + sb.append(Config.EOL); + } + sb.append("Pathfind success/fail:"); + sb.append(_findSuccess); + sb.append("/"); + sb.append(_findFails); + result[result.length - 1] = sb.toString(); + + return result; + } + + private static class SingletonHolder + { + protected static final CellPathFinding _instance = new CellPathFinding(); + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java similarity index 89% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java index a3206e22ca..fb063e9a41 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java @@ -1,184 +1,184 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import com.l2jmobius.commons.geodriver.Cell; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; - -/** - * @author -Nemesiss-, HorridoJoho - */ -public class NodeLoc extends AbstractNodeLoc -{ - private int _x; - private int _y; - private boolean _goNorth; - private boolean _goEast; - private boolean _goSouth; - private boolean _goWest; - private int _geoHeight; - - public NodeLoc(int x, int y, int z) - { - set(x, y, z); - } - - public void set(int x, int y, int z) - { - _x = x; - _y = y; - _goNorth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_NORTH); - _goEast = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_EAST); - _goSouth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_SOUTH); - _goWest = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_WEST); - _geoHeight = GeoData.getInstance().getNearestZ(x, y, z); - } - - public boolean canGoNorth() - { - return _goNorth; - } - - public boolean canGoEast() - { - return _goEast; - } - - public boolean canGoSouth() - { - return _goSouth; - } - - public boolean canGoWest() - { - return _goWest; - } - - public boolean canGoAll() - { - return canGoNorth() && canGoEast() && canGoSouth() && canGoWest(); - } - - @Override - public int getX() - { - return GeoData.getInstance().getWorldX(_x); - } - - @Override - public int getY() - { - return GeoData.getInstance().getWorldY(_y); - } - - @Override - public int getZ() - { - return _geoHeight; - } - - @Override - public int getNodeX() - { - return _x; - } - - @Override - public int getNodeY() - { - return _y; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + _x; - result = (prime * result) + _y; - - int nswe = 0; - if (canGoNorth()) - { - nswe |= Cell.NSWE_NORTH; - } - if (canGoEast()) - { - nswe |= Cell.NSWE_EAST; - } - if (canGoSouth()) - { - nswe |= Cell.NSWE_SOUTH; - } - if (canGoWest()) - { - nswe |= Cell.NSWE_WEST; - } - - result = (prime * result) + (((_geoHeight & 0xFFFF) << 1) | nswe); - return result; - // return super.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NodeLoc)) - { - return false; - } - final NodeLoc other = (NodeLoc) obj; - if (_x != other._x) - { - return false; - } - if (_y != other._y) - { - return false; - } - if (_goNorth != other._goNorth) - { - return false; - } - if (_goEast != other._goEast) - { - return false; - } - if (_goSouth != other._goSouth) - { - return false; - } - if (_goWest != other._goWest) - { - return false; - } - if (_geoHeight != other._geoHeight) - { - return false; - } - return true; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; + +/** + * @author -Nemesiss-, HorridoJoho + */ +public class NodeLoc extends AbstractNodeLoc +{ + private int _x; + private int _y; + private boolean _goNorth; + private boolean _goEast; + private boolean _goSouth; + private boolean _goWest; + private int _geoHeight; + + public NodeLoc(int x, int y, int z) + { + set(x, y, z); + } + + public void set(int x, int y, int z) + { + _x = x; + _y = y; + _goNorth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_NORTH); + _goEast = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_EAST); + _goSouth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_SOUTH); + _goWest = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_WEST); + _geoHeight = GeoData.getInstance().getNearestZ(x, y, z); + } + + public boolean canGoNorth() + { + return _goNorth; + } + + public boolean canGoEast() + { + return _goEast; + } + + public boolean canGoSouth() + { + return _goSouth; + } + + public boolean canGoWest() + { + return _goWest; + } + + public boolean canGoAll() + { + return canGoNorth() && canGoEast() && canGoSouth() && canGoWest(); + } + + @Override + public int getX() + { + return GeoData.getInstance().getWorldX(_x); + } + + @Override + public int getY() + { + return GeoData.getInstance().getWorldY(_y); + } + + @Override + public int getZ() + { + return _geoHeight; + } + + @Override + public int getNodeX() + { + return _x; + } + + @Override + public int getNodeY() + { + return _y; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + _x; + result = (prime * result) + _y; + + int nswe = 0; + if (canGoNorth()) + { + nswe |= Cell.NSWE_NORTH; + } + if (canGoEast()) + { + nswe |= Cell.NSWE_EAST; + } + if (canGoSouth()) + { + nswe |= Cell.NSWE_SOUTH; + } + if (canGoWest()) + { + nswe |= Cell.NSWE_WEST; + } + + result = (prime * result) + (((_geoHeight & 0xFFFF) << 1) | nswe); + return result; + // return super.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof NodeLoc)) + { + return false; + } + final NodeLoc other = (NodeLoc) obj; + if (_x != other._x) + { + return false; + } + if (_y != other._y) + { + return false; + } + if (_goNorth != other._goNorth) + { + return false; + } + if (_goEast != other._goEast) + { + return false; + } + if (_goSouth != other._goSouth) + { + return false; + } + if (_goWest != other._goWest) + { + return false; + } + if (_geoHeight != other._geoHeight) + { + return false; + } + return true; + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java similarity index 87% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java index d4d59fe4c5..fb9d7fdd2e 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java @@ -1,62 +1,62 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import com.l2jmobius.gameserver.pathfinding.AbstractNode; - -/** - * @author -Nemesiss- - */ -public class GeoNode extends AbstractNode -{ - private final int _neighborsIdx; - private short _cost; - private GeoNode[] _neighbors; - - public GeoNode(GeoNodeLoc Loc, int Neighbors_idx) - { - super(Loc); - _neighborsIdx = Neighbors_idx; - } - - public short getCost() - { - return _cost; - } - - public void setCost(int cost) - { - _cost = (short) cost; - } - - public GeoNode[] getNeighbors() - { - return _neighbors; - } - - public void attachNeighbors() - { - if (getLoc() == null) - { - _neighbors = null; - } - else - { - _neighbors = GeoPathFinding.getInstance().readNeighbors(this, _neighborsIdx); - } - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; + +/** + * @author -Nemesiss- + */ +public class GeoNode extends AbstractNode +{ + private final int _neighborsIdx; + private short _cost; + private GeoNode[] _neighbors; + + public GeoNode(GeoNodeLoc Loc, int Neighbors_idx) + { + super(Loc); + _neighborsIdx = Neighbors_idx; + } + + public short getCost() + { + return _cost; + } + + public void setCost(int cost) + { + _cost = (short) cost; + } + + public GeoNode[] getNeighbors() + { + return _neighbors; + } + + public void attachNeighbors() + { + if (getLoc() == null) + { + _neighbors = null; + } + else + { + _neighbors = GeoPathFinding.getInstance().readNeighbors(this, _neighborsIdx); + } + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java similarity index 88% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java index 2bfd116b68..9dabc50452 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java @@ -1,109 +1,109 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; - -/** - * @author -Nemesiss- - */ -public class GeoNodeLoc extends AbstractNodeLoc -{ - private final short _x; - private final short _y; - private final short _z; - - public GeoNodeLoc(short x, short y, short z) - { - _x = x; - _y = y; - _z = z; - } - - @Override - public int getX() - { - return L2World.MAP_MIN_X + (_x * 128) + 48; - } - - @Override - public int getY() - { - return L2World.MAP_MIN_Y + (_y * 128) + 48; - } - - @Override - public int getZ() - { - return _z; - } - - @Override - public int getNodeX() - { - return _x; - } - - @Override - public int getNodeY() - { - return _y; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + _x; - result = (prime * result) + _y; - result = (prime * result) + _z; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof GeoNodeLoc)) - { - return false; - } - final GeoNodeLoc other = (GeoNodeLoc) obj; - if (_x != other._x) - { - return false; - } - if (_y != other._y) - { - return false; - } - if (_z != other._z) - { - return false; - } - return true; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.model.L2World; + +/** + * @author -Nemesiss- + */ +public class GeoNodeLoc extends AbstractNodeLoc +{ + private final short _x; + private final short _y; + private final short _z; + + public GeoNodeLoc(short x, short y, short z) + { + _x = x; + _y = y; + _z = z; + } + + @Override + public int getX() + { + return L2World.MAP_MIN_X + (_x * 128) + 48; + } + + @Override + public int getY() + { + return L2World.MAP_MIN_Y + (_y * 128) + 48; + } + + @Override + public int getZ() + { + return _z; + } + + @Override + public int getNodeX() + { + return _x; + } + + @Override + public int getNodeY() + { + return _y; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + _x; + result = (prime * result) + _y; + result = (prime * result) + _z; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof GeoNodeLoc)) + { + return false; + } + final GeoNodeLoc other = (GeoNodeLoc) obj; + if (_x != other._x) + { + return false; + } + if (_y != other._y) + { + return false; + } + if (_z != other._z) + { + return false; + } + return true; + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java similarity index 94% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java index e435ff5b9c..66a7aa7905 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java @@ -1,470 +1,470 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.model.Location; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; -import com.l2jmobius.gameserver.util.Util; - -/** - * @author -Nemesiss- - */ -public class GeoPathFinding extends PathFinding -{ - private static Logger _log = Logger.getLogger(GeoPathFinding.class.getName()); - private static Map _pathNodes = new ConcurrentHashMap<>(); - private static Map _pathNodesIndex = new ConcurrentHashMap<>(); - - public static GeoPathFinding getInstance() - { - return SingletonHolder._instance; - } - - @Override - public boolean pathNodesExist(short regionoffset) - { - return _pathNodesIndex.containsKey(regionoffset); - } - - @Override - public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) - { - final int gx = (x - L2World.MAP_MIN_X) >> 4; - final int gy = (y - L2World.MAP_MIN_Y) >> 4; - final short gz = (short) z; - final int gtx = (tx - L2World.MAP_MIN_X) >> 4; - final int gty = (ty - L2World.MAP_MIN_Y) >> 4; - final short gtz = (short) tz; - - final GeoNode start = readNode(gx, gy, gz); - final GeoNode end = readNode(gtx, gty, gtz); - if ((start == null) || (end == null)) - { - return null; - } - if (Math.abs(start.getLoc().getZ() - z) > 55) - { - return null; // not correct layer - } - if (Math.abs(end.getLoc().getZ() - tz) > 55) - { - return null; // not correct layer - } - if (start == end) - { - return null; - } - - // TODO: Find closest path node we CAN access. Now only checks if we can not reach the closest - Location temp = GeoData.getInstance().moveCheck(x, y, z, start.getLoc().getX(), start.getLoc().getY(), start.getLoc().getZ(), instance); - if ((temp.getX() != start.getLoc().getX()) || (temp.getY() != start.getLoc().getY())) - { - return null; // cannot reach closest... - } - - // TODO: Find closest path node around target, now only checks if final location can be reached - temp = GeoData.getInstance().moveCheck(tx, ty, tz, end.getLoc().getX(), end.getLoc().getY(), end.getLoc().getZ(), instance); - if ((temp.getX() != end.getLoc().getX()) || (temp.getY() != end.getLoc().getY())) - { - return null; // cannot reach closest... - } - - // return searchAStar(start, end); - return searchByClosest2(start, end); - } - - public List searchByClosest2(GeoNode start, GeoNode end) - { - // Always continues checking from the closest to target non-blocked - // node from to_visit list. There's extra length in path if needed - // to go backwards/sideways but when moving generally forwards, this is extra fast - // and accurate. And can reach insane distances (try it with 800 nodes..). - // Minimum required node count would be around 300-400. - // Generally returns a bit (only a bit) more intelligent looking routes than - // the basic version. Not a true distance image (which would increase CPU - // load) level of intelligence though. - - // List of Visited Nodes - final List visited = new ArrayList<>(550); - - // List of Nodes to Visit - final LinkedList to_visit = new LinkedList<>(); - to_visit.add(start); - final int targetX = end.getLoc().getNodeX(); - final int targetY = end.getLoc().getNodeY(); - - int dx, dy; - boolean added; - int i = 0; - while (i < 550) - { - GeoNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) - { - return constructPath2(node); - } - - i++; - visited.add(node); - node.attachNeighbors(); - final GeoNode[] neighbors = node.getNeighbors(); - if (neighbors == null) - { - continue; - } - for (GeoNode n : neighbors) - { - if ((visited.lastIndexOf(n) == -1) && !to_visit.contains(n)) - { - added = false; - n.setParent(node); - dx = targetX - n.getLoc().getNodeX(); - dy = targetY - n.getLoc().getNodeY(); - n.setCost((dx * dx) + (dy * dy)); - for (int index = 0; index < to_visit.size(); index++) - { - // supposed to find it quite early.. - if (to_visit.get(index).getCost() > n.getCost()) - { - to_visit.add(index, n); - added = true; - break; - } - } - if (!added) - { - to_visit.addLast(n); - } - } - } - } - // No Path found - return null; - } - - public List constructPath2(AbstractNode node) - { - final LinkedList path = new LinkedList<>(); - int previousDirectionX = -1000; - int previousDirectionY = -1000; - int directionX; - int directionY; - - while (node.getParent() != null) - { - // only add a new route point if moving direction changes - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - - if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) - { - previousDirectionX = directionX; - previousDirectionY = directionY; - path.addFirst(node.getLoc()); - } - node = node.getParent(); - } - return path; - } - - public GeoNode[] readNeighbors(GeoNode n, int idx) - { - final int node_x = n.getLoc().getNodeX(); - final int node_y = n.getLoc().getNodeY(); - // short node_z = n.getLoc().getZ(); - - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - final ByteBuffer pn = _pathNodes.get(regoffset); - - final List> Neighbors = new ArrayList<>(8); - GeoNode newNode; - short new_node_x, new_node_y; - - // Region for sure will change, we must read from correct file - byte neighbor = pn.get(idx++); // N - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) node_x; - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // NE - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // E - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) node_y; - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // SE - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // S - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) node_x; - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // SW - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // W - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) node_y; - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // NW - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - final GeoNode[] result = new GeoNode[Neighbors.size()]; - return Neighbors.toArray(result); - } - - // Private - - private GeoNode readNode(short node_x, short node_y, byte layer) - { - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - if (!pathNodesExist(regoffset)) - { - return null; - } - final short nbx = getNodeBlock(node_x); - final short nby = getNodeBlock(node_y); - int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); - final ByteBuffer pn = _pathNodes.get(regoffset); - // reading - final byte nodes = pn.get(idx); - idx += (layer * 10) + 1; // byte + layer*10byte - if (nodes < layer) - { - _log.warning("SmthWrong!"); - } - final short node_z = pn.getShort(idx); - idx += 2; - return new GeoNode(new GeoNodeLoc(node_x, node_y, node_z), idx); - } - - private GeoNode readNode(int gx, int gy, short z) - { - final short node_x = getNodePos(gx); - final short node_y = getNodePos(gy); - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - if (!pathNodesExist(regoffset)) - { - return null; - } - final short nbx = getNodeBlock(node_x); - final short nby = getNodeBlock(node_y); - int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); - final ByteBuffer pn = _pathNodes.get(regoffset); - // reading - byte nodes = pn.get(idx++); - int idx2 = 0; // create index to nearlest node by z - short last_z = Short.MIN_VALUE; - while (nodes > 0) - { - final short node_z = pn.getShort(idx); - if (Math.abs(last_z - z) > Math.abs(node_z - z)) - { - last_z = node_z; - idx2 = idx + 2; - } - idx += 10; // short + 8 byte - nodes--; - } - return new GeoNode(new GeoNodeLoc(node_x, node_y, last_z), idx2); - } - - protected GeoPathFinding() - { - try - { - _log.info("Path Engine: - Loading Path Nodes..."); - //@formatter:off - Files.lines(Paths.get(Config.PATHNODE_DIR.getPath(), "pn_index.txt"), StandardCharsets.UTF_8) - .map(String::trim) - .filter(l -> !l.isEmpty()) - .forEach(line -> { - final String[] parts = line.split("_"); - - if ((parts.length < 2) - || !Util.isDigit(parts[0]) - || !Util.isDigit(parts[1])) - { - _log.warning("Invalid pathnode entry: '" + line + "', must be in format 'XX_YY', where X and Y - integers"); - return; - } - - final byte rx = Byte.parseByte(parts[0]); - final byte ry = Byte.parseByte(parts[1]); - LoadPathNodeFile(rx, ry); - }); - //@formatter:on - } - catch (IOException e) - { - _log.log(Level.WARNING, "", e); - throw new Error("Failed to read pn_index file."); - } - } - - private void LoadPathNodeFile(byte rx, byte ry) - { - if ((rx < L2World.TILE_X_MIN) || (rx > L2World.TILE_X_MAX) || (ry < L2World.TILE_Y_MIN) || (ry > L2World.TILE_Y_MAX)) - { - _log.warning("Failed to Load PathNode File: invalid region " + rx + "," + ry + Config.EOL); - return; - } - final short regionoffset = getRegionOffset(rx, ry); - final File file = new File(Config.PATHNODE_DIR, rx + "_" + ry + ".pn"); - _log.info("Path Engine: - Loading: " + file.getName() + " -> region offset: " + regionoffset + " X: " + rx + " Y: " + ry); - int node = 0, size, index = 0; - - // Create a read-only memory-mapped file - try (RandomAccessFile raf = new RandomAccessFile(file, "r"); - FileChannel roChannel = raf.getChannel()) - { - size = (int) roChannel.size(); - MappedByteBuffer nodes; - if (Config.FORCE_GEODATA) - { - // it is not guarantee, because the underlying operating system may have paged out some of the buffer's data - nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size).load(); - } - else - { - nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size); - } - - // Indexing pathnode files, so we will know where each block starts - final IntBuffer indexs = IntBuffer.allocate(65536); - - while (node < 65536) - { - final byte layer = nodes.get(index); - indexs.put(node++, index); - index += (layer * 10) + 1; - } - _pathNodesIndex.put(regionoffset, indexs); - _pathNodes.put(regionoffset, nodes); - } - catch (Exception e) - { - _log.log(Level.WARNING, "Failed to Load PathNode File: " + file.getAbsolutePath() + " : " + e.getMessage(), e); - } - } - - private static class SingletonHolder - { - protected static final GeoPathFinding _instance = new GeoPathFinding(); - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.instancezone.Instance; +import com.l2jmobius.gameserver.util.Util; + +/** + * @author -Nemesiss- + */ +public class GeoPathFinding extends PathFinding +{ + private static Logger _log = Logger.getLogger(GeoPathFinding.class.getName()); + private static Map _pathNodes = new ConcurrentHashMap<>(); + private static Map _pathNodesIndex = new ConcurrentHashMap<>(); + + public static GeoPathFinding getInstance() + { + return SingletonHolder._instance; + } + + @Override + public boolean pathNodesExist(short regionoffset) + { + return _pathNodesIndex.containsKey(regionoffset); + } + + @Override + public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) + { + final int gx = (x - L2World.MAP_MIN_X) >> 4; + final int gy = (y - L2World.MAP_MIN_Y) >> 4; + final short gz = (short) z; + final int gtx = (tx - L2World.MAP_MIN_X) >> 4; + final int gty = (ty - L2World.MAP_MIN_Y) >> 4; + final short gtz = (short) tz; + + final GeoNode start = readNode(gx, gy, gz); + final GeoNode end = readNode(gtx, gty, gtz); + if ((start == null) || (end == null)) + { + return null; + } + if (Math.abs(start.getLoc().getZ() - z) > 55) + { + return null; // not correct layer + } + if (Math.abs(end.getLoc().getZ() - tz) > 55) + { + return null; // not correct layer + } + if (start == end) + { + return null; + } + + // TODO: Find closest path node we CAN access. Now only checks if we can not reach the closest + Location temp = GeoData.getInstance().moveCheck(x, y, z, start.getLoc().getX(), start.getLoc().getY(), start.getLoc().getZ(), instance); + if ((temp.getX() != start.getLoc().getX()) || (temp.getY() != start.getLoc().getY())) + { + return null; // cannot reach closest... + } + + // TODO: Find closest path node around target, now only checks if final location can be reached + temp = GeoData.getInstance().moveCheck(tx, ty, tz, end.getLoc().getX(), end.getLoc().getY(), end.getLoc().getZ(), instance); + if ((temp.getX() != end.getLoc().getX()) || (temp.getY() != end.getLoc().getY())) + { + return null; // cannot reach closest... + } + + // return searchAStar(start, end); + return searchByClosest2(start, end); + } + + public List searchByClosest2(GeoNode start, GeoNode end) + { + // Always continues checking from the closest to target non-blocked + // node from to_visit list. There's extra length in path if needed + // to go backwards/sideways but when moving generally forwards, this is extra fast + // and accurate. And can reach insane distances (try it with 800 nodes..). + // Minimum required node count would be around 300-400. + // Generally returns a bit (only a bit) more intelligent looking routes than + // the basic version. Not a true distance image (which would increase CPU + // load) level of intelligence though. + + // List of Visited Nodes + final List visited = new ArrayList<>(550); + + // List of Nodes to Visit + final LinkedList to_visit = new LinkedList<>(); + to_visit.add(start); + final int targetX = end.getLoc().getNodeX(); + final int targetY = end.getLoc().getNodeY(); + + int dx, dy; + boolean added; + int i = 0; + while (i < 550) + { + GeoNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) + { + return constructPath2(node); + } + + i++; + visited.add(node); + node.attachNeighbors(); + final GeoNode[] neighbors = node.getNeighbors(); + if (neighbors == null) + { + continue; + } + for (GeoNode n : neighbors) + { + if ((visited.lastIndexOf(n) == -1) && !to_visit.contains(n)) + { + added = false; + n.setParent(node); + dx = targetX - n.getLoc().getNodeX(); + dy = targetY - n.getLoc().getNodeY(); + n.setCost((dx * dx) + (dy * dy)); + for (int index = 0; index < to_visit.size(); index++) + { + // supposed to find it quite early.. + if (to_visit.get(index).getCost() > n.getCost()) + { + to_visit.add(index, n); + added = true; + break; + } + } + if (!added) + { + to_visit.addLast(n); + } + } + } + } + // No Path found + return null; + } + + public List constructPath2(AbstractNode node) + { + final LinkedList path = new LinkedList<>(); + int previousDirectionX = -1000; + int previousDirectionY = -1000; + int directionX; + int directionY; + + while (node.getParent() != null) + { + // only add a new route point if moving direction changes + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + + if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) + { + previousDirectionX = directionX; + previousDirectionY = directionY; + path.addFirst(node.getLoc()); + } + node = node.getParent(); + } + return path; + } + + public GeoNode[] readNeighbors(GeoNode n, int idx) + { + final int node_x = n.getLoc().getNodeX(); + final int node_y = n.getLoc().getNodeY(); + // short node_z = n.getLoc().getZ(); + + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + final ByteBuffer pn = _pathNodes.get(regoffset); + + final List> Neighbors = new ArrayList<>(8); + GeoNode newNode; + short new_node_x, new_node_y; + + // Region for sure will change, we must read from correct file + byte neighbor = pn.get(idx++); // N + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) node_x; + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // NE + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // E + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) node_y; + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // SE + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // S + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) node_x; + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // SW + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // W + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) node_y; + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // NW + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + final GeoNode[] result = new GeoNode[Neighbors.size()]; + return Neighbors.toArray(result); + } + + // Private + + private GeoNode readNode(short node_x, short node_y, byte layer) + { + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + if (!pathNodesExist(regoffset)) + { + return null; + } + final short nbx = getNodeBlock(node_x); + final short nby = getNodeBlock(node_y); + int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); + final ByteBuffer pn = _pathNodes.get(regoffset); + // reading + final byte nodes = pn.get(idx); + idx += (layer * 10) + 1; // byte + layer*10byte + if (nodes < layer) + { + _log.warning("SmthWrong!"); + } + final short node_z = pn.getShort(idx); + idx += 2; + return new GeoNode(new GeoNodeLoc(node_x, node_y, node_z), idx); + } + + private GeoNode readNode(int gx, int gy, short z) + { + final short node_x = getNodePos(gx); + final short node_y = getNodePos(gy); + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + if (!pathNodesExist(regoffset)) + { + return null; + } + final short nbx = getNodeBlock(node_x); + final short nby = getNodeBlock(node_y); + int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); + final ByteBuffer pn = _pathNodes.get(regoffset); + // reading + byte nodes = pn.get(idx++); + int idx2 = 0; // create index to nearlest node by z + short last_z = Short.MIN_VALUE; + while (nodes > 0) + { + final short node_z = pn.getShort(idx); + if (Math.abs(last_z - z) > Math.abs(node_z - z)) + { + last_z = node_z; + idx2 = idx + 2; + } + idx += 10; // short + 8 byte + nodes--; + } + return new GeoNode(new GeoNodeLoc(node_x, node_y, last_z), idx2); + } + + protected GeoPathFinding() + { + try + { + _log.info("Path Engine: - Loading Path Nodes..."); + //@formatter:off + Files.lines(Paths.get(Config.PATHNODE_DIR.getPath(), "pn_index.txt"), StandardCharsets.UTF_8) + .map(String::trim) + .filter(l -> !l.isEmpty()) + .forEach(line -> { + final String[] parts = line.split("_"); + + if ((parts.length < 2) + || !Util.isDigit(parts[0]) + || !Util.isDigit(parts[1])) + { + _log.warning("Invalid pathnode entry: '" + line + "', must be in format 'XX_YY', where X and Y - integers"); + return; + } + + final byte rx = Byte.parseByte(parts[0]); + final byte ry = Byte.parseByte(parts[1]); + LoadPathNodeFile(rx, ry); + }); + //@formatter:on + } + catch (IOException e) + { + _log.log(Level.WARNING, "", e); + throw new Error("Failed to read pn_index file."); + } + } + + private void LoadPathNodeFile(byte rx, byte ry) + { + if ((rx < L2World.TILE_X_MIN) || (rx > L2World.TILE_X_MAX) || (ry < L2World.TILE_Y_MIN) || (ry > L2World.TILE_Y_MAX)) + { + _log.warning("Failed to Load PathNode File: invalid region " + rx + "," + ry + Config.EOL); + return; + } + final short regionoffset = getRegionOffset(rx, ry); + final File file = new File(Config.PATHNODE_DIR, rx + "_" + ry + ".pn"); + _log.info("Path Engine: - Loading: " + file.getName() + " -> region offset: " + regionoffset + " X: " + rx + " Y: " + ry); + int node = 0, size, index = 0; + + // Create a read-only memory-mapped file + try (RandomAccessFile raf = new RandomAccessFile(file, "r"); + FileChannel roChannel = raf.getChannel()) + { + size = (int) roChannel.size(); + MappedByteBuffer nodes; + if (Config.FORCE_GEODATA) + { + // it is not guarantee, because the underlying operating system may have paged out some of the buffer's data + nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size).load(); + } + else + { + nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size); + } + + // Indexing pathnode files, so we will know where each block starts + final IntBuffer indexs = IntBuffer.allocate(65536); + + while (node < 65536) + { + final byte layer = nodes.get(index); + indexs.put(node++, index); + index += (layer * 10) + 1; + } + _pathNodesIndex.put(regionoffset, indexs); + _pathNodes.put(regionoffset, nodes); + } + catch (Exception e) + { + _log.log(Level.WARNING, "Failed to Load PathNode File: " + file.getAbsolutePath() + " : " + e.getMessage(), e); + } + } + + private static class SingletonHolder + { + protected static final GeoPathFinding _instance = new GeoPathFinding(); + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java similarity index 89% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java rename to L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java index bed45d7643..665977f686 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java @@ -1,124 +1,124 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.utils; - -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoNode; - -/** - * @author -Nemesiss- - */ -public class BinaryNodeHeap -{ - private final GeoNode[] _list; - private int _size; - - public BinaryNodeHeap(int size) - { - _list = new GeoNode[size + 1]; - _size = 0; - } - - public void add(GeoNode n) - { - _size++; - int pos = _size; - _list[pos] = n; - while (pos != 1) - { - final int p2 = pos / 2; - if (_list[pos].getCost() <= _list[p2].getCost()) - { - final GeoNode temp = _list[p2]; - _list[p2] = _list[pos]; - _list[pos] = temp; - pos = p2; - } - else - { - break; - } - } - } - - public GeoNode removeFirst() - { - final GeoNode first = _list[1]; - _list[1] = _list[_size]; - _list[_size] = null; - _size--; - int pos = 1; - int cpos; - int dblcpos; - GeoNode temp; - while (true) - { - cpos = pos; - dblcpos = cpos * 2; - if ((dblcpos + 1) <= _size) - { - if (_list[cpos].getCost() >= _list[dblcpos].getCost()) - { - pos = dblcpos; - } - if (_list[pos].getCost() >= _list[dblcpos + 1].getCost()) - { - pos = dblcpos + 1; - } - } - else if (dblcpos <= _size) - { - if (_list[cpos].getCost() >= _list[dblcpos].getCost()) - { - pos = dblcpos; - } - } - - if (cpos != pos) - { - temp = _list[cpos]; - _list[cpos] = _list[pos]; - _list[pos] = temp; - } - else - { - break; - } - } - return first; - } - - public boolean contains(GeoNode n) - { - if (_size == 0) - { - return false; - } - for (int i = 1; i <= _size; i++) - { - if (_list[i].equals(n)) - { - return true; - } - } - return false; - } - - public boolean isEmpty() - { - return _size == 0; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.utils; + +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoNode; + +/** + * @author -Nemesiss- + */ +public class BinaryNodeHeap +{ + private final GeoNode[] _list; + private int _size; + + public BinaryNodeHeap(int size) + { + _list = new GeoNode[size + 1]; + _size = 0; + } + + public void add(GeoNode n) + { + _size++; + int pos = _size; + _list[pos] = n; + while (pos != 1) + { + final int p2 = pos / 2; + if (_list[pos].getCost() <= _list[p2].getCost()) + { + final GeoNode temp = _list[p2]; + _list[p2] = _list[pos]; + _list[pos] = temp; + pos = p2; + } + else + { + break; + } + } + } + + public GeoNode removeFirst() + { + final GeoNode first = _list[1]; + _list[1] = _list[_size]; + _list[_size] = null; + _size--; + int pos = 1; + int cpos; + int dblcpos; + GeoNode temp; + while (true) + { + cpos = pos; + dblcpos = cpos * 2; + if ((dblcpos + 1) <= _size) + { + if (_list[cpos].getCost() >= _list[dblcpos].getCost()) + { + pos = dblcpos; + } + if (_list[pos].getCost() >= _list[dblcpos + 1].getCost()) + { + pos = dblcpos + 1; + } + } + else if (dblcpos <= _size) + { + if (_list[cpos].getCost() >= _list[dblcpos].getCost()) + { + pos = dblcpos; + } + } + + if (cpos != pos) + { + temp = _list[cpos]; + _list[cpos] = _list[pos]; + _list[pos] = temp; + } + else + { + break; + } + } + return first; + } + + public boolean contains(GeoNode n) + { + if (_size == 0) + { + return false; + } + for (int i = 1; i <= _size; i++) + { + if (_list[i].equals(n)) + { + return true; + } + } + return false; + } + + public boolean isEmpty() + { + return _size == 0; + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java index 1a099de096..4f61421f83 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java @@ -18,11 +18,11 @@ package com.l2jmobius.gameserver.instancemanager; import java.util.concurrent.ConcurrentHashMap; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.holders.WarpedSpaceHolder; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.util.Util; /** diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/model/actor/L2Character.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/model/actor/L2Character.java index 8f7e8cea75..ca1f436bfa 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/model/actor/L2Character.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/model/actor/L2Character.java @@ -63,6 +63,8 @@ import com.l2jmobius.gameserver.enums.ShotType; import com.l2jmobius.gameserver.enums.StatusUpdateType; import com.l2jmobius.gameserver.enums.Team; import com.l2jmobius.gameserver.enums.UserInfoType; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.idfactory.IdFactory; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.instancemanager.TimersManager; @@ -153,8 +155,6 @@ import com.l2jmobius.gameserver.network.serverpackets.StopMove; import com.l2jmobius.gameserver.network.serverpackets.StopRotation; import com.l2jmobius.gameserver.network.serverpackets.TeleportToLocation; import com.l2jmobius.gameserver.network.serverpackets.UserInfo; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager; import com.l2jmobius.gameserver.util.Util; diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/util/GeoUtils.java b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/util/GeoUtils.java index 69ca1e0977..c706c4a491 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/util/GeoUtils.java +++ b/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/util/GeoUtils.java @@ -18,8 +18,8 @@ package com.l2jmobius.gameserver.util; import java.awt.Color; -import com.l2jmobius.commons.geodriver.Cell; import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.serverpackets.ExServerPrimitive; diff --git a/L2J_Mobius_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java b/L2J_Mobius_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java index 962d1456f7..03b3ca8902 100644 --- a/L2J_Mobius_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java +++ b/L2J_Mobius_Helios/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java @@ -19,10 +19,10 @@ package handlers.admincommandhandlers; import java.util.List; import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.IAdminCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; public class AdminPathNode implements IAdminCommandHandler { diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java index 46ae84491a..5932d62564 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GameServer.java @@ -98,6 +98,7 @@ import com.l2jmobius.gameserver.datatables.BotReportTable; import com.l2jmobius.gameserver.datatables.EventDroplist; import com.l2jmobius.gameserver.datatables.ItemTable; import com.l2jmobius.gameserver.datatables.MerchantPriceConfigTable; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.ConditionHandler; import com.l2jmobius.gameserver.handler.DailyMissionHandler; import com.l2jmobius.gameserver.handler.EffectHandler; @@ -145,7 +146,6 @@ import com.l2jmobius.gameserver.model.votereward.VoteSystem; import com.l2jmobius.gameserver.network.ClientNetworkManager; import com.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager; import com.l2jmobius.gameserver.network.telnet.TelnetServer; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.scripting.ScriptEngineManager; import com.l2jmobius.gameserver.taskmanager.TaskManager; import com.l2jmobius.gameserver.util.Broadcast; diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GeoData.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GeoData.java index 41007ee949..bbf22617b9 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GeoData.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/GeoData.java @@ -22,9 +22,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jmobius.Config; -import com.l2jmobius.commons.geodriver.Cell; -import com.l2jmobius.commons.geodriver.GeoDriver; import com.l2jmobius.gameserver.data.xml.impl.DoorData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.geodriver.GeoDriver; import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.L2World; diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java index 551fb76d54..973c82b4a8 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java @@ -34,12 +34,12 @@ import org.w3c.dom.Node; import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.commons.util.IXmlReader; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance; import com.l2jmobius.gameserver.model.actor.templates.L2DoorTemplate; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; /** * This class loads and hold info about doors. diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/Cell.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java similarity index 94% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/Cell.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java index 7c7c441cac..4914b1d72e 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/Cell.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/GeoDriver.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java similarity index 93% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/GeoDriver.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java index c02d85891d..2dc266df46 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/GeoDriver.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java @@ -1,189 +1,189 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.commons.geodriver; - -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteOrder; -import java.nio.channels.FileChannel.MapMode; -import java.nio.file.Path; -import java.util.concurrent.atomic.AtomicReferenceArray; - -import com.l2jmobius.commons.geodriver.regions.NullRegion; -import com.l2jmobius.commons.geodriver.regions.Region; - -/** - * @author HorridoJoho - */ -public final class GeoDriver -{ - // world dimensions: 1048576 * 1048576 = 1099511627776 - private static final int WORLD_MIN_X = -655360; - private static final int WORLD_MAX_X = 393215; - private static final int WORLD_MIN_Y = -589824; - private static final int WORLD_MAX_Y = 458751; - private static final int WORLD_MIN_Z = -16384; - private static final int WORLD_MAX_Z = 16384; - - /** Regions in the world on the x axis */ - public static final int GEO_REGIONS_X = 32; - /** Regions in the world on the y axis */ - public static final int GEO_REGIONS_Y = 32; - /** Region in the world */ - public static final int GEO_REGIONS = GEO_REGIONS_X * GEO_REGIONS_Y; - - /** Blocks in the world on the x axis */ - public static final int GEO_BLOCKS_X = GEO_REGIONS_X * IRegion.REGION_BLOCKS_X; - /** Blocks in the world on the y axis */ - public static final int GEO_BLOCKS_Y = GEO_REGIONS_Y * IRegion.REGION_BLOCKS_Y; - /** Blocks in the world */ - public static final int GEO_BLOCKS = GEO_REGIONS * IRegion.REGION_BLOCKS; - - /** Cells in the world on the x axis */ - public static final int GEO_CELLS_X = GEO_BLOCKS_X * IBlock.BLOCK_CELLS_X; - /** Cells in the world in the y axis */ - public static final int GEO_CELLS_Y = GEO_BLOCKS_Y * IBlock.BLOCK_CELLS_Y; - /** Cells in the world in the z axis */ - public static final int GEO_CELLS_Z = (Math.abs(WORLD_MIN_Z) + Math.abs(WORLD_MAX_Z)) / 16; - - /** The regions array */ - private final AtomicReferenceArray _regions = new AtomicReferenceArray<>(GEO_REGIONS); - - public GeoDriver() - { - for (int i = 0; i < _regions.length(); i++) - { - _regions.set(i, NullRegion.INSTANCE); - } - } - - private void checkGeoX(int geoX) - { - if ((geoX < 0) || (geoX >= GEO_CELLS_X)) - { - throw new IllegalArgumentException(); - } - } - - private void checkGeoY(int geoY) - { - if ((geoY < 0) || (geoY >= GEO_CELLS_Y)) - { - throw new IllegalArgumentException(); - } - } - - private void checkGeoZ(int geoZ) - { - if ((geoZ < 0) || (geoZ >= GEO_CELLS_Z)) - { - throw new IllegalArgumentException(); - } - } - - private IRegion getRegion(int geoX, int geoY) - { - checkGeoX(geoX); - checkGeoY(geoY); - return _regions.get(((geoX / IRegion.REGION_CELLS_X) * GEO_REGIONS_Y) + (geoY / IRegion.REGION_CELLS_Y)); - } - - public void loadRegion(Path filePath, int regionX, int regionY) throws IOException - { - final int regionOffset = (regionX * GEO_REGIONS_Y) + regionY; - - try (RandomAccessFile raf = new RandomAccessFile(filePath.toFile(), "r")) - { - _regions.set(regionOffset, new Region(raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()).load().order(ByteOrder.LITTLE_ENDIAN))); - } - } - - public void unloadRegion(int regionX, int regionY) - { - _regions.set((regionX * GEO_REGIONS_Y) + regionY, NullRegion.INSTANCE); - } - - public boolean hasGeoPos(int geoX, int geoY) - { - return getRegion(geoX, geoY).hasGeo(); - } - - public boolean checkNearestNswe(int geoX, int geoY, int worldZ, int nswe) - { - return getRegion(geoX, geoY).checkNearestNswe(geoX, geoY, worldZ, nswe); - } - - public int getNearestZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNearestZ(geoX, geoY, worldZ); - } - - public int getNextLowerZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNextLowerZ(geoX, geoY, worldZ); - } - - public int getNextHigherZ(int geoX, int geoY, int worldZ) - { - return getRegion(geoX, geoY).getNextHigherZ(geoX, geoY, worldZ); - } - - public int getGeoX(int worldX) - { - if ((worldX < WORLD_MIN_X) || (worldX > WORLD_MAX_X)) - { - throw new IllegalArgumentException(); - } - return (worldX - WORLD_MIN_X) / 16; - } - - public int getGeoY(int worldY) - { - if ((worldY < WORLD_MIN_Y) || (worldY > WORLD_MAX_Y)) - { - throw new IllegalArgumentException(); - } - return (worldY - WORLD_MIN_Y) / 16; - } - - public int getGeoZ(int worldZ) - { - if ((worldZ < WORLD_MIN_Z) || (worldZ > WORLD_MAX_Z)) - { - throw new IllegalArgumentException(); - } - return (worldZ - WORLD_MIN_Z) / 16; - } - - public int getWorldX(int geoX) - { - checkGeoX(geoX); - return (geoX * 16) + WORLD_MIN_X + 8; - } - - public int getWorldY(int geoY) - { - checkGeoY(geoY); - return (geoY * 16) + WORLD_MIN_Y + 8; - } - - public int getWorldZ(int geoZ) - { - checkGeoZ(geoZ); - return (geoZ * 16) + WORLD_MIN_Z + 8; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.geodriver; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel.MapMode; +import java.nio.file.Path; +import java.util.concurrent.atomic.AtomicReferenceArray; + +import com.l2jmobius.gameserver.geodata.geodriver.regions.NullRegion; +import com.l2jmobius.gameserver.geodata.geodriver.regions.Region; + +/** + * @author HorridoJoho + */ +public final class GeoDriver +{ + // world dimensions: 1048576 * 1048576 = 1099511627776 + private static final int WORLD_MIN_X = -655360; + private static final int WORLD_MAX_X = 393215; + private static final int WORLD_MIN_Y = -589824; + private static final int WORLD_MAX_Y = 458751; + private static final int WORLD_MIN_Z = -16384; + private static final int WORLD_MAX_Z = 16384; + + /** Regions in the world on the x axis */ + public static final int GEO_REGIONS_X = 32; + /** Regions in the world on the y axis */ + public static final int GEO_REGIONS_Y = 32; + /** Region in the world */ + public static final int GEO_REGIONS = GEO_REGIONS_X * GEO_REGIONS_Y; + + /** Blocks in the world on the x axis */ + public static final int GEO_BLOCKS_X = GEO_REGIONS_X * IRegion.REGION_BLOCKS_X; + /** Blocks in the world on the y axis */ + public static final int GEO_BLOCKS_Y = GEO_REGIONS_Y * IRegion.REGION_BLOCKS_Y; + /** Blocks in the world */ + public static final int GEO_BLOCKS = GEO_REGIONS * IRegion.REGION_BLOCKS; + + /** Cells in the world on the x axis */ + public static final int GEO_CELLS_X = GEO_BLOCKS_X * IBlock.BLOCK_CELLS_X; + /** Cells in the world in the y axis */ + public static final int GEO_CELLS_Y = GEO_BLOCKS_Y * IBlock.BLOCK_CELLS_Y; + /** Cells in the world in the z axis */ + public static final int GEO_CELLS_Z = (Math.abs(WORLD_MIN_Z) + Math.abs(WORLD_MAX_Z)) / 16; + + /** The regions array */ + private final AtomicReferenceArray _regions = new AtomicReferenceArray<>(GEO_REGIONS); + + public GeoDriver() + { + for (int i = 0; i < _regions.length(); i++) + { + _regions.set(i, NullRegion.INSTANCE); + } + } + + private void checkGeoX(int geoX) + { + if ((geoX < 0) || (geoX >= GEO_CELLS_X)) + { + throw new IllegalArgumentException(); + } + } + + private void checkGeoY(int geoY) + { + if ((geoY < 0) || (geoY >= GEO_CELLS_Y)) + { + throw new IllegalArgumentException(); + } + } + + private void checkGeoZ(int geoZ) + { + if ((geoZ < 0) || (geoZ >= GEO_CELLS_Z)) + { + throw new IllegalArgumentException(); + } + } + + private IRegion getRegion(int geoX, int geoY) + { + checkGeoX(geoX); + checkGeoY(geoY); + return _regions.get(((geoX / IRegion.REGION_CELLS_X) * GEO_REGIONS_Y) + (geoY / IRegion.REGION_CELLS_Y)); + } + + public void loadRegion(Path filePath, int regionX, int regionY) throws IOException + { + final int regionOffset = (regionX * GEO_REGIONS_Y) + regionY; + + try (RandomAccessFile raf = new RandomAccessFile(filePath.toFile(), "r")) + { + _regions.set(regionOffset, new Region(raf.getChannel().map(MapMode.READ_ONLY, 0, raf.length()).load().order(ByteOrder.LITTLE_ENDIAN))); + } + } + + public void unloadRegion(int regionX, int regionY) + { + _regions.set((regionX * GEO_REGIONS_Y) + regionY, NullRegion.INSTANCE); + } + + public boolean hasGeoPos(int geoX, int geoY) + { + return getRegion(geoX, geoY).hasGeo(); + } + + public boolean checkNearestNswe(int geoX, int geoY, int worldZ, int nswe) + { + return getRegion(geoX, geoY).checkNearestNswe(geoX, geoY, worldZ, nswe); + } + + public int getNearestZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNearestZ(geoX, geoY, worldZ); + } + + public int getNextLowerZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNextLowerZ(geoX, geoY, worldZ); + } + + public int getNextHigherZ(int geoX, int geoY, int worldZ) + { + return getRegion(geoX, geoY).getNextHigherZ(geoX, geoY, worldZ); + } + + public int getGeoX(int worldX) + { + if ((worldX < WORLD_MIN_X) || (worldX > WORLD_MAX_X)) + { + throw new IllegalArgumentException(); + } + return (worldX - WORLD_MIN_X) / 16; + } + + public int getGeoY(int worldY) + { + if ((worldY < WORLD_MIN_Y) || (worldY > WORLD_MAX_Y)) + { + throw new IllegalArgumentException(); + } + return (worldY - WORLD_MIN_Y) / 16; + } + + public int getGeoZ(int worldZ) + { + if ((worldZ < WORLD_MIN_Z) || (worldZ > WORLD_MAX_Z)) + { + throw new IllegalArgumentException(); + } + return (worldZ - WORLD_MIN_Z) / 16; + } + + public int getWorldX(int geoX) + { + checkGeoX(geoX); + return (geoX * 16) + WORLD_MIN_X + 8; + } + + public int getWorldY(int geoY) + { + checkGeoY(geoY); + return (geoY * 16) + WORLD_MIN_Y + 8; + } + + public int getWorldZ(int geoZ) + { + checkGeoZ(geoZ); + return (geoZ * 16) + WORLD_MIN_Z + 8; + } +} diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IBlock.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java similarity index 93% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IBlock.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java index 93680fdc94..21df97c40d 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/IBlock.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IRegion.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java similarity index 93% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IRegion.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java index a17e6a0c5f..3eb23da03e 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/IRegion.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java similarity index 91% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java index 068914d7f3..4d6410672e 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java similarity index 88% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java index 5f924bc835..d5bcff094b 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java similarity index 94% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java index c9e8f0b8f5..313131bd5a 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java similarity index 88% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java index 97beba4ee4..60ecac873a 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; -import com.l2jmobius.commons.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/Region.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java similarity index 82% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/Region.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java index 299f4691f7..d2d02481ed 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/regions/Region.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java @@ -14,15 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; -import com.l2jmobius.commons.geodriver.IRegion; -import com.l2jmobius.commons.geodriver.blocks.ComplexBlock; -import com.l2jmobius.commons.geodriver.blocks.FlatBlock; -import com.l2jmobius.commons.geodriver.blocks.MultilayerBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.ComplexBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.FlatBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.MultilayerBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java similarity index 92% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java index 0975c5a975..83d0131910 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java @@ -1,87 +1,87 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -public abstract class AbstractNode -{ - private T _loc; - private AbstractNode _parent; - - public AbstractNode(T loc) - { - _loc = loc; - } - - public void setParent(AbstractNode p) - { - _parent = p; - } - - public AbstractNode getParent() - { - return _parent; - } - - public T getLoc() - { - return _loc; - } - - public void setLoc(T l) - { - _loc = l; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + ((_loc == null) ? 0 : _loc.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof AbstractNode)) - { - return false; - } - final AbstractNode other = (AbstractNode) obj; - if (_loc == null) - { - if (other._loc != null) - { - return false; - } - } - else if (!_loc.equals(other._loc)) - { - return false; - } - return true; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +public abstract class AbstractNode +{ + private T _loc; + private AbstractNode _parent; + + public AbstractNode(T loc) + { + _loc = loc; + } + + public void setParent(AbstractNode p) + { + _parent = p; + } + + public AbstractNode getParent() + { + return _parent; + } + + public T getLoc() + { + return _loc; + } + + public void setLoc(T l) + { + _loc = l; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + ((_loc == null) ? 0 : _loc.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof AbstractNode)) + { + return false; + } + final AbstractNode other = (AbstractNode) obj; + if (_loc == null) + { + if (other._loc != null) + { + return false; + } + } + else if (!_loc.equals(other._loc)) + { + return false; + } + return true; + } } \ No newline at end of file diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java similarity index 91% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java index 4197a02155..0678b3cb3a 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java @@ -1,33 +1,33 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -/** - * @author -Nemesiss- - */ -public abstract class AbstractNodeLoc -{ - public abstract int getX(); - - public abstract int getY(); - - public abstract int getZ(); - - public abstract int getNodeX(); - - public abstract int getNodeY(); -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +/** + * @author -Nemesiss- + */ +public abstract class AbstractNodeLoc +{ + public abstract int getX(); + + public abstract int getY(); + + public abstract int getZ(); + + public abstract int getNodeX(); + + public abstract int getNodeY(); +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java similarity index 92% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java index fedfbf55fb..e7b3093081 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java @@ -1,211 +1,211 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding; - -import java.util.List; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.cellnodes.CellPathFinding; -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoPathFinding; - -/** - * @author -Nemesiss- - */ -public abstract class PathFinding -{ - public static PathFinding getInstance() - { - if (Config.PATHFINDING == 1) - { - // Higher Memory Usage, Smaller Cpu Usage - return GeoPathFinding.getInstance(); - } - // Cell pathfinding, calculated directly from geodata files - return CellPathFinding.getInstance(); - } - - public abstract boolean pathNodesExist(short regionoffset); - - public abstract List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable); - - // @formatter:off - /* - public List search(AbstractNode start, AbstractNode end, int instanceId) - { - // The simplest grid-based pathfinding. - // Drawback is not having higher cost for diagonal movement (means funny routes) - // Could be optimized e.g. not to calculate backwards as far as forwards. - - // List of Visited Nodes - LinkedList visited = new LinkedList(); - - // List of Nodes to Visit - LinkedList to_visit = new LinkedList(); - to_visit.add(start); - - int i = 0; - while (i < 800) - { - AbstractNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) //path found! - return constructPath(node, instanceId); - else - { - i++; - visited.add(node); - node.attachNeighbors(); - Node[] neighbors = node.getNeighbors(); - if (neighbors == null) - continue; - for (Node n : neighbors) - { - if (!visited.contains(n) && !to_visit.contains(n)) - { - n.setParent(node); - to_visit.add(n); - } - } - } - } - //No Path found - return null; - } - */ - /* - public List searchAStar(Node start, Node end, int instanceId) - { - // Not operational yet? - int start_x = start.getLoc().getX(); - int start_y = start.getLoc().getY(); - int end_x = end.getLoc().getX(); - int end_y = end.getLoc().getY(); - //List of Visited Nodes - FastNodeList visited = new FastNodeList(800);//TODO! Add limit to cfg - - // List of Nodes to Visit - BinaryNodeHeap to_visit = new BinaryNodeHeap(800); - to_visit.add(start); - - int i = 0; - while (i < 800)//TODO! Add limit to cfg - { - AbstractNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) //path found! - return constructPath(node, instanceId); - else - { - visited.add(node); - node.attachNeighbors(); - for (Node n : node.getNeighbors()) - { - if (!visited.contains(n) && !to_visit.contains(n)) - { - i++; - n.setParent(node); - n.setCost(Math.abs(start_x - n.getLoc().getNodeX()) + Math.abs(start_y - n.getLoc().getNodeY()) - + Math.abs(end_x - n.getLoc().getNodeX()) + Math.abs(end_y - n.getLoc().getNodeY())); - to_visit.add(n); - } - } - } - } - //No Path found - return null; - } - */ - // @formatter:on - - /** - * Convert geodata position to pathnode position - * @param geo_pos - * @return pathnode position - */ - public short getNodePos(int geo_pos) - { - return (short) (geo_pos >> 3); // OK? - } - - /** - * Convert node position to pathnode block position - * @param node_pos - * @return pathnode block position (0...255) - */ - public short getNodeBlock(int node_pos) - { - return (short) (node_pos % 256); - } - - public byte getRegionX(int node_pos) - { - return (byte) ((node_pos >> 8) + L2World.TILE_X_MIN); - } - - public byte getRegionY(int node_pos) - { - return (byte) ((node_pos >> 8) + L2World.TILE_Y_MIN); - } - - public short getRegionOffset(byte rx, byte ry) - { - return (short) ((rx << 5) + ry); - } - - /** - * Convert pathnode x to World x position - * @param node_x rx - * @return - */ - public int calculateWorldX(short node_x) - { - return L2World.MAP_MIN_X + (node_x * 128) + 48; - } - - /** - * Convert pathnode y to World y position - * @param node_y - * @return - */ - public int calculateWorldY(short node_y) - { - return L2World.MAP_MIN_Y + (node_y * 128) + 48; - } - - public String[] getStat() - { - return null; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding; + +import java.util.List; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.cellnodes.CellPathFinding; +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoPathFinding; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.instancezone.Instance; + +/** + * @author -Nemesiss- + */ +public abstract class PathFinding +{ + public static PathFinding getInstance() + { + if (Config.PATHFINDING == 1) + { + // Higher Memory Usage, Smaller Cpu Usage + return GeoPathFinding.getInstance(); + } + // Cell pathfinding, calculated directly from geodata files + return CellPathFinding.getInstance(); + } + + public abstract boolean pathNodesExist(short regionoffset); + + public abstract List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable); + + // @formatter:off + /* + public List search(AbstractNode start, AbstractNode end, int instanceId) + { + // The simplest grid-based pathfinding. + // Drawback is not having higher cost for diagonal movement (means funny routes) + // Could be optimized e.g. not to calculate backwards as far as forwards. + + // List of Visited Nodes + LinkedList visited = new LinkedList(); + + // List of Nodes to Visit + LinkedList to_visit = new LinkedList(); + to_visit.add(start); + + int i = 0; + while (i < 800) + { + AbstractNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) //path found! + return constructPath(node, instanceId); + else + { + i++; + visited.add(node); + node.attachNeighbors(); + Node[] neighbors = node.getNeighbors(); + if (neighbors == null) + continue; + for (Node n : neighbors) + { + if (!visited.contains(n) && !to_visit.contains(n)) + { + n.setParent(node); + to_visit.add(n); + } + } + } + } + //No Path found + return null; + } + */ + /* + public List searchAStar(Node start, Node end, int instanceId) + { + // Not operational yet? + int start_x = start.getLoc().getX(); + int start_y = start.getLoc().getY(); + int end_x = end.getLoc().getX(); + int end_y = end.getLoc().getY(); + //List of Visited Nodes + FastNodeList visited = new FastNodeList(800);//TODO! Add limit to cfg + + // List of Nodes to Visit + BinaryNodeHeap to_visit = new BinaryNodeHeap(800); + to_visit.add(start); + + int i = 0; + while (i < 800)//TODO! Add limit to cfg + { + AbstractNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) //path found! + return constructPath(node, instanceId); + else + { + visited.add(node); + node.attachNeighbors(); + for (Node n : node.getNeighbors()) + { + if (!visited.contains(n) && !to_visit.contains(n)) + { + i++; + n.setParent(node); + n.setCost(Math.abs(start_x - n.getLoc().getNodeX()) + Math.abs(start_y - n.getLoc().getNodeY()) + + Math.abs(end_x - n.getLoc().getNodeX()) + Math.abs(end_y - n.getLoc().getNodeY())); + to_visit.add(n); + } + } + } + } + //No Path found + return null; + } + */ + // @formatter:on + + /** + * Convert geodata position to pathnode position + * @param geo_pos + * @return pathnode position + */ + public short getNodePos(int geo_pos) + { + return (short) (geo_pos >> 3); // OK? + } + + /** + * Convert node position to pathnode block position + * @param node_pos + * @return pathnode block position (0...255) + */ + public short getNodeBlock(int node_pos) + { + return (short) (node_pos % 256); + } + + public byte getRegionX(int node_pos) + { + return (byte) ((node_pos >> 8) + L2World.TILE_X_MIN); + } + + public byte getRegionY(int node_pos) + { + return (byte) ((node_pos >> 8) + L2World.TILE_Y_MIN); + } + + public short getRegionOffset(byte rx, byte ry) + { + return (short) ((rx << 5) + ry); + } + + /** + * Convert pathnode x to World x position + * @param node_x rx + * @return + */ + public int calculateWorldX(short node_x) + { + return L2World.MAP_MIN_X + (node_x * 128) + 48; + } + + /** + * Convert pathnode y to World y position + * @param node_y + * @return + */ + public int calculateWorldY(short node_y) + { + return L2World.MAP_MIN_Y + (node_y * 128) + 48; + } + + public String[] getStat() + { + return null; + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java similarity index 87% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java index daf6ae3edb..f903507286 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java @@ -1,69 +1,69 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import com.l2jmobius.gameserver.pathfinding.AbstractNode; - -public class CellNode extends AbstractNode -{ - private CellNode _next = null; - private boolean _isInUse = true; - private float _cost = -1000; - - public CellNode(NodeLoc loc) - { - super(loc); - } - - public boolean isInUse() - { - return _isInUse; - } - - public void setInUse() - { - _isInUse = true; - } - - public CellNode getNext() - { - return _next; - } - - public void setNext(CellNode next) - { - _next = next; - } - - public float getCost() - { - return _cost; - } - - public void setCost(double cost) - { - _cost = (float) cost; - } - - public void free() - { - setParent(null); - _cost = -1000; - _isInUse = false; - _next = null; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; + +public class CellNode extends AbstractNode +{ + private CellNode _next = null; + private boolean _isInUse = true; + private float _cost = -1000; + + public CellNode(NodeLoc loc) + { + super(loc); + } + + public boolean isInUse() + { + return _isInUse; + } + + public void setInUse() + { + _isInUse = true; + } + + public CellNode getNext() + { + return _next; + } + + public void setNext(CellNode next) + { + _next = next; + } + + public float getCost() + { + return _cost; + } + + public void setCost(double cost) + { + _cost = (float) cost; + } + + public void free() + { + setParent(null); + _cost = -1000; + _isInUse = false; + _next = null; + } } \ No newline at end of file diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java similarity index 94% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java index 8f8a87a079..4eef566183 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java @@ -1,361 +1,361 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.locks.ReentrantLock; - -import com.l2jmobius.Config; - -/** - * @author DS Credits to Diamond - */ -public class CellNodeBuffer -{ - private static final int MAX_ITERATIONS = 3500; - - private final ReentrantLock _lock = new ReentrantLock(); - private final int _mapSize; - private final CellNode[][] _buffer; - - private int _baseX = 0; - private int _baseY = 0; - - private int _targetX = 0; - private int _targetY = 0; - private int _targetZ = 0; - - private long _timeStamp = 0; - private long _lastElapsedTime = 0; - - private CellNode _current = null; - - public CellNodeBuffer(int size) - { - _mapSize = size; - _buffer = new CellNode[_mapSize][_mapSize]; - } - - public final boolean lock() - { - return _lock.tryLock(); - } - - public final CellNode findPath(int x, int y, int z, int tx, int ty, int tz) - { - _timeStamp = System.currentTimeMillis(); - _baseX = x + ((tx - x - _mapSize) / 2); // middle of the line (x,y) - (tx,ty) - _baseY = y + ((ty - y - _mapSize) / 2); // will be in the center of the buffer - _targetX = tx; - _targetY = ty; - _targetZ = tz; - _current = getNode(x, y, z); - _current.setCost(getCost(x, y, z, Config.HIGH_WEIGHT)); - - for (int count = 0; count < MAX_ITERATIONS; count++) - { - if ((_current.getLoc().getNodeX() == _targetX) && (_current.getLoc().getNodeY() == _targetY) && (Math.abs(_current.getLoc().getZ() - _targetZ) < 64)) - { - return _current; // found - } - - getNeighbors(); - if (_current.getNext() == null) - { - return null; // no more ways - } - - _current = _current.getNext(); - } - return null; - } - - public final void free() - { - _current = null; - - CellNode node; - for (int i = 0; i < _mapSize; i++) - { - for (int j = 0; j < _mapSize; j++) - { - node = _buffer[i][j]; - if (node != null) - { - node.free(); - } - } - } - - _lock.unlock(); - _lastElapsedTime = System.currentTimeMillis() - _timeStamp; - } - - public final long getElapsedTime() - { - return _lastElapsedTime; - } - - public final List debugPath() - { - final List result = new LinkedList<>(); - - for (CellNode n = _current; n.getParent() != null; n = (CellNode) n.getParent()) - { - result.add(n); - n.setCost(-n.getCost()); - } - - for (int i = 0; i < _mapSize; i++) - { - for (int j = 0; j < _mapSize; j++) - { - final CellNode n = _buffer[i][j]; - if ((n == null) || !n.isInUse() || (n.getCost() <= 0)) - { - continue; - } - - result.add(n); - } - } - - return result; - } - - private void getNeighbors() - { - if (!_current.getLoc().canGoAll()) - { - return; - } - - final int x = _current.getLoc().getNodeX(); - final int y = _current.getLoc().getNodeY(); - final int z = _current.getLoc().getZ(); - - CellNode nodeE = null; - CellNode nodeS = null; - CellNode nodeW = null; - CellNode nodeN = null; - - // East - if (_current.getLoc().canGoEast()) - { - nodeE = addNode(x + 1, y, z, false); - } - - // South - if (_current.getLoc().canGoSouth()) - { - nodeS = addNode(x, y + 1, z, false); - } - - // West - if (_current.getLoc().canGoWest()) - { - nodeW = addNode(x - 1, y, z, false); - } - - // North - if (_current.getLoc().canGoNorth()) - { - nodeN = addNode(x, y - 1, z, false); - } - - if (Config.ADVANCED_DIAGONAL_STRATEGY) - { - // SouthEast - if ((nodeE != null) && (nodeS != null)) - { - if (nodeE.getLoc().canGoSouth() && nodeS.getLoc().canGoEast()) - { - addNode(x + 1, y + 1, z, true); - } - } - - // SouthWest - if ((nodeS != null) && (nodeW != null)) - { - if (nodeW.getLoc().canGoSouth() && nodeS.getLoc().canGoWest()) - { - addNode(x - 1, y + 1, z, true); - } - } - - // NorthEast - if ((nodeN != null) && (nodeE != null)) - { - if (nodeE.getLoc().canGoNorth() && nodeN.getLoc().canGoEast()) - { - addNode(x + 1, y - 1, z, true); - } - } - - // NorthWest - if ((nodeN != null) && (nodeW != null)) - { - if (nodeW.getLoc().canGoNorth() && nodeN.getLoc().canGoWest()) - { - addNode(x - 1, y - 1, z, true); - } - } - } - } - - private CellNode getNode(int x, int y, int z) - { - final int aX = x - _baseX; - if ((aX < 0) || (aX >= _mapSize)) - { - return null; - } - - final int aY = y - _baseY; - if ((aY < 0) || (aY >= _mapSize)) - { - return null; - } - - CellNode result = _buffer[aX][aY]; - if (result == null) - { - result = new CellNode(new NodeLoc(x, y, z)); - _buffer[aX][aY] = result; - } - else if (!result.isInUse()) - { - result.setInUse(); - // reinit node if needed - if (result.getLoc() != null) - { - result.getLoc().set(x, y, z); - } - else - { - result.setLoc(new NodeLoc(x, y, z)); - } - } - - return result; - } - - private CellNode addNode(int x, int y, int z, boolean diagonal) - { - final CellNode newNode = getNode(x, y, z); - if (newNode == null) - { - return null; - } - if (newNode.getCost() >= 0) - { - return newNode; - } - - final int geoZ = newNode.getLoc().getZ(); - - final int stepZ = Math.abs(geoZ - _current.getLoc().getZ()); - float weight = diagonal ? Config.DIAGONAL_WEIGHT : Config.LOW_WEIGHT; - - if (!newNode.getLoc().canGoAll() || (stepZ > 16)) - { - weight = Config.HIGH_WEIGHT; - } - else if (isHighWeight(x + 1, y, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x - 1, y, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x, y + 1, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - else if (isHighWeight(x, y - 1, geoZ)) - { - weight = Config.MEDIUM_WEIGHT; - } - - newNode.setParent(_current); - newNode.setCost(getCost(x, y, geoZ, weight)); - - CellNode node = _current; - int count = 0; - while ((node.getNext() != null) && (count < (MAX_ITERATIONS * 4))) - { - count++; - if (node.getNext().getCost() > newNode.getCost()) - { - // insert node into a chain - newNode.setNext(node.getNext()); - break; - } - node = node.getNext(); - } - if (count == (MAX_ITERATIONS * 4)) - { - System.err.println("Pathfinding: too long loop detected, cost:" + newNode.getCost()); - } - - node.setNext(newNode); // add last - - return newNode; - } - - private boolean isHighWeight(int x, int y, int z) - { - final CellNode result = getNode(x, y, z); - if (result == null) - { - return true; - } - - if (!result.getLoc().canGoAll()) - { - return true; - } - if (Math.abs(result.getLoc().getZ() - z) > 16) - { - return true; - } - - return false; - } - - private double getCost(int x, int y, int z, float weight) - { - final int dX = x - _targetX; - final int dY = y - _targetY; - final int dZ = z - _targetZ; - // Math.abs(dx) + Math.abs(dy) + Math.abs(dz) / 16 - double result = Math.sqrt((dX * dX) + (dY * dY) + ((dZ * dZ) / 256.0)); - if (result > weight) - { - result += weight; - } - - if (result > Float.MAX_VALUE) - { - result = Float.MAX_VALUE; - } - - return result; - } +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.locks.ReentrantLock; + +import com.l2jmobius.Config; + +/** + * @author DS Credits to Diamond + */ +public class CellNodeBuffer +{ + private static final int MAX_ITERATIONS = 3500; + + private final ReentrantLock _lock = new ReentrantLock(); + private final int _mapSize; + private final CellNode[][] _buffer; + + private int _baseX = 0; + private int _baseY = 0; + + private int _targetX = 0; + private int _targetY = 0; + private int _targetZ = 0; + + private long _timeStamp = 0; + private long _lastElapsedTime = 0; + + private CellNode _current = null; + + public CellNodeBuffer(int size) + { + _mapSize = size; + _buffer = new CellNode[_mapSize][_mapSize]; + } + + public final boolean lock() + { + return _lock.tryLock(); + } + + public final CellNode findPath(int x, int y, int z, int tx, int ty, int tz) + { + _timeStamp = System.currentTimeMillis(); + _baseX = x + ((tx - x - _mapSize) / 2); // middle of the line (x,y) - (tx,ty) + _baseY = y + ((ty - y - _mapSize) / 2); // will be in the center of the buffer + _targetX = tx; + _targetY = ty; + _targetZ = tz; + _current = getNode(x, y, z); + _current.setCost(getCost(x, y, z, Config.HIGH_WEIGHT)); + + for (int count = 0; count < MAX_ITERATIONS; count++) + { + if ((_current.getLoc().getNodeX() == _targetX) && (_current.getLoc().getNodeY() == _targetY) && (Math.abs(_current.getLoc().getZ() - _targetZ) < 64)) + { + return _current; // found + } + + getNeighbors(); + if (_current.getNext() == null) + { + return null; // no more ways + } + + _current = _current.getNext(); + } + return null; + } + + public final void free() + { + _current = null; + + CellNode node; + for (int i = 0; i < _mapSize; i++) + { + for (int j = 0; j < _mapSize; j++) + { + node = _buffer[i][j]; + if (node != null) + { + node.free(); + } + } + } + + _lock.unlock(); + _lastElapsedTime = System.currentTimeMillis() - _timeStamp; + } + + public final long getElapsedTime() + { + return _lastElapsedTime; + } + + public final List debugPath() + { + final List result = new LinkedList<>(); + + for (CellNode n = _current; n.getParent() != null; n = (CellNode) n.getParent()) + { + result.add(n); + n.setCost(-n.getCost()); + } + + for (int i = 0; i < _mapSize; i++) + { + for (int j = 0; j < _mapSize; j++) + { + final CellNode n = _buffer[i][j]; + if ((n == null) || !n.isInUse() || (n.getCost() <= 0)) + { + continue; + } + + result.add(n); + } + } + + return result; + } + + private void getNeighbors() + { + if (!_current.getLoc().canGoAll()) + { + return; + } + + final int x = _current.getLoc().getNodeX(); + final int y = _current.getLoc().getNodeY(); + final int z = _current.getLoc().getZ(); + + CellNode nodeE = null; + CellNode nodeS = null; + CellNode nodeW = null; + CellNode nodeN = null; + + // East + if (_current.getLoc().canGoEast()) + { + nodeE = addNode(x + 1, y, z, false); + } + + // South + if (_current.getLoc().canGoSouth()) + { + nodeS = addNode(x, y + 1, z, false); + } + + // West + if (_current.getLoc().canGoWest()) + { + nodeW = addNode(x - 1, y, z, false); + } + + // North + if (_current.getLoc().canGoNorth()) + { + nodeN = addNode(x, y - 1, z, false); + } + + if (Config.ADVANCED_DIAGONAL_STRATEGY) + { + // SouthEast + if ((nodeE != null) && (nodeS != null)) + { + if (nodeE.getLoc().canGoSouth() && nodeS.getLoc().canGoEast()) + { + addNode(x + 1, y + 1, z, true); + } + } + + // SouthWest + if ((nodeS != null) && (nodeW != null)) + { + if (nodeW.getLoc().canGoSouth() && nodeS.getLoc().canGoWest()) + { + addNode(x - 1, y + 1, z, true); + } + } + + // NorthEast + if ((nodeN != null) && (nodeE != null)) + { + if (nodeE.getLoc().canGoNorth() && nodeN.getLoc().canGoEast()) + { + addNode(x + 1, y - 1, z, true); + } + } + + // NorthWest + if ((nodeN != null) && (nodeW != null)) + { + if (nodeW.getLoc().canGoNorth() && nodeN.getLoc().canGoWest()) + { + addNode(x - 1, y - 1, z, true); + } + } + } + } + + private CellNode getNode(int x, int y, int z) + { + final int aX = x - _baseX; + if ((aX < 0) || (aX >= _mapSize)) + { + return null; + } + + final int aY = y - _baseY; + if ((aY < 0) || (aY >= _mapSize)) + { + return null; + } + + CellNode result = _buffer[aX][aY]; + if (result == null) + { + result = new CellNode(new NodeLoc(x, y, z)); + _buffer[aX][aY] = result; + } + else if (!result.isInUse()) + { + result.setInUse(); + // reinit node if needed + if (result.getLoc() != null) + { + result.getLoc().set(x, y, z); + } + else + { + result.setLoc(new NodeLoc(x, y, z)); + } + } + + return result; + } + + private CellNode addNode(int x, int y, int z, boolean diagonal) + { + final CellNode newNode = getNode(x, y, z); + if (newNode == null) + { + return null; + } + if (newNode.getCost() >= 0) + { + return newNode; + } + + final int geoZ = newNode.getLoc().getZ(); + + final int stepZ = Math.abs(geoZ - _current.getLoc().getZ()); + float weight = diagonal ? Config.DIAGONAL_WEIGHT : Config.LOW_WEIGHT; + + if (!newNode.getLoc().canGoAll() || (stepZ > 16)) + { + weight = Config.HIGH_WEIGHT; + } + else if (isHighWeight(x + 1, y, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x - 1, y, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x, y + 1, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + else if (isHighWeight(x, y - 1, geoZ)) + { + weight = Config.MEDIUM_WEIGHT; + } + + newNode.setParent(_current); + newNode.setCost(getCost(x, y, geoZ, weight)); + + CellNode node = _current; + int count = 0; + while ((node.getNext() != null) && (count < (MAX_ITERATIONS * 4))) + { + count++; + if (node.getNext().getCost() > newNode.getCost()) + { + // insert node into a chain + newNode.setNext(node.getNext()); + break; + } + node = node.getNext(); + } + if (count == (MAX_ITERATIONS * 4)) + { + System.err.println("Pathfinding: too long loop detected, cost:" + newNode.getCost()); + } + + node.setNext(newNode); // add last + + return newNode; + } + + private boolean isHighWeight(int x, int y, int z) + { + final CellNode result = getNode(x, y, z); + if (result == null) + { + return true; + } + + if (!result.getLoc().canGoAll()) + { + return true; + } + if (Math.abs(result.getLoc().getZ() - z) > 16) + { + return true; + } + + return false; + } + + private double getCost(int x, int y, int z, float weight) + { + final int dX = x - _targetX; + final int dY = y - _targetY; + final int dZ = z - _targetZ; + // Math.abs(dx) + Math.abs(dy) + Math.abs(dz) / 16 + double result = Math.sqrt((dX * dX) + (dY * dY) + ((dZ * dZ) / 256.0)); + if (result > weight) + { + result += weight; + } + + if (result > Float.MAX_VALUE) + { + result = Float.MAX_VALUE; + } + + return result; + } } \ No newline at end of file diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java similarity index 93% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java index 80643e2131..f36ec872ba 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java @@ -1,440 +1,440 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.idfactory.IdFactory; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.model.itemcontainer.Inventory; -import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; - -/** - * @author Sami, DS Credits to Diamond - */ -public class CellPathFinding extends PathFinding -{ - private static final Logger _log = Logger.getLogger(CellPathFinding.class.getName()); - private BufferInfo[] _allBuffers; - private int _findSuccess = 0; - private int _findFails = 0; - private int _postFilterUses = 0; - private int _postFilterPlayableUses = 0; - private int _postFilterPasses = 0; - private long _postFilterElapsed = 0; - - private List _debugItems = null; - - public static CellPathFinding getInstance() - { - return SingletonHolder._instance; - } - - protected CellPathFinding() - { - try - { - final String[] array = Config.PATHFIND_BUFFERS.split(";"); - - _allBuffers = new BufferInfo[array.length]; - - String buf; - String[] args; - for (int i = 0; i < array.length; i++) - { - buf = array[i]; - args = buf.split("x"); - if (args.length != 2) - { - throw new Exception("Invalid buffer definition: " + buf); - } - - _allBuffers[i] = new BufferInfo(Integer.parseInt(args[0]), Integer.parseInt(args[1])); - } - } - catch (Exception e) - { - _log.log(Level.WARNING, "CellPathFinding: Problem during buffer init: " + e.getMessage(), e); - throw new Error("CellPathFinding: load aborted"); - } - } - - @Override - public boolean pathNodesExist(short regionoffset) - { - return false; - } - - @Override - public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) - { - final int gx = GeoData.getInstance().getGeoX(x); - final int gy = GeoData.getInstance().getGeoY(y); - if (!GeoData.getInstance().hasGeo(x, y)) - { - return null; - } - final int gz = GeoData.getInstance().getHeight(x, y, z); - final int gtx = GeoData.getInstance().getGeoX(tx); - final int gty = GeoData.getInstance().getGeoY(ty); - if (!GeoData.getInstance().hasGeo(tx, ty)) - { - return null; - } - final int gtz = GeoData.getInstance().getHeight(tx, ty, tz); - final CellNodeBuffer buffer = alloc(64 + (2 * Math.max(Math.abs(gx - gtx), Math.abs(gy - gty))), playable); - if (buffer == null) - { - return null; - } - - final boolean debug = playable && Config.DEBUG_PATH; - - if (debug) - { - if (_debugItems == null) - { - _debugItems = new CopyOnWriteArrayList<>(); - } - else - { - for (L2ItemInstance item : _debugItems) - { - if (item == null) - { - continue; - } - item.decayMe(); - } - - _debugItems.clear(); - } - } - - List path = null; - try - { - final CellNode result = buffer.findPath(gx, gy, gz, gtx, gty, gtz); - - if (debug) - { - for (CellNode n : buffer.debugPath()) - { - if (n.getCost() < 0) - { - dropDebugItem(1831, (int) (-n.getCost() * 10), n.getLoc()); - } - else - { - // known nodes - dropDebugItem(Inventory.ADENA_ID, (int) (n.getCost() * 10), n.getLoc()); - } - } - } - - if (result == null) - { - _findFails++; - return null; - } - - path = constructPath(result); - } - catch (Exception e) - { - _log.log(Level.WARNING, "", e); - return null; - } - finally - { - buffer.free(); - } - - if ((path.size() < 3) || (Config.MAX_POSTFILTER_PASSES <= 0)) - { - _findSuccess++; - return path; - } - - final long timeStamp = System.currentTimeMillis(); - _postFilterUses++; - if (playable) - { - _postFilterPlayableUses++; - } - - int currentX, currentY, currentZ; - ListIterator middlePoint; - boolean remove; - int pass = 0; - do - { - pass++; - _postFilterPasses++; - - remove = false; - middlePoint = path.listIterator(); - currentX = x; - currentY = y; - currentZ = z; - - while (middlePoint.hasNext()) - { - final AbstractNodeLoc locMiddle = middlePoint.next(); - if (!middlePoint.hasNext()) - { - break; - } - - final AbstractNodeLoc locEnd = path.get(middlePoint.nextIndex()); - if (GeoData.getInstance().canMove(currentX, currentY, currentZ, locEnd.getX(), locEnd.getY(), locEnd.getZ(), instance)) - { - middlePoint.remove(); - remove = true; - if (debug) - { - dropDebugItem(735, 1, locMiddle); - } - } - else - { - currentX = locMiddle.getX(); - currentY = locMiddle.getY(); - currentZ = locMiddle.getZ(); - } - } - } - // only one postfilter pass for AI - while (playable && remove && (path.size() > 2) && (pass < Config.MAX_POSTFILTER_PASSES)); - - if (debug) - { - path.forEach(n -> dropDebugItem(65, 1, n)); - } - - _findSuccess++; - _postFilterElapsed += System.currentTimeMillis() - timeStamp; - return path; - } - - private List constructPath(AbstractNode node) - { - final LinkedList path = new LinkedList<>(); - int previousDirectionX = Integer.MIN_VALUE; - int previousDirectionY = Integer.MIN_VALUE; - int directionX, directionY; - - while (node.getParent() != null) - { - if (!Config.ADVANCED_DIAGONAL_STRATEGY && (node.getParent().getParent() != null)) - { - final int tmpX = node.getLoc().getNodeX() - node.getParent().getParent().getLoc().getNodeX(); - final int tmpY = node.getLoc().getNodeY() - node.getParent().getParent().getLoc().getNodeY(); - if (Math.abs(tmpX) == Math.abs(tmpY)) - { - directionX = tmpX; - directionY = tmpY; - } - else - { - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - } - } - else - { - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - } - - // only add a new route point if moving direction changes - if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) - { - previousDirectionX = directionX; - previousDirectionY = directionY; - - path.addFirst(node.getLoc()); - node.setLoc(null); - } - - node = node.getParent(); - } - - return path; - } - - private CellNodeBuffer alloc(int size, boolean playable) - { - CellNodeBuffer current = null; - for (BufferInfo i : _allBuffers) - { - if (i.mapSize >= size) - { - for (CellNodeBuffer buf : i.bufs) - { - if (buf.lock()) - { - i.uses++; - if (playable) - { - i.playableUses++; - } - i.elapsed += buf.getElapsedTime(); - current = buf; - break; - } - } - if (current != null) - { - break; - } - - // not found, allocate temporary buffer - current = new CellNodeBuffer(i.mapSize); - current.lock(); - if (i.bufs.size() < i.count) - { - i.bufs.add(current); - i.uses++; - if (playable) - { - i.playableUses++; - } - break; - } - - i.overflows++; - if (playable) - { - i.playableOverflows++; - // System.err.println("Overflow, size requested: " + size + " playable:"+playable); - } - } - } - - return current; - } - - private void dropDebugItem(int itemId, int num, AbstractNodeLoc loc) - { - final L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); - item.setCount(num); - item.spawnMe(loc.getX(), loc.getY(), loc.getZ()); - _debugItems.add(item); - } - - private static final class BufferInfo - { - final int mapSize; - final int count; - ArrayList bufs; - int uses = 0; - int playableUses = 0; - int overflows = 0; - int playableOverflows = 0; - long elapsed = 0; - - public BufferInfo(int size, int cnt) - { - mapSize = size; - count = cnt; - bufs = new ArrayList<>(count); - } - - @Override - public String toString() - { - final StringBuilder sb = new StringBuilder(100); - sb.append(mapSize); - sb.append("x"); - sb.append(mapSize); - sb.append(" num:"); - sb.append(bufs.size()); - sb.append("/"); - sb.append(count); - sb.append(" uses:"); - sb.append(uses); - sb.append("/"); - sb.append(playableUses); - if (uses > 0) - { - sb.append(" total/avg(ms):"); - sb.append(elapsed); - sb.append("/"); - sb.append(String.format("%1.2f", (double) elapsed / uses)); - } - - sb.append(" ovf:"); - sb.append(overflows); - sb.append("/"); - sb.append(playableOverflows); - - return sb.toString(); - } - } - - @Override - public String[] getStat() - { - final String[] result = new String[_allBuffers.length + 1]; - for (int i = 0; i < _allBuffers.length; i++) - { - result[i] = _allBuffers[i].toString(); - } - - final StringBuilder sb = new StringBuilder(128); - sb.append("LOS postfilter uses:"); - sb.append(_postFilterUses); - sb.append("/"); - sb.append(_postFilterPlayableUses); - if (_postFilterUses > 0) - { - sb.append(" total/avg(ms):"); - sb.append(_postFilterElapsed); - sb.append("/"); - sb.append(String.format("%1.2f", (double) _postFilterElapsed / _postFilterUses)); - sb.append(" passes total/avg:"); - sb.append(_postFilterPasses); - sb.append("/"); - sb.append(String.format("%1.1f", (double) _postFilterPasses / _postFilterUses)); - sb.append(Config.EOL); - } - sb.append("Pathfind success/fail:"); - sb.append(_findSuccess); - sb.append("/"); - sb.append(_findFails); - result[result.length - 1] = sb.toString(); - - return result; - } - - private static class SingletonHolder - { - protected static final CellPathFinding _instance = new CellPathFinding(); - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; +import com.l2jmobius.gameserver.idfactory.IdFactory; +import com.l2jmobius.gameserver.model.instancezone.Instance; +import com.l2jmobius.gameserver.model.itemcontainer.Inventory; +import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; + +/** + * @author Sami, DS Credits to Diamond + */ +public class CellPathFinding extends PathFinding +{ + private static final Logger _log = Logger.getLogger(CellPathFinding.class.getName()); + private BufferInfo[] _allBuffers; + private int _findSuccess = 0; + private int _findFails = 0; + private int _postFilterUses = 0; + private int _postFilterPlayableUses = 0; + private int _postFilterPasses = 0; + private long _postFilterElapsed = 0; + + private List _debugItems = null; + + public static CellPathFinding getInstance() + { + return SingletonHolder._instance; + } + + protected CellPathFinding() + { + try + { + final String[] array = Config.PATHFIND_BUFFERS.split(";"); + + _allBuffers = new BufferInfo[array.length]; + + String buf; + String[] args; + for (int i = 0; i < array.length; i++) + { + buf = array[i]; + args = buf.split("x"); + if (args.length != 2) + { + throw new Exception("Invalid buffer definition: " + buf); + } + + _allBuffers[i] = new BufferInfo(Integer.parseInt(args[0]), Integer.parseInt(args[1])); + } + } + catch (Exception e) + { + _log.log(Level.WARNING, "CellPathFinding: Problem during buffer init: " + e.getMessage(), e); + throw new Error("CellPathFinding: load aborted"); + } + } + + @Override + public boolean pathNodesExist(short regionoffset) + { + return false; + } + + @Override + public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) + { + final int gx = GeoData.getInstance().getGeoX(x); + final int gy = GeoData.getInstance().getGeoY(y); + if (!GeoData.getInstance().hasGeo(x, y)) + { + return null; + } + final int gz = GeoData.getInstance().getHeight(x, y, z); + final int gtx = GeoData.getInstance().getGeoX(tx); + final int gty = GeoData.getInstance().getGeoY(ty); + if (!GeoData.getInstance().hasGeo(tx, ty)) + { + return null; + } + final int gtz = GeoData.getInstance().getHeight(tx, ty, tz); + final CellNodeBuffer buffer = alloc(64 + (2 * Math.max(Math.abs(gx - gtx), Math.abs(gy - gty))), playable); + if (buffer == null) + { + return null; + } + + final boolean debug = playable && Config.DEBUG_PATH; + + if (debug) + { + if (_debugItems == null) + { + _debugItems = new CopyOnWriteArrayList<>(); + } + else + { + for (L2ItemInstance item : _debugItems) + { + if (item == null) + { + continue; + } + item.decayMe(); + } + + _debugItems.clear(); + } + } + + List path = null; + try + { + final CellNode result = buffer.findPath(gx, gy, gz, gtx, gty, gtz); + + if (debug) + { + for (CellNode n : buffer.debugPath()) + { + if (n.getCost() < 0) + { + dropDebugItem(1831, (int) (-n.getCost() * 10), n.getLoc()); + } + else + { + // known nodes + dropDebugItem(Inventory.ADENA_ID, (int) (n.getCost() * 10), n.getLoc()); + } + } + } + + if (result == null) + { + _findFails++; + return null; + } + + path = constructPath(result); + } + catch (Exception e) + { + _log.log(Level.WARNING, "", e); + return null; + } + finally + { + buffer.free(); + } + + if ((path.size() < 3) || (Config.MAX_POSTFILTER_PASSES <= 0)) + { + _findSuccess++; + return path; + } + + final long timeStamp = System.currentTimeMillis(); + _postFilterUses++; + if (playable) + { + _postFilterPlayableUses++; + } + + int currentX, currentY, currentZ; + ListIterator middlePoint; + boolean remove; + int pass = 0; + do + { + pass++; + _postFilterPasses++; + + remove = false; + middlePoint = path.listIterator(); + currentX = x; + currentY = y; + currentZ = z; + + while (middlePoint.hasNext()) + { + final AbstractNodeLoc locMiddle = middlePoint.next(); + if (!middlePoint.hasNext()) + { + break; + } + + final AbstractNodeLoc locEnd = path.get(middlePoint.nextIndex()); + if (GeoData.getInstance().canMove(currentX, currentY, currentZ, locEnd.getX(), locEnd.getY(), locEnd.getZ(), instance)) + { + middlePoint.remove(); + remove = true; + if (debug) + { + dropDebugItem(735, 1, locMiddle); + } + } + else + { + currentX = locMiddle.getX(); + currentY = locMiddle.getY(); + currentZ = locMiddle.getZ(); + } + } + } + // only one postfilter pass for AI + while (playable && remove && (path.size() > 2) && (pass < Config.MAX_POSTFILTER_PASSES)); + + if (debug) + { + path.forEach(n -> dropDebugItem(65, 1, n)); + } + + _findSuccess++; + _postFilterElapsed += System.currentTimeMillis() - timeStamp; + return path; + } + + private List constructPath(AbstractNode node) + { + final LinkedList path = new LinkedList<>(); + int previousDirectionX = Integer.MIN_VALUE; + int previousDirectionY = Integer.MIN_VALUE; + int directionX, directionY; + + while (node.getParent() != null) + { + if (!Config.ADVANCED_DIAGONAL_STRATEGY && (node.getParent().getParent() != null)) + { + final int tmpX = node.getLoc().getNodeX() - node.getParent().getParent().getLoc().getNodeX(); + final int tmpY = node.getLoc().getNodeY() - node.getParent().getParent().getLoc().getNodeY(); + if (Math.abs(tmpX) == Math.abs(tmpY)) + { + directionX = tmpX; + directionY = tmpY; + } + else + { + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + } + } + else + { + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + } + + // only add a new route point if moving direction changes + if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) + { + previousDirectionX = directionX; + previousDirectionY = directionY; + + path.addFirst(node.getLoc()); + node.setLoc(null); + } + + node = node.getParent(); + } + + return path; + } + + private CellNodeBuffer alloc(int size, boolean playable) + { + CellNodeBuffer current = null; + for (BufferInfo i : _allBuffers) + { + if (i.mapSize >= size) + { + for (CellNodeBuffer buf : i.bufs) + { + if (buf.lock()) + { + i.uses++; + if (playable) + { + i.playableUses++; + } + i.elapsed += buf.getElapsedTime(); + current = buf; + break; + } + } + if (current != null) + { + break; + } + + // not found, allocate temporary buffer + current = new CellNodeBuffer(i.mapSize); + current.lock(); + if (i.bufs.size() < i.count) + { + i.bufs.add(current); + i.uses++; + if (playable) + { + i.playableUses++; + } + break; + } + + i.overflows++; + if (playable) + { + i.playableOverflows++; + // System.err.println("Overflow, size requested: " + size + " playable:"+playable); + } + } + } + + return current; + } + + private void dropDebugItem(int itemId, int num, AbstractNodeLoc loc) + { + final L2ItemInstance item = new L2ItemInstance(IdFactory.getInstance().getNextId(), itemId); + item.setCount(num); + item.spawnMe(loc.getX(), loc.getY(), loc.getZ()); + _debugItems.add(item); + } + + private static final class BufferInfo + { + final int mapSize; + final int count; + ArrayList bufs; + int uses = 0; + int playableUses = 0; + int overflows = 0; + int playableOverflows = 0; + long elapsed = 0; + + public BufferInfo(int size, int cnt) + { + mapSize = size; + count = cnt; + bufs = new ArrayList<>(count); + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(100); + sb.append(mapSize); + sb.append("x"); + sb.append(mapSize); + sb.append(" num:"); + sb.append(bufs.size()); + sb.append("/"); + sb.append(count); + sb.append(" uses:"); + sb.append(uses); + sb.append("/"); + sb.append(playableUses); + if (uses > 0) + { + sb.append(" total/avg(ms):"); + sb.append(elapsed); + sb.append("/"); + sb.append(String.format("%1.2f", (double) elapsed / uses)); + } + + sb.append(" ovf:"); + sb.append(overflows); + sb.append("/"); + sb.append(playableOverflows); + + return sb.toString(); + } + } + + @Override + public String[] getStat() + { + final String[] result = new String[_allBuffers.length + 1]; + for (int i = 0; i < _allBuffers.length; i++) + { + result[i] = _allBuffers[i].toString(); + } + + final StringBuilder sb = new StringBuilder(128); + sb.append("LOS postfilter uses:"); + sb.append(_postFilterUses); + sb.append("/"); + sb.append(_postFilterPlayableUses); + if (_postFilterUses > 0) + { + sb.append(" total/avg(ms):"); + sb.append(_postFilterElapsed); + sb.append("/"); + sb.append(String.format("%1.2f", (double) _postFilterElapsed / _postFilterUses)); + sb.append(" passes total/avg:"); + sb.append(_postFilterPasses); + sb.append("/"); + sb.append(String.format("%1.1f", (double) _postFilterPasses / _postFilterUses)); + sb.append(Config.EOL); + } + sb.append("Pathfind success/fail:"); + sb.append(_findSuccess); + sb.append("/"); + sb.append(_findFails); + result[result.length - 1] = sb.toString(); + + return result; + } + + private static class SingletonHolder + { + protected static final CellPathFinding _instance = new CellPathFinding(); + } +} diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java similarity index 89% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java index a3206e22ca..fb063e9a41 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java @@ -1,184 +1,184 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; - -import com.l2jmobius.commons.geodriver.Cell; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; - -/** - * @author -Nemesiss-, HorridoJoho - */ -public class NodeLoc extends AbstractNodeLoc -{ - private int _x; - private int _y; - private boolean _goNorth; - private boolean _goEast; - private boolean _goSouth; - private boolean _goWest; - private int _geoHeight; - - public NodeLoc(int x, int y, int z) - { - set(x, y, z); - } - - public void set(int x, int y, int z) - { - _x = x; - _y = y; - _goNorth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_NORTH); - _goEast = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_EAST); - _goSouth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_SOUTH); - _goWest = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_WEST); - _geoHeight = GeoData.getInstance().getNearestZ(x, y, z); - } - - public boolean canGoNorth() - { - return _goNorth; - } - - public boolean canGoEast() - { - return _goEast; - } - - public boolean canGoSouth() - { - return _goSouth; - } - - public boolean canGoWest() - { - return _goWest; - } - - public boolean canGoAll() - { - return canGoNorth() && canGoEast() && canGoSouth() && canGoWest(); - } - - @Override - public int getX() - { - return GeoData.getInstance().getWorldX(_x); - } - - @Override - public int getY() - { - return GeoData.getInstance().getWorldY(_y); - } - - @Override - public int getZ() - { - return _geoHeight; - } - - @Override - public int getNodeX() - { - return _x; - } - - @Override - public int getNodeY() - { - return _y; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + _x; - result = (prime * result) + _y; - - int nswe = 0; - if (canGoNorth()) - { - nswe |= Cell.NSWE_NORTH; - } - if (canGoEast()) - { - nswe |= Cell.NSWE_EAST; - } - if (canGoSouth()) - { - nswe |= Cell.NSWE_SOUTH; - } - if (canGoWest()) - { - nswe |= Cell.NSWE_WEST; - } - - result = (prime * result) + (((_geoHeight & 0xFFFF) << 1) | nswe); - return result; - // return super.hashCode(); - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof NodeLoc)) - { - return false; - } - final NodeLoc other = (NodeLoc) obj; - if (_x != other._x) - { - return false; - } - if (_y != other._y) - { - return false; - } - if (_goNorth != other._goNorth) - { - return false; - } - if (_goEast != other._goEast) - { - return false; - } - if (_goSouth != other._goSouth) - { - return false; - } - if (_goWest != other._goWest) - { - return false; - } - if (_geoHeight != other._geoHeight) - { - return false; - } - return true; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; + +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; + +/** + * @author -Nemesiss-, HorridoJoho + */ +public class NodeLoc extends AbstractNodeLoc +{ + private int _x; + private int _y; + private boolean _goNorth; + private boolean _goEast; + private boolean _goSouth; + private boolean _goWest; + private int _geoHeight; + + public NodeLoc(int x, int y, int z) + { + set(x, y, z); + } + + public void set(int x, int y, int z) + { + _x = x; + _y = y; + _goNorth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_NORTH); + _goEast = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_EAST); + _goSouth = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_SOUTH); + _goWest = GeoData.getInstance().checkNearestNswe(x, y, z, Cell.NSWE_WEST); + _geoHeight = GeoData.getInstance().getNearestZ(x, y, z); + } + + public boolean canGoNorth() + { + return _goNorth; + } + + public boolean canGoEast() + { + return _goEast; + } + + public boolean canGoSouth() + { + return _goSouth; + } + + public boolean canGoWest() + { + return _goWest; + } + + public boolean canGoAll() + { + return canGoNorth() && canGoEast() && canGoSouth() && canGoWest(); + } + + @Override + public int getX() + { + return GeoData.getInstance().getWorldX(_x); + } + + @Override + public int getY() + { + return GeoData.getInstance().getWorldY(_y); + } + + @Override + public int getZ() + { + return _geoHeight; + } + + @Override + public int getNodeX() + { + return _x; + } + + @Override + public int getNodeY() + { + return _y; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + _x; + result = (prime * result) + _y; + + int nswe = 0; + if (canGoNorth()) + { + nswe |= Cell.NSWE_NORTH; + } + if (canGoEast()) + { + nswe |= Cell.NSWE_EAST; + } + if (canGoSouth()) + { + nswe |= Cell.NSWE_SOUTH; + } + if (canGoWest()) + { + nswe |= Cell.NSWE_WEST; + } + + result = (prime * result) + (((_geoHeight & 0xFFFF) << 1) | nswe); + return result; + // return super.hashCode(); + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof NodeLoc)) + { + return false; + } + final NodeLoc other = (NodeLoc) obj; + if (_x != other._x) + { + return false; + } + if (_y != other._y) + { + return false; + } + if (_goNorth != other._goNorth) + { + return false; + } + if (_goEast != other._goEast) + { + return false; + } + if (_goSouth != other._goSouth) + { + return false; + } + if (_goWest != other._goWest) + { + return false; + } + if (_geoHeight != other._geoHeight) + { + return false; + } + return true; + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java similarity index 87% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java index d4d59fe4c5..fb9d7fdd2e 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java @@ -1,62 +1,62 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import com.l2jmobius.gameserver.pathfinding.AbstractNode; - -/** - * @author -Nemesiss- - */ -public class GeoNode extends AbstractNode -{ - private final int _neighborsIdx; - private short _cost; - private GeoNode[] _neighbors; - - public GeoNode(GeoNodeLoc Loc, int Neighbors_idx) - { - super(Loc); - _neighborsIdx = Neighbors_idx; - } - - public short getCost() - { - return _cost; - } - - public void setCost(int cost) - { - _cost = (short) cost; - } - - public GeoNode[] getNeighbors() - { - return _neighbors; - } - - public void attachNeighbors() - { - if (getLoc() == null) - { - _neighbors = null; - } - else - { - _neighbors = GeoPathFinding.getInstance().readNeighbors(this, _neighborsIdx); - } - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; + +/** + * @author -Nemesiss- + */ +public class GeoNode extends AbstractNode +{ + private final int _neighborsIdx; + private short _cost; + private GeoNode[] _neighbors; + + public GeoNode(GeoNodeLoc Loc, int Neighbors_idx) + { + super(Loc); + _neighborsIdx = Neighbors_idx; + } + + public short getCost() + { + return _cost; + } + + public void setCost(int cost) + { + _cost = (short) cost; + } + + public GeoNode[] getNeighbors() + { + return _neighbors; + } + + public void attachNeighbors() + { + if (getLoc() == null) + { + _neighbors = null; + } + else + { + _neighbors = GeoPathFinding.getInstance().readNeighbors(this, _neighborsIdx); + } + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java similarity index 88% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java index 2bfd116b68..9dabc50452 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java @@ -1,109 +1,109 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; - -/** - * @author -Nemesiss- - */ -public class GeoNodeLoc extends AbstractNodeLoc -{ - private final short _x; - private final short _y; - private final short _z; - - public GeoNodeLoc(short x, short y, short z) - { - _x = x; - _y = y; - _z = z; - } - - @Override - public int getX() - { - return L2World.MAP_MIN_X + (_x * 128) + 48; - } - - @Override - public int getY() - { - return L2World.MAP_MIN_Y + (_y * 128) + 48; - } - - @Override - public int getZ() - { - return _z; - } - - @Override - public int getNodeX() - { - return _x; - } - - @Override - public int getNodeY() - { - return _y; - } - - @Override - public int hashCode() - { - final int prime = 31; - int result = 1; - result = (prime * result) + _x; - result = (prime * result) + _y; - result = (prime * result) + _z; - return result; - } - - @Override - public boolean equals(Object obj) - { - if (this == obj) - { - return true; - } - if (obj == null) - { - return false; - } - if (!(obj instanceof GeoNodeLoc)) - { - return false; - } - final GeoNodeLoc other = (GeoNodeLoc) obj; - if (_x != other._x) - { - return false; - } - if (_y != other._y) - { - return false; - } - if (_z != other._z) - { - return false; - } - return true; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.model.L2World; + +/** + * @author -Nemesiss- + */ +public class GeoNodeLoc extends AbstractNodeLoc +{ + private final short _x; + private final short _y; + private final short _z; + + public GeoNodeLoc(short x, short y, short z) + { + _x = x; + _y = y; + _z = z; + } + + @Override + public int getX() + { + return L2World.MAP_MIN_X + (_x * 128) + 48; + } + + @Override + public int getY() + { + return L2World.MAP_MIN_Y + (_y * 128) + 48; + } + + @Override + public int getZ() + { + return _z; + } + + @Override + public int getNodeX() + { + return _x; + } + + @Override + public int getNodeY() + { + return _y; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = (prime * result) + _x; + result = (prime * result) + _y; + result = (prime * result) + _z; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + { + return true; + } + if (obj == null) + { + return false; + } + if (!(obj instanceof GeoNodeLoc)) + { + return false; + } + final GeoNodeLoc other = (GeoNodeLoc) obj; + if (_x != other._x) + { + return false; + } + if (_y != other._y) + { + return false; + } + if (_z != other._z) + { + return false; + } + return true; + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java similarity index 94% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java index e435ff5b9c..66a7aa7905 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java @@ -1,470 +1,470 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.geonodes; - -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import com.l2jmobius.Config; -import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.model.Location; -import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; -import com.l2jmobius.gameserver.util.Util; - -/** - * @author -Nemesiss- - */ -public class GeoPathFinding extends PathFinding -{ - private static Logger _log = Logger.getLogger(GeoPathFinding.class.getName()); - private static Map _pathNodes = new ConcurrentHashMap<>(); - private static Map _pathNodesIndex = new ConcurrentHashMap<>(); - - public static GeoPathFinding getInstance() - { - return SingletonHolder._instance; - } - - @Override - public boolean pathNodesExist(short regionoffset) - { - return _pathNodesIndex.containsKey(regionoffset); - } - - @Override - public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) - { - final int gx = (x - L2World.MAP_MIN_X) >> 4; - final int gy = (y - L2World.MAP_MIN_Y) >> 4; - final short gz = (short) z; - final int gtx = (tx - L2World.MAP_MIN_X) >> 4; - final int gty = (ty - L2World.MAP_MIN_Y) >> 4; - final short gtz = (short) tz; - - final GeoNode start = readNode(gx, gy, gz); - final GeoNode end = readNode(gtx, gty, gtz); - if ((start == null) || (end == null)) - { - return null; - } - if (Math.abs(start.getLoc().getZ() - z) > 55) - { - return null; // not correct layer - } - if (Math.abs(end.getLoc().getZ() - tz) > 55) - { - return null; // not correct layer - } - if (start == end) - { - return null; - } - - // TODO: Find closest path node we CAN access. Now only checks if we can not reach the closest - Location temp = GeoData.getInstance().moveCheck(x, y, z, start.getLoc().getX(), start.getLoc().getY(), start.getLoc().getZ(), instance); - if ((temp.getX() != start.getLoc().getX()) || (temp.getY() != start.getLoc().getY())) - { - return null; // cannot reach closest... - } - - // TODO: Find closest path node around target, now only checks if final location can be reached - temp = GeoData.getInstance().moveCheck(tx, ty, tz, end.getLoc().getX(), end.getLoc().getY(), end.getLoc().getZ(), instance); - if ((temp.getX() != end.getLoc().getX()) || (temp.getY() != end.getLoc().getY())) - { - return null; // cannot reach closest... - } - - // return searchAStar(start, end); - return searchByClosest2(start, end); - } - - public List searchByClosest2(GeoNode start, GeoNode end) - { - // Always continues checking from the closest to target non-blocked - // node from to_visit list. There's extra length in path if needed - // to go backwards/sideways but when moving generally forwards, this is extra fast - // and accurate. And can reach insane distances (try it with 800 nodes..). - // Minimum required node count would be around 300-400. - // Generally returns a bit (only a bit) more intelligent looking routes than - // the basic version. Not a true distance image (which would increase CPU - // load) level of intelligence though. - - // List of Visited Nodes - final List visited = new ArrayList<>(550); - - // List of Nodes to Visit - final LinkedList to_visit = new LinkedList<>(); - to_visit.add(start); - final int targetX = end.getLoc().getNodeX(); - final int targetY = end.getLoc().getNodeY(); - - int dx, dy; - boolean added; - int i = 0; - while (i < 550) - { - GeoNode node; - try - { - node = to_visit.removeFirst(); - } - catch (Exception e) - { - // No Path found - return null; - } - if (node.equals(end)) - { - return constructPath2(node); - } - - i++; - visited.add(node); - node.attachNeighbors(); - final GeoNode[] neighbors = node.getNeighbors(); - if (neighbors == null) - { - continue; - } - for (GeoNode n : neighbors) - { - if ((visited.lastIndexOf(n) == -1) && !to_visit.contains(n)) - { - added = false; - n.setParent(node); - dx = targetX - n.getLoc().getNodeX(); - dy = targetY - n.getLoc().getNodeY(); - n.setCost((dx * dx) + (dy * dy)); - for (int index = 0; index < to_visit.size(); index++) - { - // supposed to find it quite early.. - if (to_visit.get(index).getCost() > n.getCost()) - { - to_visit.add(index, n); - added = true; - break; - } - } - if (!added) - { - to_visit.addLast(n); - } - } - } - } - // No Path found - return null; - } - - public List constructPath2(AbstractNode node) - { - final LinkedList path = new LinkedList<>(); - int previousDirectionX = -1000; - int previousDirectionY = -1000; - int directionX; - int directionY; - - while (node.getParent() != null) - { - // only add a new route point if moving direction changes - directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); - directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); - - if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) - { - previousDirectionX = directionX; - previousDirectionY = directionY; - path.addFirst(node.getLoc()); - } - node = node.getParent(); - } - return path; - } - - public GeoNode[] readNeighbors(GeoNode n, int idx) - { - final int node_x = n.getLoc().getNodeX(); - final int node_y = n.getLoc().getNodeY(); - // short node_z = n.getLoc().getZ(); - - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - final ByteBuffer pn = _pathNodes.get(regoffset); - - final List> Neighbors = new ArrayList<>(8); - GeoNode newNode; - short new_node_x, new_node_y; - - // Region for sure will change, we must read from correct file - byte neighbor = pn.get(idx++); // N - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) node_x; - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // NE - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // E - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) node_y; - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // SE - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x + 1); - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // S - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) node_x; - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // SW - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) (node_y + 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // W - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) node_y; - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - neighbor = pn.get(idx++); // NW - if (neighbor > 0) - { - neighbor--; - new_node_x = (short) (node_x - 1); - new_node_y = (short) (node_y - 1); - newNode = readNode(new_node_x, new_node_y, neighbor); - if (newNode != null) - { - Neighbors.add(newNode); - } - } - final GeoNode[] result = new GeoNode[Neighbors.size()]; - return Neighbors.toArray(result); - } - - // Private - - private GeoNode readNode(short node_x, short node_y, byte layer) - { - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - if (!pathNodesExist(regoffset)) - { - return null; - } - final short nbx = getNodeBlock(node_x); - final short nby = getNodeBlock(node_y); - int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); - final ByteBuffer pn = _pathNodes.get(regoffset); - // reading - final byte nodes = pn.get(idx); - idx += (layer * 10) + 1; // byte + layer*10byte - if (nodes < layer) - { - _log.warning("SmthWrong!"); - } - final short node_z = pn.getShort(idx); - idx += 2; - return new GeoNode(new GeoNodeLoc(node_x, node_y, node_z), idx); - } - - private GeoNode readNode(int gx, int gy, short z) - { - final short node_x = getNodePos(gx); - final short node_y = getNodePos(gy); - final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); - if (!pathNodesExist(regoffset)) - { - return null; - } - final short nbx = getNodeBlock(node_x); - final short nby = getNodeBlock(node_y); - int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); - final ByteBuffer pn = _pathNodes.get(regoffset); - // reading - byte nodes = pn.get(idx++); - int idx2 = 0; // create index to nearlest node by z - short last_z = Short.MIN_VALUE; - while (nodes > 0) - { - final short node_z = pn.getShort(idx); - if (Math.abs(last_z - z) > Math.abs(node_z - z)) - { - last_z = node_z; - idx2 = idx + 2; - } - idx += 10; // short + 8 byte - nodes--; - } - return new GeoNode(new GeoNodeLoc(node_x, node_y, last_z), idx2); - } - - protected GeoPathFinding() - { - try - { - _log.info("Path Engine: - Loading Path Nodes..."); - //@formatter:off - Files.lines(Paths.get(Config.PATHNODE_DIR.getPath(), "pn_index.txt"), StandardCharsets.UTF_8) - .map(String::trim) - .filter(l -> !l.isEmpty()) - .forEach(line -> { - final String[] parts = line.split("_"); - - if ((parts.length < 2) - || !Util.isDigit(parts[0]) - || !Util.isDigit(parts[1])) - { - _log.warning("Invalid pathnode entry: '" + line + "', must be in format 'XX_YY', where X and Y - integers"); - return; - } - - final byte rx = Byte.parseByte(parts[0]); - final byte ry = Byte.parseByte(parts[1]); - LoadPathNodeFile(rx, ry); - }); - //@formatter:on - } - catch (IOException e) - { - _log.log(Level.WARNING, "", e); - throw new Error("Failed to read pn_index file."); - } - } - - private void LoadPathNodeFile(byte rx, byte ry) - { - if ((rx < L2World.TILE_X_MIN) || (rx > L2World.TILE_X_MAX) || (ry < L2World.TILE_Y_MIN) || (ry > L2World.TILE_Y_MAX)) - { - _log.warning("Failed to Load PathNode File: invalid region " + rx + "," + ry + Config.EOL); - return; - } - final short regionoffset = getRegionOffset(rx, ry); - final File file = new File(Config.PATHNODE_DIR, rx + "_" + ry + ".pn"); - _log.info("Path Engine: - Loading: " + file.getName() + " -> region offset: " + regionoffset + " X: " + rx + " Y: " + ry); - int node = 0, size, index = 0; - - // Create a read-only memory-mapped file - try (RandomAccessFile raf = new RandomAccessFile(file, "r"); - FileChannel roChannel = raf.getChannel()) - { - size = (int) roChannel.size(); - MappedByteBuffer nodes; - if (Config.FORCE_GEODATA) - { - // it is not guarantee, because the underlying operating system may have paged out some of the buffer's data - nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size).load(); - } - else - { - nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size); - } - - // Indexing pathnode files, so we will know where each block starts - final IntBuffer indexs = IntBuffer.allocate(65536); - - while (node < 65536) - { - final byte layer = nodes.get(index); - indexs.put(node++, index); - index += (layer * 10) + 1; - } - _pathNodesIndex.put(regionoffset, indexs); - _pathNodes.put(regionoffset, nodes); - } - catch (Exception e) - { - _log.log(Level.WARNING, "Failed to Load PathNode File: " + file.getAbsolutePath() + " : " + e.getMessage(), e); - } - } - - private static class SingletonHolder - { - protected static final GeoPathFinding _instance = new GeoPathFinding(); - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; +import com.l2jmobius.gameserver.model.L2World; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.instancezone.Instance; +import com.l2jmobius.gameserver.util.Util; + +/** + * @author -Nemesiss- + */ +public class GeoPathFinding extends PathFinding +{ + private static Logger _log = Logger.getLogger(GeoPathFinding.class.getName()); + private static Map _pathNodes = new ConcurrentHashMap<>(); + private static Map _pathNodesIndex = new ConcurrentHashMap<>(); + + public static GeoPathFinding getInstance() + { + return SingletonHolder._instance; + } + + @Override + public boolean pathNodesExist(short regionoffset) + { + return _pathNodesIndex.containsKey(regionoffset); + } + + @Override + public List findPath(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean playable) + { + final int gx = (x - L2World.MAP_MIN_X) >> 4; + final int gy = (y - L2World.MAP_MIN_Y) >> 4; + final short gz = (short) z; + final int gtx = (tx - L2World.MAP_MIN_X) >> 4; + final int gty = (ty - L2World.MAP_MIN_Y) >> 4; + final short gtz = (short) tz; + + final GeoNode start = readNode(gx, gy, gz); + final GeoNode end = readNode(gtx, gty, gtz); + if ((start == null) || (end == null)) + { + return null; + } + if (Math.abs(start.getLoc().getZ() - z) > 55) + { + return null; // not correct layer + } + if (Math.abs(end.getLoc().getZ() - tz) > 55) + { + return null; // not correct layer + } + if (start == end) + { + return null; + } + + // TODO: Find closest path node we CAN access. Now only checks if we can not reach the closest + Location temp = GeoData.getInstance().moveCheck(x, y, z, start.getLoc().getX(), start.getLoc().getY(), start.getLoc().getZ(), instance); + if ((temp.getX() != start.getLoc().getX()) || (temp.getY() != start.getLoc().getY())) + { + return null; // cannot reach closest... + } + + // TODO: Find closest path node around target, now only checks if final location can be reached + temp = GeoData.getInstance().moveCheck(tx, ty, tz, end.getLoc().getX(), end.getLoc().getY(), end.getLoc().getZ(), instance); + if ((temp.getX() != end.getLoc().getX()) || (temp.getY() != end.getLoc().getY())) + { + return null; // cannot reach closest... + } + + // return searchAStar(start, end); + return searchByClosest2(start, end); + } + + public List searchByClosest2(GeoNode start, GeoNode end) + { + // Always continues checking from the closest to target non-blocked + // node from to_visit list. There's extra length in path if needed + // to go backwards/sideways but when moving generally forwards, this is extra fast + // and accurate. And can reach insane distances (try it with 800 nodes..). + // Minimum required node count would be around 300-400. + // Generally returns a bit (only a bit) more intelligent looking routes than + // the basic version. Not a true distance image (which would increase CPU + // load) level of intelligence though. + + // List of Visited Nodes + final List visited = new ArrayList<>(550); + + // List of Nodes to Visit + final LinkedList to_visit = new LinkedList<>(); + to_visit.add(start); + final int targetX = end.getLoc().getNodeX(); + final int targetY = end.getLoc().getNodeY(); + + int dx, dy; + boolean added; + int i = 0; + while (i < 550) + { + GeoNode node; + try + { + node = to_visit.removeFirst(); + } + catch (Exception e) + { + // No Path found + return null; + } + if (node.equals(end)) + { + return constructPath2(node); + } + + i++; + visited.add(node); + node.attachNeighbors(); + final GeoNode[] neighbors = node.getNeighbors(); + if (neighbors == null) + { + continue; + } + for (GeoNode n : neighbors) + { + if ((visited.lastIndexOf(n) == -1) && !to_visit.contains(n)) + { + added = false; + n.setParent(node); + dx = targetX - n.getLoc().getNodeX(); + dy = targetY - n.getLoc().getNodeY(); + n.setCost((dx * dx) + (dy * dy)); + for (int index = 0; index < to_visit.size(); index++) + { + // supposed to find it quite early.. + if (to_visit.get(index).getCost() > n.getCost()) + { + to_visit.add(index, n); + added = true; + break; + } + } + if (!added) + { + to_visit.addLast(n); + } + } + } + } + // No Path found + return null; + } + + public List constructPath2(AbstractNode node) + { + final LinkedList path = new LinkedList<>(); + int previousDirectionX = -1000; + int previousDirectionY = -1000; + int directionX; + int directionY; + + while (node.getParent() != null) + { + // only add a new route point if moving direction changes + directionX = node.getLoc().getNodeX() - node.getParent().getLoc().getNodeX(); + directionY = node.getLoc().getNodeY() - node.getParent().getLoc().getNodeY(); + + if ((directionX != previousDirectionX) || (directionY != previousDirectionY)) + { + previousDirectionX = directionX; + previousDirectionY = directionY; + path.addFirst(node.getLoc()); + } + node = node.getParent(); + } + return path; + } + + public GeoNode[] readNeighbors(GeoNode n, int idx) + { + final int node_x = n.getLoc().getNodeX(); + final int node_y = n.getLoc().getNodeY(); + // short node_z = n.getLoc().getZ(); + + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + final ByteBuffer pn = _pathNodes.get(regoffset); + + final List> Neighbors = new ArrayList<>(8); + GeoNode newNode; + short new_node_x, new_node_y; + + // Region for sure will change, we must read from correct file + byte neighbor = pn.get(idx++); // N + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) node_x; + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // NE + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // E + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) node_y; + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // SE + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x + 1); + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // S + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) node_x; + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // SW + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) (node_y + 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // W + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) node_y; + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + neighbor = pn.get(idx++); // NW + if (neighbor > 0) + { + neighbor--; + new_node_x = (short) (node_x - 1); + new_node_y = (short) (node_y - 1); + newNode = readNode(new_node_x, new_node_y, neighbor); + if (newNode != null) + { + Neighbors.add(newNode); + } + } + final GeoNode[] result = new GeoNode[Neighbors.size()]; + return Neighbors.toArray(result); + } + + // Private + + private GeoNode readNode(short node_x, short node_y, byte layer) + { + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + if (!pathNodesExist(regoffset)) + { + return null; + } + final short nbx = getNodeBlock(node_x); + final short nby = getNodeBlock(node_y); + int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); + final ByteBuffer pn = _pathNodes.get(regoffset); + // reading + final byte nodes = pn.get(idx); + idx += (layer * 10) + 1; // byte + layer*10byte + if (nodes < layer) + { + _log.warning("SmthWrong!"); + } + final short node_z = pn.getShort(idx); + idx += 2; + return new GeoNode(new GeoNodeLoc(node_x, node_y, node_z), idx); + } + + private GeoNode readNode(int gx, int gy, short z) + { + final short node_x = getNodePos(gx); + final short node_y = getNodePos(gy); + final short regoffset = getRegionOffset(getRegionX(node_x), getRegionY(node_y)); + if (!pathNodesExist(regoffset)) + { + return null; + } + final short nbx = getNodeBlock(node_x); + final short nby = getNodeBlock(node_y); + int idx = _pathNodesIndex.get(regoffset).get((nby << 8) + nbx); + final ByteBuffer pn = _pathNodes.get(regoffset); + // reading + byte nodes = pn.get(idx++); + int idx2 = 0; // create index to nearlest node by z + short last_z = Short.MIN_VALUE; + while (nodes > 0) + { + final short node_z = pn.getShort(idx); + if (Math.abs(last_z - z) > Math.abs(node_z - z)) + { + last_z = node_z; + idx2 = idx + 2; + } + idx += 10; // short + 8 byte + nodes--; + } + return new GeoNode(new GeoNodeLoc(node_x, node_y, last_z), idx2); + } + + protected GeoPathFinding() + { + try + { + _log.info("Path Engine: - Loading Path Nodes..."); + //@formatter:off + Files.lines(Paths.get(Config.PATHNODE_DIR.getPath(), "pn_index.txt"), StandardCharsets.UTF_8) + .map(String::trim) + .filter(l -> !l.isEmpty()) + .forEach(line -> { + final String[] parts = line.split("_"); + + if ((parts.length < 2) + || !Util.isDigit(parts[0]) + || !Util.isDigit(parts[1])) + { + _log.warning("Invalid pathnode entry: '" + line + "', must be in format 'XX_YY', where X and Y - integers"); + return; + } + + final byte rx = Byte.parseByte(parts[0]); + final byte ry = Byte.parseByte(parts[1]); + LoadPathNodeFile(rx, ry); + }); + //@formatter:on + } + catch (IOException e) + { + _log.log(Level.WARNING, "", e); + throw new Error("Failed to read pn_index file."); + } + } + + private void LoadPathNodeFile(byte rx, byte ry) + { + if ((rx < L2World.TILE_X_MIN) || (rx > L2World.TILE_X_MAX) || (ry < L2World.TILE_Y_MIN) || (ry > L2World.TILE_Y_MAX)) + { + _log.warning("Failed to Load PathNode File: invalid region " + rx + "," + ry + Config.EOL); + return; + } + final short regionoffset = getRegionOffset(rx, ry); + final File file = new File(Config.PATHNODE_DIR, rx + "_" + ry + ".pn"); + _log.info("Path Engine: - Loading: " + file.getName() + " -> region offset: " + regionoffset + " X: " + rx + " Y: " + ry); + int node = 0, size, index = 0; + + // Create a read-only memory-mapped file + try (RandomAccessFile raf = new RandomAccessFile(file, "r"); + FileChannel roChannel = raf.getChannel()) + { + size = (int) roChannel.size(); + MappedByteBuffer nodes; + if (Config.FORCE_GEODATA) + { + // it is not guarantee, because the underlying operating system may have paged out some of the buffer's data + nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size).load(); + } + else + { + nodes = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, size); + } + + // Indexing pathnode files, so we will know where each block starts + final IntBuffer indexs = IntBuffer.allocate(65536); + + while (node < 65536) + { + final byte layer = nodes.get(index); + indexs.put(node++, index); + index += (layer * 10) + 1; + } + _pathNodesIndex.put(regionoffset, indexs); + _pathNodes.put(regionoffset, nodes); + } + catch (Exception e) + { + _log.log(Level.WARNING, "Failed to Load PathNode File: " + file.getAbsolutePath() + " : " + e.getMessage(), e); + } + } + + private static class SingletonHolder + { + protected static final GeoPathFinding _instance = new GeoPathFinding(); + } +} diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java similarity index 89% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java rename to L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java index bed45d7643..665977f686 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java @@ -1,124 +1,124 @@ -/* - * This file is part of the L2J Mobius project. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.l2jmobius.gameserver.pathfinding.utils; - -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoNode; - -/** - * @author -Nemesiss- - */ -public class BinaryNodeHeap -{ - private final GeoNode[] _list; - private int _size; - - public BinaryNodeHeap(int size) - { - _list = new GeoNode[size + 1]; - _size = 0; - } - - public void add(GeoNode n) - { - _size++; - int pos = _size; - _list[pos] = n; - while (pos != 1) - { - final int p2 = pos / 2; - if (_list[pos].getCost() <= _list[p2].getCost()) - { - final GeoNode temp = _list[p2]; - _list[p2] = _list[pos]; - _list[pos] = temp; - pos = p2; - } - else - { - break; - } - } - } - - public GeoNode removeFirst() - { - final GeoNode first = _list[1]; - _list[1] = _list[_size]; - _list[_size] = null; - _size--; - int pos = 1; - int cpos; - int dblcpos; - GeoNode temp; - while (true) - { - cpos = pos; - dblcpos = cpos * 2; - if ((dblcpos + 1) <= _size) - { - if (_list[cpos].getCost() >= _list[dblcpos].getCost()) - { - pos = dblcpos; - } - if (_list[pos].getCost() >= _list[dblcpos + 1].getCost()) - { - pos = dblcpos + 1; - } - } - else if (dblcpos <= _size) - { - if (_list[cpos].getCost() >= _list[dblcpos].getCost()) - { - pos = dblcpos; - } - } - - if (cpos != pos) - { - temp = _list[cpos]; - _list[cpos] = _list[pos]; - _list[pos] = temp; - } - else - { - break; - } - } - return first; - } - - public boolean contains(GeoNode n) - { - if (_size == 0) - { - return false; - } - for (int i = 1; i <= _size; i++) - { - if (_list[i].equals(n)) - { - return true; - } - } - return false; - } - - public boolean isEmpty() - { - return _size == 0; - } -} +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.l2jmobius.gameserver.geodata.pathfinding.utils; + +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoNode; + +/** + * @author -Nemesiss- + */ +public class BinaryNodeHeap +{ + private final GeoNode[] _list; + private int _size; + + public BinaryNodeHeap(int size) + { + _list = new GeoNode[size + 1]; + _size = 0; + } + + public void add(GeoNode n) + { + _size++; + int pos = _size; + _list[pos] = n; + while (pos != 1) + { + final int p2 = pos / 2; + if (_list[pos].getCost() <= _list[p2].getCost()) + { + final GeoNode temp = _list[p2]; + _list[p2] = _list[pos]; + _list[pos] = temp; + pos = p2; + } + else + { + break; + } + } + } + + public GeoNode removeFirst() + { + final GeoNode first = _list[1]; + _list[1] = _list[_size]; + _list[_size] = null; + _size--; + int pos = 1; + int cpos; + int dblcpos; + GeoNode temp; + while (true) + { + cpos = pos; + dblcpos = cpos * 2; + if ((dblcpos + 1) <= _size) + { + if (_list[cpos].getCost() >= _list[dblcpos].getCost()) + { + pos = dblcpos; + } + if (_list[pos].getCost() >= _list[dblcpos + 1].getCost()) + { + pos = dblcpos + 1; + } + } + else if (dblcpos <= _size) + { + if (_list[cpos].getCost() >= _list[dblcpos].getCost()) + { + pos = dblcpos; + } + } + + if (cpos != pos) + { + temp = _list[cpos]; + _list[cpos] = _list[pos]; + _list[pos] = temp; + } + else + { + break; + } + } + return first; + } + + public boolean contains(GeoNode n) + { + if (_size == 0) + { + return false; + } + for (int i = 1; i <= _size; i++) + { + if (_list[i].equals(n)) + { + return true; + } + } + return false; + } + + public boolean isEmpty() + { + return _size == 0; + } +} diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java index 1a099de096..4f61421f83 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java @@ -18,11 +18,11 @@ package com.l2jmobius.gameserver.instancemanager; import java.util.concurrent.ConcurrentHashMap; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.holders.WarpedSpaceHolder; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.util.Util; /** diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/L2Character.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/L2Character.java index 8f7e8cea75..ca1f436bfa 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/L2Character.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/model/actor/L2Character.java @@ -63,6 +63,8 @@ import com.l2jmobius.gameserver.enums.ShotType; import com.l2jmobius.gameserver.enums.StatusUpdateType; import com.l2jmobius.gameserver.enums.Team; import com.l2jmobius.gameserver.enums.UserInfoType; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.idfactory.IdFactory; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.instancemanager.TimersManager; @@ -153,8 +155,6 @@ import com.l2jmobius.gameserver.network.serverpackets.StopMove; import com.l2jmobius.gameserver.network.serverpackets.StopRotation; import com.l2jmobius.gameserver.network.serverpackets.TeleportToLocation; import com.l2jmobius.gameserver.network.serverpackets.UserInfo; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager; import com.l2jmobius.gameserver.util.Util; diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/util/GeoUtils.java b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/util/GeoUtils.java index 69ca1e0977..c706c4a491 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/util/GeoUtils.java +++ b/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/util/GeoUtils.java @@ -18,8 +18,8 @@ package com.l2jmobius.gameserver.util; import java.awt.Color; -import com.l2jmobius.commons.geodriver.Cell; import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.serverpackets.ExServerPrimitive; diff --git a/L2J_Mobius_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java index 962d1456f7..03b3ca8902 100644 --- a/L2J_Mobius_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java +++ b/L2J_Mobius_Underground/dist/game/data/scripts/handlers/admincommandhandlers/AdminPathNode.java @@ -19,10 +19,10 @@ package handlers.admincommandhandlers; import java.util.List; import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.IAdminCommandHandler; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; public class AdminPathNode implements IAdminCommandHandler { diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java index 46ae84491a..5932d62564 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GameServer.java @@ -98,6 +98,7 @@ import com.l2jmobius.gameserver.datatables.BotReportTable; import com.l2jmobius.gameserver.datatables.EventDroplist; import com.l2jmobius.gameserver.datatables.ItemTable; import com.l2jmobius.gameserver.datatables.MerchantPriceConfigTable; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.handler.ConditionHandler; import com.l2jmobius.gameserver.handler.DailyMissionHandler; import com.l2jmobius.gameserver.handler.EffectHandler; @@ -145,7 +146,6 @@ import com.l2jmobius.gameserver.model.votereward.VoteSystem; import com.l2jmobius.gameserver.network.ClientNetworkManager; import com.l2jmobius.gameserver.network.loginserver.LoginServerNetworkManager; import com.l2jmobius.gameserver.network.telnet.TelnetServer; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.scripting.ScriptEngineManager; import com.l2jmobius.gameserver.taskmanager.TaskManager; import com.l2jmobius.gameserver.util.Broadcast; diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GeoData.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GeoData.java index 41007ee949..bbf22617b9 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GeoData.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/GeoData.java @@ -22,9 +22,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.l2jmobius.Config; -import com.l2jmobius.commons.geodriver.Cell; -import com.l2jmobius.commons.geodriver.GeoDriver; import com.l2jmobius.gameserver.data.xml.impl.DoorData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.geodriver.GeoDriver; import com.l2jmobius.gameserver.instancemanager.WarpedSpaceManager; import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.L2World; diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java index 551fb76d54..973c82b4a8 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/data/xml/impl/DoorData.java @@ -34,12 +34,12 @@ import org.w3c.dom.Node; import com.l2jmobius.commons.util.IGameXmlReader; import com.l2jmobius.commons.util.IXmlReader; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.instance.L2DoorInstance; import com.l2jmobius.gameserver.model.actor.templates.L2DoorTemplate; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; /** * This class loads and hold info about doors. diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/Cell.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java similarity index 94% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/Cell.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java index 7c7c441cac..4914b1d72e 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/Cell.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/Cell.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/GeoDriver.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java similarity index 96% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/GeoDriver.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java index c02d85891d..ffef644f31 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/GeoDriver.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/GeoDriver.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; import java.io.IOException; import java.io.RandomAccessFile; @@ -23,8 +23,8 @@ import java.nio.channels.FileChannel.MapMode; import java.nio.file.Path; import java.util.concurrent.atomic.AtomicReferenceArray; -import com.l2jmobius.commons.geodriver.regions.NullRegion; -import com.l2jmobius.commons.geodriver.regions.Region; +import com.l2jmobius.gameserver.geodata.geodriver.regions.NullRegion; +import com.l2jmobius.gameserver.geodata.geodriver.regions.Region; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IBlock.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java similarity index 93% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IBlock.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java index 93680fdc94..21df97c40d 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IBlock.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IBlock.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IRegion.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java similarity index 93% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IRegion.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java index a17e6a0c5f..3eb23da03e 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/IRegion.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/IRegion.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver; +package com.l2jmobius.gameserver.geodata.geodriver; /** * @author HorridoJoho diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java similarity index 91% rename from L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java index 068914d7f3..4d6410672e 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/commons/geodriver/blocks/ComplexBlock.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/ComplexBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java similarity index 88% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java index 5f924bc835..d5bcff094b 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/FlatBlock.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/FlatBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java similarity index 94% rename from L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java index c9e8f0b8f5..313131bd5a 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/commons/geodriver/blocks/MultilayerBlock.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/blocks/MultilayerBlock.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.blocks; +package com.l2jmobius.gameserver.geodata.geodriver.blocks; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java similarity index 88% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java index 97beba4ee4..60ecac873a 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/NullRegion.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/NullRegion.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; -import com.l2jmobius.commons.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/Region.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java similarity index 82% rename from L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/Region.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java index 299f4691f7..d2d02481ed 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/commons/geodriver/regions/Region.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/geodriver/regions/Region.java @@ -14,15 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.commons.geodriver.regions; +package com.l2jmobius.gameserver.geodata.geodriver.regions; import java.nio.ByteBuffer; -import com.l2jmobius.commons.geodriver.IBlock; -import com.l2jmobius.commons.geodriver.IRegion; -import com.l2jmobius.commons.geodriver.blocks.ComplexBlock; -import com.l2jmobius.commons.geodriver.blocks.FlatBlock; -import com.l2jmobius.commons.geodriver.blocks.MultilayerBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IBlock; +import com.l2jmobius.gameserver.geodata.geodriver.IRegion; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.ComplexBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.FlatBlock; +import com.l2jmobius.gameserver.geodata.geodriver.blocks.MultilayerBlock; /** * @author HorridoJoho diff --git a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java similarity index 96% rename from L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java index 0975c5a975..e3476f28c2 100644 --- a/L2J_Mobius_Classic/java/com/l2jmobius/gameserver/pathfinding/AbstractNode.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNode.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding; +package com.l2jmobius.gameserver.geodata.pathfinding; public abstract class AbstractNode { diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java similarity index 94% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java index 4197a02155..ec3bd23d44 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/AbstractNodeLoc.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/AbstractNodeLoc.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding; +package com.l2jmobius.gameserver.geodata.pathfinding; /** * @author -Nemesiss- diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java similarity index 95% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java index fedfbf55fb..c1fbd19084 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/PathFinding.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/PathFinding.java @@ -14,15 +14,15 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding; +package com.l2jmobius.gameserver.geodata.pathfinding; import java.util.List; import com.l2jmobius.Config; +import com.l2jmobius.gameserver.geodata.pathfinding.cellnodes.CellPathFinding; +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoPathFinding; import com.l2jmobius.gameserver.model.L2World; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.cellnodes.CellPathFinding; -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoPathFinding; /** * @author -Nemesiss- diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java similarity index 91% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java index daf6ae3edb..dd2c0f2d8e 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNode.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNode.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; public class CellNode extends AbstractNode { diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java similarity index 99% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java index 8f8a87a079..5747e430ea 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellNodeBuffer.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellNodeBuffer.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; import java.util.LinkedList; import java.util.List; diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java similarity index 97% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java index 80643e2131..e02aaaf2b5 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/CellPathFinding.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/CellPathFinding.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; import java.util.ArrayList; import java.util.LinkedList; @@ -26,13 +26,13 @@ import java.util.logging.Logger; import com.l2jmobius.Config; import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.idfactory.IdFactory; import com.l2jmobius.gameserver.model.instancezone.Instance; import com.l2jmobius.gameserver.model.itemcontainer.Inventory; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; /** * @author Sami, DS Credits to Diamond diff --git a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java similarity index 94% rename from L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java index a3206e22ca..bb36538728 100644 --- a/L2J_Mobius_Helios/java/com/l2jmobius/gameserver/pathfinding/cellnodes/NodeLoc.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/cellnodes/NodeLoc.java @@ -14,11 +14,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.cellnodes; +package com.l2jmobius.gameserver.geodata.pathfinding.cellnodes; -import com.l2jmobius.commons.geodriver.Cell; import com.l2jmobius.gameserver.GeoData; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; /** * @author -Nemesiss-, HorridoJoho diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java similarity index 91% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java index d4d59fe4c5..e9461b122a 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNode.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNode.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.geonodes; +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; /** * @author -Nemesiss- diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java similarity index 93% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java index 2bfd116b68..3721b3a75e 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoNodeLoc.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoNodeLoc.java @@ -14,10 +14,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.geonodes; +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.model.L2World; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; /** * @author -Nemesiss- diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java similarity index 98% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java index e435ff5b9c..ceefeecf43 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/geonodes/GeoPathFinding.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/geonodes/GeoPathFinding.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.geonodes; +package com.l2jmobius.gameserver.geodata.pathfinding.geonodes; import java.io.File; import java.io.IOException; @@ -36,12 +36,12 @@ import java.util.logging.Logger; import com.l2jmobius.Config; import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNode; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.model.L2World; import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNode; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.util.Util; /** diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java similarity index 94% rename from L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java rename to L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java index bed45d7643..a6aae4c662 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/pathfinding/utils/BinaryNodeHeap.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/geodata/pathfinding/utils/BinaryNodeHeap.java @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package com.l2jmobius.gameserver.pathfinding.utils; +package com.l2jmobius.gameserver.geodata.pathfinding.utils; -import com.l2jmobius.gameserver.pathfinding.geonodes.GeoNode; +import com.l2jmobius.gameserver.geodata.pathfinding.geonodes.GeoNode; /** * @author -Nemesiss- diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java index 1a099de096..4f61421f83 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/instancemanager/WarpedSpaceManager.java @@ -18,11 +18,11 @@ package com.l2jmobius.gameserver.instancemanager; import java.util.concurrent.ConcurrentHashMap; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.model.Location; import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.holders.WarpedSpaceHolder; import com.l2jmobius.gameserver.model.instancezone.Instance; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; import com.l2jmobius.gameserver.util.Util; /** diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Character.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Character.java index 8f7e8cea75..ca1f436bfa 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Character.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Character.java @@ -63,6 +63,8 @@ import com.l2jmobius.gameserver.enums.ShotType; import com.l2jmobius.gameserver.enums.StatusUpdateType; import com.l2jmobius.gameserver.enums.Team; import com.l2jmobius.gameserver.enums.UserInfoType; +import com.l2jmobius.gameserver.geodata.pathfinding.AbstractNodeLoc; +import com.l2jmobius.gameserver.geodata.pathfinding.PathFinding; import com.l2jmobius.gameserver.idfactory.IdFactory; import com.l2jmobius.gameserver.instancemanager.MapRegionManager; import com.l2jmobius.gameserver.instancemanager.TimersManager; @@ -153,8 +155,6 @@ import com.l2jmobius.gameserver.network.serverpackets.StopMove; import com.l2jmobius.gameserver.network.serverpackets.StopRotation; import com.l2jmobius.gameserver.network.serverpackets.TeleportToLocation; import com.l2jmobius.gameserver.network.serverpackets.UserInfo; -import com.l2jmobius.gameserver.pathfinding.AbstractNodeLoc; -import com.l2jmobius.gameserver.pathfinding.PathFinding; import com.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager; import com.l2jmobius.gameserver.util.Util; diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/util/GeoUtils.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/util/GeoUtils.java index 69ca1e0977..c706c4a491 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/util/GeoUtils.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/util/GeoUtils.java @@ -18,8 +18,8 @@ package com.l2jmobius.gameserver.util; import java.awt.Color; -import com.l2jmobius.commons.geodriver.Cell; import com.l2jmobius.gameserver.GeoData; +import com.l2jmobius.gameserver.geodata.geodriver.Cell; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.network.serverpackets.ExServerPrimitive;