Remove hunting time as needed.

Thanks to Hiroshi.
This commit is contained in:
MobiusDevelopment
2021-04-28 13:37:35 +00:00
parent 99a6553f63
commit c8e919b609
36 changed files with 555 additions and 381 deletions

View File

@@ -357,7 +357,6 @@ import org.l2jmobius.gameserver.network.serverpackets.friend.FriendStatus;
import org.l2jmobius.gameserver.network.serverpackets.monsterbook.ExMonsterBook;
import org.l2jmobius.gameserver.network.serverpackets.monsterbook.ExMonsterBookCloseForce;
import org.l2jmobius.gameserver.network.serverpackets.monsterbook.ExMonsterBookRewardIcon;
import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
import org.l2jmobius.gameserver.taskmanager.AutoPlayTaskManager;
import org.l2jmobius.gameserver.taskmanager.AutoUseTaskManager;
@@ -887,7 +886,7 @@ public class PlayerInstance extends Playable
private final AutoPlaySettingsHolder _autoPlaySettings = new AutoPlaySettingsHolder();
private final AutoUseSettingsHolder _autoUseSettings = new AutoUseSettingsHolder();
private ScheduledFuture<?> _timedHuntingZoneFinishTask = null;
private ScheduledFuture<?> _timedHuntingZoneTask = null;
private final List<QuestTimer> _questTimers = new ArrayList<>();
private final List<TimerHolder<?>> _timerHolders = new ArrayList<>();
@@ -13970,10 +13969,10 @@ public class PlayerInstance extends Playable
_fallingDamageTask.cancel(false);
_fallingDamageTask = null;
}
if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isDone() && !_timedHuntingZoneFinishTask.isCancelled())
if ((_timedHuntingZoneTask != null) && !_timedHuntingZoneTask.isDone() && !_timedHuntingZoneTask.isCancelled())
{
_timedHuntingZoneFinishTask.cancel(false);
_timedHuntingZoneFinishTask = null;
_timedHuntingZoneTask.cancel(false);
_timedHuntingZoneTask = null;
}
if ((_taskWarnUserTakeBreak != null) && !_taskWarnUserTakeBreak.isDone() && !_taskWarnUserTakeBreak.isCancelled())
{
@@ -14315,33 +14314,38 @@ public class PlayerInstance extends Playable
// TODO: Delay window.
// sendPacket(new TimedHuntingZoneEnter((int) (delay / 60 / 1000)));
sendMessage("You have " + (delay / 60 / 1000) + " minutes left for this timed zone.");
_timedHuntingZoneFinishTask = ThreadPool.schedule(() ->
_timedHuntingZoneTask = ThreadPool.scheduleAtFixedRate(() ->
{
if ((isOnlineInt() > 0) && isInTimedHuntingZone(zoneId))
if (isInTimedHuntingZone(zoneId))
{
sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
abortCast();
stopMove(null);
teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, TeleportWhereType.TOWN));
final long time = getTimedHuntingZoneRemainingTime(zoneId);
if (time > 0)
{
getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + zoneId, time - 60000);
}
else
{
_timedHuntingZoneTask.cancel(false);
_timedHuntingZoneTask = null;
abortCast();
stopMove(null);
teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, TeleportWhereType.TOWN));
}
}
}, delay);
}, 60000, 60000);
}
public void stopTimedHuntingZoneTask()
{
if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
if ((_timedHuntingZoneTask != null) && !_timedHuntingZoneTask.isCancelled() && !_timedHuntingZoneTask.isDone())
{
_timedHuntingZoneFinishTask.cancel(true);
_timedHuntingZoneFinishTask = null;
_timedHuntingZoneTask.cancel(true);
_timedHuntingZoneTask = null;
}
}
public long getTimedHuntingZoneRemainingTime()
public long getTimedHuntingZoneRemainingTime(int zoneId)
{
if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
{
return _timedHuntingZoneFinishTask.getDelay(TimeUnit.MILLISECONDS);
}
return 0;
return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
}
}

View File

@@ -62,7 +62,8 @@ public class PlayerVariables extends AbstractVariables
public static final String FORTUNE_TELLING_VARIABLE = "FortuneTelling";
public static final String FORTUNE_TELLING_BLACK_CAT_VARIABLE = "FortuneTellingBlackCat";
public static final String DELUSION_RETURN = "DELUSION_RETURN";
public static final String HUNTING_ZONE_RESET_TIME = "HUNTING_ZONE_RESET_TIME_";
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
private final int _objectId;

View File

@@ -16,12 +16,10 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
import org.l2jmobius.commons.util.Chronos;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
@@ -44,16 +42,15 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
final long currentTime = Chronos.currentTimeMillis();
final long stormIsleExitTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 1, 0);
final long primevalIsleExitTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 6, 0);
if ((stormIsleExitTime > currentTime) && player.isInTimedHuntingZone(1))
final long stormIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(6);
if ((stormIsleExitTime > 0) && player.isInTimedHuntingZone(1))
{
player.startTimedHuntingZone(1, stormIsleExitTime - currentTime);
player.startTimedHuntingZone(1, stormIsleExitTime);
}
else if ((primevalIsleExitTime > currentTime) && player.isInTimedHuntingZone(6))
else if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(6))
{
player.startTimedHuntingZone(6, primevalIsleExitTime - currentTime);
player.startTimedHuntingZone(6, primevalIsleExitTime);
}
else if (!player.isGM())
{

View File

@@ -79,7 +79,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
return;
}
if (player.isInInstance())
if (player.isInInstance() || player.isInTimedHuntingZone(player.getX(), player.getY()))
{
player.sendMessage("Cannot use time-limited hunting zones while in an instance.");
return;
@@ -93,10 +93,15 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
}
final long currentTime = Chronos.currentTimeMillis();
long endTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0);
if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
final long lastEntryTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, 0);
if ((lastEntryTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
{
endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
if (endTime == currentTime)
{
endTime = Config.TIME_LIMITED_ZONE_INITIAL_TIME;
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
@@ -111,7 +116,7 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, endTime);
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
switch (_zoneId)
{

View File

@@ -20,7 +20,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.commons.util.Chronos;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -56,8 +55,12 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
packet.writeD(1); // zone id
packet.writeD(100); // min level
packet.writeD(120); // max level
packet.writeD(0); // remain time base?
endTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 1, 0);
packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
endTime = _player.getTimedHuntingZoneRemainingTime(1);
if (endTime > 0)
{
endTime += currentTime;
}
if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
{
endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
@@ -76,8 +79,12 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
packet.writeD(6); // zone id
packet.writeD(105); // min level
packet.writeD(120); // max level
packet.writeD(0); // remain time base?
endTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 6, 0);
packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
endTime = _player.getTimedHuntingZoneRemainingTime(6);
if (endTime > 0)
{
endTime += currentTime;
}
if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
{
endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;