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;