Store door objects in regions.

This commit is contained in:
MobiusDevelopment 2021-03-14 20:29:42 +00:00
parent a8a6584d64
commit 031006131b
46 changed files with 1375 additions and 514 deletions

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -31,6 +31,8 @@ import org.l2jmobius.gameserver.instancemanager.ClanHallManager;
import org.l2jmobius.gameserver.instancemanager.IdManager; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
@ -239,22 +241,15 @@ public class DoorData implements IXmlReader
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz)
{ {
int region; final WorldRegion region = World.getInstance().getRegion(x, y);
try final Collection<DoorInstance> doors = region != null ? region.getDoors() : null;
{ if ((doors == null) || doors.isEmpty())
region = MapRegionData.getInstance().getMapRegion(x, y);
}
catch (Exception e)
{ {
return false; return false;
} }
for (DoorInstance doorInst : DOORS.values()) for (DoorInstance doorInst : doors)
{ {
if (doorInst.getMapRegion() != region)
{
continue;
}
if (doorInst.getXMax() == 0) if (doorInst.getXMax() == 0)
{ {
continue; continue;

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -29,6 +30,7 @@ import org.l2jmobius.gameserver.ai.SiegeGuardAI;
import org.l2jmobius.gameserver.data.sql.SpawnTable; import org.l2jmobius.gameserver.data.sql.SpawnTable;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.NpcInstance; import org.l2jmobius.gameserver.model.actor.instance.NpcInstance;
import org.l2jmobius.gameserver.model.spawn.Spawn; import org.l2jmobius.gameserver.model.spawn.Spawn;
import org.l2jmobius.gameserver.model.zone.ZoneManager; import org.l2jmobius.gameserver.model.zone.ZoneManager;
@ -42,6 +44,7 @@ public class WorldRegion
private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName()); private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName());
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
private final List<DoorInstance> _doors = new ArrayList<>(1);
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
private final int _regionY; private final int _regionY;
@ -315,6 +318,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -342,6 +353,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -377,6 +396,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public String getName() public String getName()
{ {
return "(" + _regionX + ", " + _regionY + ")"; return "(" + _regionX + ", " + _regionY + ")";

View File

@ -31,6 +31,8 @@ import org.l2jmobius.gameserver.instancemanager.ClanHallManager;
import org.l2jmobius.gameserver.instancemanager.IdManager; import org.l2jmobius.gameserver.instancemanager.IdManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate;
import org.l2jmobius.gameserver.model.residences.ClanHall; import org.l2jmobius.gameserver.model.residences.ClanHall;
@ -239,22 +241,15 @@ public class DoorData implements IXmlReader
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz)
{ {
int region; final WorldRegion region = World.getInstance().getRegion(x, y);
try final Collection<DoorInstance> doors = region != null ? region.getDoors() : null;
{ if ((doors == null) || doors.isEmpty())
region = MapRegionData.getInstance().getMapRegion(x, y);
}
catch (Exception e)
{ {
return false; return false;
} }
for (DoorInstance doorInst : DOORS.values()) for (DoorInstance doorInst : doors)
{ {
if (doorInst.getMapRegion() != region)
{
continue;
}
if (doorInst.getXMax() == 0) if (doorInst.getXMax() == 0)
{ {
continue; continue;

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -29,6 +30,7 @@ import org.l2jmobius.gameserver.ai.SiegeGuardAI;
import org.l2jmobius.gameserver.data.sql.SpawnTable; import org.l2jmobius.gameserver.data.sql.SpawnTable;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Creature; import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.instance.NpcInstance; import org.l2jmobius.gameserver.model.actor.instance.NpcInstance;
import org.l2jmobius.gameserver.model.spawn.Spawn; import org.l2jmobius.gameserver.model.spawn.Spawn;
import org.l2jmobius.gameserver.model.zone.ZoneManager; import org.l2jmobius.gameserver.model.zone.ZoneManager;
@ -42,6 +44,7 @@ public class WorldRegion
private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName()); private static final Logger LOGGER = Logger.getLogger(WorldRegion.class.getName());
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
private final List<DoorInstance> _doors = new ArrayList<>(1);
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
private final int _regionY; private final int _regionY;
@ -315,6 +318,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -342,6 +353,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -377,6 +396,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public String getName() public String getName()
{ {
return "(" + _regionX + ", " + _regionY + ")"; return "(" + _regionX + ", " + _regionY + ")";

View File

@ -17,11 +17,9 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -31,11 +29,13 @@ import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance;
/** /**
* Loads doors. * Loads doors.
@ -46,7 +46,6 @@ public class DoorData implements IXmlReader
private static final Map<String, Set<Integer>> _groups = new HashMap<>(); private static final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -58,7 +57,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/Doors.xml"); parseDatapackFile("data/Doors.xml");
} }
@ -88,7 +86,7 @@ public class DoorData implements IXmlReader
} }
} }
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " door templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public void insertCollisionData(StatSet set) public void insertCollisionData(StatSet set)
@ -125,7 +123,7 @@ public class DoorData implements IXmlReader
final DoorInstance door = new DoorInstance(template); final DoorInstance door = new DoorInstance(template);
door.setCurrentHp(door.getMaxHp()); door.setCurrentHp(door.getMaxHp());
door.spawnMe(template.getX(), template.getY(), template.getZ()); door.spawnMe(template.getX(), template.getY(), template.getZ());
putDoor(door, MapRegionManager.getInstance().getMapRegionLocId(door)); _doors.put(door.getId(), door);
} }
public StatSet getDoorTemplate(int doorId) public StatSet getDoorTemplate(int doorId)
@ -138,17 +136,6 @@ public class DoorData implements IXmlReader
return _doors.get(doorId); return _doors.get(doorId);
} }
public void putDoor(DoorInstance door, int region)
{
_doors.put(door.getId(), door);
if (!_regions.containsKey(region))
{
_regions.put(region, new ArrayList<>());
}
_regions.get(region).add(door);
}
public static void addDoorGroup(String groupName, int doorId) public static void addDoorGroup(String groupName, int doorId)
{ {
Set<Integer> set = _groups.get(groupName); Set<Integer> set = _groups.get(groupName);
@ -180,36 +167,39 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instanceId
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, int instanceId, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, int instanceId, boolean doubleFaceCheck)
{ {
Collection<DoorInstance> allDoors; final Collection<DoorInstance> doors;
if ((instanceId > 0) && (InstanceManager.getInstance().getInstance(instanceId) != null)) if (instanceId < 1)
{ {
allDoors = InstanceManager.getInstance().getInstance(instanceId).getDoors(); final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
} }
else else
{ {
allDoors = _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Instance instance = InstanceManager.getInstance().getInstance(instanceId);
if (instance != null)
{
doors = instance.getDoors();
}
else
{
doors = null;
}
} }
if ((doors == null) || doors.isEmpty())
if (allDoors == null)
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,11 +17,9 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -31,11 +29,13 @@ import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.InstanceManager; import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance;
/** /**
* Loads doors. * Loads doors.
@ -46,7 +46,6 @@ public class DoorData implements IXmlReader
private static final Map<String, Set<Integer>> _groups = new HashMap<>(); private static final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -58,7 +57,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/Doors.xml"); parseDatapackFile("data/Doors.xml");
} }
@ -88,7 +86,7 @@ public class DoorData implements IXmlReader
} }
} }
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " door templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public void insertCollisionData(StatSet set) public void insertCollisionData(StatSet set)
@ -125,7 +123,7 @@ public class DoorData implements IXmlReader
final DoorInstance door = new DoorInstance(template); final DoorInstance door = new DoorInstance(template);
door.setCurrentHp(door.getMaxHp()); door.setCurrentHp(door.getMaxHp());
door.spawnMe(template.getX(), template.getY(), template.getZ()); door.spawnMe(template.getX(), template.getY(), template.getZ());
putDoor(door, MapRegionManager.getInstance().getMapRegionLocId(door)); _doors.put(door.getId(), door);
} }
public StatSet getDoorTemplate(int doorId) public StatSet getDoorTemplate(int doorId)
@ -138,17 +136,6 @@ public class DoorData implements IXmlReader
return _doors.get(doorId); return _doors.get(doorId);
} }
public void putDoor(DoorInstance door, int region)
{
_doors.put(door.getId(), door);
if (!_regions.containsKey(region))
{
_regions.put(region, new ArrayList<>());
}
_regions.get(region).add(door);
}
public static void addDoorGroup(String groupName, int doorId) public static void addDoorGroup(String groupName, int doorId)
{ {
Set<Integer> set = _groups.get(groupName); Set<Integer> set = _groups.get(groupName);
@ -180,36 +167,39 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instanceId, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instanceId
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, int instanceId, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, int instanceId, boolean doubleFaceCheck)
{ {
Collection<DoorInstance> allDoors; final Collection<DoorInstance> doors;
if ((instanceId > 0) && (InstanceManager.getInstance().getInstance(instanceId) != null)) if (instanceId < 1)
{ {
allDoors = InstanceManager.getInstance().getInstance(instanceId).getDoors(); final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
} }
else else
{ {
allDoors = _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Instance instance = InstanceManager.getInstance().getInstance(instanceId);
if (instance != null)
{
doors = instance.getDoors();
}
else
{
doors = null;
}
} }
if ((doors == null) || doors.isEmpty())
if (allDoors == null)
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;

View File

@ -17,12 +17,10 @@
package org.l2jmobius.gameserver.data.xml; package org.l2jmobius.gameserver.data.xml;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -33,9 +31,10 @@ import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.IXmlReader;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.Location; import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.StatSet; import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.WorldRegion;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance; import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate; import org.l2jmobius.gameserver.model.actor.templates.DoorTemplate;
import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.instancezone.Instance;
@ -52,7 +51,6 @@ public class DoorData implements IXmlReader
private final Map<String, Set<Integer>> _groups = new HashMap<>(); private final Map<String, Set<Integer>> _groups = new HashMap<>();
private final Map<Integer, DoorInstance> _doors = new HashMap<>(); private final Map<Integer, DoorInstance> _doors = new HashMap<>();
private final Map<Integer, StatSet> _templates = new HashMap<>(); private final Map<Integer, StatSet> _templates = new HashMap<>();
private final Map<Integer, List<DoorInstance>> _regions = new HashMap<>();
protected DoorData() protected DoorData()
{ {
@ -64,7 +62,6 @@ public class DoorData implements IXmlReader
{ {
_doors.clear(); _doors.clear();
_groups.clear(); _groups.clear();
_regions.clear();
parseDatapackFile("data/DoorData.xml"); parseDatapackFile("data/DoorData.xml");
} }
@ -72,7 +69,7 @@ public class DoorData implements IXmlReader
public void parseDocument(Document doc, File f) public void parseDocument(Document doc, File f)
{ {
forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode)))); forEach(doc, "list", listNode -> forEach(listNode, "door", doorNode -> spawnDoor(parseDoor(doorNode))));
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " Door Templates for " + _regions.size() + " regions."); LOGGER.info(getClass().getSimpleName() + ": Loaded " + _doors.size() + " doors.");
} }
public StatSet parseDoor(Node doorNode) public StatSet parseDoor(Node doorNode)
@ -151,7 +148,7 @@ public class DoorData implements IXmlReader
// Register the door // Register the door
_templates.put(door.getId(), set); _templates.put(door.getId(), set);
_doors.put(door.getId(), door); _doors.put(door.getId(), door);
_regions.computeIfAbsent(MapRegionManager.getInstance().getMapRegionLocId(door), key -> new ArrayList<>()).add(door);
return door; return door;
} }
@ -213,27 +210,31 @@ public class DoorData implements IXmlReader
return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false); return checkIfDoorsBetween(x, y, z, tx, ty, tz, instance, false);
} }
/**
* GodKratos: TODO: remove GeoData checks from door table and convert door nodes to Geo zones
* @param x
* @param y
* @param z
* @param tx
* @param ty
* @param tz
* @param instance
* @param doubleFaceCheck
* @return {@code boolean}
*/
public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck) public boolean checkIfDoorsBetween(int x, int y, int z, int tx, int ty, int tz, Instance instance, boolean doubleFaceCheck)
{ {
final Collection<DoorInstance> allDoors = (instance != null) ? instance.getDoors() : _regions.get(MapRegionManager.getInstance().getMapRegionLocId(x, y)); final Collection<DoorInstance> doors;
if (allDoors == null) if (instance == null)
{
final WorldRegion region = World.getInstance().getRegion(x, y);
if (region != null)
{
doors = region.getDoors();
}
else
{
doors = null;
}
}
else
{
doors = instance.getDoors();
}
if ((doors == null) || doors.isEmpty())
{ {
return false; return false;
} }
for (DoorInstance doorInst : allDoors) for (DoorInstance doorInst : doors)
{ {
// check dead and open // check dead and open
if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0)) if (doorInst.isDead() || doorInst.isOpen() || !doorInst.checkCollision() || (doorInst.getX(0) == 0))

View File

@ -16,6 +16,7 @@
*/ */
package org.l2jmobius.gameserver.model; package org.l2jmobius.gameserver.model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledFuture;
@ -23,6 +24,7 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.commons.concurrent.ThreadPool;
import org.l2jmobius.gameserver.model.actor.Attackable; import org.l2jmobius.gameserver.model.actor.Attackable;
import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.DoorInstance;
import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager; import org.l2jmobius.gameserver.taskmanager.RandomAnimationTaskManager;
import org.l2jmobius.gameserver.util.UnboundArrayList; import org.l2jmobius.gameserver.util.UnboundArrayList;
@ -30,6 +32,8 @@ public class WorldRegion
{ {
/** List containing visible objects in this world region. */ /** List containing visible objects in this world region. */
private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>(); private final UnboundArrayList<WorldObject> _visibleObjects = new UnboundArrayList<>();
/** List containing doors in this world region. */
private final List<DoorInstance> _doors = new ArrayList<>(1);
/** Array containing nearby regions forming this world region's effective area. */ /** Array containing nearby regions forming this world region's effective area. */
private WorldRegion[] _surroundingRegions; private WorldRegion[] _surroundingRegions;
private final int _regionX; private final int _regionX;
@ -230,6 +234,14 @@ public class WorldRegion
_visibleObjects.addIfAbsent(object); _visibleObjects.addIfAbsent(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
_surroundingRegions[i].addDoor((DoorInstance) object);
}
}
// If this is the first player to enter the region, activate self and neighbors. // If this is the first player to enter the region, activate self and neighbors.
if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && !_active && !Config.GRIDS_ALWAYS_ON)
{ {
@ -255,6 +267,14 @@ public class WorldRegion
_visibleObjects.remove(object); _visibleObjects.remove(object);
if (object.isDoor())
{
for (int i = 0; i < _surroundingRegions.length; i++)
{
removeDoor((DoorInstance) object);
}
}
if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON) if (object.isPlayable() && areNeighborsEmpty() && !Config.GRIDS_ALWAYS_ON)
{ {
startDeactivation(); startDeactivation();
@ -266,6 +286,24 @@ public class WorldRegion
return _visibleObjects; return _visibleObjects;
} }
public synchronized void addDoor(DoorInstance door)
{
if (!_doors.contains(door))
{
_doors.add(door);
}
}
private synchronized void removeDoor(DoorInstance door)
{
_doors.remove(door);
}
public List<DoorInstance> getDoors()
{
return _doors;
}
public void setSurroundingRegions(WorldRegion[] regions) public void setSurroundingRegions(WorldRegion[] regions)
{ {
_surroundingRegions = regions; _surroundingRegions = regions;