From eae968d570ccb38b907438796b1f96663303f461 Mon Sep 17 00:00:00 2001
From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com>
Date: Fri, 3 Jan 2020 16:30:59 +0000
Subject: [PATCH] Support for time limited zones.
---
.../dist/game/data/html/default/34530.htm | 3 +
.../dist/game/data/html/teleporter/34530.htm | 3 +
.../handlers/usercommandhandlers/Loc.java | 3 +
.../data/spawns/LimitedZones/StormIsle.xml | 1176 +++++++++++++++++
.../others/InvestigatorsTeleporter.xml | 11 +
.../model/actor/instance/PlayerInstance.java | 52 +-
.../model/variables/PlayerVariables.java | 1 +
.../gameserver/network/Disconnection.java | 1 +
.../gameserver/network/ExIncomingPackets.java | 3 +-
.../network/clientpackets/EnterWorld.java | 12 +
.../sessionzones/ExTimedHuntingZoneEnter.java | 104 ++
.../sessionzones/ExTimedHuntingZoneList.java | 2 +-
.../sessionzones/TimedHuntingZoneEnter.java | 42 +
.../sessionzones/TimedHuntingZoneExit.java | 40 +
.../TimedHuntingZoneList.java | 10 +-
.../model/actor/instance/PlayerInstance.java | 52 +-
.../model/variables/PlayerVariables.java | 1 +
.../gameserver/network/Disconnection.java | 1 +
.../gameserver/network/ExIncomingPackets.java | 3 +-
.../network/clientpackets/EnterWorld.java | 12 +
.../sessionzones/ExTimedHuntingZoneEnter.java | 103 ++
.../sessionzones/TimedHuntingZoneEnter.java | 42 +
.../sessionzones/TimedHuntingZoneExit.java | 40 +
23 files changed, 1707 insertions(+), 10 deletions(-)
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/default/34530.htm
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/teleporter/34530.htm
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/dist/game/data/spawns/LimitedZones/StormIsle.xml
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/dist/game/data/teleporters/others/InvestigatorsTeleporter.xml
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
create mode 100644 L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
rename L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/{timedhunting => sessionzones}/TimedHuntingZoneList.java (94%)
create mode 100644 L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
create mode 100644 L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
create mode 100644 L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/default/34530.htm b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/default/34530.htm
new file mode 100644
index 0000000000..b0594f6992
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/default/34530.htm
@@ -0,0 +1,3 @@
+
Investigators Guard:
+There are many dangerous monsters outside the camps. Don't let your guard down.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/teleporter/34530.htm b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/teleporter/34530.htm
new file mode 100644
index 0000000000..b0594f6992
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/html/teleporter/34530.htm
@@ -0,0 +1,3 @@
+Investigators Guard:
+There are many dangerous monsters outside the camps. Don't let your guard down.
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java
index 21bb5f8a2e..c3af962dc7 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java
@@ -24,6 +24,7 @@ import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.zone.type.RespawnZone;
import org.l2jmobius.gameserver.network.SystemMessageId;
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
+import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneEnter;
/**
* Loc user command.
@@ -66,6 +67,8 @@ public class Loc implements IUserCommandHandler
sm.addString(player.getX() + ", " + player.getY() + ", " + player.getZ());
}
player.sendPacket(sm);
+
+ player.sendPacket(new TimedHuntingZoneEnter(1));
return true;
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/spawns/LimitedZones/StormIsle.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/spawns/LimitedZones/StormIsle.xml
new file mode 100644
index 0000000000..4dccfa3cee
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/spawns/LimitedZones/StormIsle.xml
@@ -0,0 +1,1176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/teleporters/others/InvestigatorsTeleporter.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/teleporters/others/InvestigatorsTeleporter.xml
new file mode 100644
index 0000000000..1483b709ea
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/teleporters/others/InvestigatorsTeleporter.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index acde343b64..b9e8701c07 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -116,6 +116,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
+import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
@@ -341,6 +342,7 @@ 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.util.Broadcast;
import org.l2jmobius.gameserver.util.EnumIntBitmask;
@@ -863,6 +865,8 @@ public class PlayerInstance extends Playable
private final Collection _autoPotionItems = ConcurrentHashMap.newKeySet();
private final Collection _autoSkills = ConcurrentHashMap.newKeySet();
+ private ScheduledFuture> _timedHuntingZoneFinishTask = null;
+
// Selling buffs system
private boolean _isSellingBuffs = false;
private List _sellingBuffs = null;
@@ -10312,12 +10316,18 @@ public class PlayerInstance extends Playable
s.updateAndBroadcastStatus(0);
});
- // show movie if available
+ // Show movie if available
if (_movieHolder != null)
{
sendPacket(new ExStartScenePlayer(_movieHolder.getMovie()));
}
+ // Close time limited zone window.
+ if (!isInTimedHuntingZone())
+ {
+ stopTimedHuntingZoneTask();
+ }
+
// send info to nearby players
broadcastInfo();
}
@@ -14195,4 +14205,44 @@ public class PlayerInstance extends Playable
_autoSkills.remove(skillId);
stopAutoUseTask();
}
+
+ public boolean isInTimedHuntingZone()
+ {
+ final int x = ((getX() - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
+ final int y = ((getY() - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
+ if ((x == 25) && (y == 23)) // Storm Isle.
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public void startTimedHuntingZone(long delay)
+ {
+ // TODO: Delay window.
+ // sendPacket(new TimedHuntingZoneEnter((int) (delay / 60 / 1000)));
+ // For now close window.
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+
+ _timedHuntingZoneFinishTask = ThreadPool.schedule(() ->
+ {
+ if ((isOnlineInt() > 0) && isInTimedHuntingZone())
+ {
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ abortCast();
+ stopMove(null);
+ teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, TeleportWhereType.TOWN));
+ }
+ }, delay);
+ }
+
+ public void stopTimedHuntingZoneTask()
+ {
+ if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
+ {
+ _timedHuntingZoneFinishTask.cancel(true);
+ _timedHuntingZoneFinishTask = null;
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ }
+ }
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
index 187465ee8c..55650df182 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
@@ -63,6 +63,7 @@ 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";
private final int _objectId;
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/Disconnection.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/Disconnection.java
index 23e34a2fde..342eb35fdc 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/Disconnection.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/Disconnection.java
@@ -116,6 +116,7 @@ public class Disconnection
{
if (_player != null)
{
+ _player.stopTimedHuntingZoneTask();
_player.stopAutoPlayTask();
_player.stopAutoUseTask();
_player.storeMe();
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index b1b5157266..0be08cce88 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -111,6 +111,7 @@ import org.l2jmobius.gameserver.network.clientpackets.ranking.RequestRankingChar
import org.l2jmobius.gameserver.network.clientpackets.ranking.RequestRankingCharRankers;
import org.l2jmobius.gameserver.network.clientpackets.sayune.RequestFlyMove;
import org.l2jmobius.gameserver.network.clientpackets.sayune.RequestFlyMoveStart;
+import org.l2jmobius.gameserver.network.clientpackets.sessionzones.ExTimedHuntingZoneEnter;
import org.l2jmobius.gameserver.network.clientpackets.sessionzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.CannotMoveAnymoreInShuttle;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.MoveToLocationInShuttle;
@@ -508,7 +509,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_GACHA_SHOP_GACHA_GROUP(0x17D, null, ConnectionState.IN_GAME),
EX_GACHA_SHOP_GACHA_ITEM(0x17E, null, ConnectionState.IN_GAME),
EX_TIME_RESTRICT_FIELD_LIST(0x17F, ExTimedHuntingZoneList::new, ConnectionState.IN_GAME),
- EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, null, ConnectionState.IN_GAME),
+ EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, ExTimedHuntingZoneEnter::new, ConnectionState.IN_GAME),
EX_RANKING_CHAR_INFO(0x181, RequestRankingCharInfo::new, ConnectionState.IN_GAME),
EX_RANKING_CHAR_HISTORY(0x182, null, ConnectionState.IN_GAME),
EX_RANKING_CHAR_RANKERS(0x183, RequestRankingCharRankers::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
index 4c22b5f7f2..b1e5fc9515 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
@@ -36,6 +36,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.MailManager;
+import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.instancemanager.ServerRestartManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager;
@@ -639,6 +640,17 @@ public class EnterWorld implements IClientIncomingPacket
player.updateAbnormalVisualEffects();
}
+ // Check if in time limited hunting zone.
+ final long exitTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME, 0) - 3600000;
+ if (exitTime > System.currentTimeMillis())
+ {
+ player.startTimedHuntingZone(exitTime - System.currentTimeMillis());
+ }
+ else if (player.isInTimedHuntingZone())
+ {
+ player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
+ }
+
if (Config.ENABLE_ATTENDANCE_REWARDS)
{
ThreadPool.schedule(() ->
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..123a85d719
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
@@ -0,0 +1,104 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.model.variables.PlayerVariables;
+import org.l2jmobius.gameserver.network.GameClient;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
+
+/**
+ * @author Mobius
+ */
+public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
+{
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ packet.readD(); // Zone id.
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ if (player.isMounted())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while mounted.");
+ return;
+ }
+ if (player.isInDuel())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones during a duel.");
+ return;
+ }
+ if (player.isInOlympiadMode() || OlympiadManager.getInstance().isRegistered(player))
+ {
+ player.sendPacket(SystemMessageId.CANNOT_USE_TIME_LIMITED_HUNTING_ZONES_WHILE_WAITING_FOR_THE_OLYMPIAD);
+ return;
+ }
+ if (player.isOnEvent() || (player.getBlockCheckerArena() > -1))
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
+ return;
+ }
+ if (player.isInInstance())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while in an instance.");
+ return;
+ }
+
+ if (player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME, 0) > System.currentTimeMillis())
+ {
+ if (player.isInTimedHuntingZone())
+ {
+ player.sendPacket(SystemMessageId.YOU_WILL_EXCEED_THE_MAX_AMOUNT_OF_TIME_FOR_THE_HUNTING_ZONE_SO_YOU_CANNOT_ADD_ANY_MORE_TIME);
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_TIME_AVAILABLE_TO_ENTER_THE_HUNTING_ZONE);
+ }
+ return;
+ }
+
+ if (player.getLevel() < 100)
+ {
+ player.sendMessage("Your level is too low.");
+ }
+
+ if (player.getAdena() > 150000)
+ {
+ player.reduceAdena("TimedHuntingZone", 150000, player, true);
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME, System.currentTimeMillis() + 64800000); // 64800000 = 18 hours
+ player.teleToLocation(194291, 176604, -1888); // Storm Isle
+ player.startTimedHuntingZone(18000000); // 300 minutes
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ }
+ }
+}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
index 8210b4e8cf..eaf79b23ed 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
@@ -20,7 +20,7 @@ import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
-import org.l2jmobius.gameserver.network.serverpackets.timedhunting.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
public class ExTimedHuntingZoneList implements IClientIncomingPacket
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..6fc9adc50c
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneEnter implements IClientOutgoingPacket
+{
+ private final int _remainingTime;
+
+ public TimedHuntingZoneEnter(int remainingTime)
+ {
+ _remainingTime = remainingTime;
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_ENTER.writeId(packet);
+ packet.writeC(_remainingTime);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
new file mode 100644
index 0000000000..31caafdc50
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneExit implements IClientOutgoingPacket
+{
+ public static final TimedHuntingZoneExit STATIC_PACKET = new TimedHuntingZoneExit();
+
+ public TimedHuntingZoneExit()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/timedhunting/TimedHuntingZoneList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
similarity index 94%
rename from L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/timedhunting/TimedHuntingZoneList.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
index c7f9819d2b..ecd19674de 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/timedhunting/TimedHuntingZoneList.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-package org.l2jmobius.gameserver.network.serverpackets.timedhunting;
+package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
import java.util.ArrayList;
import java.util.List;
@@ -69,9 +69,9 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
{
final TimeRestrictedFieldInfo field = new TimeRestrictedFieldInfo();
field.resetCycle = 1;
- field.fieldId = 2;
- field.minLevel = 78;
- field.maxLevel = 999;
+ field.fieldId = 1;
+ field.minLevel = 100;
+ field.maxLevel = 120;
field.remainTimeBase = 3600;
field.remainTime = 3600;
field.remainTimeMax = 21600;
@@ -81,7 +81,7 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
final FieldRequiredItem item = new FieldRequiredItem();
item.itemId = 57;
- item.count = 10000;
+ item.count = 150000;
field.requiredItems = List.of(item);
infos.add(field);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 466c644281..3be0b804be 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -116,6 +116,7 @@ import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.GlobalVariablesManager;
import org.l2jmobius.gameserver.instancemanager.HandysBlockCheckerManager;
import org.l2jmobius.gameserver.instancemanager.ItemsOnGroundManager;
+import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.MatchingRoomManager;
import org.l2jmobius.gameserver.instancemanager.MentorManager;
import org.l2jmobius.gameserver.instancemanager.PunishmentManager;
@@ -338,6 +339,7 @@ import org.l2jmobius.gameserver.network.serverpackets.ValidateLocation;
import org.l2jmobius.gameserver.network.serverpackets.autoplay.ExAutoPlayDoMacro;
import org.l2jmobius.gameserver.network.serverpackets.commission.ExResponseCommissionInfo;
import org.l2jmobius.gameserver.network.serverpackets.friend.FriendStatus;
+import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
import org.l2jmobius.gameserver.taskmanager.AttackStanceTaskManager;
import org.l2jmobius.gameserver.util.Broadcast;
import org.l2jmobius.gameserver.util.EnumIntBitmask;
@@ -856,6 +858,8 @@ public class PlayerInstance extends Playable
private final Collection _autoPotionItems = ConcurrentHashMap.newKeySet();
private final Collection _autoSkills = ConcurrentHashMap.newKeySet();
+ private ScheduledFuture> _timedHuntingZoneFinishTask = null;
+
// Selling buffs system
private boolean _isSellingBuffs = false;
private List _sellingBuffs = null;
@@ -10225,12 +10229,18 @@ public class PlayerInstance extends Playable
s.updateAndBroadcastStatus(0);
});
- // show movie if available
+ // Show movie if available
if (_movieHolder != null)
{
sendPacket(new ExStartScenePlayer(_movieHolder.getMovie()));
}
+ // Close time limited zone window.
+ if (!isInTimedHuntingZone())
+ {
+ stopTimedHuntingZoneTask();
+ }
+
// send info to nearby players
broadcastInfo();
}
@@ -14141,4 +14151,44 @@ public class PlayerInstance extends Playable
_autoSkills.remove(skillId);
stopAutoUseTask();
}
+
+ public boolean isInTimedHuntingZone()
+ {
+ final int x = ((getX() - World.MAP_MIN_X) >> 15) + World.TILE_X_MIN;
+ final int y = ((getY() - World.MAP_MIN_Y) >> 15) + World.TILE_Y_MIN;
+ if ((x == 20) && (y == 15)) // Ancient Pirates' Tomb.
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public void startTimedHuntingZone(long delay)
+ {
+ // TODO: Delay window.
+ // sendPacket(new TimedHuntingZoneEnter((int) (delay / 60 / 1000)));
+ // For now close window.
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+
+ _timedHuntingZoneFinishTask = ThreadPool.schedule(() ->
+ {
+ if ((isOnlineInt() > 0) && isInTimedHuntingZone())
+ {
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ abortCast();
+ stopMove(null);
+ teleToLocation(MapRegionManager.getInstance().getTeleToLocation(this, TeleportWhereType.TOWN));
+ }
+ }, delay);
+ }
+
+ public void stopTimedHuntingZoneTask()
+ {
+ if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
+ {
+ _timedHuntingZoneFinishTask.cancel(true);
+ _timedHuntingZoneFinishTask = null;
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ }
+ }
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
index 187465ee8c..55650df182 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java
@@ -63,6 +63,7 @@ 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";
private final int _objectId;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/Disconnection.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/Disconnection.java
index fdd56ef2e3..a781dd8565 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/Disconnection.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/Disconnection.java
@@ -116,6 +116,7 @@ public class Disconnection
{
if (_player != null)
{
+ _player.stopTimedHuntingZoneTask();
_player.stopAutoPlayTask();
_player.stopAutoUseTask();
_player.storeMe();
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index 896ac981dc..2cdd93db1b 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -102,6 +102,7 @@ import org.l2jmobius.gameserver.network.clientpackets.ranking.RequestRankingChar
import org.l2jmobius.gameserver.network.clientpackets.ranking.RequestRankingCharRankers;
import org.l2jmobius.gameserver.network.clientpackets.sayune.RequestFlyMove;
import org.l2jmobius.gameserver.network.clientpackets.sayune.RequestFlyMoveStart;
+import org.l2jmobius.gameserver.network.clientpackets.sessionzones.ExTimedHuntingZoneEnter;
import org.l2jmobius.gameserver.network.clientpackets.sessionzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.CannotMoveAnymoreInShuttle;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.MoveToLocationInShuttle;
@@ -499,7 +500,7 @@ public enum ExIncomingPackets implements IIncomingPackets
EX_GACHA_SHOP_GACHA_GROUP(0x17D, null, ConnectionState.IN_GAME),
EX_GACHA_SHOP_GACHA_ITEM(0x17E, null, ConnectionState.IN_GAME),
EX_TIME_RESTRICT_FIELD_LIST(0x17F, ExTimedHuntingZoneList::new, ConnectionState.IN_GAME),
- EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, null, ConnectionState.IN_GAME),
+ EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, ExTimedHuntingZoneEnter::new, ConnectionState.IN_GAME),
EX_RANKING_CHAR_INFO(0x181, RequestRankingCharInfo::new, ConnectionState.IN_GAME),
EX_RANKING_CHAR_HISTORY(0x182, null, ConnectionState.IN_GAME),
EX_RANKING_CHAR_RANKERS(0x183, RequestRankingCharRankers::new, ConnectionState.IN_GAME),
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
index 0590818968..ddd7d584f5 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java
@@ -35,6 +35,7 @@ import org.l2jmobius.gameserver.instancemanager.FortManager;
import org.l2jmobius.gameserver.instancemanager.FortSiegeManager;
import org.l2jmobius.gameserver.instancemanager.InstanceManager;
import org.l2jmobius.gameserver.instancemanager.MailManager;
+import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
import org.l2jmobius.gameserver.instancemanager.PetitionManager;
import org.l2jmobius.gameserver.instancemanager.ServerRestartManager;
import org.l2jmobius.gameserver.instancemanager.SiegeManager;
@@ -624,6 +625,17 @@ public class EnterWorld implements IClientIncomingPacket
player.updateAbnormalVisualEffects();
}
+ // Check if in time limited hunting zone.
+ final long exitTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME, 0) - 3600000;
+ if (exitTime > System.currentTimeMillis())
+ {
+ player.startTimedHuntingZone(exitTime - System.currentTimeMillis());
+ }
+ else if (player.isInTimedHuntingZone())
+ {
+ player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
+ }
+
if (Config.ENABLE_ATTENDANCE_REWARDS)
{
ThreadPool.schedule(() ->
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..b37784b75e
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
@@ -0,0 +1,103 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.clientpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketReader;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.model.variables.PlayerVariables;
+import org.l2jmobius.gameserver.network.GameClient;
+import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
+
+/**
+ * @author Mobius
+ */
+public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
+{
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ packet.readD(); // Zone id.
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ if (player.isMounted())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while mounted.");
+ return;
+ }
+ if (player.isInDuel())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones during a duel.");
+ return;
+ }
+ if (player.isInOlympiadMode() || OlympiadManager.getInstance().isRegistered(player))
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while waiting for the Olympiad.");
+ return;
+ }
+ if (player.isOnEvent() || (player.getBlockCheckerArena() > -1))
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while registered on an event.");
+ return;
+ }
+ if (player.isInInstance())
+ {
+ player.sendMessage("Cannot use time-limited hunting zones while in an instance.");
+ return;
+ }
+
+ if (player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME, 0) > System.currentTimeMillis())
+ {
+ if (player.isInTimedHuntingZone())
+ {
+ player.sendMessage("You will exceed the max amount of time for the hunting zone, so you cannot add any more time.");
+ }
+ else
+ {
+ player.sendMessage("You don't have enough time available to enter the hunting zone.");
+ }
+ return;
+ }
+
+ if (player.getLevel() < 78)
+ {
+ player.sendMessage("Your level is too low.");
+ }
+
+ if (player.getAdena() > 10000)
+ {
+ player.reduceAdena("TimedHuntingZone", 10000, player, true);
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME, System.currentTimeMillis() + 64800000); // 64800000 = 18 hours
+ player.teleToLocation(13181, -78651, -5977); // Ancient Pirates' Tomb
+ player.startTimedHuntingZone(18000000); // 300 minutes
+ }
+ else
+ {
+ player.sendMessage("Not enough adena.");
+ }
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..6fc9adc50c
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
@@ -0,0 +1,42 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneEnter implements IClientOutgoingPacket
+{
+ private final int _remainingTime;
+
+ public TimedHuntingZoneEnter(int remainingTime)
+ {
+ _remainingTime = remainingTime;
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_ENTER.writeId(packet);
+ packet.writeC(_remainingTime);
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
new file mode 100644
index 0000000000..31caafdc50
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
@@ -0,0 +1,40 @@
+/*
+ * This file is part of the L2J Mobius project.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneExit implements IClientOutgoingPacket
+{
+ public static final TimedHuntingZoneExit STATIC_PACKET = new TimedHuntingZoneExit();
+
+ public TimedHuntingZoneExit()
+ {
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_USER_EXIT.writeId(packet);
+ return true;
+ }
+}
\ No newline at end of file