diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/ExClientPackets.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/ExClientPackets.java index 6d7bccb6ef..6b1b51b025 100644 --- a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/ExClientPackets.java +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/ExClientPackets.java @@ -116,6 +116,7 @@ import org.l2jmobius.gameserver.network.clientpackets.homunculus.RequestExHomunc import org.l2jmobius.gameserver.network.clientpackets.homunculus.RequestExShowHomunculusInfo; import org.l2jmobius.gameserver.network.clientpackets.homunculus.RequestExSummonHomunculusCouponResult; import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter; +import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneLeave; import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList; import org.l2jmobius.gameserver.network.clientpackets.huntpass.HuntpassSayhasToggle; import org.l2jmobius.gameserver.network.clientpackets.huntpass.RequestHuntPassBuyPremium; @@ -587,7 +588,7 @@ public enum ExClientPackets EX_GACHA_SHOP_GACHA_ITEM(0x17E, null, ConnectionState.IN_GAME), EX_TIME_RESTRICT_FIELD_LIST(0x17F, ExTimedHuntingZoneList::new, ConnectionState.IN_GAME), EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, ExTimedHuntingZoneEnter::new, ConnectionState.IN_GAME), - EX_TIME_RESTRICT_FIELD_USER_LEAVE(0x181, null, ConnectionState.IN_GAME), + EX_TIME_RESTRICT_FIELD_USER_LEAVE(0x181, ExTimedHuntingZoneLeave::new, ConnectionState.IN_GAME), EX_RANKING_CHAR_INFO(0x182, RequestRankingCharInfo::new, ConnectionState.IN_GAME), EX_RANKING_CHAR_HISTORY(0x183, null, ConnectionState.IN_GAME), EX_RANKING_CHAR_RANKERS(0x184, RequestRankingCharRankers::new, ConnectionState.IN_GAME), diff --git a/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java new file mode 100644 index 0000000000..3ae8557a07 --- /dev/null +++ b/L2J_Mobius_10.3_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java @@ -0,0 +1,101 @@ +/* + * 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.threads.ThreadPool; +import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; +import org.l2jmobius.gameserver.enums.TeleportWhereType; +import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.instancemanager.MapRegionManager; +import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; +import org.l2jmobius.gameserver.model.variables.PlayerVariables; +import org.l2jmobius.gameserver.model.zone.ZoneId; +import org.l2jmobius.gameserver.model.zone.ZoneType; +import org.l2jmobius.gameserver.model.zone.type.TimedHuntingZone; +import org.l2jmobius.gameserver.network.GameClient; +import org.l2jmobius.gameserver.network.SystemMessageId; +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket; +import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; +import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit; + +/** + * @author Index + */ +public class ExTimedHuntingZoneLeave implements ClientPacket +{ + @Override + public void run(GameClient client) + { + final Player player = client.getPlayer(); + if (player == null) + { + return; + } + + if (player.isInCombat()) + { + player.sendPacket(new SystemMessage(SystemMessageId.YOU_CANNOT_TELEPORT_IN_BATTLE)); + return; + } + + TimedHuntingZoneHolder huntingZone = player.getTimedHuntingZone(); + final Location exit = huntingZone != null ? huntingZone.getExitLocation() != null ? huntingZone.getExitLocation() : InstanceManager.getInstance().getInstance(huntingZone.getInstanceId()).getExitLocation(player) : MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN); + if (huntingZone != null) + { + player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, huntingZone.getZoneId()); + player.teleToLocation(exit, InstanceManager.getInstance().getInstance(0)); + startScheduleTask(player, huntingZone); + } + else + { + huntingZone = TimedHuntingZoneData.getInstance().getHuntingZone(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, -1)); + if (huntingZone != null) + { + startScheduleTask(player, huntingZone); + } + else + { + player.sendPacket(new TimedHuntingZoneExit(0)); + } + } + } + + private void startScheduleTask(Player player, TimedHuntingZoneHolder holder) + { + ThreadPool.schedule(() -> additionalCheck(player, holder), 2000); + } + + private void additionalCheck(Player player, TimedHuntingZoneHolder timedHuntingZoneHolder) + { + final ZoneType currentZone = ZoneManager.getInstance().getZone(timedHuntingZoneHolder.getEnterLocation(), TimedHuntingZone.class); + if (currentZone != null) + { + if (currentZone.isCharacterInZone(player)) + { + currentZone.removeCharacter(player); + } + else if (player.isInsideZone(ZoneId.TIMED_HUNTING)) + { + player.sendPacket(new TimedHuntingZoneExit(timedHuntingZoneHolder.getZoneId())); + player.setInsideZone(ZoneId.TIMED_HUNTING, false); + } + } + } +} diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/ExClientPackets.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/ExClientPackets.java index 3db8dd61e5..2f4a18895a 100644 --- a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/ExClientPackets.java +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/ExClientPackets.java @@ -103,6 +103,7 @@ import org.l2jmobius.gameserver.network.clientpackets.equipmentupgrade.RequestUp import org.l2jmobius.gameserver.network.clientpackets.equipmentupgradenormal.ExUpgradeSystemNormalRequest; import org.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo; import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneEnter; +import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneLeave; import org.l2jmobius.gameserver.network.clientpackets.huntingzones.ExTimedHuntingZoneList; import org.l2jmobius.gameserver.network.clientpackets.huntpass.HuntpassSayhasToggle; import org.l2jmobius.gameserver.network.clientpackets.huntpass.RequestHuntPassBuyPremium; @@ -609,7 +610,7 @@ public enum ExClientPackets EX_GACHA_SHOP_GACHA_ITEM(0x17E, null, ConnectionState.IN_GAME), EX_TIME_RESTRICT_FIELD_LIST(0x17F, ExTimedHuntingZoneList::new, ConnectionState.IN_GAME), EX_TIME_RESTRICT_FIELD_USER_ENTER(0x180, ExTimedHuntingZoneEnter::new, ConnectionState.IN_GAME), - EX_TIME_RESTRICT_FIELD_USER_LEAVE(0x181, null, ConnectionState.IN_GAME), + EX_TIME_RESTRICT_FIELD_USER_LEAVE(0x181, ExTimedHuntingZoneLeave::new, ConnectionState.IN_GAME), EX_RANKING_CHAR_INFO(0x182, RequestRankingCharInfo::new, ConnectionState.IN_GAME), EX_RANKING_CHAR_HISTORY(0x183, null, ConnectionState.IN_GAME), EX_RANKING_CHAR_RANKERS(0x184, RequestRankingCharRankers::new, ConnectionState.IN_GAME), diff --git a/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java new file mode 100644 index 0000000000..3ae8557a07 --- /dev/null +++ b/L2J_Mobius_Essence_6.3_Crusader/java/org/l2jmobius/gameserver/network/clientpackets/huntingzones/ExTimedHuntingZoneLeave.java @@ -0,0 +1,101 @@ +/* + * 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.threads.ThreadPool; +import org.l2jmobius.gameserver.data.xml.TimedHuntingZoneData; +import org.l2jmobius.gameserver.enums.TeleportWhereType; +import org.l2jmobius.gameserver.instancemanager.InstanceManager; +import org.l2jmobius.gameserver.instancemanager.MapRegionManager; +import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.Location; +import org.l2jmobius.gameserver.model.actor.Player; +import org.l2jmobius.gameserver.model.holders.TimedHuntingZoneHolder; +import org.l2jmobius.gameserver.model.variables.PlayerVariables; +import org.l2jmobius.gameserver.model.zone.ZoneId; +import org.l2jmobius.gameserver.model.zone.ZoneType; +import org.l2jmobius.gameserver.model.zone.type.TimedHuntingZone; +import org.l2jmobius.gameserver.network.GameClient; +import org.l2jmobius.gameserver.network.SystemMessageId; +import org.l2jmobius.gameserver.network.clientpackets.ClientPacket; +import org.l2jmobius.gameserver.network.serverpackets.SystemMessage; +import org.l2jmobius.gameserver.network.serverpackets.huntingzones.TimedHuntingZoneExit; + +/** + * @author Index + */ +public class ExTimedHuntingZoneLeave implements ClientPacket +{ + @Override + public void run(GameClient client) + { + final Player player = client.getPlayer(); + if (player == null) + { + return; + } + + if (player.isInCombat()) + { + player.sendPacket(new SystemMessage(SystemMessageId.YOU_CANNOT_TELEPORT_IN_BATTLE)); + return; + } + + TimedHuntingZoneHolder huntingZone = player.getTimedHuntingZone(); + final Location exit = huntingZone != null ? huntingZone.getExitLocation() != null ? huntingZone.getExitLocation() : InstanceManager.getInstance().getInstance(huntingZone.getInstanceId()).getExitLocation(player) : MapRegionManager.getInstance().getTeleToLocation(player, TeleportWhereType.TOWN); + if (huntingZone != null) + { + player.getVariables().set(PlayerVariables.LAST_HUNTING_ZONE_ID, huntingZone.getZoneId()); + player.teleToLocation(exit, InstanceManager.getInstance().getInstance(0)); + startScheduleTask(player, huntingZone); + } + else + { + huntingZone = TimedHuntingZoneData.getInstance().getHuntingZone(player.getVariables().getInt(PlayerVariables.LAST_HUNTING_ZONE_ID, -1)); + if (huntingZone != null) + { + startScheduleTask(player, huntingZone); + } + else + { + player.sendPacket(new TimedHuntingZoneExit(0)); + } + } + } + + private void startScheduleTask(Player player, TimedHuntingZoneHolder holder) + { + ThreadPool.schedule(() -> additionalCheck(player, holder), 2000); + } + + private void additionalCheck(Player player, TimedHuntingZoneHolder timedHuntingZoneHolder) + { + final ZoneType currentZone = ZoneManager.getInstance().getZone(timedHuntingZoneHolder.getEnterLocation(), TimedHuntingZone.class); + if (currentZone != null) + { + if (currentZone.isCharacterInZone(player)) + { + currentZone.removeCharacter(player); + } + else if (player.isInsideZone(ZoneId.TIMED_HUNTING)) + { + player.sendPacket(new TimedHuntingZoneExit(timedHuntingZoneHolder.getZoneId())); + player.setInsideZone(ZoneId.TIMED_HUNTING, false); + } + } + } +}