diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 8357840939..1b8a37f54d 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -37,6 +37,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("AbsorbDamage", AbsorbDamage::new);
EffectHandler.getInstance().registerHandler("Accuracy", Accuracy::new);
EffectHandler.getInstance().registerHandler("AddHate", AddHate::new);
+ EffectHandler.getInstance().registerHandler("AddHuntingTime", AddHuntingTime::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionCp", AdditionalPotionCp::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionHp", AdditionalPotionHp::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionMp", AdditionalPotionMp::new);
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
new file mode 100644
index 0000000000..6690a04b69
--- /dev/null
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -0,0 +1,80 @@
+/*
+ * 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 handlers.effecthandlers;
+
+import org.l2jmobius.gameserver.model.StatsSet;
+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.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;
+
+/**
+ * @author Mobius
+ */
+public class AddHuntingTime extends AbstractEffect
+{
+ private final int _zoneId;
+ private final long _time;
+
+ public AddHuntingTime(StatsSet params)
+ {
+ _zoneId = params.getInt("zoneId", 0);
+ _time = params.getLong("time", 3600000);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final long currentTime = System.currentTimeMillis();
+ if (player.isInTimedHuntingZone(_zoneId))
+ {
+ final long increasedTime = _time + player.getTimedHuntingZoneRemainingTime();
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, currentTime + increasedTime);
+ player.startTimedHuntingZone(_zoneId, increasedTime);
+ }
+ else
+ {
+ long endTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000;
+ }
+ else if (endTime < currentTime)
+ {
+ endTime = currentTime;
+ }
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, endTime + _time);
+ }
+
+ player.sendPacket(new TimedHuntingZoneList(player));
+ }
+}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/items/80900-80999.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/items/80900-80999.xml
index bbd358968c..160bd0a552 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/items/80900-80999.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/items/80900-80999.xml
@@ -67,7 +67,7 @@
-
-
+
@@ -75,11 +75,16 @@
+
+
+
+
+
-
-
+
@@ -87,6 +92,11 @@
+
+
+
+
+
-
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/39500-39599.xml b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/39500-39599.xml
index 2b00deb1c4..ef90ed6e2e 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/39500-39599.xml
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/39500-39599.xml
@@ -291,12 +291,50 @@
500
+ 1
A1
- 4
+ 5
+ 0
+ SELF
+ SINGLE
+ 1
+ 80905
+
+
+ 100
+ 120
+ CASTER
+
+
+
+
+ 1
+
+
+
+ 1
A1
- 4
+ 5
+ 0
+ SELF
+ SINGLE
+ 1
+ 80906
+
+
+ 105
+ 120
+ CASTER
+
+
+
+
+ 6
+
+
+
A1
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
index af9d0f7ce6..66475ff68e 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/stats/skills/documentation.txt
@@ -7,6 +7,7 @@ AbstractStatEffect: Abstract class for managing stats.
AbstractStatPercentEffect: Abstract class for managing stat percentages. (l2jmobius)
Accuracy: P. Accuracy stat.
AddHate: Instant effect that increases target's hate towards you.
+AddHuntingTime: Add time for time limited hunting zones. (l2jmobius)
AdditionalPotionCp: Increases the amount of CP heal gained from potions or elixirs. (l2jmobius)
AdditionalPotionHp: Increases the amount of HP heal gained from potions or elixirs. (l2jmobius)
AdditionalPotionMp: Increases the amount of MP heal gained from potions or elixirs. (l2jmobius)
diff --git a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/skills.xsd b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/skills.xsd
index f624a1fe09..f4e94b76ca 100644
--- a/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_7.0_PreludeOfWar/dist/game/data/xsd/skills.xsd
@@ -872,21 +872,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -903,13 +888,13 @@
-
+
-
+
@@ -918,135 +903,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1150,6 +1006,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1487,21 +1359,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -2004,6 +1861,12 @@
+
+
+
+
+
+
@@ -2073,9 +1936,25 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2096,7 +1975,6 @@
-
@@ -2156,21 +2034,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -2190,6 +2053,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2569,8 +2482,8 @@
-
+
@@ -2657,7 +2570,6 @@
-
@@ -2707,7 +2619,6 @@
-
@@ -2726,7 +2637,6 @@
-
@@ -2749,23 +2659,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
@@ -2844,27 +2739,12 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -3147,6 +3027,7 @@
+
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 f7ed2bf0d1..61df80a511 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
@@ -14253,6 +14253,7 @@ public class PlayerInstance extends Playable
// TODO: Delay window.
// sendPacket(new TimedHuntingZoneEnter((int) (delay / 60 / 1000)));
+ sendMessage("You have " + (delay / 60 / 1000) + " minutes left for this timed zone.");
_timedHuntingZoneFinishTask = ThreadPool.schedule(() ->
{
@@ -14272,7 +14273,16 @@ public class PlayerInstance extends Playable
{
_timedHuntingZoneFinishTask.cancel(true);
_timedHuntingZoneFinishTask = null;
- sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
}
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ }
+
+ public long getTimedHuntingZoneRemainingTime()
+ {
+ if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
+ {
+ return _timedHuntingZoneFinishTask.getDelay(TimeUnit.MILLISECONDS);
+ }
+ return 0;
}
}
diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
index afc525c8c3..8753311b22 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/sessionzones/ExTimedHuntingZoneEnter.java
@@ -73,30 +73,32 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0) > System.currentTimeMillis())
- {
- if (player.isInTimedHuntingZone())
- {
- player.sendPacket(SystemMessageId.YOU_WILL_EXCEED_THE_MAX_AMOUNT_OF_TIME_FOR_THE_HUNTING_ZONE_SO_YOU_CANNOT_ADD_ANY_MORE_TIME);
- }
- else
- {
- player.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_TIME_AVAILABLE_TO_ENTER_THE_HUNTING_ZONE);
- }
- return;
- }
-
if (((_zoneId == 1) && (player.getLevel() < 100)) //
|| ((_zoneId == 6) && (player.getLevel() < 105)) //
)
{
- player.sendMessage("Your level does not corespont the zone equivalent.");
+ player.sendMessage("Your level does not correspond the zone equivalent.");
}
- if (player.getAdena() > 150000)
+ final long currentTime = System.currentTimeMillis();
+ long endTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0);
+ if ((endTime + 18000000) < currentTime)
{
- player.reduceAdena("TimedHuntingZone", 150000, player, true);
- player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, System.currentTimeMillis() + 18000000); // 300 minutes
+ endTime = currentTime + 18000000; // 300 minutes
+ }
+
+ if (endTime > currentTime)
+ {
+ if (player.getAdena() > 150000)
+ {
+ player.reduceAdena("TimedHuntingZone", 150000, player, true);
+ }
+ else
+ {
+ player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ return;
+ }
+
switch (_zoneId)
{
case 1: // Storm Isle
@@ -110,11 +112,13 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
break;
}
}
- player.startTimedHuntingZone(_zoneId, 18000000); // 300 minutes
+
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, endTime);
+ player.startTimedHuntingZone(_zoneId, endTime - currentTime);
}
else
{
- player.sendPacket(SystemMessageId.NOT_ENOUGH_ADENA);
+ player.sendPacket(SystemMessageId.YOU_DON_T_HAVE_ENOUGH_TIME_AVAILABLE_TO_ENTER_THE_HUNTING_ZONE);
}
}
}
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
index e59aa5c4f5..1b64b4bb53 100644
--- 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
@@ -18,6 +18,7 @@ package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -26,10 +27,12 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
*/
public class TimedHuntingZoneList implements IClientOutgoingPacket
{
+ private final PlayerInstance _player;
private final boolean _isInTimedHuntingZone;
public TimedHuntingZoneList(PlayerInstance player)
{
+ _player = player;
_isInTimedHuntingZone = player.isInTimedHuntingZone();
}
@@ -38,21 +41,29 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
{
OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ final long currentTime = System.currentTimeMillis();
+ long endTime;
+
packet.writeD(2); // zone count
- // Isle of Storms
+ // Storm Isle
packet.writeD(1); // required item count
packet.writeD(57); // item id
packet.writeQ(150000); // item count
packet.writeD(1); // reset cycle
- packet.writeD(1); // field id
+ packet.writeD(1); // zone id
packet.writeD(100); // min level
packet.writeD(120); // max level
- packet.writeD(3600); // remain time base
- packet.writeD(3600); // remain time
- packet.writeD(21600); // remain time max
- packet.writeD(18000); // remain refill time
- packet.writeD(18000); // refill time max
+ packet.writeD(0); // remain time base?
+ endTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 1, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000;
+ }
+ packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
+ packet.writeD(18000); // remain time max
+ packet.writeD(3600); // remain refill time
+ packet.writeD(3600); // refill time max
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
// Primeval Isle
@@ -60,14 +71,19 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
packet.writeD(57); // item id
packet.writeQ(150000); // item count
packet.writeD(1); // reset cycle
- packet.writeD(6); // field id
+ packet.writeD(6); // zone id
packet.writeD(105); // min level
packet.writeD(120); // max level
- packet.writeD(3600); // remain time base
- packet.writeD(3600); // remain time
- packet.writeD(21600); // remain time max
- packet.writeD(18000); // remain refill time
- packet.writeD(18000); // refill time max
+ packet.writeD(0); // remain time base?
+ endTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 6, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000;
+ }
+ packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
+ packet.writeD(18000); // remain time max
+ packet.writeD(3600); // remain refill time
+ packet.writeD(3600); // refill time max
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
return true;
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
index 5dfe695d41..247561666e 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/EffectMasterHandler.java
@@ -37,6 +37,7 @@ public class EffectMasterHandler
EffectHandler.getInstance().registerHandler("AbsorbDamage", AbsorbDamage::new);
EffectHandler.getInstance().registerHandler("Accuracy", Accuracy::new);
EffectHandler.getInstance().registerHandler("AddHate", AddHate::new);
+ EffectHandler.getInstance().registerHandler("AddHuntingTime", AddHuntingTime::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionCp", AdditionalPotionCp::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionHp", AdditionalPotionHp::new);
EffectHandler.getInstance().registerHandler("AdditionalPotionMp", AdditionalPotionMp::new);
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
new file mode 100644
index 0000000000..6690a04b69
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/effecthandlers/AddHuntingTime.java
@@ -0,0 +1,80 @@
+/*
+ * 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 handlers.effecthandlers;
+
+import org.l2jmobius.gameserver.model.StatsSet;
+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.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;
+
+/**
+ * @author Mobius
+ */
+public class AddHuntingTime extends AbstractEffect
+{
+ private final int _zoneId;
+ private final long _time;
+
+ public AddHuntingTime(StatsSet params)
+ {
+ _zoneId = params.getInt("zoneId", 0);
+ _time = params.getLong("time", 3600000);
+ }
+
+ @Override
+ public boolean isInstant()
+ {
+ return true;
+ }
+
+ @Override
+ public void instant(Creature effector, Creature effected, Skill skill, ItemInstance item)
+ {
+ final PlayerInstance player = effected.getActingPlayer();
+ if (player == null)
+ {
+ return;
+ }
+
+ final long currentTime = System.currentTimeMillis();
+ if (player.isInTimedHuntingZone(_zoneId))
+ {
+ final long increasedTime = _time + player.getTimedHuntingZoneRemainingTime();
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, currentTime + increasedTime);
+ player.startTimedHuntingZone(_zoneId, increasedTime);
+ }
+ else
+ {
+ long endTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000;
+ }
+ else if (endTime < currentTime)
+ {
+ endTime = currentTime;
+ }
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, endTime + _time);
+ }
+
+ player.sendPacket(new TimedHuntingZoneList(player));
+ }
+}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/items/91900-91999.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/items/91900-91999.xml
index 0290b5330f..b30aa32966 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/items/91900-91999.xml
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/items/91900-91999.xml
@@ -565,11 +565,19 @@
-
-
+
+
+
+
+
+
+
+
+
-
@@ -1133,7 +1141,7 @@
-
-
+
@@ -1141,6 +1149,11 @@
+
+
+
+
+
-
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/50100-50199.xml b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/50100-50199.xml
index 6f3131f9b8..72edb58f32 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/50100-50199.xml
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/50100-50199.xml
@@ -442,10 +442,27 @@
3000
+ 1
A1
- 500
- 500
- 3000
+ 5
+ 0
+ SELF
+ SINGLE
+ 1
+ 91939
+
+
+ 78
+ 999
+ CASTER
+
+
+
+
+ 2
+
+
+
A1
@@ -629,10 +646,27 @@
3000
+ 1
A1
- 500
- 500
- 3000
+ 5
+ 0
+ SELF
+ SINGLE
+ 1
+ 91984
+
+
+ 78
+ 999
+ CASTER
+
+
+
+
+ 2
+
+
+
A1
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
index 3281dcfa5d..2d317b82a4 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/stats/skills/documentation.txt
@@ -7,6 +7,7 @@ AbstractStatEffect: Abstract class for managing stats.
AbstractStatPercentEffect: Abstract class for managing stat percentages. (l2jmobius)
Accuracy: P. Accuracy stat.
AddHate: Instant effect that increases target's hate towards you.
+AddHuntingTime: Add time for time limited hunting zones. (l2jmobius)
AdditionalPotionCp: Increases the amount of CP heal gained from potions or elixirs. (l2jmobius)
AdditionalPotionHp: Increases the amount of HP heal gained from potions or elixirs. (l2jmobius)
AdditionalPotionMp: Increases the amount of MP heal gained from potions or elixirs. (l2jmobius)
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/skills.xsd b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/skills.xsd
index b842ed170a..a7fdf10fa0 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/skills.xsd
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/xsd/skills.xsd
@@ -332,8 +332,8 @@
-
-
+
+
@@ -347,8 +347,8 @@
-
-
+
+
@@ -616,21 +616,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -715,21 +700,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -746,13 +716,13 @@
-
+
-
+
@@ -761,135 +731,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1063,21 +904,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1108,6 +934,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1154,21 +995,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1253,6 +1080,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1283,22 +1140,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -1362,21 +1205,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1452,36 +1280,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1657,6 +1455,8 @@
+
+
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 1e03af12b5..22c57ba32d 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
@@ -14194,6 +14194,7 @@ public class PlayerInstance extends Playable
// TODO: Delay window.
// sendPacket(new TimedHuntingZoneEnter((int) (delay / 60 / 1000)));
+ sendMessage("You have " + (delay / 60 / 1000) + " minutes left for this timed zone.");
_timedHuntingZoneFinishTask = ThreadPool.schedule(() ->
{
@@ -14213,7 +14214,16 @@ public class PlayerInstance extends Playable
{
_timedHuntingZoneFinishTask.cancel(true);
_timedHuntingZoneFinishTask = null;
- sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
}
+ sendPacket(TimedHuntingZoneExit.STATIC_PACKET);
+ }
+
+ public long getTimedHuntingZoneRemainingTime()
+ {
+ if ((_timedHuntingZoneFinishTask != null) && !_timedHuntingZoneFinishTask.isCancelled() && !_timedHuntingZoneFinishTask.isDone())
+ {
+ return _timedHuntingZoneFinishTask.getDelay(TimeUnit.MILLISECONDS);
+ }
+ return 0;
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/sessionzones/ExTimedHuntingZoneEnter.java
index ee0dc466f3..2832ecb54c 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/sessionzones/ExTimedHuntingZoneEnter.java
@@ -72,28 +72,30 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
return;
}
- if (player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0) > System.currentTimeMillis())
+ if ((_zoneId == 2) && (player.getLevel() < 78))
{
- if (player.isInTimedHuntingZone())
+ player.sendMessage("Your level does not correspond the zone equivalent.");
+ }
+
+ final long currentTime = System.currentTimeMillis();
+ long endTime = player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000; // 300 minutes
+ }
+
+ if (endTime > currentTime)
+ {
+ if (player.getAdena() > 10000)
{
- player.sendMessage("You will exceed the max amount of time for the hunting zone, so you cannot add any more time.");
+ player.reduceAdena("TimedHuntingZone", 10000, player, true);
}
else
{
- player.sendMessage("You don't have enough time available to enter the hunting zone.");
+ player.sendMessage("Not enough adena.");
+ return;
}
- return;
- }
-
- if ((_zoneId == 2) && (player.getLevel() < 78))
- {
- player.sendMessage("Your level is too low.");
- }
-
- if (player.getAdena() > 10000)
- {
- player.reduceAdena("TimedHuntingZone", 10000, player, true);
- player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, System.currentTimeMillis() + 18000000); // 300 minutes
+
switch (_zoneId)
{
case 2: // Ancient Pirates' Tomb
@@ -102,11 +104,13 @@ public class ExTimedHuntingZoneEnter implements IClientIncomingPacket
break;
}
}
- player.startTimedHuntingZone(_zoneId, 18000000); // 300 minutes
+
+ player.getVariables().set(PlayerVariables.HUNTING_ZONE_RESET_TIME + _zoneId, endTime);
+ player.startTimedHuntingZone(_zoneId, endTime - currentTime);
}
else
{
- player.sendMessage("Not enough adena.");
+ player.sendMessage("You don't have enough time available to enter the hunting zone.");
}
}
}
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
index 10c68fbb24..7077b73370 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/sessionzones/TimedHuntingZoneList.java
@@ -18,6 +18,7 @@ package org.l2jmobius.gameserver.network.serverpackets.sessionzones;
import org.l2jmobius.commons.network.PacketWriter;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
+import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.OutgoingPackets;
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
@@ -26,10 +27,12 @@ import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
*/
public class TimedHuntingZoneList implements IClientOutgoingPacket
{
+ private final PlayerInstance _player;
private final boolean _isInTimedHuntingZone;
public TimedHuntingZoneList(PlayerInstance player)
{
+ _player = player;
_isInTimedHuntingZone = player.isInTimedHuntingZone();
}
@@ -38,6 +41,9 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
{
OutgoingPackets.EX_TIME_RESTRICT_FIELD_LIST.writeId(packet);
+ final long currentTime = System.currentTimeMillis();
+ long endTime;
+
packet.writeD(1); // zone count
// Ancient Pirates' Tomb
@@ -45,14 +51,19 @@ public class TimedHuntingZoneList implements IClientOutgoingPacket
packet.writeD(57); // item id
packet.writeQ(10000); // item count
packet.writeD(1); // reset cycle
- packet.writeD(2); // field id
+ packet.writeD(2); // zone id
packet.writeD(78); // min level
packet.writeD(999); // max level
- packet.writeD(3600); // remain time base
- packet.writeD(3600); // remain time
- packet.writeD(21600); // remain time max
- packet.writeD(18000); // remain refill time
- packet.writeD(18000); // refill time max
+ packet.writeD(0); // remain time base?
+ endTime = _player.getVariables().getLong(PlayerVariables.HUNTING_ZONE_RESET_TIME + 2, 0);
+ if ((endTime + 18000000) < currentTime)
+ {
+ endTime = currentTime + 18000000;
+ }
+ packet.writeD((int) (Math.max(endTime - currentTime, 0)) / 1000); // remain time
+ packet.writeD(18000); // remain time max
+ packet.writeD(3600); // remain refill time
+ packet.writeD(3600); // refill time max
packet.writeC(_isInTimedHuntingZone ? 0 : 1); // field activated
return true;