diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index 5b54b0c9f7..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Maximum added time.
-# Default: 18000000 (5 hours)
-MaximumAddedTime = 18000000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Teleport fee.
-# Default: 150000
-TeleportFee = 150000
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..865f031240
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,25 @@
+
+
+
+ 194291,176604,-1888
+ 3600000
+ 36000000
+ 21600000
+ 3600
+ 3600
+ 150000
+ 100
+ 120
+
+
+ 9400,-21720,-3634
+ 3600000
+ 36000000
+ 21600000
+ 3600
+ 3600
+ 150000
+ 105
+ 120
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index a6d1600cb8..7b82279b8b 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,9 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -72,9 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
index 11aa8b3950..d314f72d80 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/Config.java
@@ -104,7 +104,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -839,10 +838,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1988,13 +1983,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 18000000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 150000);
-
// Load Training Camp config file (if exists)
final PropertiesParser trainingCampSettings = new PropertiesParser(TRAINING_CAMP_CONFIG_FILE);
TRAINING_CAMP_ENABLE = trainingCampSettings.getBoolean("TrainingCampEnable", false);
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
index 665cd5a0f9..f5df9cdd92 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/GameServer.java
@@ -104,6 +104,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -351,6 +352,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..b20e2e2341
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 150000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
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 ca74f89075..cb7334bcf5 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
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -231,6 +232,7 @@ import org.l2jmobius.gameserver.model.holders.RecipeHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14276,12 +14278,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(1, x, y) // Storm Isle
- || isInTimedHuntingZone(6, x, y); // Primeval Isle
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14289,18 +14285,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
-
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 1: // Storm Isle
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 25) && (y == 23);
- }
- case 6: // Primeval Isle
- {
- return (x == 20) && (y == 17);
+ return true;
}
}
return false;
@@ -14344,8 +14343,13 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index d9345545a5..b7ca293e50 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,17 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long stormIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
- final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(6);
- if ((stormIsleExitTime > 0) && player.isInTimedHuntingZone(1))
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
{
- player.startTimedHuntingZone(1, stormIsleExitTime);
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
}
- else if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(6))
- {
- player.startTimedHuntingZone(6, primevalIsleExitTime);
- }
- else if (!player.isGM())
+
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
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 7a0fcfe988..c1fbc31c26 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
@@ -75,6 +75,8 @@ import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExt
import org.l2jmobius.gameserver.network.clientpackets.equipmentupgrade.RequestUpgradeSystemResult;
import org.l2jmobius.gameserver.network.clientpackets.faction.RequestUserFactionInfo;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGameStartInfo;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd;
@@ -111,8 +113,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
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/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 73%
rename from L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index e44ea34b95..c06b418436 100644
--- 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/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,12 +14,14 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
@@ -85,52 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (((_zoneId == 1) && (player.getLevel() < 100)) //
- || ((_zoneId == 6) && (player.getLevel() < 105)) //
- )
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
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)
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 1: // Storm Isle
- {
- player.teleToLocation(194291, 176604, -1888);
- break;
- }
- case 6: // Primeval Isle
- {
- player.teleToLocation(9400, -21720, -3634);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
similarity index 88%
rename from L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
index 945a4cbe79..7a972c2dfc 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -14,13 +14,13 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
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.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
similarity index 92%
rename from L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
index 6fc9adc50c..b30fe94754 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
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/huntingzones/TimedHuntingZoneExit.java
similarity index 92%
rename from L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
index 31caafdc50..5acc701e4e 100644
--- 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/huntingzones/TimedHuntingZoneExit.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
similarity index 52%
rename from L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
rename to L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
index 0bf985eaed..b79d3cf2c0 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -14,12 +14,13 @@
* 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;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -42,35 +43,30 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
public boolean write(PacketWriter packet)
{
OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
+ int remainingTime;
final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(1); // zone count
-
- // Ancient Pirates' Tomb
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(2); // zone id
- packet.writeD(78); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(2);
- if (endTime > 0)
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
{
- endTime += currentTime;
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeC(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated
}
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
-
return true;
}
}
\ No newline at end of file
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
deleted file mode 100644
index 2c022a0a2e..0000000000
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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.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.zone.ZoneId;
-import org.l2jmobius.gameserver.network.OutgoingPackets;
-import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
-
-/**
- * @author Mobius
- */
-public class TimedHuntingZoneList implements IClientOutgoingPacket
-{
- private final PlayerInstance _player;
- private final boolean _isInTimedHuntingZone;
-
- public TimedHuntingZoneList(PlayerInstance player)
- {
- _player = player;
- _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
- }
-
- @Override
- public boolean write(PacketWriter packet)
- {
- OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
- final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(2); // zone count
-
- // Storm Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(1); // zone id
- packet.writeD(100); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
-
- // Primeval Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(6); // zone id
- packet.writeD(105); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_8.0_Homunculus/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index d6bc0894d8..0000000000
--- a/L2J_Mobius_8.0_Homunculus/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Initial free time.
-# Default: 36000000 (10 hour)
-InitialTimeWeekly = 36000000
-
-# Maximum added time.
-# Default: 18000000 (6 hours)
-MaximumAddedTime = 21600000
-
-# Maximum added time Weekly.
-# Default: 43200000 (12 hours)
-MaximumAddedTimeWeekly = 43200000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Reset Weekly.
-# Default: 604800000 (7 Days)
-ResetWeekly = 604800000
-
-# Teleport fee.
-# Default: 150000
-TeleportFee = 150000
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_8.0_Homunculus/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..fbfe8ffe5c
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,70 @@
+
+
+
+ 194291,176604,-1888
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 100
+ 120
+
+
+ 9400,-21720,-3634
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 105
+ 120
+
+
+ -122259,73678,-2872
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 107
+ 120
+
+
+ 139411,-169382,-1600
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 99
+ 105
+
+
+ -82014,16247,-15416
+ 36000000
+ 604800000
+ 43200000
+ 43200
+ 3600
+ 150000
+ 110
+ 130
+ true
+
+
+ 181409,-78389,-2728
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 105
+ 130
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index 07f519c382..7b82279b8b 100644
--- a/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,15 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
- final long currentTime = Chronos.currentTimeMillis();
- long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((_zoneId == 8) && (endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME_WEEKLY))
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
{
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
return;
}
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
+
+ final long currentTime = Chronos.currentTimeMillis();
+ long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -78,13 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((_zoneId == 8) && ((endTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime))
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_8.0_Homunculus/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_8.0_Homunculus/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/Config.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/Config.java
index 8ca3b9544b..58d8bbe7a6 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/Config.java
@@ -104,7 +104,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -836,13 +835,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_MAX_ADDED_TIME_WEEKLY;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_RESET_WEEKLY;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1988,16 +1980,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY = timeLimitedZoneSettings.getLong("InitialTimeWeekly", 36000000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 21600000);
- TIME_LIMITED_MAX_ADDED_TIME_WEEKLY = timeLimitedZoneSettings.getLong("MaximumAddedTimeWeekly", 43200000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_RESET_WEEKLY = timeLimitedZoneSettings.getLong("ResetWeekly", 604800000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 150000);
-
// Load Training Camp config file (if exists)
final PropertiesParser trainingCampSettings = new PropertiesParser(TRAINING_CAMP_CONFIG_FILE);
TRAINING_CAMP_ENABLE = trainingCampSettings.getBoolean("TrainingCampEnable", false);
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
index b6d7f6c539..8bce59d124 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/GameServer.java
@@ -103,6 +103,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -349,6 +350,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..b20e2e2341
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 150000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 1ebb219829..9dfdc6dd95 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -82,6 +82,7 @@ import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -229,6 +230,7 @@ import org.l2jmobius.gameserver.model.holders.RecipeHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14314,16 +14316,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(1, x, y) // Storm Isle
- || isInTimedHuntingZone(6, x, y) // Primeval Isle
- || isInTimedHuntingZone(7, x, y) // Golden Altar
- || isInTimedHuntingZone(11, x, y) // Abandoned Coal Mines
- || isInTimedHuntingZone(8, x, y) // Tower of Insolence
- || isInTimedHuntingZone(12, x, y); // Imperial Tomb
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14331,33 +14323,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 1: // Storm Isle
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 25) && (y == 23);
- }
- case 6: // Primeval Isle
- {
- return (x == 20) && (y == 17);
- }
- case 7: // Golden Altar
- {
- return (x == 16) && (y == 20);
- }
- case 11: // Abandoned Coal Mines
- {
- return (x == 24) && (y == 12);
- }
- case 8: // Tower of Insolence
- {
- return (x == 17) && (y == 18);
- }
- case 12: // Imperial Tomb
- {
- return (x == 25) && (y == 15);
+ return true;
}
}
return false;
@@ -14401,9 +14381,14 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
public int getHomunculusHpBonus()
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index 9a6cb3747a..b7ca293e50 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,37 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long stormIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
- final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(6);
- final long goldenAltarExitTime = player.getTimedHuntingZoneRemainingTime(7);
- final long coalMinesExitTime = player.getTimedHuntingZoneRemainingTime(11);
- final long toiExitTime = player.getTimedHuntingZoneRemainingTime(8);
- final long imperialTombExitTime = player.getTimedHuntingZoneRemainingTime(12);
- if ((stormIsleExitTime > 0) && player.isInTimedHuntingZone(1))
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
{
- player.startTimedHuntingZone(1, stormIsleExitTime);
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
}
- else if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(6))
- {
- player.startTimedHuntingZone(6, primevalIsleExitTime);
- }
- else if ((goldenAltarExitTime > 0) && player.isInTimedHuntingZone(7))
- {
- player.startTimedHuntingZone(7, goldenAltarExitTime);
- }
- else if ((coalMinesExitTime > 0) && player.isInTimedHuntingZone(11))
- {
- player.startTimedHuntingZone(11, coalMinesExitTime);
- }
- else if ((toiExitTime > 0) && player.isInTimedHuntingZone(8))
- {
- player.startTimedHuntingZone(8, toiExitTime);
- }
- else if ((imperialTombExitTime > 0) && player.isInTimedHuntingZone(12))
- {
- player.startTimedHuntingZone(12, imperialTombExitTime);
- }
- else if (!player.isGM())
+
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index b509169071..aae68bfcb9 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -86,6 +86,8 @@ import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExHomunculusIns
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExHomunculusSummon;
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExRequestHomonculusList;
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExRequestHomunculusActivate;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGameStartInfo;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd;
@@ -121,8 +123,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 63%
rename from L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index 490038491c..c06b418436 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,12 +14,14 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
@@ -85,84 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (((_zoneId == 1) && (player.getLevel() < 100)) //
- || ((_zoneId == 6) && (player.getLevel() < 105)) //
- || ((_zoneId == 7) && (player.getLevel() < 107)) //
- || (((_zoneId == 11) && ((player.getLevel() < 99) || (player.getLevel() > 105)))) //
- || (((_zoneId == 12) && ((player.getLevel() < 110) || (player.getLevel() > 130)))) //
- || (((_zoneId == 13) && ((player.getLevel() < 105) || (player.getLevel() > 130)))) //
- )
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
final long lastEntryTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, 0);
- if ((_zoneId == 8) && ((lastEntryTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime))
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
- }
- }
- else if ((lastEntryTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- if (endTime == currentTime)
- {
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 1: // Storm Isle
- {
- player.teleToLocation(194291, 176604, -1888);
- break;
- }
- case 6: // Primeval Isle
- {
- player.teleToLocation(9400, -21720, -3634);
- break;
- }
- case 7: // Golden Altar
- {
- player.teleToLocation(-122259, 73678, -2872);
- break;
- }
- case 11: // Abandoned Coal Mines
- {
- player.teleToLocation(139411, -169382, -1600);
- break;
- }
- case 8: // Tower of Insolence
- {
- player.teleToLocation(-82014, 16247, -15416);
- break;
- }
- case 12: // Imperial Tomb
- {
- player.teleToLocation(181409, -78389, -2728);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
similarity index 88%
rename from L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
rename to L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
index 945a4cbe79..7a972c2dfc 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -14,13 +14,13 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
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.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
similarity index 92%
rename from L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
rename to L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
index 6fc9adc50c..b30fe94754 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
similarity index 92%
rename from L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
rename to L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
index 31caafdc50..5acc701e4e 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
new file mode 100644
index 0000000000..df07cdd821
--- /dev/null
+++ b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -0,0 +1,73 @@
+/*
+ * 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.huntingzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.zone.ZoneId;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneList implements IClientOutgoingPacket
+{
+ private final PlayerInstance _player;
+ private final boolean _isInTimedHuntingZone;
+
+ public TimedHuntingZoneList(PlayerInstance player)
+ {
+ _player = player;
+ _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ int remainingTime;
+ final long currentTime = Chronos.currentTimeMillis();
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeD(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated (272 C to D)
+ packet.writeH(0); // 245
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
deleted file mode 100644
index 5ad0d51367..0000000000
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * 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.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.zone.ZoneId;
-import org.l2jmobius.gameserver.network.OutgoingPackets;
-import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
-
-/**
- * @author Mobius
- */
-public class TimedHuntingZoneList implements IClientOutgoingPacket
-{
- private final PlayerInstance _player;
- private final boolean _isInTimedHuntingZone;
-
- public TimedHuntingZoneList(PlayerInstance player)
- {
- _player = player;
- _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
- }
-
- @Override
- public boolean write(PacketWriter packet)
- {
- OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
- final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(6); // zone count
-
- // Storm Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(1); // zone id
- packet.writeD(100); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Primeval Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(6); // zone id
- packet.writeD(105); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Golden Altar
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(7); // zone id
- packet.writeD(107); // min level
- packet.writeD(120); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(7);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Abandoned Coal Mines
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(11); // zone id
- packet.writeD(99); // min level
- packet.writeD(105); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(11);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Tower of Insolence
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(0); // reset cycle
- packet.writeD(8); // zone id
- packet.writeD(110); // min level
- packet.writeD(130); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(8);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME_WEEKLY / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Imperial Tomb
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(12); // zone id
- packet.writeD(105); // min level
- packet.writeD(130); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(12);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index d6bc0894d8..0000000000
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Initial free time.
-# Default: 36000000 (10 hour)
-InitialTimeWeekly = 36000000
-
-# Maximum added time.
-# Default: 18000000 (6 hours)
-MaximumAddedTime = 21600000
-
-# Maximum added time Weekly.
-# Default: 43200000 (12 hours)
-MaximumAddedTimeWeekly = 43200000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Reset Weekly.
-# Default: 604800000 (7 Days)
-ResetWeekly = 604800000
-
-# Teleport fee.
-# Default: 150000
-TeleportFee = 150000
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..fbfe8ffe5c
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,70 @@
+
+
+
+ 194291,176604,-1888
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 100
+ 120
+
+
+ 9400,-21720,-3634
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 105
+ 120
+
+
+ -122259,73678,-2872
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 107
+ 120
+
+
+ 139411,-169382,-1600
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 99
+ 105
+
+
+ -82014,16247,-15416
+ 36000000
+ 604800000
+ 43200000
+ 43200
+ 3600
+ 150000
+ 110
+ 130
+ true
+
+
+ 181409,-78389,-2728
+ 3600000
+ 36000000
+ 21600000
+ 43200
+ 3600
+ 150000
+ 105
+ 130
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index 07f519c382..7b82279b8b 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,15 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
- final long currentTime = Chronos.currentTimeMillis();
- long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((_zoneId == 8) && (endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME_WEEKLY))
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
{
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
return;
}
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
+
+ final long currentTime = Chronos.currentTimeMillis();
+ long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -78,13 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((_zoneId == 8) && ((endTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime))
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
index 8ca3b9544b..58d8bbe7a6 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
@@ -104,7 +104,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -836,13 +835,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_MAX_ADDED_TIME_WEEKLY;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_RESET_WEEKLY;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1988,16 +1980,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY = timeLimitedZoneSettings.getLong("InitialTimeWeekly", 36000000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 21600000);
- TIME_LIMITED_MAX_ADDED_TIME_WEEKLY = timeLimitedZoneSettings.getLong("MaximumAddedTimeWeekly", 43200000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_RESET_WEEKLY = timeLimitedZoneSettings.getLong("ResetWeekly", 604800000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 150000);
-
// Load Training Camp config file (if exists)
final PropertiesParser trainingCampSettings = new PropertiesParser(TRAINING_CAMP_CONFIG_FILE);
TRAINING_CAMP_ENABLE = trainingCampSettings.getBoolean("TrainingCampEnable", false);
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
index b6d7f6c539..8bce59d124 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/GameServer.java
@@ -103,6 +103,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -349,6 +350,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..b20e2e2341
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 150000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index fc0a9d0325..6803cd6f9c 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -82,6 +82,7 @@ import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
import org.l2jmobius.gameserver.data.xml.SymbolSealData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -229,6 +230,7 @@ import org.l2jmobius.gameserver.model.holders.RecipeHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14324,16 +14326,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(1, x, y) // Storm Isle
- || isInTimedHuntingZone(6, x, y) // Primeval Isle
- || isInTimedHuntingZone(7, x, y) // Golden Altar
- || isInTimedHuntingZone(11, x, y) // Abandoned Coal Mines
- || isInTimedHuntingZone(8, x, y) // Tower of Insolence
- || isInTimedHuntingZone(12, x, y); // Imperial Tomb
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14341,33 +14333,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 1: // Storm Isle
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 25) && (y == 23);
- }
- case 6: // Primeval Isle
- {
- return (x == 20) && (y == 17);
- }
- case 7: // Golden Altar
- {
- return (x == 16) && (y == 20);
- }
- case 11: // Abandoned Coal Mines
- {
- return (x == 24) && (y == 12);
- }
- case 8: // Tower of Insolence
- {
- return (x == 17) && (y == 18);
- }
- case 12: // Imperial Tomb
- {
- return (x == 25) && (y == 15);
+ return true;
}
}
return false;
@@ -14411,9 +14391,14 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
public int getHomunculusHpBonus()
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index 9a6cb3747a..b7ca293e50 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,37 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long stormIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
- final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(6);
- final long goldenAltarExitTime = player.getTimedHuntingZoneRemainingTime(7);
- final long coalMinesExitTime = player.getTimedHuntingZoneRemainingTime(11);
- final long toiExitTime = player.getTimedHuntingZoneRemainingTime(8);
- final long imperialTombExitTime = player.getTimedHuntingZoneRemainingTime(12);
- if ((stormIsleExitTime > 0) && player.isInTimedHuntingZone(1))
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
{
- player.startTimedHuntingZone(1, stormIsleExitTime);
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
}
- else if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(6))
- {
- player.startTimedHuntingZone(6, primevalIsleExitTime);
- }
- else if ((goldenAltarExitTime > 0) && player.isInTimedHuntingZone(7))
- {
- player.startTimedHuntingZone(7, goldenAltarExitTime);
- }
- else if ((coalMinesExitTime > 0) && player.isInTimedHuntingZone(11))
- {
- player.startTimedHuntingZone(11, coalMinesExitTime);
- }
- else if ((toiExitTime > 0) && player.isInTimedHuntingZone(8))
- {
- player.startTimedHuntingZone(8, toiExitTime);
- }
- else if ((imperialTombExitTime > 0) && player.isInTimedHuntingZone(12))
- {
- player.startTimedHuntingZone(12, imperialTombExitTime);
- }
- else if (!player.isGM())
+
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index 9e0e9f55a2..31cc6ebf42 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -86,6 +86,8 @@ import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExHomunculusIns
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExHomunculusSummon;
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExRequestHomonculusList;
import org.l2jmobius.gameserver.network.clientpackets.homunculus.ExRequestHomunculusActivate;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGameStartInfo;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd;
@@ -121,8 +123,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 63%
rename from L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index 490038491c..c06b418436 100644
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,12 +14,14 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
@@ -85,84 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (((_zoneId == 1) && (player.getLevel() < 100)) //
- || ((_zoneId == 6) && (player.getLevel() < 105)) //
- || ((_zoneId == 7) && (player.getLevel() < 107)) //
- || (((_zoneId == 11) && ((player.getLevel() < 99) || (player.getLevel() > 105)))) //
- || (((_zoneId == 12) && ((player.getLevel() < 110) || (player.getLevel() > 130)))) //
- || (((_zoneId == 13) && ((player.getLevel() < 105) || (player.getLevel() > 130)))) //
- )
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
final long lastEntryTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, 0);
- if ((_zoneId == 8) && ((lastEntryTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime))
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
- }
- }
- else if ((lastEntryTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- if (endTime == currentTime)
- {
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 1: // Storm Isle
- {
- player.teleToLocation(194291, 176604, -1888);
- break;
- }
- case 6: // Primeval Isle
- {
- player.teleToLocation(9400, -21720, -3634);
- break;
- }
- case 7: // Golden Altar
- {
- player.teleToLocation(-122259, 73678, -2872);
- break;
- }
- case 11: // Abandoned Coal Mines
- {
- player.teleToLocation(139411, -169382, -1600);
- break;
- }
- case 8: // Tower of Insolence
- {
- player.teleToLocation(-82014, 16247, -15416);
- break;
- }
- case 12: // Imperial Tomb
- {
- player.teleToLocation(181409, -78389, -2728);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
similarity index 88%
rename from L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
rename to L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
index 945a4cbe79..7a972c2dfc 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -14,13 +14,13 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
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.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
similarity index 92%
rename from L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
rename to L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
index 6fc9adc50c..b30fe94754 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
similarity index 92%
rename from L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
rename to L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
index 31caafdc50..5acc701e4e 100644
--- a/L2J_Mobius_8.0_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
new file mode 100644
index 0000000000..df07cdd821
--- /dev/null
+++ b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -0,0 +1,73 @@
+/*
+ * 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.huntingzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.zone.ZoneId;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneList implements IClientOutgoingPacket
+{
+ private final PlayerInstance _player;
+ private final boolean _isInTimedHuntingZone;
+
+ public TimedHuntingZoneList(PlayerInstance player)
+ {
+ _player = player;
+ _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ int remainingTime;
+ final long currentTime = Chronos.currentTimeMillis();
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeD(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated (272 C to D)
+ packet.writeH(0); // 245
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
deleted file mode 100644
index 5ad0d51367..0000000000
--- a/L2J_Mobius_9.0_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * 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.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.zone.ZoneId;
-import org.l2jmobius.gameserver.network.OutgoingPackets;
-import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
-
-/**
- * @author Mobius
- */
-public class TimedHuntingZoneList implements IClientOutgoingPacket
-{
- private final PlayerInstance _player;
- private final boolean _isInTimedHuntingZone;
-
- public TimedHuntingZoneList(PlayerInstance player)
- {
- _player = player;
- _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
- }
-
- @Override
- public boolean write(PacketWriter packet)
- {
- OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
- final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(6); // zone count
-
- // Storm Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(1); // zone id
- packet.writeD(100); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Primeval Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(6); // zone id
- packet.writeD(105); // min level
- packet.writeD(120); // max level
- 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;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Golden Altar
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(7); // zone id
- packet.writeD(107); // min level
- packet.writeD(120); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(7);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Abandoned Coal Mines
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(11); // zone id
- packet.writeD(99); // min level
- packet.writeD(105); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(11);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Tower of Insolence
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(0); // reset cycle
- packet.writeD(8); // zone id
- packet.writeD(110); // min level
- packet.writeD(130); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(8);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_WEEKLY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME_WEEKLY;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME_WEEKLY / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- // Imperial Tomb
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(12); // zone id
- packet.writeD(105); // min level
- packet.writeD(130); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(12);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- packet.writeD(3600); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0); // 245
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index 2f4bda576d..0000000000
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Maximum added time.
-# Default: 18000000 (5 hours)
-MaximumAddedTime = 18000000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Teleport fee.
-# Default: 10000
-TeleportFee = 10000
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..cb6a1cb0ba
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,14 @@
+
+
+
+ 17613,-76862,-6265
+ 3600000
+ 36000000
+ 18000000
+ 3600
+ 3600
+ 10000
+ 78
+ 999
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index a6d1600cb8..7b82279b8b 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,9 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -72,9 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
index 81835ba175..c563c27c41 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/Config.java
@@ -103,7 +103,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -845,10 +844,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1892,13 +1887,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 18000000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 10000);
-
// Load Training Camp config file (if exists)
final PropertiesParser trainingCampSettings = new PropertiesParser(TRAINING_CAMP_CONFIG_FILE);
TRAINING_CAMP_ENABLE = trainingCampSettings.getBoolean("TrainingCampEnable", false);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
index d2825d10b3..42956c9069 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/GameServer.java
@@ -103,6 +103,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -347,6 +348,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..f72bb545d5
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 10000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
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 c6fa036982..d9c5c12e20 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
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.RecipeData;
import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -232,6 +233,7 @@ import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14179,11 +14181,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(2, x, y); // Ancient Pirates' Tomb
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14191,14 +14188,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
-
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 2: // Ancient Pirates' Tomb.
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 20) && (y == 15);
+ return true;
}
}
return false;
@@ -14242,8 +14246,13 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index ce5ef68b39..b7ca293e50 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,12 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long pirateTombExitTime = player.getTimedHuntingZoneRemainingTime(2);
- if ((pirateTombExitTime > 0) && player.isInTimedHuntingZone(2))
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
{
- player.startTimedHuntingZone(2, pirateTombExitTime);
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
}
- else if (!player.isGM())
+
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
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 81c42ceeb3..75fe43b953 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
@@ -77,6 +77,8 @@ import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
import org.l2jmobius.gameserver.network.clientpackets.equipmentupgrade.RequestUpgradeSystemResult;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGameStartInfo;
import org.l2jmobius.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd;
@@ -102,8 +104,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
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/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 72%
rename from L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index 59ba1b0d67..392db9259a 100644
--- 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/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,15 +14,18 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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;
/**
@@ -84,45 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if ((_zoneId == 2) && (player.getLevel() < 78))
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
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)
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendMessage("Not enough adena.");
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendMessage("Not enough adena.");
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 2: // Ancient Pirates' Tomb
- {
- player.teleToLocation(17613, -76862, -6265);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
similarity index 88%
rename from L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
rename to L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
index 945a4cbe79..7a972c2dfc 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -14,13 +14,13 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
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.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
similarity index 92%
rename from L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
rename to L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
index 6fc9adc50c..b30fe94754 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
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/huntingzones/TimedHuntingZoneExit.java
similarity index 92%
rename from L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
rename to L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
index 31caafdc50..5acc701e4e 100644
--- 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/huntingzones/TimedHuntingZoneExit.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.sessionzones;
+package org.l2jmobius.gameserver.network.serverpackets.huntingzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.network.OutgoingPackets;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
new file mode 100644
index 0000000000..b79d3cf2c0
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -0,0 +1,72 @@
+/*
+ * 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.huntingzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.zone.ZoneId;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneList implements IClientOutgoingPacket
+{
+ private final PlayerInstance _player;
+ private final boolean _isInTimedHuntingZone;
+
+ public TimedHuntingZoneList(PlayerInstance player)
+ {
+ _player = player;
+ _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ int remainingTime;
+ final long currentTime = Chronos.currentTimeMillis();
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeC(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index 2db26f6ab9..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,48 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Initial free time Primeval Isle.
-# Default: 7200000 (1 hour)
-PrimevalStart = 7200000
-
-# Maximum Added time Primeval Isle.
-# Default: 46800000 (13 hours)
-PrimevalMaxTime = 46800000
-
-# Maximum Added time Alligator Island.
-# Default: 10800000 (3 hours)
-AlligatorMaxTime = 10800000
-
-# Maximum Added time Forgotten Primeval Garden.
-# Default: 21600000 (6 hours)
-PrimevalGardenMaxTime = 21600000
-
-# Initial free time Antharas Lair.
-# Default: 25200000 (7 hours)
-AntharasLairStart = 25200000
-
-# Maximum Added time Antharas Lair.
-# Default: 151200000 (42 hours)
-AntharasLairMaxTime = 151200000
-
-# Reset delay Only Antharas Lair (Weekly).
-# Default: 604800000 (7 Days)
-AntharasLairResetDelay = 604800000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Teleport fee.
-# Default: 10000
-TeleportFee = 10000
-
-# TODO: NOT USED
-# Maximum added time.
-# Default: 18000000 (5 hours)
-MaximumAddedTime = 18000000
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..00c71c3148
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,116 @@
+
+
+
+ 9400,-21720,-3634
+ 3600000
+ 36000000
+ 46800000
+ 43200
+ 3600
+ 10000
+ 40
+ 999
+
+
+ -112937,213590,-13248
+ 3600000
+ 36000000
+ 21600000
+ 18000
+ 3600
+ 10000
+ 76
+ 999
+
+
+ 115528,191580,-3371
+ 3600000
+ 36000000
+ 46800000
+ 7200
+ 3600
+ 10000
+ 60
+ 999
+
+
+ 133247,114445,-3724
+ 25200000
+ 604800000
+ 151200000
+ 126000
+ 3600
+ 10000
+ 80
+ 999
+ true
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index 7d376e0c47..7b82279b8b 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,33 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_PRIMEVAL))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_ALLIGATOR))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_GARDEN))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_ANTHARAS))
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -96,17 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_PRIMEVAL;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_ANTHARAS;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/Config.java
index cd83750a6f..30f30d9c96 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/Config.java
@@ -103,7 +103,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -851,17 +850,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_ZONE_PRIMEVAL;
- public static long TIME_LIMITED_ZONE_ANTHARAS;
- public static long TIME_LIMITED_MAX_ADDED_PRIMEVAL;
- public static long TIME_LIMITED_MAX_ADDED_ALLIGATOR;
- public static long TIME_LIMITED_MAX_ADDED_GARDEN;
- public static long TIME_LIMITED_MAX_ADDED_ANTHARAS;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1917,20 +1905,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_PRIMEVAL = timeLimitedZoneSettings.getLong("PrimevalStart", 7200000);
- TIME_LIMITED_ZONE_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairStart", 25200000);
- TIME_LIMITED_MAX_ADDED_PRIMEVAL = timeLimitedZoneSettings.getLong("PrimevalMaxTime", 46800000);
- TIME_LIMITED_MAX_ADDED_ALLIGATOR = timeLimitedZoneSettings.getLong("AlligatorMaxTime", 10800000);
- TIME_LIMITED_MAX_ADDED_GARDEN = timeLimitedZoneSettings.getLong("PrimevalGardenMaxTime", 21600000);
- TIME_LIMITED_MAX_ADDED_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairMaxTime", 151200000);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 18000000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairResetDelay", 604800000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 10000);
-
// Load Magic Lamp config file (if exists)
final PropertiesParser magicLampSettings = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampSettings.getBoolean("MagicLampEnabled", false);
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
index 7049118dd7..d58f25365d 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/GameServer.java
@@ -107,6 +107,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -355,6 +356,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..f72bb545d5
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 10000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index dbccce4340..6bf49d433d 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.RecipeData;
import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -233,6 +234,7 @@ import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14416,20 +14418,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(1, x, y) // Primeval Isle
- || isInTimedHuntingZone(4, x, y) // Primeval Garden
- || isInTimedHuntingZone(11, x, y) // Aligator Island
- || isInTimedHuntingZone(12, x, y) // Antharas Lair
- || isInTimedHuntingZone(101, x, y) // Transcendent Instance Zone 1
- || isInTimedHuntingZone(102, x, y) // Transcendent Instance Zone 2
- || isInTimedHuntingZone(103, x, y) // Transcendent Instance Zone 3
- || isInTimedHuntingZone(104, x, y) // Transcendent Instance Zone 4
- || isInTimedHuntingZone(106, x, y) // Transcendent Instance Zone 6
- || isInTimedHuntingZone(107, x, y); // Transcendent Instance Zone 7
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14437,50 +14425,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
-
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 1: // Primeval Isle
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 20) && (y == 17);
- }
- case 4: // Primeval Garden
- {
- return (x == 24) && (y == 19);
- }
- case 11: // Primeval Garden
- {
- return (x == 23) && (y == 23);
- }
- case 12: // Antharas Lair
- {
- return (x == 25) && (y == 21);
- }
- case 101: // Transcendent Instance Zone 1
- {
- return (x == 21) && (y == 18);
- }
- case 102: // Transcendent Instance Zone 2
- {
- return (x == 23) && (y == 19);
- }
- case 103: // Transcendent Instance Zone 3
- {
- return (x == 24) && (y == 17);
- }
- case 104: // Transcendent Instance Zone 4
- {
- return (x == 24) && (y == 18);
- }
- case 106: // Transcendent Instance Zone 6
- {
- return (x == 23) && (y == 21);
- }
- case 107: // Transcendent Instance Zone 7
- {
- return (x == 18) && (y == 22);
+ return true;
}
}
return false;
@@ -14524,9 +14483,14 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
private void restoreRandomCraft()
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index 52bb5bf73b..b7ca293e50 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,58 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
- final long primevalGardenExitTime = player.getTimedHuntingZoneRemainingTime(4);
- final long alligatorIslandExitTime = player.getTimedHuntingZoneRemainingTime(11);
- final long antharasLairExitTime = player.getTimedHuntingZoneRemainingTime(12);
- final long transcendent1ExitTime = player.getTimedHuntingZoneRemainingTime(101);
- final long transcendent2ExitTime = player.getTimedHuntingZoneRemainingTime(102);
- final long transcendent3ExitTime = player.getTimedHuntingZoneRemainingTime(103);
- final long transcendent4ExitTime = player.getTimedHuntingZoneRemainingTime(104);
- final long transcendent6ExitTime = player.getTimedHuntingZoneRemainingTime(106);
- final long transcendent7ExitTime = player.getTimedHuntingZoneRemainingTime(107);
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
+ }
- if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(1))
- {
- player.startTimedHuntingZone(1, primevalIsleExitTime);
- }
- else if ((primevalGardenExitTime > 0) && player.isInTimedHuntingZone(4))
- {
- player.startTimedHuntingZone(4, primevalGardenExitTime);
- }
- else if ((alligatorIslandExitTime > 0) && player.isInTimedHuntingZone(11))
- {
- player.startTimedHuntingZone(11, alligatorIslandExitTime);
- }
- else if ((antharasLairExitTime > 0) && player.isInTimedHuntingZone(12))
- {
- player.startTimedHuntingZone(12, antharasLairExitTime);
- }
- else if ((transcendent1ExitTime > 0) && player.isInTimedHuntingZone(101))
- {
- player.startTimedHuntingZone(101, transcendent1ExitTime);
- }
- else if ((transcendent2ExitTime > 0) && player.isInTimedHuntingZone(102))
- {
- player.startTimedHuntingZone(102, transcendent2ExitTime);
- }
- else if ((transcendent3ExitTime > 0) && player.isInTimedHuntingZone(103))
- {
- player.startTimedHuntingZone(103, transcendent3ExitTime);
- }
- else if ((transcendent4ExitTime > 0) && player.isInTimedHuntingZone(104))
- {
- player.startTimedHuntingZone(104, transcendent4ExitTime);
- }
- else if ((transcendent6ExitTime > 0) && player.isInTimedHuntingZone(106))
- {
- player.startTimedHuntingZone(106, transcendent6ExitTime);
- }
- else if ((transcendent7ExitTime > 0) && player.isInTimedHuntingZone(107))
- {
- player.startTimedHuntingZone(107, transcendent7ExitTime);
- }
- else if (!player.isGM())
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index 059775ff09..ad33458411 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -80,6 +80,8 @@ import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
import org.l2jmobius.gameserver.network.clientpackets.equipmentupgrade.RequestUpgradeSystemResult;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.limitshop.RequestPurchaseLimitShopItemBuy;
import org.l2jmobius.gameserver.network.clientpackets.limitshop.RequestPurchaseLimitShopItemList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
@@ -114,8 +116,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 62%
rename from L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index b9ea6be8f8..392db9259a 100644
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,15 +14,18 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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;
/**
@@ -84,95 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (((_zoneId == 1) && (player.getLevel() < 40)) //
- || ((_zoneId == 4) && (player.getLevel() < 76)) //
- || ((_zoneId == 11) && (player.getLevel() < 60)) //
- || ((_zoneId == 12) && (player.getLevel() < 80)) //
- || ((_zoneId == 101) && (player.getLevel() < 40)) //
- )
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
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)
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendMessage("Not enough adena.");
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendMessage("Not enough adena.");
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 1: // Primeval Isle
- {
- player.teleToLocation(9400, -21720, -3634);
- break;
- }
- case 4: // Forgotten Primeval Garden
- {
- player.teleToLocation(-112937, 213590, -13248);
- break;
- }
- case 11: // Aligator Island
- {
- player.teleToLocation(115528, 191580, -3371);
- break;
- }
- case 12: // Antharas Lair
- {
- player.teleToLocation(133247, 114445, -3724);
- break;
- }
- case 101: // Transcendent Instance Zone 1
- {
- player.teleToLocation(63443, 26304, -3755);
- break;
- }
- case 102: // Transcendent Instance Zone 2
- {
- player.teleToLocation(125277, 70262, -4408);
- break;
- }
- case 103: // Transcendent Instance Zone 3
- {
- player.teleToLocation(148724, -22366, -3436);
- break;
- }
- case 104: // Transcendent Instance Zone 4
- {
- player.teleToLocation(167965, 28800, -3606);
- break;
- }
- case 106: // Transcendent Instance Zone 6
- {
- player.teleToLocation(99797, 110524, -3702);
- break;
- }
- case 107: // Transcendent Instance Zone 7
- {
- player.teleToLocation(-50416, 145363, -2825);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
new file mode 100644
index 0000000000..7a972c2dfc
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -0,0 +1,47 @@
+/*
+ * 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.huntingzones;
+
+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.huntingzones.TimedHuntingZoneList;
+
+/**
+ * @author Mobius
+ */
+public class ExTimedHuntingZoneList implements IClientIncomingPacket
+{
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ client.sendPacket(new TimedHuntingZoneList(player));
+ }
+}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
deleted file mode 100644
index 945a4cbe79..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.network.GameClient;
-import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
-
-/**
- * @author Mobius
- */
-public class ExTimedHuntingZoneList implements IClientIncomingPacket
-{
- @Override
- public boolean read(GameClient client, PacketReader packet)
- {
- return true;
- }
-
- @Override
- public void run(GameClient client)
- {
- final PlayerInstance player = client.getPlayer();
- if (player == null)
- {
- return;
- }
-
- client.sendPacket(new TimedHuntingZoneList(player));
- }
-}
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..b30fe94754
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/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.huntingzones;
+
+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_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
new file mode 100644
index 0000000000..5acc701e4e
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/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.huntingzones;
+
+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_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
new file mode 100644
index 0000000000..df07cdd821
--- /dev/null
+++ b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -0,0 +1,73 @@
+/*
+ * 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.huntingzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.zone.ZoneId;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneList implements IClientOutgoingPacket
+{
+ private final PlayerInstance _player;
+ private final boolean _isInTimedHuntingZone;
+
+ public TimedHuntingZoneList(PlayerInstance player)
+ {
+ _player = player;
+ _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ int remainingTime;
+ final long currentTime = Chronos.currentTimeMillis();
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeD(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated (272 C to D)
+ packet.writeH(0); // 245
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
deleted file mode 100644
index 6fc9adc50c..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
deleted file mode 100644
index 31caafdc50..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
deleted file mode 100644
index 23b5cc8d07..0000000000
--- a/L2J_Mobius_Essence_4.0_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * 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.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.zone.ZoneId;
-import org.l2jmobius.gameserver.network.OutgoingPackets;
-import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
-
-/**
- * @author Mobius
- */
-public class TimedHuntingZoneList implements IClientOutgoingPacket
-{
- private final PlayerInstance _player;
- private final boolean _isInTimedHuntingZone;
-
- public TimedHuntingZoneList(PlayerInstance player)
- {
- _player = player;
- _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
- }
-
- @Override
- public boolean write(PacketWriter packet)
- {
- OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
- final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(4); // zone count
-
- // Primeval Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(1); // zone id
- packet.writeD(40); // min level
- packet.writeD(999); // max level
- 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_PRIMEVAL;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_PRIMEVAL / 1000));
- packet.writeD(43200); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Forgotten Primeval Garden
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(4); // zone id
- packet.writeD(76); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(4);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_GARDEN / 1000));
- packet.writeD(18000); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Alligator Island
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(11); // zone id
- packet.writeD(60); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(11);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_ALLIGATOR / 1000));
- packet.writeD(7200); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Antharas Lair
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(0); // reset cycle
- packet.writeD(12); // zone id
- packet.writeD(80); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(12);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_ANTHARAS;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_ANTHARAS / 1000));
- packet.writeD(126000); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Transcendent Instance Zone 1
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(101); // zone id
- // packet.writeD(40); // min level
- // packet.writeD(49); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(101);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 2
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(102); // zone id
- // packet.writeD(50); // min level
- // packet.writeD(59); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(102);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 3
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(103); // zone id
- // packet.writeD(60); // min level
- // packet.writeD(69); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(103);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 4
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(104); // zone id
- // packet.writeD(70); // min level
- // packet.writeD(79); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(104);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 6
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(106); // zone id
- // packet.writeD(80); // min level
- // packet.writeD(999); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(106);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 7
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(107); // zone id
- // packet.writeD(85); // min level
- // packet.writeD(999); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(107);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- return true;
- }
-}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/config/TimeLimitedZones.ini b/L2J_Mobius_Essence_5.0_Sylph/dist/game/config/TimeLimitedZones.ini
deleted file mode 100644
index 2db26f6ab9..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/config/TimeLimitedZones.ini
+++ /dev/null
@@ -1,48 +0,0 @@
-# ---------------------------------------------------------------------------
-# Time Limited Zones
-# ---------------------------------------------------------------------------
-
-# Initial free time.
-# Default: 3600000 (1 hour)
-InitialTime = 3600000
-
-# Initial free time Primeval Isle.
-# Default: 7200000 (1 hour)
-PrimevalStart = 7200000
-
-# Maximum Added time Primeval Isle.
-# Default: 46800000 (13 hours)
-PrimevalMaxTime = 46800000
-
-# Maximum Added time Alligator Island.
-# Default: 10800000 (3 hours)
-AlligatorMaxTime = 10800000
-
-# Maximum Added time Forgotten Primeval Garden.
-# Default: 21600000 (6 hours)
-PrimevalGardenMaxTime = 21600000
-
-# Initial free time Antharas Lair.
-# Default: 25200000 (7 hours)
-AntharasLairStart = 25200000
-
-# Maximum Added time Antharas Lair.
-# Default: 151200000 (42 hours)
-AntharasLairMaxTime = 151200000
-
-# Reset delay Only Antharas Lair (Weekly).
-# Default: 604800000 (7 Days)
-AntharasLairResetDelay = 604800000
-
-# Reset delay.
-# Default: 36000000 (10 hours)
-ResetDelay = 36000000
-
-# Teleport fee.
-# Default: 10000
-TeleportFee = 10000
-
-# TODO: NOT USED
-# Maximum added time.
-# Default: 18000000 (5 hours)
-MaximumAddedTime = 18000000
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/TimedHuntingZoneData.xml b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/TimedHuntingZoneData.xml
new file mode 100644
index 0000000000..00c71c3148
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/TimedHuntingZoneData.xml
@@ -0,0 +1,116 @@
+
+
+
+ 9400,-21720,-3634
+ 3600000
+ 36000000
+ 46800000
+ 43200
+ 3600
+ 10000
+ 40
+ 999
+
+
+ -112937,213590,-13248
+ 3600000
+ 36000000
+ 21600000
+ 18000
+ 3600
+ 10000
+ 76
+ 999
+
+
+ 115528,191580,-3371
+ 3600000
+ 36000000
+ 46800000
+ 7200
+ 3600
+ 10000
+ 60
+ 999
+
+
+ 133247,114445,-3724
+ 25200000
+ 604800000
+ 151200000
+ 126000
+ 3600
+ 10000
+ 80
+ 999
+ true
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
index 7d376e0c47..7b82279b8b 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -16,16 +16,17 @@
*/
package handlers.effecthandlers;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.StatSet;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneList;
/**
* @author Mobius
@@ -56,33 +57,15 @@ public class AddHuntingTime extends AbstractEffect
return;
}
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
final long currentTime = Chronos.currentTimeMillis();
long endTime = currentTime + player.getTimedHuntingZoneRemainingTime(_zoneId);
- if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_TIME))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_PRIMEVAL))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_ALLIGATOR))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_GARDEN))
- {
- player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
- player.sendMessage("You cannot exceed the time zone limit.");
- return;
- }
- else if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= Config.TIME_LIMITED_MAX_ADDED_ANTHARAS))
+ if ((endTime > currentTime) && (((endTime - currentTime) + _time) >= holder.getMaximumAddedTime()))
{
player.getInventory().addItem("AddHuntingTime effect refund", item.getId(), 1, player, player);
player.sendMessage("You cannot exceed the time zone limit.");
@@ -96,17 +79,9 @@ public class AddHuntingTime extends AbstractEffect
}
else
{
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
+ if ((endTime + holder.getResetDelay()) < currentTime)
{
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_PRIMEVAL;
- }
- else if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_ANTHARAS;
+ endTime = currentTime + holder.getInitialTime();
}
else if (endTime < currentTime)
{
diff --git a/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/TimedHuntingZoneData.xsd b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/TimedHuntingZoneData.xsd
new file mode 100644
index 0000000000..c5dd31a591
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/dist/game/data/xsd/TimedHuntingZoneData.xsd
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/Config.java
index bd4c003aa0..4223a2c10e 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/Config.java
@@ -103,7 +103,6 @@ public class Config
private static final String RATES_CONFIG_FILE = "./config/Rates.ini";
private static final String SERVER_CONFIG_FILE = "./config/Server.ini";
private static final String TELNET_CONFIG_FILE = "./config/Telnet.ini";
- private static final String TIME_LIMITED_ZONE_CONFIG_FILE = "./config/TimeLimitedZones.ini";
private static final String TRAINING_CAMP_CONFIG_FILE = "./config/TrainingCamp.ini";
private static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
private static final String HEXID_FILE = "./config/hexid.txt";
@@ -851,17 +850,6 @@ public class Config
public static String TELNET_HOSTNAME;
public static List TELNET_HOSTS;
public static int TELNET_PORT;
- public static long TIME_LIMITED_ZONE_INITIAL_TIME;
- public static long TIME_LIMITED_ZONE_PRIMEVAL;
- public static long TIME_LIMITED_ZONE_ANTHARAS;
- public static long TIME_LIMITED_MAX_ADDED_PRIMEVAL;
- public static long TIME_LIMITED_MAX_ADDED_ALLIGATOR;
- public static long TIME_LIMITED_MAX_ADDED_GARDEN;
- public static long TIME_LIMITED_MAX_ADDED_ANTHARAS;
- public static long TIME_LIMITED_MAX_ADDED_TIME;
- public static long TIME_LIMITED_ZONE_RESET_DELAY;
- public static long TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS;
- public static long TIME_LIMITED_ZONE_TELEPORT_FEE;
public static boolean TRAINING_CAMP_ENABLE;
public static boolean TRAINING_CAMP_PREMIUM_ONLY;
public static int TRAINING_CAMP_MAX_DURATION;
@@ -1917,20 +1905,6 @@ public class Config
TELNET_PASSWORD = telnetSettings.getString("Password", "");
TELNET_HOSTS = Arrays.asList(telnetSettings.getString("ListOfHosts", "127.0.0.1,::1").split(","));
- // Load Time Limited Zone config file (if exists)
- final PropertiesParser timeLimitedZoneSettings = new PropertiesParser(TIME_LIMITED_ZONE_CONFIG_FILE);
- TIME_LIMITED_ZONE_PRIMEVAL = timeLimitedZoneSettings.getLong("PrimevalStart", 7200000);
- TIME_LIMITED_ZONE_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairStart", 25200000);
- TIME_LIMITED_MAX_ADDED_PRIMEVAL = timeLimitedZoneSettings.getLong("PrimevalMaxTime", 46800000);
- TIME_LIMITED_MAX_ADDED_ALLIGATOR = timeLimitedZoneSettings.getLong("AlligatorMaxTime", 10800000);
- TIME_LIMITED_MAX_ADDED_GARDEN = timeLimitedZoneSettings.getLong("PrimevalGardenMaxTime", 21600000);
- TIME_LIMITED_MAX_ADDED_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairMaxTime", 151200000);
- TIME_LIMITED_ZONE_INITIAL_TIME = timeLimitedZoneSettings.getLong("InitialTime", 3600000);
- TIME_LIMITED_MAX_ADDED_TIME = timeLimitedZoneSettings.getLong("MaximumAddedTime", 18000000);
- TIME_LIMITED_ZONE_RESET_DELAY = timeLimitedZoneSettings.getLong("ResetDelay", 36000000);
- TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS = timeLimitedZoneSettings.getLong("AntharasLairResetDelay", 604800000);
- TIME_LIMITED_ZONE_TELEPORT_FEE = timeLimitedZoneSettings.getLong("TeleportFee", 10000);
-
// Load Magic Lamp config file (if exists)
final PropertiesParser magicLampSettings = new PropertiesParser(MAGIC_LAMP_FILE);
ENABLE_MAGIC_LAMP = magicLampSettings.getBoolean("MagicLampEnabled", false);
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/GameServer.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/GameServer.java
index d2f2da9e5b..a34d920cb8 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/GameServer.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/GameServer.java
@@ -108,6 +108,7 @@ import org.l2jmobius.gameserver.data.xml.SpawnData;
import org.l2jmobius.gameserver.data.xml.StaticObjectData;
import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.data.xml.TeleporterData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.data.xml.TransformData;
import org.l2jmobius.gameserver.data.xml.VariationData;
import org.l2jmobius.gameserver.geoengine.GeoEngine;
@@ -357,6 +358,7 @@ public class GameServer
CrestTable.getInstance();
TeleportListData.getInstance();
TeleporterData.getInstance();
+ TimedHuntingZoneData.getInstance();
MatchingRoomManager.getInstance();
PetitionManager.getInstance();
CursedWeaponsManager.getInstance();
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
new file mode 100644
index 0000000000..f72bb545d5
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/data/xml/TimedHuntingZoneData.java
@@ -0,0 +1,186 @@
+/*
+ * 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.data.xml;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
+import org.l2jmobius.commons.util.IXmlReader;
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneData implements IXmlReader
+{
+ private static final Logger LOGGER = Logger.getLogger(TimedHuntingZoneData.class.getName());
+
+ private final Map _timedHuntingZoneData = new HashMap<>();
+
+ protected TimedHuntingZoneData()
+ {
+ load();
+ }
+
+ @Override
+ public void load()
+ {
+ _timedHuntingZoneData.clear();
+ parseDatapackFile("data/TimedHuntingZoneData.xml");
+
+ if (!_timedHuntingZoneData.isEmpty())
+ {
+ LOGGER.info(getClass().getSimpleName() + ": Loaded " + _timedHuntingZoneData.size() + " timed hunting zones.");
+ }
+ else
+ {
+ LOGGER.info(getClass().getSimpleName() + ": System is disabled.");
+ }
+ }
+
+ @Override
+ public void parseDocument(Document doc, File f)
+ {
+ for (Node xmlNode = doc.getFirstChild(); xmlNode != null; xmlNode = xmlNode.getNextSibling())
+ {
+ if ("list".equalsIgnoreCase(xmlNode.getNodeName()))
+ {
+ final NamedNodeMap listAttributes = xmlNode.getAttributes();
+ final Node attribute = listAttributes.getNamedItem("enabled");
+ if ((attribute != null) && Boolean.parseBoolean(attribute.getNodeValue()))
+ {
+ for (Node listNode = xmlNode.getFirstChild(); listNode != null; listNode = listNode.getNextSibling())
+ {
+ if ("zone".equalsIgnoreCase(listNode.getNodeName()))
+ {
+ final NamedNodeMap zoneAttributes = listNode.getAttributes();
+ int id = parseInteger(zoneAttributes, "id");
+ String name = parseString(zoneAttributes, "name", "");
+ int initialTime = 0;
+ int maxAddedTime = 0;
+ int resetDelay = 0;
+ int entryItemId = 57;
+ int entryFee = 10000;
+ int minLevel = 1;
+ int maxLevel = 999;
+ int remainRefillTime = 3600;
+ int refillTimeMax = 3600;
+ boolean weekly = false;
+ Location enterLocation = null;
+ for (Node zoneNode = listNode.getFirstChild(); zoneNode != null; zoneNode = zoneNode.getNextSibling())
+ {
+ switch (zoneNode.getNodeName())
+ {
+ case "enterLocation":
+ {
+ final String[] coordinates = zoneNode.getTextContent().split(",");
+ enterLocation = new Location(Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1]), Integer.parseInt(coordinates[2]));
+ break;
+ }
+ case "initialTime":
+ {
+ initialTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxAddedTime":
+ {
+ maxAddedTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "resetDelay":
+ {
+ resetDelay = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryItemId":
+ {
+ entryItemId = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "entryFee":
+ {
+ entryFee = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "minLevel":
+ {
+ minLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "maxLevel":
+ {
+ maxLevel = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "remainRefillTime":
+ {
+ remainRefillTime = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "refillTimeMax":
+ {
+ refillTimeMax = Integer.parseInt(zoneNode.getTextContent());
+ break;
+ }
+ case "weekly":
+ {
+ weekly = Boolean.parseBoolean(zoneNode.getTextContent());
+ break;
+ }
+ }
+ }
+ _timedHuntingZoneData.put(id, new TimedHuntingZoneHolder(id, name, initialTime, maxAddedTime, resetDelay, entryItemId, entryFee, minLevel, maxLevel, remainRefillTime, refillTimeMax, weekly, enterLocation));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public TimedHuntingZoneHolder getHuntingZone(int zoneId)
+ {
+ return _timedHuntingZoneData.get(zoneId);
+ }
+
+ public Collection getAllHuntingZones()
+ {
+ return _timedHuntingZoneData.values();
+ }
+
+ public int getSize()
+ {
+ return _timedHuntingZoneData.size();
+ }
+
+ public static TimedHuntingZoneData getInstance()
+ {
+ return SingletonHolder.INSTANCE;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final TimedHuntingZoneData INSTANCE = new TimedHuntingZoneData();
+ }
+}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
index 8ecb250671..f01a0619b3 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java
@@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.data.xml.RecipeData;
import org.l2jmobius.gameserver.data.xml.SendMessageLocalisationData;
import org.l2jmobius.gameserver.data.xml.SkillData;
import org.l2jmobius.gameserver.data.xml.SkillTreeData;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.enums.AdminTeleportType;
import org.l2jmobius.gameserver.enums.BroochJewel;
import org.l2jmobius.gameserver.enums.CastleSide;
@@ -233,6 +234,7 @@ import org.l2jmobius.gameserver.model.holders.PreparedMultisellListHolder;
import org.l2jmobius.gameserver.model.holders.SellBuffHolder;
import org.l2jmobius.gameserver.model.holders.SkillUseHolder;
import org.l2jmobius.gameserver.model.holders.SubClassHolder;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.holders.TrainingHolder;
import org.l2jmobius.gameserver.model.instancezone.Instance;
import org.l2jmobius.gameserver.model.interfaces.ILocational;
@@ -14430,20 +14432,6 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
- public boolean isInTimedHuntingZone(int x, int y)
- {
- return isInTimedHuntingZone(1, x, y) // Primeval Isle
- || isInTimedHuntingZone(4, x, y) // Primeval Garden
- || isInTimedHuntingZone(11, x, y) // Aligator Island
- || isInTimedHuntingZone(12, x, y) // Antharas Lair
- || isInTimedHuntingZone(101, x, y) // Transcendent Instance Zone 1
- || isInTimedHuntingZone(102, x, y) // Transcendent Instance Zone 2
- || isInTimedHuntingZone(103, x, y) // Transcendent Instance Zone 3
- || isInTimedHuntingZone(104, x, y) // Transcendent Instance Zone 4
- || isInTimedHuntingZone(106, x, y) // Transcendent Instance Zone 6
- || isInTimedHuntingZone(107, x, y); // Transcendent Instance Zone 7
- }
-
public boolean isInTimedHuntingZone(int zoneId)
{
return isInTimedHuntingZone(zoneId, getX(), getY());
@@ -14451,50 +14439,21 @@ public class PlayerInstance extends Playable
public boolean isInTimedHuntingZone(int zoneId, int locX, int locY)
{
- final int x = ((locX - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
- final int y = ((locY - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
-
- switch (zoneId)
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(zoneId);
+ if (holder == null)
{
- case 1: // Primeval Isle
+ return false;
+ }
+ 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));
+ }
+
+ public boolean isInTimedHuntingZone(int x, int y)
+ {
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (isInTimedHuntingZone(holder.getZoneId(), x, y))
{
- return (x == 20) && (y == 17);
- }
- case 4: // Primeval Garden
- {
- return (x == 24) && (y == 19);
- }
- case 11: // Primeval Garden
- {
- return (x == 23) && (y == 23);
- }
- case 12: // Antharas Lair
- {
- return (x == 25) && (y == 21);
- }
- case 101: // Transcendent Instance Zone 1
- {
- return (x == 21) && (y == 18);
- }
- case 102: // Transcendent Instance Zone 2
- {
- return (x == 23) && (y == 19);
- }
- case 103: // Transcendent Instance Zone 3
- {
- return (x == 24) && (y == 17);
- }
- case 104: // Transcendent Instance Zone 4
- {
- return (x == 24) && (y == 18);
- }
- case 106: // Transcendent Instance Zone 6
- {
- return (x == 23) && (y == 21);
- }
- case 107: // Transcendent Instance Zone 7
- {
- return (x == 18) && (y == 22);
+ return true;
}
}
return false;
@@ -14538,9 +14497,14 @@ public class PlayerInstance extends Playable
}
}
- public long getTimedHuntingZoneRemainingTime(int zoneId)
+ public int getTimedHuntingZoneRemainingTime(int zoneId)
{
- return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ return Math.max(getVariables().getInt(PlayerVariables.HUNTING_ZONE_TIME + zoneId, 0), 0);
+ }
+
+ public long getTimedHuntingZoneInitialEntry(int zoneId)
+ {
+ return Math.max(getVariables().getLong(PlayerVariables.HUNTING_ZONE_ENTRY + zoneId, 0), 0);
}
private void restoreRandomCraft()
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
new file mode 100644
index 0000000000..8dc7e29393
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/holders/TimedHuntingZoneHolder.java
@@ -0,0 +1,136 @@
+/*
+ * 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.model.holders;
+
+import org.l2jmobius.gameserver.model.Location;
+import org.l2jmobius.gameserver.model.World;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneHolder
+{
+ private final int _id;
+ private final String _name;
+ private final int _initialTime;
+ private final int _maximumAddedTime;
+ private final int _resetDelay;
+ private final int _entryItemId;
+ private final int _entryFee;
+ private final int _minLevel;
+ private final int _maxLevel;
+ private final int _remainRefillTime;
+ private final int _refillTimeMax;
+ private final boolean _weekly;
+ private final Location _enterLocation;
+ private final int _mapX;
+ private final int _mapY;
+
+ public TimedHuntingZoneHolder(int id, String name, int initialTime, int maximumAddedTime, int resetDelay, int entryItemId, int entryFee, int minLevel, int maxLevel, int remainRefillTime, int refillTimeMax, boolean weekly, Location enterLocation)
+ {
+ _id = id;
+ _name = name;
+ _initialTime = initialTime;
+ _maximumAddedTime = maximumAddedTime;
+ _resetDelay = resetDelay;
+ _entryItemId = entryItemId;
+ _entryFee = entryFee;
+ _minLevel = minLevel;
+ _maxLevel = maxLevel;
+ _remainRefillTime = remainRefillTime;
+ _refillTimeMax = refillTimeMax;
+ _weekly = weekly;
+ _enterLocation = enterLocation;
+ _mapX = ((_enterLocation.getX() - World.WORLD_X_MIN) >> 15) + World.TILE_X_MIN;
+ _mapY = ((_enterLocation.getY() - World.WORLD_Y_MIN) >> 15) + World.TILE_Y_MIN;
+ }
+
+ public int getZoneId()
+ {
+ return _id;
+ }
+
+ public String getZoneName()
+ {
+ return _name;
+ }
+
+ public int getInitialTime()
+ {
+ return _initialTime;
+ }
+
+ public int getMaximumAddedTime()
+ {
+ return _maximumAddedTime;
+ }
+
+ public int getResetDelay()
+ {
+ return _resetDelay;
+ }
+
+ public int getEntryItemId()
+ {
+ return _entryItemId;
+ }
+
+ public int getEntryFee()
+ {
+ return _entryFee;
+ }
+
+ public int getMinLevel()
+ {
+ return _minLevel;
+ }
+
+ public int getMaxLevel()
+ {
+ return _maxLevel;
+ }
+
+ public int getRemainRefillTime()
+ {
+ return _remainRefillTime;
+ }
+
+ public int getRefillTimeMax()
+ {
+ return _refillTimeMax;
+ }
+
+ public boolean isWeekly()
+ {
+ return _weekly;
+ }
+
+ public Location getEnterLocation()
+ {
+ return _enterLocation;
+ }
+
+ public int getMapX()
+ {
+ return _mapX;
+ }
+
+ public int getMapY()
+ {
+ return _mapY;
+ }
+}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
index 52bb5bf73b..b7ca293e50 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/model/zone/type/TimedHuntingZone.java
@@ -16,13 +16,15 @@
*/
package org.l2jmobius.gameserver.model.zone.type;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
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.holders.TimedHuntingZoneHolder;
import org.l2jmobius.gameserver.model.zone.ZoneId;
import org.l2jmobius.gameserver.model.zone.ZoneType;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneExit;
+import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit;
/**
* @author Mobius
@@ -42,58 +44,23 @@ public class TimedHuntingZone extends ZoneType
{
player.setInsideZone(ZoneId.TIMED_HUNTING, true);
- final long primevalIsleExitTime = player.getTimedHuntingZoneRemainingTime(1);
- final long primevalGardenExitTime = player.getTimedHuntingZoneRemainingTime(4);
- final long alligatorIslandExitTime = player.getTimedHuntingZoneRemainingTime(11);
- final long antharasLairExitTime = player.getTimedHuntingZoneRemainingTime(12);
- final long transcendent1ExitTime = player.getTimedHuntingZoneRemainingTime(101);
- final long transcendent2ExitTime = player.getTimedHuntingZoneRemainingTime(102);
- final long transcendent3ExitTime = player.getTimedHuntingZoneRemainingTime(103);
- final long transcendent4ExitTime = player.getTimedHuntingZoneRemainingTime(104);
- final long transcendent6ExitTime = player.getTimedHuntingZoneRemainingTime(106);
- final long transcendent7ExitTime = player.getTimedHuntingZoneRemainingTime(107);
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ if (!player.isInTimedHuntingZone(holder.getZoneId()))
+ {
+ continue;
+ }
+
+ final int remainingTime = player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if (remainingTime > 0)
+ {
+ player.startTimedHuntingZone(holder.getZoneId(), remainingTime);
+ return;
+ }
+ break;
+ }
- if ((primevalIsleExitTime > 0) && player.isInTimedHuntingZone(1))
- {
- player.startTimedHuntingZone(1, primevalIsleExitTime);
- }
- else if ((primevalGardenExitTime > 0) && player.isInTimedHuntingZone(4))
- {
- player.startTimedHuntingZone(4, primevalGardenExitTime);
- }
- else if ((alligatorIslandExitTime > 0) && player.isInTimedHuntingZone(11))
- {
- player.startTimedHuntingZone(11, alligatorIslandExitTime);
- }
- else if ((antharasLairExitTime > 0) && player.isInTimedHuntingZone(12))
- {
- player.startTimedHuntingZone(12, antharasLairExitTime);
- }
- else if ((transcendent1ExitTime > 0) && player.isInTimedHuntingZone(101))
- {
- player.startTimedHuntingZone(101, transcendent1ExitTime);
- }
- else if ((transcendent2ExitTime > 0) && player.isInTimedHuntingZone(102))
- {
- player.startTimedHuntingZone(102, transcendent2ExitTime);
- }
- else if ((transcendent3ExitTime > 0) && player.isInTimedHuntingZone(103))
- {
- player.startTimedHuntingZone(103, transcendent3ExitTime);
- }
- else if ((transcendent4ExitTime > 0) && player.isInTimedHuntingZone(104))
- {
- player.startTimedHuntingZone(104, transcendent4ExitTime);
- }
- else if ((transcendent6ExitTime > 0) && player.isInTimedHuntingZone(106))
- {
- player.startTimedHuntingZone(106, transcendent6ExitTime);
- }
- else if ((transcendent7ExitTime > 0) && player.isInTimedHuntingZone(107))
- {
- player.startTimedHuntingZone(107, transcendent7ExitTime);
- }
- else if (!player.isGM())
+ if (!player.isGM())
{
player.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN));
}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
index 6bef1408ef..922bfbd13f 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/ExIncomingPackets.java
@@ -80,6 +80,8 @@ import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul;
import org.l2jmobius.gameserver.network.clientpackets.ensoul.RequestTryEnSoulExtraction;
import org.l2jmobius.gameserver.network.clientpackets.equipmentupgrade.RequestUpgradeSystemResult;
import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter;
+import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList;
import org.l2jmobius.gameserver.network.clientpackets.limitshop.RequestPurchaseLimitShopItemBuy;
import org.l2jmobius.gameserver.network.clientpackets.limitshop.RequestPurchaseLimitShopItemList;
import org.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay;
@@ -114,8 +116,6 @@ 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;
import org.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff;
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
similarity index 62%
rename from L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
rename to L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
index b9ea6be8f8..392db9259a 100644
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneEnter.java
@@ -14,15 +14,18 @@
* 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;
+package org.l2jmobius.gameserver.network.clientpackets.huntingzones;
-import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
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;
/**
@@ -84,95 +87,52 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (((_zoneId == 1) && (player.getLevel() < 40)) //
- || ((_zoneId == 4) && (player.getLevel() < 76)) //
- || ((_zoneId == 11) && (player.getLevel() < 60)) //
- || ((_zoneId == 12) && (player.getLevel() < 80)) //
- || ((_zoneId == 101) && (player.getLevel() < 40)) //
- )
+ final TimedHuntingZoneHolder holder = TimedHuntingZoneData.getInstance().getHuntingZone(_zoneId);
+ if (holder == null)
+ {
+ return;
+ }
+
+ if ((player.getLevel() < holder.getMinLevel()) || (player.getLevel() > holder.getMaxLevel()))
{
player.sendMessage("Your level does not correspond the zone equivalent.");
+ return;
}
final long currentTime = Chronos.currentTimeMillis();
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)
+ if ((lastEntryTime + holder.getResetDelay()) < currentTime)
{
if (endTime == currentTime)
{
- endTime += Config.TIME_LIMITED_ZONE_INITIAL_TIME;
+ endTime += holder.getInitialTime();
player.getVariables().set(PlayerVariables.HUNTING_ZONE_ENTRY + _zoneId, currentTime);
}
}
if (endTime > currentTime)
{
- if (player.getAdena() > Config.TIME_LIMITED_ZONE_TELEPORT_FEE)
+ if (holder.getEntryItemId() == Inventory.ADENA_ID)
{
- player.reduceAdena("TimedHuntingZone", Config.TIME_LIMITED_ZONE_TELEPORT_FEE, player, true);
+ if (player.getAdena() > holder.getEntryFee())
+ {
+ player.reduceAdena("TimedHuntingZone", holder.getEntryFee(), player, true);
+ }
+ else
+ {
+ player.sendMessage("Not enough adena.");
+ return;
+ }
}
- else
+ else if (!player.destroyItemByItemId("TimedHuntingZone", holder.getEntryItemId(), holder.getEntryFee(), player, true))
{
- player.sendMessage("Not enough adena.");
+ player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_REQUIRED_ITEMS);
return;
}
player.getVariables().set(PlayerVariables.HUNTING_ZONE_TIME + _zoneId, endTime - currentTime);
-
- switch (_zoneId)
- {
- case 1: // Primeval Isle
- {
- player.teleToLocation(9400, -21720, -3634);
- break;
- }
- case 4: // Forgotten Primeval Garden
- {
- player.teleToLocation(-112937, 213590, -13248);
- break;
- }
- case 11: // Aligator Island
- {
- player.teleToLocation(115528, 191580, -3371);
- break;
- }
- case 12: // Antharas Lair
- {
- player.teleToLocation(133247, 114445, -3724);
- break;
- }
- case 101: // Transcendent Instance Zone 1
- {
- player.teleToLocation(63443, 26304, -3755);
- break;
- }
- case 102: // Transcendent Instance Zone 2
- {
- player.teleToLocation(125277, 70262, -4408);
- break;
- }
- case 103: // Transcendent Instance Zone 3
- {
- player.teleToLocation(148724, -22366, -3436);
- break;
- }
- case 104: // Transcendent Instance Zone 4
- {
- player.teleToLocation(167965, 28800, -3606);
- break;
- }
- case 106: // Transcendent Instance Zone 6
- {
- player.teleToLocation(99797, 110524, -3702);
- break;
- }
- case 107: // Transcendent Instance Zone 7
- {
- player.teleToLocation(-50416, 145363, -2825);
- break;
- }
- }
+ player.teleToLocation(holder.getEnterLocation());
}
else
{
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
new file mode 100644
index 0000000000..7a972c2dfc
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneList.java
@@ -0,0 +1,47 @@
+/*
+ * 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.huntingzones;
+
+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.huntingzones.TimedHuntingZoneList;
+
+/**
+ * @author Mobius
+ */
+public class ExTimedHuntingZoneList implements IClientIncomingPacket
+{
+ @Override
+ public boolean read(GameClient client, PacketReader packet)
+ {
+ return true;
+ }
+
+ @Override
+ public void run(GameClient client)
+ {
+ final PlayerInstance player = client.getPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ client.sendPacket(new TimedHuntingZoneList(player));
+ }
+}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
deleted file mode 100644
index 945a4cbe79..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneList.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.network.GameClient;
-import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
-import org.l2jmobius.gameserver.network.serverpackets.sessionzones.TimedHuntingZoneList;
-
-/**
- * @author Mobius
- */
-public class ExTimedHuntingZoneList implements IClientIncomingPacket
-{
- @Override
- public boolean read(GameClient client, PacketReader packet)
- {
- return true;
- }
-
- @Override
- public void run(GameClient client)
- {
- final PlayerInstance player = client.getPlayer();
- if (player == null)
- {
- return;
- }
-
- client.sendPacket(new TimedHuntingZoneList(player));
- }
-}
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneEnter.java
new file mode 100644
index 0000000000..b30fe94754
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/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.huntingzones;
+
+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_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneExit.java
new file mode 100644
index 0000000000..5acc701e4e
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/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.huntingzones;
+
+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_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
new file mode 100644
index 0000000000..df07cdd821
--- /dev/null
+++ b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/huntingzones/TimedHuntingZoneList.java
@@ -0,0 +1,73 @@
+/*
+ * 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.huntingzones;
+
+import org.l2jmobius.commons.network.PacketWriter;
+import org.l2jmobius.commons.util.Chronos;
+import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData;
+import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder;
+import org.l2jmobius.gameserver.model.zone.ZoneId;
+import org.l2jmobius.gameserver.network.OutgoingPackets;
+import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
+
+/**
+ * @author Mobius
+ */
+public class TimedHuntingZoneList implements IClientOutgoingPacket
+{
+ private final PlayerInstance _player;
+ private final boolean _isInTimedHuntingZone;
+
+ public TimedHuntingZoneList(PlayerInstance player)
+ {
+ _player = player;
+ _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
+ }
+
+ @Override
+ public boolean write(PacketWriter packet)
+ {
+ OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ int remainingTime;
+ final long currentTime = Chronos.currentTimeMillis();
+ packet.writeD(TimedHuntingZoneData.getInstance().getSize()); // zone count
+ for (TimedHuntingZoneHolder holder : TimedHuntingZoneData.getInstance().getAllHuntingZones())
+ {
+ packet.writeD(holder.getEntryFee() == 0 ? 0 : 1); // required item count
+ packet.writeD(holder.getEntryItemId());
+ packet.writeQ(holder.getEntryFee());
+ packet.writeD(holder.isWeekly() ? 0 : 1); // reset cycle
+ packet.writeD(holder.getZoneId());
+ packet.writeD(holder.getMinLevel());
+ packet.writeD(holder.getMaxLevel());
+ packet.writeD(holder.getInitialTime() / 1000); // remain time base
+ remainingTime = _player.getTimedHuntingZoneRemainingTime(holder.getZoneId());
+ if ((remainingTime == 0) && ((_player.getTimedHuntingZoneInitialEntry(1) + holder.getResetDelay()) < currentTime))
+ {
+ remainingTime = holder.getInitialTime();
+ }
+ packet.writeD(remainingTime / 1000); // remain time
+ packet.writeD(holder.getMaximumAddedTime() / 1000);
+ packet.writeD(holder.getRemainRefillTime());
+ packet.writeD(holder.getRefillTimeMax());
+ packet.writeD(!_isInTimedHuntingZone || _player.isInTimedHuntingZone(holder.getZoneId()) ? 1 : 0); // field activated (272 C to D)
+ packet.writeH(0); // 245
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
deleted file mode 100644
index 6fc9adc50c..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneEnter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
deleted file mode 100644
index 31caafdc50..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneExit.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
deleted file mode 100644
index 23b5cc8d07..0000000000
--- a/L2J_Mobius_Essence_5.0_Sylph/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * 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.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.zone.ZoneId;
-import org.l2jmobius.gameserver.network.OutgoingPackets;
-import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
-
-/**
- * @author Mobius
- */
-public class TimedHuntingZoneList implements IClientOutgoingPacket
-{
- private final PlayerInstance _player;
- private final boolean _isInTimedHuntingZone;
-
- public TimedHuntingZoneList(PlayerInstance player)
- {
- _player = player;
- _isInTimedHuntingZone = player.isInsideZone(ZoneId.TIMED_HUNTING);
- }
-
- @Override
- public boolean write(PacketWriter packet)
- {
- OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
-
- final long currentTime = Chronos.currentTimeMillis();
- long endTime;
- packet.writeD(4); // zone count
-
- // Primeval Isle
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(1); // zone id
- packet.writeD(40); // min level
- packet.writeD(999); // max level
- 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_PRIMEVAL;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_PRIMEVAL / 1000));
- packet.writeD(43200); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Forgotten Primeval Garden
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(4); // zone id
- packet.writeD(76); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(4);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_GARDEN / 1000));
- packet.writeD(18000); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Alligator Island
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(1); // reset cycle
- packet.writeD(11); // zone id
- packet.writeD(60); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(11);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_ALLIGATOR / 1000));
- packet.writeD(7200); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Antharas Lair
- packet.writeD(1); // required item count
- packet.writeD(57); // item id
- packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- packet.writeD(0); // reset cycle
- packet.writeD(12); // zone id
- packet.writeD(80); // min level
- packet.writeD(999); // max level
- packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- endTime = _player.getTimedHuntingZoneRemainingTime(12);
- if (endTime > 0)
- {
- endTime += currentTime;
- }
- if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY_ANTHARAS) < currentTime)
- {
- endTime = currentTime + Config.TIME_LIMITED_ZONE_ANTHARAS;
- }
- packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_ANTHARAS / 1000));
- packet.writeD(126000); // remain refill time
- packet.writeD(3600); // refill time max
- packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- packet.writeH(0);
-
- // Transcendent Instance Zone 1
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(101); // zone id
- // packet.writeD(40); // min level
- // packet.writeD(49); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(101);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 2
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(102); // zone id
- // packet.writeD(50); // min level
- // packet.writeD(59); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(102);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 3
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(103); // zone id
- // packet.writeD(60); // min level
- // packet.writeD(69); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(103);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 4
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(104); // zone id
- // packet.writeD(70); // min level
- // packet.writeD(79); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(104);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 6
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(106); // zone id
- // packet.writeD(80); // min level
- // packet.writeD(999); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(106);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- // Transcendent Instance Zone 7
- // packet.writeD(1); // required item count
- // packet.writeD(57); // item id
- // packet.writeQ(Config.TIME_LIMITED_ZONE_TELEPORT_FEE); // item count
- // packet.writeD(1); // reset cycle
- // packet.writeD(107); // zone id
- // packet.writeD(85); // min level
- // packet.writeD(999); // max level
- // packet.writeD((int) (Config.TIME_LIMITED_ZONE_INITIAL_TIME / 1000)); // remain time base?
- // endTime = _player.getTimedHuntingZoneRemainingTime(107);
- // if (endTime > 0)
- // {
- // endTime += currentTime;
- // }
- // if ((endTime + Config.TIME_LIMITED_ZONE_RESET_DELAY) < currentTime)
- // {
- // endTime = currentTime + Config.TIME_LIMITED_ZONE_INITIAL_TIME;
- // }
- // packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
- // packet.writeD((int) (Config.TIME_LIMITED_MAX_ADDED_TIME / 1000));
- // packet.writeD(3600); // remain refill time
- // packet.writeD(3600); // refill time max
- // packet.writeD(_isInTimedHuntingZone ? 0 : 1); // field activated (272 C to D)
- // packet.writeH(0);
-
- return true;
- }
-}
\ No newline at end of file