Support for separate zones in instances.

This commit is contained in:
MobiusDev
2018-04-10 06:50:38 +00:00
parent 9889144248
commit ebcea6647f

View File

@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger; import java.util.logging.Logger;
import com.l2jmobius.gameserver.enums.InstanceType; import com.l2jmobius.gameserver.enums.InstanceType;
import com.l2jmobius.gameserver.instancemanager.InstanceManager;
import com.l2jmobius.gameserver.model.L2Object; import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.actor.L2Character; import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
@ -31,6 +32,7 @@ import com.l2jmobius.gameserver.model.events.EventDispatcher;
import com.l2jmobius.gameserver.model.events.ListenersContainer; import com.l2jmobius.gameserver.model.events.ListenersContainer;
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureZoneEnter; import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureZoneEnter;
import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureZoneExit; import com.l2jmobius.gameserver.model.events.impl.character.OnCreatureZoneExit;
import com.l2jmobius.gameserver.model.instancezone.InstanceWorld;
import com.l2jmobius.gameserver.model.interfaces.ILocational; import com.l2jmobius.gameserver.model.interfaces.ILocational;
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket; import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@ -58,6 +60,7 @@ public abstract class L2ZoneType extends ListenersContainer
private boolean _allowStore; private boolean _allowStore;
protected boolean _enabled; protected boolean _enabled;
private AbstractZoneSettings _settings; private AbstractZoneSettings _settings;
private int _instanceTemplateId = -1;
private int _instanceId = -1; private int _instanceId = -1;
protected L2ZoneType(int id) protected L2ZoneType(int id)
@ -182,7 +185,7 @@ public abstract class L2ZoneType extends ListenersContainer
} }
else if (name.equals("instanceId")) else if (name.equals("instanceId"))
{ {
_instanceId = Integer.parseInt(value); _instanceTemplateId = Integer.parseInt(value);
} }
else else
{ {
@ -196,6 +199,16 @@ public abstract class L2ZoneType extends ListenersContainer
*/ */
private boolean isAffected(L2Character character) private boolean isAffected(L2Character character)
{ {
// Check instance Template Id
if (_instanceTemplateId > 0)
{
final InstanceWorld world = InstanceManager.getInstance().getWorld(character.getInstanceId());
if ((world != null) && (world.getTemplateId() != _instanceTemplateId))
{
return false;
}
}
if ((character.getLevel() < _minLvl) || (character.getLevel() > _maxLvl) || !character.isInstanceTypes(_target)) if ((character.getLevel() < _minLvl) || (character.getLevel() > _maxLvl) || !character.isInstanceTypes(_target))
{ {
return false; return false;
@ -320,6 +333,24 @@ public abstract class L2ZoneType extends ListenersContainer
return _instanceId; return _instanceId;
} }
/**
* Set the zone instance Template Id .
* @param instanceTemplateId
*/
public void setInstanceTemplateId(int instanceTemplateId)
{
_instanceTemplateId = instanceTemplateId;
}
/**
* Returns zone instance TemplateId
* @return
*/
public int getInstanceTemplateId()
{
return _instanceTemplateId;
}
/** /**
* Checks if the given coordinates are within zone's plane * Checks if the given coordinates are within zone's plane
* @param x * @param x
@ -353,31 +384,6 @@ public abstract class L2ZoneType extends ListenersContainer
return _zone.isInsideZone(x, y, z); return _zone.isInsideZone(x, y, z);
} }
/**
* Checks if the given coordinates are within the zone and the instanceId used matched the zone's instanceId
* @param x
* @param y
* @param z
* @param instanceId
* @return
*/
public boolean isInsideZone(int x, int y, int z, int instanceId)
{
// It will check if coords are within the zone if the given instanceId or
// the zone's _instanceId are in the multiverse or they match
return ((_instanceId == -1) || (instanceId == -1) || (_instanceId == instanceId)) && _zone.isInsideZone(x, y, z);
}
/**
* Checks if the given object is inside the zone.
* @param object
* @return
*/
public boolean isInsideZone(L2Object object)
{
return isInsideZone(object.getX(), object.getY(), object.getZ(), object.getInstanceId());
}
public double getDistanceToZone(int x, int y) public double getDistanceToZone(int x, int y)
{ {
return getZone().getDistanceToZone(x, y); return getZone().getDistanceToZone(x, y);