Pārlūkot izejas kodu

BETA: Reworking doors:
* Removing StatsSet from L2DoorInstance's constructor.
* Possibility to override every single param of each door from instance xmls.
* Created getters for L2DoorTemplate no more public variables access.
* Added Missing credits to DoorTable

* Reviewed by: Zoey76
* Tested by: Micr0

Rumen Nikiforov 12 gadi atpakaļ
vecāks
revīzija
fd17b64a83

+ 11 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/DoorTable.java

@@ -34,10 +34,15 @@ import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2DoorTemplate;
 import com.l2jserver.gameserver.pathfinding.AbstractNodeLoc;
 
+/**
+ * @author JIV, GodKratos, UnAfraid
+ */
 public class DoorTable extends DocumentParser
 {
-	private final Map<Integer, L2DoorInstance> _doors = new HashMap<>();
 	private static final Map<String, Set<Integer>> _groups = new HashMap<>();
+	
+	private final Map<Integer, L2DoorInstance> _doors = new HashMap<>();
+	private final Map<Integer, StatsSet> _templates = new HashMap<>();
 	private final Map<Integer, List<L2DoorInstance>> _regions = new HashMap<>();
 	
 	protected DoorTable()
@@ -77,6 +82,7 @@ public class DoorTable extends DocumentParser
 							set.set(att.getNodeName(), att.getNodeValue());
 						}
 						makeDoor(set);
+						_templates.put(set.getInteger("id"), set);
 					}
 				}
 			}
@@ -113,15 +119,15 @@ public class DoorTable extends DocumentParser
 	{
 		insertCollisionData(set);
 		L2DoorTemplate template = new L2DoorTemplate(set);
-		L2DoorInstance door = new L2DoorInstance(IdFactory.getInstance().getNextId(), template, set);
+		L2DoorInstance door = new L2DoorInstance(IdFactory.getInstance().getNextId(), template);
 		door.setCurrentHp(door.getMaxHp());
-		door.spawnMe(template.posX, template.posY, template.posZ);
+		door.spawnMe(template.getX(), template.getY(), template.getZ());
 		putDoor(door, MapRegionManager.getInstance().getMapRegionLocId(door));
 	}
 	
-	public L2DoorTemplate getDoorTemplate(int doorId)
+	public StatsSet getDoorTemplate(int doorId)
 	{
-		return _doors.get(doorId).getTemplate();
+		return _templates.get(doorId);
 	}
 	
 	public L2DoorInstance getDoor(int doorId)

+ 56 - 54
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2DoorInstance.java

@@ -34,7 +34,6 @@ import com.l2jserver.gameserver.instancemanager.TerritoryWarManager;
 import com.l2jserver.gameserver.model.L2CharPosition;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.knownlist.DoorKnownList;
@@ -64,11 +63,11 @@ public class L2DoorInstance extends L2Character
 {
 	protected static final Logger log = Logger.getLogger(L2DoorInstance.class.getName());
 	
-	private static final byte OPEN_BY_CLICK = 1;
-	private static final byte OPEN_BY_TIME = 2;
-	private static final byte OPEN_BY_ITEM = 4;
-	private static final byte OPEN_BY_SKILL = 8;
-	private static final byte OPEN_BY_CYCLE = 16;
+	public static final byte OPEN_BY_CLICK = 1;
+	public static final byte OPEN_BY_TIME = 2;
+	public static final byte OPEN_BY_ITEM = 4;
+	public static final byte OPEN_BY_SKILL = 8;
+	public static final byte OPEN_BY_CYCLE = 16;
 	
 	/** The castle index in the array of L2Castle this L2NpcInstance belongs to */
 	private int _castleIndex = -2;
@@ -78,47 +77,35 @@ public class L2DoorInstance extends L2Character
 	private boolean _open = false;
 	private boolean _isAttackableDoor = false;
 	private boolean _isTargetable;
-	private final boolean _checkCollision;
-	private int _openType = 0;
 	private int _meshindex = 1;
-	private int _level = 0;
-	protected int _closeTime = -1;
-	protected int _openTime = -1;
-	protected int _randomTime = -1;
 	// used for autoclose on open
 	private Future<?> _autoCloseTask;
 	
 	/**
 	 * @param objectId
 	 * @param template
-	 * @param data
 	 */
-	public L2DoorInstance(int objectId, L2DoorTemplate template, StatsSet data)
+	public L2DoorInstance(int objectId, L2DoorTemplate template)
 	{
 		super(objectId, template);
 		setInstanceType(InstanceType.L2DoorInstance);
 		setIsInvul(false);
 		setLethalable(false);
-		_isTargetable = data.getBool("targetable", true);
+		_open = template.isOpenByDefault();
+		_isAttackableDoor = template.isAttackable();
+		_isTargetable = template.isTargetable();
+		
 		if (getGroupName() != null)
 		{
 			DoorTable.addDoorGroup(getGroupName(), getDoorId());
 		}
-		if (data.getString("default_status", "close").equals("open"))
-		{
-			_open = true;
-		}
-		_closeTime = data.getInteger("close_time", -1);
-		_level = data.getInteger("level", 0);
-		_openType = data.getInteger("open_method", 0);
-		_checkCollision = data.getBool("check_collision", true);
+		
 		if (isOpenableByTime())
 		{
-			_openTime = data.getInteger("open_time");
-			_randomTime = data.getInteger("random_time", -1);
 			startTimerOpen();
 		}
-		int clanhallId = data.getInteger("clanhall_id", 0);
+		
+		int clanhallId = template.getClanHallId();
 		if (clanhallId > 0)
 		{
 			ClanHall hall = ClanHallManager.getAllClanHalls().get(clanhallId);
@@ -189,10 +176,10 @@ public class L2DoorInstance extends L2Character
 	
 	private void startTimerOpen()
 	{
-		int delay = _open ? _openTime : _closeTime;
-		if (_randomTime > 0)
+		int delay = _open ? getTemplate().getOpenTime() : getTemplate().getCloseTime();
+		if (getTemplate().getRandomTime() > 0)
 		{
-			delay += Rnd.get(_randomTime);
+			delay += Rnd.get(getTemplate().getRandomTime());
 		}
 		ThreadPoolManager.getInstance().scheduleGeneral(new TimerOpen(), delay * 1000);
 	}
@@ -240,35 +227,50 @@ public class L2DoorInstance extends L2Character
 		setStatus(new DoorStatus(this));
 	}
 	
+	/**
+	 * @return {@code true} if door is open-able by skill.
+	 */
 	public final boolean isOpenableBySkill()
 	{
-		return (_openType & OPEN_BY_SKILL) != 0;
+		return (getTemplate().getOpenType() & OPEN_BY_SKILL) == OPEN_BY_SKILL;
 	}
 	
+	/**
+	 * @return {@code true} if door is open-able by item.
+	 */
 	public final boolean isOpenableByItem()
 	{
-		return (_openType & OPEN_BY_ITEM) != 0;
+		return (getTemplate().getOpenType() & OPEN_BY_ITEM) == OPEN_BY_ITEM;
 	}
 	
+	/**
+	 * @return {@code true} if door is open-able by double-click.
+	 */
 	public final boolean isOpenableByClick()
 	{
-		return (_openType & OPEN_BY_CLICK) != 0;
+		return (getTemplate().getOpenType() & OPEN_BY_CLICK) == OPEN_BY_CLICK;
 	}
 	
+	/**
+	 * @return {@code true} if door is open-able by time.
+	 */
 	public final boolean isOpenableByTime()
 	{
-		return (_openType & OPEN_BY_TIME) != 0;
+		return (getTemplate().getOpenType() & OPEN_BY_TIME) == OPEN_BY_TIME;
 	}
 	
+	/**
+	 * @return {@code true} if door is open-able by Field Cycle system.
+	 */
 	public final boolean isOpenableByCycle()
 	{
-		return (_openType & OPEN_BY_CYCLE) != 0;
+		return (getTemplate().getOpenType() & OPEN_BY_CYCLE) == OPEN_BY_CYCLE;
 	}
 	
 	@Override
 	public final int getLevel()
 	{
-		return _level;
+		return getTemplate().getLevel();
 	}
 	
 	/**
@@ -276,7 +278,7 @@ public class L2DoorInstance extends L2Character
 	 */
 	public int getDoorId()
 	{
-		return getTemplate().doorId;
+		return getTemplate().getDoorId();
 	}
 	
 	/**
@@ -314,7 +316,7 @@ public class L2DoorInstance extends L2Character
 	
 	public boolean getIsShowHp()
 	{
-		return getTemplate().showHp;
+		return getTemplate().isShowHp();
 	}
 	
 	public void setIsAttackableDoor(boolean val)
@@ -589,7 +591,7 @@ public class L2DoorInstance extends L2Character
 	 */
 	private void notifyChildEvent(boolean open)
 	{
-		byte openThis = open ? getTemplate().masterDoorOpen : getTemplate().masterDoorClose;
+		byte openThis = open ? getTemplate().getMasterDoorOpen() : getTemplate().getMasterDoorClose();
 		
 		if (openThis == 0)
 		{
@@ -608,32 +610,32 @@ public class L2DoorInstance extends L2Character
 	@Override
 	public String toString()
 	{
-		return getClass().getSimpleName() + "[" + getTemplate().doorId + "](" + getObjectId() + ")";
+		return getClass().getSimpleName() + "[" + getTemplate().getDoorId() + "](" + getObjectId() + ")";
 	}
 	
 	public String getDoorName()
 	{
-		return getTemplate().name;
+		return getTemplate().getName();
 	}
 	
 	public int getX(int i)
 	{
-		return getTemplate().nodeX[i];
+		return getTemplate().getNodeX()[i];
 	}
 	
 	public int getY(int i)
 	{
-		return getTemplate().nodeY[i];
+		return getTemplate().getNodeY()[i];
 	}
 	
 	public int getZMin()
 	{
-		return getTemplate().nodeZ;
+		return getTemplate().getNodeZ();
 	}
 	
 	public int getZMax()
 	{
-		return getTemplate().nodeZ + getTemplate().height;
+		return getTemplate().getNodeZ() + getTemplate().getHeight();
 	}
 	
 	public Collection<L2DefenderInstance> getKnownDefenders()
@@ -664,22 +666,22 @@ public class L2DoorInstance extends L2Character
 	
 	public int getEmitter()
 	{
-		return getTemplate().emmiter;
+		return getTemplate().getEmmiter();
 	}
 	
 	public boolean isWall()
 	{
-		return getTemplate().isWall;
+		return getTemplate().isWall();
 	}
 	
 	public String getGroupName()
 	{
-		return getTemplate().groupName;
+		return getTemplate().getGroupName();
 	}
 	
 	public int getChildId()
 	{
-		return getTemplate().childDoorId;
+		return getTemplate().getChildDoorId();
 	}
 	
 	@Override
@@ -743,7 +745,7 @@ public class L2DoorInstance extends L2Character
 	
 	public boolean checkCollision()
 	{
-		return _checkCollision;
+		return getTemplate().isCheckCollision();
 	}
 	
 	/**
@@ -769,7 +771,7 @@ public class L2DoorInstance extends L2Character
 	
 	private void startAutoCloseTask()
 	{
-		if ((_closeTime < 0) || isOpenableByTime())
+		if ((getTemplate().getCloseTime() < 0) || isOpenableByTime())
 		{
 			return;
 		}
@@ -779,7 +781,7 @@ public class L2DoorInstance extends L2Character
 			_autoCloseTask = null;
 			oldTask.cancel(false);
 		}
-		_autoCloseTask = ThreadPoolManager.getInstance().scheduleGeneral(new AutoClose(), _closeTime * 1000);
+		_autoCloseTask = ThreadPoolManager.getInstance().scheduleGeneral(new AutoClose(), getTemplate().getCloseTime() * 1000);
 	}
 	
 	class AutoClose implements Runnable
@@ -810,10 +812,10 @@ public class L2DoorInstance extends L2Character
 			}
 			
 			// _log.info("Door "+L2DoorInstance.this+ " switched state "+open);
-			int delay = open ? _closeTime : _openTime;
-			if (_randomTime > 0)
+			int delay = open ? getTemplate().getCloseTime() : getTemplate().getOpenTime();
+			if (getTemplate().getRandomTime() > 0)
 			{
-				delay += Rnd.get(_randomTime);
+				delay += Rnd.get(getTemplate().getRandomTime());
 			}
 			ThreadPoolManager.getInstance().scheduleGeneral(this, delay * 1000);
 		}

+ 189 - 60
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2DoorTemplate.java

@@ -15,92 +15,221 @@
 package com.l2jserver.gameserver.model.actor.templates;
 
 import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.instance.L2DoorInstance;
 
 /**
  * @author JIV
  */
 public class L2DoorTemplate extends L2CharTemplate
 {
-	public final int doorId;
-	public final int nodeX[];
-	public final int nodeY[];
-	public final int nodeZ;
-	public final int height;
-	public final int posX;
-	public final int posY;
-	public final int posZ;
-	public final int emmiter;
-	public final int childDoorId;
-	public final String name;
-	public final String groupName;
-	public final boolean showHp;
-	public final boolean isWall;
+	private final int _doorId;
+	private final int _nodeX[];
+	private final int _nodeY[];
+	private final int _nodeZ;
+	private final int _height;
+	private final int _posX;
+	private final int _posY;
+	private final int _posZ;
+	private final int _emmiter;
+	private final int _childDoorId;
+	private final String _name;
+	private final String _groupName;
+	private final boolean _showHp;
+	private final boolean _isWall;
 	// -1 close, 0 nothing, 1 open
-	public final byte masterDoorClose;
-	public final byte masterDoorOpen;
+	private final byte _masterDoorClose;
+	private final byte _masterDoorOpen;
+	
+	private final boolean _isTargetable;
+	private final boolean _default_status;
+	
+	private int _openTime;
+	private int _randomTime;
+	private final int _closeTime;
+	private final int _level;
+	private final int _openType;
+	private final boolean _checkCollision;
+	private final boolean _isAttackableDoor;
+	private final int _clanhallId;
 	
 	public L2DoorTemplate(StatsSet set)
 	{
 		super(set);
-		
-		// stats
-		doorId = set.getInteger("id");
-		name = set.getString("name");
+		_doorId = set.getInteger("id");
+		_name = set.getString("name");
 		
 		// position
 		String[] pos = set.getString("pos").split(";");
-		posX = Integer.parseInt(pos[0]);
-		posY = Integer.parseInt(pos[1]);
-		posZ = Integer.parseInt(pos[2]);
-		height = set.getInteger("height");
-		
-		// TODO: move to geodata system by creating door zones and load there
-		nodeZ = set.getInteger("nodeZ");
-		nodeX = new int[4]; // 4 * x
-		nodeY = new int[4]; // 4 * y
+		_posX = Integer.parseInt(pos[0]);
+		_posY = Integer.parseInt(pos[1]);
+		_posZ = Integer.parseInt(pos[2]);
+		_height = set.getInteger("height");
+		_nodeZ = set.getInteger("nodeZ");
+		_nodeX = new int[4]; // 4 * x
+		_nodeY = new int[4]; // 4 * y
 		for (int i = 0; i < 4; i++)
 		{
 			String split[] = set.getString("node" + (i + 1)).split(",");
-			nodeX[i] = Integer.parseInt(split[0]);
-			nodeY[i] = Integer.parseInt(split[1]);
+			_nodeX[i] = Integer.parseInt(split[0]);
+			_nodeY[i] = Integer.parseInt(split[1]);
 		}
 		
 		// optional
-		emmiter = set.getInteger("emitter_id", 0);
-		showHp = set.getBool("hp_showable", true);
-		isWall = set.getBool("is_wall", false);
-		groupName = set.getString("group", null);
+		_emmiter = set.getInteger("emitter_id", 0);
+		_showHp = set.getBool("hp_showable", true);
+		_isWall = set.getBool("is_wall", false);
+		_groupName = set.getString("group", null);
 		
-		childDoorId = set.getInteger("child_id_event", -1);
+		_childDoorId = set.getInteger("child_id_event", -1);
 		// true if door is opening
 		String masterevent = set.getString("master_close_event", "act_nothing");
-		if (masterevent.equals("act_open"))
-		{
-			masterDoorClose = 1;
-		}
-		else if (masterevent.equals("act_close"))
-		{
-			masterDoorClose = -1;
-		}
-		else
-		{
-			masterDoorClose = 0;
-		}
-		// #2
+		_masterDoorClose = (byte) (masterevent.equals("act_open") ? 1 : masterevent.equals("act_close") ? -1 : 0);
+		
 		masterevent = set.getString("master_open_event", "act_nothing");
-		if (masterevent.equals("act_open"))
-		{
-			masterDoorOpen = 1;
-		}
-		else if (masterevent.equals("act_close"))
-		{
-			masterDoorOpen = -1;
-		}
-		else
+		_masterDoorOpen = (byte) (masterevent.equals("act_open") ? 1 : masterevent.equals("act_close") ? -1 : 0);
+		
+		_isTargetable = set.getBool("targetable", true);
+		_default_status = set.getString("default_status", "close").equals("open");
+		_closeTime = set.getInteger("close_time", -1);
+		_level = set.getInteger("level", 0);
+		_openType = set.getInteger("open_method", 0);
+		_checkCollision = set.getBool("check_collision", true);
+		if ((_openType & L2DoorInstance.OPEN_BY_TIME) == L2DoorInstance.OPEN_BY_TIME)
 		{
-			masterDoorOpen = 0;
+			_openTime = set.getInteger("open_time");
+			_randomTime = set.getInteger("random_time", -1);
 		}
-		
+		_isAttackableDoor = set.getBool("is_attackable", false);
+		_clanhallId = set.getInteger("clanhall_id", 0);
+	}
+	
+	public int getDoorId()
+	{
+		return _doorId;
+	}
+	
+	public String getName()
+	{
+		return _name;
+	}
+	
+	public int[] getNodeX()
+	{
+		return _nodeX;
+	}
+	
+	public int[] getNodeY()
+	{
+		return _nodeY;
+	}
+	
+	public int getNodeZ()
+	{
+		return _nodeZ;
+	}
+	
+	public int getHeight()
+	{
+		return _height;
+	}
+	
+	public int getX()
+	{
+		return _posX;
+	}
+	
+	public int getY()
+	{
+		return _posY;
+	}
+	
+	public int getZ()
+	{
+		return _posZ;
+	}
+	
+	public int getEmmiter()
+	{
+		return _emmiter;
 	}
 	
+	public int getChildDoorId()
+	{
+		return _childDoorId;
+	}
+	
+	public String getGroupName()
+	{
+		return _groupName;
+	}
+	
+	public boolean isShowHp()
+	{
+		return _showHp;
+	}
+	
+	public boolean isWall()
+	{
+		return _isWall;
+	}
+	
+	public byte getMasterDoorOpen()
+	{
+		return _masterDoorOpen;
+	}
+	
+	public byte getMasterDoorClose()
+	{
+		return _masterDoorClose;
+	}
+	
+	public boolean isTargetable()
+	{
+		return _isTargetable;
+	}
+	
+	public boolean isOpenByDefault()
+	{
+		return _default_status;
+	}
+	
+	public int getOpenTime()
+	{
+		return _openTime;
+	}
+	
+	public int getRandomTime()
+	{
+		return _randomTime;
+	}
+	
+	public int getCloseTime()
+	{
+		return _closeTime;
+	}
+	
+	public int getLevel()
+	{
+		return _level;
+	}
+	
+	public int getOpenType()
+	{
+		return _openType;
+	}
+	
+	public boolean isCheckCollision()
+	{
+		return _checkCollision;
+	}
+	
+	public boolean isAttackable()
+	{
+		return _isAttackableDoor;
+	}
+	
+	public int getClanHallId()
+	{
+		return _clanhallId;
+	}
 }

+ 6 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Instance.java

@@ -212,10 +212,10 @@ public class Instance
 	
 	/**
 	 * Adds a door into the instance
-	 * @param doorId - from doorData.xml
+	 * @param doorId - from doors.xml
 	 * @param set - StatsSet for initializing door
 	 */
-	private void addDoor(int doorId, StatsSet set)
+	public void addDoor(int doorId, StatsSet set)
 	{
 		if (_doors.containsKey(doorId))
 		{
@@ -223,11 +223,11 @@ public class Instance
 			return;
 		}
 		
-		L2DoorTemplate temp = DoorTable.getInstance().getDoorTemplate(doorId);
-		L2DoorInstance newdoor = new L2DoorInstance(IdFactory.getInstance().getNextId(), temp, set);
+		L2DoorTemplate temp = new L2DoorTemplate(set);
+		L2DoorInstance newdoor = new L2DoorInstance(IdFactory.getInstance().getNextId(), temp);
 		newdoor.setInstanceId(getId());
 		newdoor.setCurrentHp(newdoor.getMaxHp());
-		newdoor.spawnMe(temp.posX, temp.posY, temp.posZ);
+		newdoor.spawnMe(temp.getX(), temp.getY(), temp.getZ());
 		_doors.put(doorId, newdoor);
 	}
 	
@@ -448,6 +448,7 @@ public class Instance
 					{
 						doorId = Integer.parseInt(d.getAttributes().getNamedItem("doorId").getNodeValue());
 						StatsSet set = new StatsSet();
+						set.add(DoorTable.getInstance().getDoorTemplate(doorId));
 						for (Node bean = d.getFirstChild(); bean != null; bean = bean.getNextSibling())
 						{
 							if ("set".equalsIgnoreCase(bean.getNodeName()))