Partially reverted latest timed zone changes.
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
|
|||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -18,8 +19,6 @@
|
|||||||
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
|
|||||||
+7
-13
@@ -85,14 +85,13 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 150000;
|
int entryFee = 150000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
boolean weekly = false;
|
boolean weekly = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -144,6 +143,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -164,19 +168,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
weekly = Boolean.parseBoolean(zoneNode.getTextContent());
|
weekly = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -891,7 +891,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private final List<QuestTimer> _questTimers = new ArrayList<>();
|
private final List<QuestTimer> _questTimers = new ArrayList<>();
|
||||||
@@ -4148,52 +4147,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final int relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14628,23 +14581,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -41,10 +42,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -55,14 +54,13 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
_weekly = weekly;
|
_weekly = weekly;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -112,6 +110,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -142,16 +145,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -67,6 +67,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String CLAN_CONTRIBUTION_REWARDED = "CLAN_CONTRIBUTION_REWARDED";
|
public static final String CLAN_CONTRIBUTION_REWARDED = "CLAN_CONTRIBUTION_REWARDED";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -857,7 +857,7 @@ public enum OutgoingPackets
|
|||||||
EX_PVPBOOK_NEW_PK(0xFE, 0x23C),
|
EX_PVPBOOK_NEW_PK(0xFE, 0x23C),
|
||||||
EX_PLEDGE_MERCENARY_MEMBER_JOIN(0xFE, 0x23D),
|
EX_PLEDGE_MERCENARY_MEMBER_JOIN(0xFE, 0x23D),
|
||||||
EX_RAID_DROP_ITEM_ANNOUNCE(0xFE, 0x23E),
|
EX_RAID_DROP_ITEM_ANNOUNCE(0xFE, 0x23E),
|
||||||
EX_LETTER_COLLECTOR_UI_LAUNCER(0xFE, 0x23F),
|
EX_LETTER_COLLECTOR_UI_LAUNCHER(0xFE, 0x23F),
|
||||||
EX_OLYMPIAD_MY_RANKING_INFO(0xFE, 0x240),
|
EX_OLYMPIAD_MY_RANKING_INFO(0xFE, 0x240),
|
||||||
EX_OLYMPIAD_RANKING_INFO(0xFE, 0x241),
|
EX_OLYMPIAD_RANKING_INFO(0xFE, 0x241),
|
||||||
EX_OLYMPIAD_HERO_AND_LEGEND_INFO(0xFE, 0x242),
|
EX_OLYMPIAD_HERO_AND_LEGEND_INFO(0xFE, 0x242),
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
@@ -25,6 +27,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>107</minLevel>
|
<minLevel>107</minLevel>
|
||||||
@@ -35,6 +38,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>99</minLevel>
|
<minLevel>99</minLevel>
|
||||||
@@ -45,6 +49,7 @@
|
|||||||
<initialTime>36000</initialTime> <!-- 10 hours -->
|
<initialTime>36000</initialTime> <!-- 10 hours -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>36000</maxAddedTime> <!-- 12 hours -->
|
<maxAddedTime>36000</maxAddedTime> <!-- 12 hours -->
|
||||||
|
<remainRefillTime>0</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>110</minLevel>
|
<minLevel>110</minLevel>
|
||||||
@@ -57,6 +62,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
||||||
|
<remainRefillTime>0</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
|
|||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -19,8 +20,6 @@
|
|||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
@@ -30,4 +29,4 @@
|
|||||||
<xs:attribute type="xs:boolean" name="enabled" />
|
<xs:attribute type="xs:boolean" name="enabled" />
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 150000;
|
int entryFee = 150000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -899,7 +899,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private final HomunculusList _homunculusList = new HomunculusList(this);
|
private final HomunculusList _homunculusList = new HomunculusList(this);
|
||||||
@@ -4186,52 +4185,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14739,23 +14692,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -67,6 +67,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String CLAN_CONTRIBUTION_REWARDED = "CLAN_CONTRIBUTION_REWARDED";
|
public static final String CLAN_CONTRIBUTION_REWARDED = "CLAN_CONTRIBUTION_REWARDED";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
+20
-30
@@ -1,37 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/TimedHuntingZoneData.xsd">
|
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/TimedHuntingZoneData.xsd">
|
||||||
<zone id="1" name="Storm Isle">
|
<zone id="1" name="Storm Isle">
|
||||||
<enterLocation>194284,176597,-1888</enterLocation>
|
<enterLocation>194291,176604,-1888</enterLocation>
|
||||||
<exitLocation>110975,220094,-3664</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="6" name="Primeval Isle">
|
<zone id="6" name="Primeval Isle">
|
||||||
<enterLocation>9365,-21407,-3584</enterLocation>
|
<enterLocation>9400,-21720,-3634</enterLocation>
|
||||||
<exitLocation>43792,-48928,-792</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="7" name="Isle of Souls">
|
<zone id="7" name="Isle of Souls">
|
||||||
<enterLocation>-122260,73669,-2872</enterLocation>
|
<enterLocation>-122259,73678,-2872</enterLocation>
|
||||||
<exitLocation>148353,28032,-2264</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>86400</resetDelay> <!-- 10 days -->
|
<resetDelay>86400</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>107</minLevel>
|
<minLevel>107</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
@@ -39,50 +36,46 @@
|
|||||||
<soloInstance>false</soloInstance>
|
<soloInstance>false</soloInstance>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="11" name="Abandoned Coal Mines">
|
<zone id="11" name="Abandoned Coal Mines">
|
||||||
<enterLocation>139405,-169389,-1600</enterLocation>
|
<enterLocation>139411,-169382,-1600</enterLocation>
|
||||||
<exitLocation>146561,28042,-2264</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>18000</refillTimeMax>
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>99</minLevel>
|
<minLevel>99</minLevel>
|
||||||
<maxLevel>105</maxLevel>
|
<maxLevel>105</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="8" name="Tower of Insolence">
|
<zone id="8" name="Tower of Insolence">
|
||||||
<enterLocation>-82014,16247,-15416</enterLocation>
|
<enterLocation>-82014,16247,-15416</enterLocation>
|
||||||
<initialTime>36000</initialTime> <!-- 10 hours -->
|
<initialTime>36000</initialTime> <!-- 10 hours -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>36000</maxAddedTime> <!-- 12 hours -->
|
<maxAddedTime>36000</maxAddedTime> <!-- 12 hours -->
|
||||||
|
<remainRefillTime>0</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>110</minLevel>
|
<minLevel>110</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<instanceId>1020</instanceId>
|
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<weekly>true</weekly>
|
<weekly>true</weekly>
|
||||||
<useWorldPrefix>true</useWorldPrefix>
|
<useWorldPrefix>true</useWorldPrefix>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="12" name="Imperial Tomb">
|
<zone id="12" name="Imperial Tomb">
|
||||||
<enterLocation>181406,-78395,-2728</enterLocation>
|
<enterLocation>181409,-78389,-2728</enterLocation>
|
||||||
<exitLocation>147714,-55409,-2728</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
||||||
<refillTimeMax>0</refillTimeMax>
|
<remainRefillTime>0</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="13" name="Corroded Fields">
|
<zone id="13" name="Corroded Fields">
|
||||||
<enterLocation>90359,198833,-3280</enterLocation>
|
<enterLocation>90327,198818,-3280</enterLocation>
|
||||||
<exitLocation>111563,220512,-3664</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 3 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 3 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
<refillTimeMax>36000</refillTimeMax>
|
<refillTimeMax>36000</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
@@ -91,16 +84,13 @@
|
|||||||
<soloInstance>false</soloInstance>
|
<soloInstance>false</soloInstance>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="14" name="Otherworldly Atelia Refinery">
|
<zone id="14" name="Otherworldly Atelia Refinery">
|
||||||
<enterLocation>-49020,15369,-8808</enterLocation>
|
<enterLocation>-49013,15351,-8808</enterLocation>
|
||||||
<exitLocation>82795,53888,-1488</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>112</minLevel>
|
<minLevel>112</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<weekly>true</weekly>
|
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
</list>
|
</list>
|
||||||
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -19,8 +20,6 @@
|
|||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
@@ -30,4 +29,4 @@
|
|||||||
<xs:attribute type="xs:boolean" name="enabled" />
|
<xs:attribute type="xs:boolean" name="enabled" />
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 150000;
|
int entryFee = 150000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-25
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
-59
@@ -912,7 +912,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private final HomunculusList _homunculusList = new HomunculusList(this);
|
private final HomunculusList _homunculusList = new HomunculusList(this);
|
||||||
@@ -4203,52 +4202,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14777,23 +14730,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -68,6 +68,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String BALTHUS_REWARD = "BALTHUS_REWARD";
|
public static final String BALTHUS_REWARD = "BALTHUS_REWARD";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
@@ -1,37 +1,34 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/TimedHuntingZoneData.xsd">
|
<list enabled="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xsd/TimedHuntingZoneData.xsd">
|
||||||
<zone id="1" name="Storm Isle">
|
<zone id="1" name="Storm Isle">
|
||||||
<enterLocation>194284,176597,-1888</enterLocation>
|
<enterLocation>194291,176604,-1888</enterLocation>
|
||||||
<exitLocation>110975,220094,-3664</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="6" name="Primeval Isle">
|
<zone id="6" name="Primeval Isle">
|
||||||
<enterLocation>9365,-21407,-3584</enterLocation>
|
<enterLocation>9400,-21720,-3634</enterLocation>
|
||||||
<exitLocation>43792,-48928,-792</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="7" name="Isle of Souls">
|
<zone id="7" name="Isle of Souls">
|
||||||
<enterLocation>-122260,73669,-2872</enterLocation>
|
<enterLocation>-122259,73678,-2872</enterLocation>
|
||||||
<exitLocation>148353,28032,-2264</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>86400</resetDelay> <!-- 10 days -->
|
<resetDelay>86400</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>107</minLevel>
|
<minLevel>107</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
@@ -39,23 +36,22 @@
|
|||||||
<soloInstance>false</soloInstance>
|
<soloInstance>false</soloInstance>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="11" name="Abandoned Coal Mines">
|
<zone id="11" name="Abandoned Coal Mines">
|
||||||
<enterLocation>139405,-169389,-1600</enterLocation>
|
<enterLocation>139411,-169382,-1600</enterLocation>
|
||||||
<exitLocation>146561,28042,-2264</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
<refillTimeMax>18000</refillTimeMax>
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>99</minLevel>
|
<minLevel>99</minLevel>
|
||||||
<maxLevel>105</maxLevel>
|
<maxLevel>105</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="20" name="Tower of Insolence (01 - 09 flours)">
|
<zone id="20" name="Tower of Insolence (01 - 09 flours)">
|
||||||
<enterLocation>-82014,16247,-15416</enterLocation>
|
<enterLocation>-82014,16247,-15416</enterLocation>
|
||||||
<initialTime>36000</initialTime> <!-- 10 hours -->
|
<initialTime>36000</initialTime> <!-- 10 hours -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>54000</maxAddedTime> <!-- 15 hours -->
|
<maxAddedTime>54000</maxAddedTime> <!-- 15 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime> <!-- 300 mins -->
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>1500000</entryFee>
|
<entryFee>1500000</entryFee>
|
||||||
<minLevel>110</minLevel>
|
<minLevel>110</minLevel>
|
||||||
@@ -66,23 +62,22 @@
|
|||||||
<useWorldPrefix>true</useWorldPrefix>
|
<useWorldPrefix>true</useWorldPrefix>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="12" name="Imperial Tomb">
|
<zone id="12" name="Imperial Tomb">
|
||||||
<enterLocation>181406,-78395,-2728</enterLocation>
|
<enterLocation>181409,-78389,-2728</enterLocation>
|
||||||
<exitLocation>147714,-55409,-2728</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
<maxAddedTime>3600</maxAddedTime> <!-- 1 hour -->
|
||||||
<refillTimeMax>0</refillTimeMax>
|
<remainRefillTime>0</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>105</minLevel>
|
<minLevel>105</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="13" name="Corroded Fields">
|
<zone id="13" name="Corroded Fields">
|
||||||
<enterLocation>90359,198833,-3280</enterLocation>
|
<enterLocation>90327,198818,-3280</enterLocation>
|
||||||
<exitLocation>111563,220512,-3664</exitLocation>
|
|
||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 3 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 3 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
<refillTimeMax>36000</refillTimeMax>
|
<refillTimeMax>36000</refillTimeMax>
|
||||||
<entryFee>150000</entryFee>
|
<entryFee>150000</entryFee>
|
||||||
<minLevel>100</minLevel>
|
<minLevel>100</minLevel>
|
||||||
@@ -91,17 +86,15 @@
|
|||||||
<soloInstance>false</soloInstance>
|
<soloInstance>false</soloInstance>
|
||||||
</zone>
|
</zone>
|
||||||
<zone id="15" name="Otherworldly Atelia Refinery">
|
<zone id="15" name="Otherworldly Atelia Refinery">
|
||||||
<enterLocation>-49020,15369,-8808</enterLocation>
|
<enterLocation>-49013,15351,-8808</enterLocation>
|
||||||
<exitLocation>82795,53888,-1488</exitLocation>
|
|
||||||
<initialTime>36000</initialTime> <!-- 10 hour -->
|
<initialTime>36000</initialTime> <!-- 10 hour -->
|
||||||
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
<resetDelay>864000</resetDelay> <!-- 10 days -->
|
||||||
<maxAddedTime>43200</maxAddedTime> <!-- 12 hours -->
|
<maxAddedTime>43200</maxAddedTime> <!-- 12 hours -->
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<remainRefillTime>0</remainRefillTime>
|
||||||
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>1500000</entryFee>
|
<entryFee>1500000</entryFee>
|
||||||
<minLevel>112</minLevel>
|
<minLevel>112</minLevel>
|
||||||
<maxLevel>130</maxLevel>
|
<maxLevel>130</maxLevel>
|
||||||
<soloInstance>false</soloInstance>
|
|
||||||
<weekly>true</weekly>
|
<weekly>true</weekly>
|
||||||
<noPvpZone>true</noPvpZone>
|
|
||||||
</zone>
|
</zone>
|
||||||
</list>
|
</list>
|
||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -19,8 +20,6 @@
|
|||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
@@ -30,4 +29,4 @@
|
|||||||
<xs:attribute type="xs:boolean" name="enabled" />
|
<xs:attribute type="xs:boolean" name="enabled" />
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 150000;
|
int entryFee = 150000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -914,7 +914,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private final HomunculusList _homunculusList = new HomunculusList(this);
|
private final HomunculusList _homunculusList = new HomunculusList(this);
|
||||||
@@ -4252,52 +4251,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14855,23 +14808,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -68,6 +68,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String BALTHUS_REWARD = "BALTHUS_REWARD";
|
public static final String BALTHUS_REWARD = "BALTHUS_REWARD";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>18000</maxAddedTime> <!-- 5 hours -->
|
<maxAddedTime>18000</maxAddedTime> <!-- 5 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>78</minLevel>
|
<minLevel>78</minLevel>
|
||||||
|
|||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-2
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -18,8 +19,6 @@
|
|||||||
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
|
|||||||
+7
-13
@@ -85,14 +85,13 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 150000;
|
int entryFee = 150000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
boolean weekly = false;
|
boolean weekly = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -144,6 +143,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -164,19 +168,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
weekly = Boolean.parseBoolean(zoneNode.getTextContent());
|
weekly = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-25
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
-59
@@ -882,7 +882,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private final List<QuestTimer> _questTimers = new ArrayList<>();
|
private final List<QuestTimer> _questTimers = new ArrayList<>();
|
||||||
@@ -4098,52 +4097,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final int relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14541,23 +14494,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -41,10 +42,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -55,14 +54,13 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
_weekly = weekly;
|
_weekly = weekly;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -112,6 +110,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -142,16 +145,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -61,6 +61,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -857,7 +857,7 @@ public enum OutgoingPackets
|
|||||||
EX_PVPBOOK_NEW_PK(0xFE, 0x23C),
|
EX_PVPBOOK_NEW_PK(0xFE, 0x23C),
|
||||||
EX_PLEDGE_MERCENARY_MEMBER_JOIN(0xFE, 0x23D),
|
EX_PLEDGE_MERCENARY_MEMBER_JOIN(0xFE, 0x23D),
|
||||||
EX_RAID_DROP_ITEM_ANNOUNCE(0xFE, 0x23E),
|
EX_RAID_DROP_ITEM_ANNOUNCE(0xFE, 0x23E),
|
||||||
EX_LETTER_COLLECTOR_UI_LAUNCER(0xFE, 0x23F),
|
EX_LETTER_COLLECTOR_UI_LAUNCHER(0xFE, 0x23F),
|
||||||
EX_OLYMPIAD_MY_RANKING_INFO(0xFE, 0x240),
|
EX_OLYMPIAD_MY_RANKING_INFO(0xFE, 0x240),
|
||||||
EX_OLYMPIAD_RANKING_INFO(0xFE, 0x241),
|
EX_OLYMPIAD_RANKING_INFO(0xFE, 0x241),
|
||||||
EX_OLYMPIAD_HERO_AND_LEGEND_INFO(0xFE, 0x242),
|
EX_OLYMPIAD_HERO_AND_LEGEND_INFO(0xFE, 0x242),
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
|
||||||
}
|
}
|
||||||
|
|||||||
+10
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>43200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>40</minLevel>
|
<minLevel>40</minLevel>
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>76</minLevel>
|
<minLevel>76</minLevel>
|
||||||
@@ -25,6 +27,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>60</minLevel>
|
<minLevel>60</minLevel>
|
||||||
@@ -35,6 +38,7 @@
|
|||||||
<initialTime>25200</initialTime> <!-- 7 hours -->
|
<initialTime>25200</initialTime> <!-- 7 hours -->
|
||||||
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
||||||
<maxAddedTime>151200</maxAddedTime> <!-- 42 hours -->
|
<maxAddedTime>151200</maxAddedTime> <!-- 42 hours -->
|
||||||
|
<remainRefillTime>126000</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -46,6 +50,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>40</minLevel>
|
<minLevel>40</minLevel>
|
||||||
@@ -57,6 +62,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>50</minLevel>
|
<minLevel>50</minLevel>
|
||||||
@@ -68,6 +74,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>60</minLevel>
|
<minLevel>60</minLevel>
|
||||||
@@ -79,6 +86,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>70</minLevel>
|
<minLevel>70</minLevel>
|
||||||
@@ -90,6 +98,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -101,6 +110,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>85</minLevel>
|
<minLevel>85</minLevel>
|
||||||
|
|||||||
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -244,7 +244,7 @@ public class TimedHunting extends AbstractInstance
|
|||||||
instance.setParameter("TimedHuntingTaskFinished", false);
|
instance.setParameter("TimedHuntingTaskFinished", false);
|
||||||
}
|
}
|
||||||
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
||||||
player.sendPacket(new TimedHuntingZoneExit(player.getLastTimeZone().getZoneId()));
|
player.sendPacket(new TimedHuntingZoneExit(108)); // Training Zone id.
|
||||||
|
|
||||||
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
||||||
instance.setParameter("PlayerIsOut", true);
|
instance.setParameter("PlayerIsOut", true);
|
||||||
|
|||||||
+2
-2
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -18,8 +19,7 @@
|
|||||||
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
|
|||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 10000;
|
int entryFee = 10000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-25
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
-59
@@ -910,7 +910,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private PlayerRandomCraft _randomCraft = null;
|
private PlayerRandomCraft _randomCraft = null;
|
||||||
@@ -4180,52 +4179,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14827,23 +14780,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -61,6 +61,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
|
|||||||
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player.isRegisteredOnEvent() || (player.getBlockCheckerArena() > -1))
|
if (player.isOnEvent() || (player.getBlockCheckerArena() > -1))
|
||||||
{
|
{
|
||||||
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>43200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>40</minLevel>
|
<minLevel>40</minLevel>
|
||||||
@@ -15,6 +16,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
<maxAddedTime>21600</maxAddedTime> <!-- 6 hours -->
|
||||||
|
<remainRefillTime>18000</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>76</minLevel>
|
<minLevel>76</minLevel>
|
||||||
@@ -25,6 +27,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>60</minLevel>
|
<minLevel>60</minLevel>
|
||||||
@@ -35,6 +38,7 @@
|
|||||||
<initialTime>25200</initialTime> <!-- 7 hours -->
|
<initialTime>25200</initialTime> <!-- 7 hours -->
|
||||||
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
||||||
<maxAddedTime>151200</maxAddedTime> <!-- 42 hours -->
|
<maxAddedTime>151200</maxAddedTime> <!-- 42 hours -->
|
||||||
|
<remainRefillTime>126000</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -46,6 +50,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 3600 1 hour -->
|
<initialTime>3600</initialTime> <!-- 3600 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>1000000</entryFee>
|
<entryFee>1000000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -56,6 +61,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>40</minLevel>
|
<minLevel>40</minLevel>
|
||||||
@@ -67,6 +73,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>50</minLevel>
|
<minLevel>50</minLevel>
|
||||||
@@ -78,6 +85,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>60</minLevel>
|
<minLevel>60</minLevel>
|
||||||
@@ -89,6 +97,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>70</minLevel>
|
<minLevel>70</minLevel>
|
||||||
@@ -100,6 +109,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -111,6 +121,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>85</minLevel>
|
<minLevel>85</minLevel>
|
||||||
|
|||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -244,7 +244,7 @@ public class TimedHunting extends AbstractInstance
|
|||||||
instance.setParameter("TimedHuntingTaskFinished", false);
|
instance.setParameter("TimedHuntingTaskFinished", false);
|
||||||
}
|
}
|
||||||
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
||||||
player.sendPacket(new TimedHuntingZoneExit(player.getLastTimeZone().getZoneId()));
|
player.sendPacket(new TimedHuntingZoneExit(108)); // Training Zone id.
|
||||||
|
|
||||||
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
||||||
instance.setParameter("PlayerIsOut", true);
|
instance.setParameter("PlayerIsOut", true);
|
||||||
|
|||||||
+2
-2
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -18,8 +19,7 @@
|
|||||||
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
|
|||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 10000;
|
int entryFee = 10000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-25
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
-59
@@ -931,7 +931,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private PlayerRandomCraft _randomCraft = null;
|
private PlayerRandomCraft _randomCraft = null;
|
||||||
@@ -4217,52 +4216,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -14910,23 +14863,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -61,6 +61,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
|
|||||||
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player.isRegisteredOnEvent() || (player.getBlockCheckerArena() > -1))
|
if (player.isOnEvent() || (player.getBlockCheckerArena() > -1))
|
||||||
{
|
{
|
||||||
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<initialTime>25200</initialTime> <!-- 7 hour / 420 min -->
|
<initialTime>25200</initialTime> <!-- 7 hour / 420 min -->
|
||||||
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
||||||
<maxAddedTime>86400</maxAddedTime> <!-- 24 hours / 1440 min -->
|
<maxAddedTime>86400</maxAddedTime> <!-- 24 hours / 1440 min -->
|
||||||
|
<remainRefillTime>61200</remainRefillTime>
|
||||||
<refillTimeMax>61200</refillTimeMax>
|
<refillTimeMax>61200</refillTimeMax>
|
||||||
<entryFee>200000</entryFee>
|
<entryFee>200000</entryFee>
|
||||||
<minLevel>76</minLevel>
|
<minLevel>76</minLevel>
|
||||||
@@ -16,6 +17,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour / 60 min -->
|
<initialTime>3600</initialTime> <!-- 1 hour / 60 min -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>7200</remainRefillTime>
|
||||||
<refillTimeMax>7200</refillTimeMax>
|
<refillTimeMax>7200</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>70</minLevel>
|
<minLevel>70</minLevel>
|
||||||
@@ -26,6 +28,7 @@
|
|||||||
<initialTime>18000</initialTime> <!-- 5 hour / 300 min -->
|
<initialTime>18000</initialTime> <!-- 5 hour / 300 min -->
|
||||||
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
||||||
<maxAddedTime>64800</maxAddedTime> <!-- 1080 min -->
|
<maxAddedTime>64800</maxAddedTime> <!-- 1080 min -->
|
||||||
|
<remainRefillTime>46800</remainRefillTime>
|
||||||
<refillTimeMax>46800</refillTimeMax>
|
<refillTimeMax>46800</refillTimeMax>
|
||||||
<entryFee>1000000</entryFee>
|
<entryFee>1000000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
@@ -37,6 +40,7 @@
|
|||||||
<initialTime>18000</initialTime> <!-- 5 hour / 300 min -->
|
<initialTime>18000</initialTime> <!-- 5 hour / 300 min -->
|
||||||
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
<resetDelay>604800</resetDelay> <!-- 7 days -->
|
||||||
<maxAddedTime>64800</maxAddedTime> <!-- 1080 min -->
|
<maxAddedTime>64800</maxAddedTime> <!-- 1080 min -->
|
||||||
|
<remainRefillTime>46800</remainRefillTime>
|
||||||
<refillTimeMax>46800</refillTimeMax>
|
<refillTimeMax>46800</refillTimeMax>
|
||||||
<entryFee>1000000</entryFee>
|
<entryFee>1000000</entryFee>
|
||||||
<minLevel>85</minLevel>
|
<minLevel>85</minLevel>
|
||||||
@@ -118,6 +122,7 @@
|
|||||||
<initialTime>7200</initialTime> <!-- 2 hour -->
|
<initialTime>7200</initialTime> <!-- 2 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>43200</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>76</minLevel>
|
<minLevel>76</minLevel>
|
||||||
@@ -128,6 +133,7 @@
|
|||||||
<initialTime>3600</initialTime> <!-- 1 hour -->
|
<initialTime>3600</initialTime> <!-- 1 hour -->
|
||||||
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
<resetDelay>36000</resetDelay> <!-- 10 hours -->
|
||||||
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
<maxAddedTime>46800</maxAddedTime> <!-- 13 hours -->
|
||||||
|
<remainRefillTime>3600</remainRefillTime>
|
||||||
<refillTimeMax>3600</refillTimeMax>
|
<refillTimeMax>3600</refillTimeMax>
|
||||||
<entryFee>10000</entryFee>
|
<entryFee>10000</entryFee>
|
||||||
<minLevel>80</minLevel>
|
<minLevel>80</minLevel>
|
||||||
|
|||||||
Vendored
+11
-23
@@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.item.instance.Item;
|
|||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneChargeResult;
|
||||||
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneEnter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
@@ -63,7 +64,7 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
}
|
}
|
||||||
|
|
||||||
final long currentTime = System.currentTimeMillis();
|
final long currentTime = System.currentTimeMillis();
|
||||||
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
final long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
||||||
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
@@ -71,37 +72,24 @@ public class AddHuntingTime extends AbstractEffect
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
long remainRefillTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRefillTimeMax());
|
final long remainRefill = player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, holder.getRemainRefillTime());
|
||||||
remainRefillTime -= _time / 1000;
|
if ((_time < remainRefill) || (remainRefill == 0))
|
||||||
if (remainRefillTime < 0)
|
|
||||||
{
|
{
|
||||||
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
|
||||||
player.sendMessage("Time for this zone can be extended no further.");
|
player.sendMessage("You cannot exceed the time zone limit.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefillTime);
|
|
||||||
|
|
||||||
final long remainTime;
|
final long remainTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, holder.getInitialTime());
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime + _time);
|
||||||
|
player.getVariables().set(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + _zoneId, remainRefill - (_time / 1000));
|
||||||
|
|
||||||
if (player.isInTimedHuntingZone(_zoneId))
|
if (player.isInTimedHuntingZone(_zoneId))
|
||||||
{
|
{
|
||||||
remainTime = _time + player.getTimedHuntingZoneRemainingTime(_zoneId);
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
player.startTimedHuntingZone(_zoneId, endTime);
|
player.startTimedHuntingZone(_zoneId, endTime);
|
||||||
}
|
player.sendPacket(new TimedHuntingZoneEnter(player, _zoneId));
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((endTime + holder.getResetDelay()) < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime + holder.getInitialTime();
|
|
||||||
}
|
|
||||||
else if (endTime < currentTime)
|
|
||||||
{
|
|
||||||
endTime = currentTime;
|
|
||||||
}
|
|
||||||
remainTime = (endTime - currentTime) + _time;
|
|
||||||
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, remainTime);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) remainRefillTime));
|
player.sendPacket(new TimedHuntingZoneChargeResult(_zoneId, (int) (remainTime / 1000), (int) (remainRefill - (_time / 1000))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+1
-1
@@ -248,7 +248,7 @@ public class TimedHunting extends AbstractInstance
|
|||||||
instance.setParameter("TimedHuntingTaskFinished", false);
|
instance.setParameter("TimedHuntingTaskFinished", false);
|
||||||
}
|
}
|
||||||
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
player.sendPacket(new ExSendUIEvent(player, true, false, 600, 0, NpcStringId.TIME_LEFT));
|
||||||
player.sendPacket(new TimedHuntingZoneExit(player.getLastTimeZone().getZoneId()));
|
player.sendPacket(new TimedHuntingZoneExit(108)); // Training Zone id.
|
||||||
|
|
||||||
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
player.getEffectList().stopSkillEffects(SkillFinishType.REMOVED, BUFF);
|
||||||
instance.setParameter("PlayerIsOut", true);
|
instance.setParameter("PlayerIsOut", true);
|
||||||
|
|||||||
Vendored
+2
-1
@@ -31,6 +31,7 @@ import org.l2jmobius.gameserver.model.holders.SkillHolder;
|
|||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
import org.l2jmobius.gameserver.model.skill.SkillCaster;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.network.NpcStringId;
|
import org.l2jmobius.gameserver.network.NpcStringId;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.ExSendUIEvent;
|
import org.l2jmobius.gameserver.network.serverpackets.ExSendUIEvent;
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
@@ -875,7 +876,7 @@ public class TrainingZone extends AbstractInstance
|
|||||||
public void onInstanceLeave(Player player, Instance instance)
|
public void onInstanceLeave(Player player, Instance instance)
|
||||||
{
|
{
|
||||||
player.sendPacket(new ExSendUIEvent(player, true, false, 3600, 0, NpcStringId.TIME_LEFT));
|
player.sendPacket(new ExSendUIEvent(player, true, false, 3600, 0, NpcStringId.TIME_LEFT));
|
||||||
player.sendPacket(new TimedHuntingZoneExit(player.getLastTimeZone().getZoneId()));
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
removeBuffs(player);
|
removeBuffs(player);
|
||||||
instance.getParameters().remove("TRAINIG_AREA_TELEPORT");
|
instance.getParameters().remove("TRAINIG_AREA_TELEPORT");
|
||||||
instance.finishInstance();
|
instance.finishInstance();
|
||||||
|
|||||||
+2
-2
@@ -10,6 +10,7 @@
|
|||||||
<xs:element type="xs:int" name="initialTime" />
|
<xs:element type="xs:int" name="initialTime" />
|
||||||
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
<xs:element type="xs:int" name="resetDelay" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="maxAddedTime" />
|
<xs:element type="xs:int" name="maxAddedTime" />
|
||||||
|
<xs:element type="xs:int" name="remainRefillTime" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
<xs:element type="xs:int" name="refillTimeMax" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
<xs:element type="xs:int" name="entryItemId" minOccurs="0" />
|
||||||
<xs:element type="xs:int" name="entryFee" />
|
<xs:element type="xs:int" name="entryFee" />
|
||||||
@@ -18,8 +19,7 @@
|
|||||||
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
<xs:element type="xs:int" name="instanceId" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
<xs:element type="xs:boolean" name="soloInstance" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
<xs:element type="xs:boolean" name="weekly" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="pvpZone" minOccurs="0" />
|
<xs:element type="xs:boolean" name="useWorldPrefix" minOccurs="0" />
|
||||||
<xs:element type="xs:boolean" name="noPvpZone" minOccurs="0" />
|
|
||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
<xs:attribute type="xs:byte" name="id" use="optional" />
|
<xs:attribute type="xs:byte" name="id" use="optional" />
|
||||||
<xs:attribute type="xs:string" name="name" use="optional" />
|
<xs:attribute type="xs:string" name="name" use="optional" />
|
||||||
|
|||||||
+7
-13
@@ -85,6 +85,7 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
int entryFee = 10000;
|
int entryFee = 10000;
|
||||||
int minLevel = 1;
|
int minLevel = 1;
|
||||||
int maxLevel = 999;
|
int maxLevel = 999;
|
||||||
|
int remainRefillTime = 3600;
|
||||||
int refillTimeMax = 3600;
|
int refillTimeMax = 3600;
|
||||||
int instanceId = 0;
|
int instanceId = 0;
|
||||||
boolean soloInstance = true;
|
boolean soloInstance = true;
|
||||||
@@ -92,8 +93,6 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
boolean useWorldPrefix = false;
|
boolean useWorldPrefix = false;
|
||||||
Location enterLocation = null;
|
Location enterLocation = null;
|
||||||
Location exitLocation = null;
|
Location exitLocation = null;
|
||||||
boolean pvpZone = false;
|
|
||||||
boolean noPvpZone = false;
|
|
||||||
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
|
||||||
{
|
{
|
||||||
switch (zoneNode.getNodeName())
|
switch (zoneNode.getNodeName())
|
||||||
@@ -145,6 +144,11 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
maxLevel = Integer.parseInt(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "remainRefillTime":
|
||||||
|
{
|
||||||
|
remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "refillTimeMax":
|
case "refillTimeMax":
|
||||||
{
|
{
|
||||||
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
|
||||||
@@ -170,19 +174,9 @@ public class TimedHuntingZoneData implements IXmlReader
|
|||||||
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
useWorldPrefix = Boolean.parseBoolean(zoneNode.getTextContent());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "pvpZone":
|
|
||||||
{
|
|
||||||
pvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "noPvpZone":
|
|
||||||
{
|
|
||||||
noPvpZone = Boolean.parseBoolean(zoneNode.getTextContent());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation, pvpZone, noPvpZone));
|
_timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, instanceId, soloInstance, weekly, useWorldPrefix, enterLocation, exitLocation));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-25
@@ -17,11 +17,9 @@
|
|||||||
package org.l2jmobius.gameserver.model.actor;
|
package org.l2jmobius.gameserver.model.actor;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
import org.l2jmobius.gameserver.ai.CtrlEvent;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
|
||||||
import org.l2jmobius.gameserver.enums.ClanWarState;
|
import org.l2jmobius.gameserver.enums.ClanWarState;
|
||||||
import org.l2jmobius.gameserver.enums.InstanceType;
|
import org.l2jmobius.gameserver.enums.InstanceType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
import org.l2jmobius.gameserver.instancemanager.ZoneManager;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
|
||||||
import org.l2jmobius.gameserver.model.WorldObject;
|
import org.l2jmobius.gameserver.model.WorldObject;
|
||||||
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
import org.l2jmobius.gameserver.model.actor.stat.PlayableStat;
|
||||||
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
import org.l2jmobius.gameserver.model.actor.status.PlayableStatus;
|
||||||
@@ -33,7 +31,6 @@ import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
|||||||
import org.l2jmobius.gameserver.model.events.EventType;
|
import org.l2jmobius.gameserver.model.events.EventType;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDeath;
|
||||||
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
|
||||||
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
import org.l2jmobius.gameserver.model.instancezone.Instance;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.quest.QuestState;
|
import org.l2jmobius.gameserver.model.quest.QuestState;
|
||||||
@@ -233,28 +230,6 @@ public abstract class Playable extends Creature
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
|
||||||
{
|
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
|
||||||
{
|
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
|
||||||
if (holder == null)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
final int instanceId = holder.getInstanceId();
|
|
||||||
if (instanceId > 0)
|
|
||||||
{
|
|
||||||
return isInInstance() && (instanceId == getInstanceWorld().getTemplateId());
|
|
||||||
}
|
|
||||||
|
|
||||||
return (holder.getMapX() == (((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN)) && (holder.getMapY() == (((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return True.
|
* Return True.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -944,7 +944,6 @@ public class Player extends Playable
|
|||||||
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
|
||||||
private boolean _resumedAutoPlay = false;
|
private boolean _resumedAutoPlay = false;
|
||||||
|
|
||||||
private TimedHuntingZoneHolder _lastTimeZone = null;
|
|
||||||
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
private ScheduledFuture<?> _timedHuntingZoneTask = null;
|
||||||
|
|
||||||
private PlayerRandomCraft _randomCraft = null;
|
private PlayerRandomCraft _randomCraft = null;
|
||||||
@@ -4269,52 +4268,6 @@ public class Player extends Playable
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateRelationsToVisiblePlayers(boolean bothWays)
|
|
||||||
{
|
|
||||||
World.getInstance().forEachVisibleObject(this, Player.class, nearby ->
|
|
||||||
{
|
|
||||||
if (!isVisibleFor(nearby))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRelation(this, nearby);
|
|
||||||
if (bothWays)
|
|
||||||
{
|
|
||||||
nearby.updateRelation(nearby, this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateRelation(Player player, Player target)
|
|
||||||
{
|
|
||||||
final long relation = player.getRelation(target);
|
|
||||||
final boolean isAutoAttackable = player.isAutoAttackable(target);
|
|
||||||
final RelationCache oldrelation = player.getKnownRelations().get(target.getObjectId());
|
|
||||||
if ((oldrelation == null) || (oldrelation.getRelation() != relation) || (oldrelation.isAutoAttackable() != isAutoAttackable))
|
|
||||||
{
|
|
||||||
final RelationChanged rc = new RelationChanged();
|
|
||||||
rc.addRelation(player, relation, isAutoAttackable);
|
|
||||||
if (player.hasSummon())
|
|
||||||
{
|
|
||||||
final Summon pet = player.getPet();
|
|
||||||
if (pet != null)
|
|
||||||
{
|
|
||||||
rc.addRelation(pet, relation, isAutoAttackable);
|
|
||||||
}
|
|
||||||
if (player.hasServitors())
|
|
||||||
{
|
|
||||||
player.getServitors().values().forEach(s -> rc.addRelation(s, relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delay by 125ms so the CharInfo packet of characters moving into field of view will arrive first,
|
|
||||||
// otherwise this relation packet will be ignored by the client.
|
|
||||||
ThreadPool.schedule(() -> target.sendPacket(rc), 125);
|
|
||||||
player.getKnownRelations().put(target.getObjectId(), new RelationCache(relation, isAutoAttackable));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void broadcastTitleInfo()
|
public void broadcastTitleInfo()
|
||||||
{
|
{
|
||||||
// Send a Server->Client packet UserInfo to this Player
|
// Send a Server->Client packet UserInfo to this Player
|
||||||
@@ -15158,23 +15111,11 @@ public class Player extends Playable
|
|||||||
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
getVariables().setIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, positions);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TimedHuntingZoneHolder getLastTimeZone()
|
|
||||||
{
|
|
||||||
return _lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastTimeZone(TimedHuntingZoneHolder lastTimeZone)
|
|
||||||
{
|
|
||||||
_lastTimeZone = lastTimeZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId)
|
public boolean isInTimedHuntingZone(int zoneId)
|
||||||
{
|
{
|
||||||
return isInTimedHuntingZone(zoneId, getX(), getY());
|
return isInTimedHuntingZone(zoneId, getX(), getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
|
||||||
{
|
{
|
||||||
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
|
||||||
|
|||||||
+8
-15
@@ -33,6 +33,7 @@ public class TimedHuntingZoneHolder
|
|||||||
private final int _entryFee;
|
private final int _entryFee;
|
||||||
private final int _minLevel;
|
private final int _minLevel;
|
||||||
private final int _maxLevel;
|
private final int _maxLevel;
|
||||||
|
private final int _remainRefillTime;
|
||||||
private final int _refillTimeMax;
|
private final int _refillTimeMax;
|
||||||
private final int _instanceId;
|
private final int _instanceId;
|
||||||
private final boolean _soloInstance;
|
private final boolean _soloInstance;
|
||||||
@@ -42,10 +43,8 @@ public class TimedHuntingZoneHolder
|
|||||||
private final Location _exitLocation;
|
private final Location _exitLocation;
|
||||||
private final int _mapX;
|
private final int _mapX;
|
||||||
private final int _mapY;
|
private final int _mapY;
|
||||||
private final boolean _pvpZone;
|
|
||||||
private final boolean _noPvpZone;
|
|
||||||
|
|
||||||
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation, boolean pvpZone, boolean noPvpZone)
|
public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, int instanceId, boolean soloInstance, boolean weekly, boolean useWorldPrefix, Location enterLocation, Location exitLocation)
|
||||||
{
|
{
|
||||||
_id = id;
|
_id = id;
|
||||||
_name = name;
|
_name = name;
|
||||||
@@ -56,6 +55,7 @@ public class TimedHuntingZoneHolder
|
|||||||
_entryFee = entryFee;
|
_entryFee = entryFee;
|
||||||
_minLevel = minLevel;
|
_minLevel = minLevel;
|
||||||
_maxLevel = maxLevel;
|
_maxLevel = maxLevel;
|
||||||
|
_remainRefillTime = remainRefillTime;
|
||||||
_refillTimeMax = refillTimeMax;
|
_refillTimeMax = refillTimeMax;
|
||||||
_instanceId = instanceId;
|
_instanceId = instanceId;
|
||||||
_soloInstance = soloInstance;
|
_soloInstance = soloInstance;
|
||||||
@@ -63,8 +63,6 @@ public class TimedHuntingZoneHolder
|
|||||||
_useWorldPrefix = useWorldPrefix;
|
_useWorldPrefix = useWorldPrefix;
|
||||||
_enterLocation = enterLocation;
|
_enterLocation = enterLocation;
|
||||||
_exitLocation = exitLocation;
|
_exitLocation = exitLocation;
|
||||||
_pvpZone = pvpZone;
|
|
||||||
_noPvpZone = noPvpZone;
|
|
||||||
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
_mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
|
||||||
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
_mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
|
||||||
}
|
}
|
||||||
@@ -114,6 +112,11 @@ public class TimedHuntingZoneHolder
|
|||||||
return _maxLevel;
|
return _maxLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRemainRefillTime()
|
||||||
|
{
|
||||||
|
return _remainRefillTime;
|
||||||
|
}
|
||||||
|
|
||||||
public int getRefillTimeMax()
|
public int getRefillTimeMax()
|
||||||
{
|
{
|
||||||
return _refillTimeMax;
|
return _refillTimeMax;
|
||||||
@@ -149,16 +152,6 @@ public class TimedHuntingZoneHolder
|
|||||||
return _exitLocation;
|
return _exitLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPvpZone()
|
|
||||||
{
|
|
||||||
return _pvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isNoPvpZone()
|
|
||||||
{
|
|
||||||
return _noPvpZone;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getMapX()
|
public int getMapX()
|
||||||
{
|
{
|
||||||
return _mapX;
|
return _mapX;
|
||||||
|
|||||||
+1
@@ -61,6 +61,7 @@ public class PlayerVariables extends AbstractVariables
|
|||||||
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
||||||
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
public static final String AUTO_USE_SETTINGS = "AUTO_USE_SETTINGS";
|
||||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||||
|
public static final String LAST_HUNTING_ZONE_ID = "LAST_HUNTING_ZONE_ID";
|
||||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||||
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
public static final String HUNTING_ZONE_REMAIN_REFILL = "HUNTING_ZONE_REMAIN_REFILL_";
|
||||||
|
|||||||
+15
-79
@@ -16,21 +16,20 @@
|
|||||||
*/
|
*/
|
||||||
package org.l2jmobius.gameserver.model.zone.type;
|
package org.l2jmobius.gameserver.model.zone.type;
|
||||||
|
|
||||||
|
import org.l2jmobius.commons.threads.ThreadPool;
|
||||||
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
|
||||||
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
import org.l2jmobius.gameserver.enums.TeleportWhereType;
|
||||||
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
import org.l2jmobius.gameserver.model.actor.Playable;
|
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
|
||||||
|
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
import org.l2jmobius.gameserver.model.zone.ZoneId;
|
||||||
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
import org.l2jmobius.gameserver.model.zone.ZoneType;
|
||||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
|
||||||
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mobius
|
* @author Mobius
|
||||||
* @author dontknowdontcare
|
|
||||||
*/
|
*/
|
||||||
public class TimedHuntingZone extends ZoneType
|
public class TimedHuntingZone extends ZoneType
|
||||||
{
|
{
|
||||||
@@ -44,29 +43,9 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
Playable summon = (Playable) creature;
|
|
||||||
for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Check summons spawning or porting inside.
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player != null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
@@ -78,25 +57,17 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.setLastTimeZone(holder);
|
|
||||||
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
|
||||||
if (holder.isPvpZone())
|
player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, holder.getZoneId());
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.PVP, true);
|
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_ENTERED_A_COMBAT_ZONE);
|
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, true);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!player.isGM())
|
if (!player.isGM())
|
||||||
{
|
{
|
||||||
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
|
||||||
@@ -109,56 +80,21 @@ public class TimedHuntingZone extends ZoneType
|
|||||||
{
|
{
|
||||||
if (!creature.isPlayer())
|
if (!creature.isPlayer())
|
||||||
{
|
{
|
||||||
if (creature.isPlayable())
|
|
||||||
{
|
|
||||||
final Playable summon = (Playable) creature;
|
|
||||||
for (final TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
|
|
||||||
{
|
|
||||||
if (!summon.isInTimedHuntingZone(holder.getZoneId()))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (holder.isPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.PVP, false);
|
|
||||||
}
|
|
||||||
else if (holder.isNoPvpZone())
|
|
||||||
{
|
|
||||||
summon.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = creature.getActingPlayer();
|
final Player player = creature.getActingPlayer();
|
||||||
if (player == null)
|
if (player != null)
|
||||||
{
|
{
|
||||||
return;
|
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
||||||
}
|
|
||||||
|
ThreadPool.schedule(() ->
|
||||||
// We default to zone 6 aka Primeval Isle so we spawn in rune town by default.
|
|
||||||
int nZoneId = 6;
|
|
||||||
|
|
||||||
final TimedHuntingZoneHolder lastTimeZone = player.getLastTimeZone();
|
|
||||||
if (lastTimeZone != null)
|
|
||||||
{
|
|
||||||
nZoneId = lastTimeZone.getZoneId();
|
|
||||||
if (lastTimeZone.isPvpZone())
|
|
||||||
{
|
{
|
||||||
player.setInsideZone(ZoneId.PVP, false);
|
if (!player.isInTimedHuntingZone(player.getX(), player.getY()))
|
||||||
player.sendPacket(SystemMessageId.YOU_HAVE_LEFT_A_COMBAT_ZONE);
|
{
|
||||||
player.updateRelationsToVisiblePlayers(true);
|
player.sendPacket(new TimedHuntingZoneExit(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, 0)));
|
||||||
}
|
}
|
||||||
else if (lastTimeZone.isNoPvpZone())
|
}, 1000);
|
||||||
{
|
|
||||||
player.setInsideZone(ZoneId.NO_PVP, false);
|
|
||||||
}
|
|
||||||
player.setLastTimeZone(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
player.setInsideZone(ZoneId.TIMED_HUNTING, false);
|
|
||||||
player.sendPacket(new TimedHuntingZoneExit(nZoneId));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
|
|||||||
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (player.isRegisteredOnEvent() || (player.getBlockCheckerArena() > -1))
|
if (player.isOnEvent() || (player.getBlockCheckerArena() > -1))
|
||||||
{
|
{
|
||||||
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
|
||||||
return;
|
return;
|
||||||
|
|||||||
+2
-2
@@ -27,13 +27,13 @@ public class TimedHuntingZoneExit implements IClientOutgoingPacket
|
|||||||
{
|
{
|
||||||
private final int _zoneId;
|
private final int _zoneId;
|
||||||
|
|
||||||
public TimedHuntingZoneExit(final int zoneId)
|
public TimedHuntingZoneExit(int zoneId)
|
||||||
{
|
{
|
||||||
_zoneId = zoneId;
|
_zoneId = zoneId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean write(final PacketWriter packet)
|
public boolean write(PacketWriter packet)
|
||||||
{
|
{
|
||||||
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
|
||||||
packet.writeD(_zoneId);
|
packet.writeD(_zoneId);
|
||||||
|
|||||||
+1
-2
@@ -62,8 +62,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
|
|||||||
}
|
}
|
||||||
packet.writeD(remainingTime / 1000); // remain time
|
packet.writeD(remainingTime / 1000); // remain time
|
||||||
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
packet.writeD(holder.getMaximumAddedTime() / 1000);
|
||||||
long remainRefillTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRefillTimeMax());
|
packet.writeD(_player.getVariables().getInt(PlayerVariables.HUNTING_ZONE_REMAIN_REFILL + holder.getZoneId(), holder.getRemainRefillTime()));
|
||||||
packet.writeD((int) remainRefillTime);
|
|
||||||
packet.writeD(holder.getRefillTimeMax());
|
packet.writeD(holder.getRefillTimeMax());
|
||||||
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
|
||||||
packet.writeC(0); // bUserBound
|
packet.writeC(0); // bUserBound
|
||||||
|
|||||||
Reference in New Issue
Block a user