diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_01.0_Ertheia/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_01.0_Ertheia/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/MasterHandler.java
index 632125d6dd..8c5b8f8aed 100644
--- a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/MasterHandler.java
@@ -334,6 +334,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -588,6 +589,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_01.0_Ertheia/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java
index 5c9bc44d3d..fa399ba045 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/Config.java
@@ -1102,6 +1102,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3289,6 +3290,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_01.0_Ertheia/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_02.5_Underground/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_02.5_Underground/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_02.5_Underground/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_02.5_Underground/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/MasterHandler.java
index d8613a8cd1..e0064851f8 100644
--- a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/MasterHandler.java
@@ -335,6 +335,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -590,6 +591,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_02.5_Underground/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java
index aaf7ba78c0..43dacaa73a 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/Config.java
@@ -1113,6 +1113,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3315,6 +3316,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_02.5_Underground/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_03.0_Helios/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_03.0_Helios/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_03.0_Helios/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_03.0_Helios/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/MasterHandler.java
index 9e13da9e31..6051767c80 100644
--- a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_03.0_Helios/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java
index f8e64ccb81..fb9e1a8cdd 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/Config.java
@@ -1126,6 +1126,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3337,6 +3338,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_03.0_Helios/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/MasterHandler.java
index 9e13da9e31..6051767c80 100644
--- a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_04.0_GrandCrusade/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java
index 34c8ffc5ee..f38694b927 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/Config.java
@@ -1113,6 +1113,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3311,6 +3312,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_04.0_GrandCrusade/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_05.0_Salvation/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_05.0_Salvation/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_05.0_Salvation/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/MasterHandler.java
index 9e13da9e31..6051767c80 100644
--- a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_05.0_Salvation/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java
index ad9e4ac32f..3b7c895d0d 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/Config.java
@@ -1112,6 +1112,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3320,6 +3321,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 7281ecd079..b79d9bdf58 100644
--- a/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_05.0_Salvation/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_RESURRECT_YOU_AND_RESTORE_YOUR_XP_S2_S3_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_05.5_EtinasFate/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_05.5_EtinasFate/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/MasterHandler.java
index 9e13da9e31..6051767c80 100644
--- a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_05.5_EtinasFate/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java
index 4a3b99e1b8..90f099325a 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/Config.java
@@ -1119,6 +1119,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3332,6 +3333,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index a7ed6a1d3a..70985fd977 100644
--- a/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_05.5_EtinasFate/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_RESURRECT_YOU_AND_RESTORE_XP_S2_S3_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_06.0_Fafurion/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_06.0_Fafurion/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/MasterHandler.java
index 7fba87b001..b592d583c4 100644
--- a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/MasterHandler.java
@@ -337,6 +337,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -594,6 +595,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_06.0_Fafurion/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java
index 5940174012..74682fe784 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/Config.java
@@ -1141,6 +1141,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3375,6 +3376,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index a7ed6a1d3a..70985fd977 100644
--- a/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_06.0_Fafurion/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_RESURRECT_YOU_AND_RESTORE_XP_S2_S3_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/MasterHandler.java
index 7fba87b001..b592d583c4 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/MasterHandler.java
@@ -337,6 +337,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -594,6 +595,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_07.0_PreludeOfWar/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java
index 596762f4b7..47f5204a65 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/Config.java
@@ -1149,6 +1149,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3391,6 +3392,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_07.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_08.2_Homunculus/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_08.2_Homunculus/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/MasterHandler.java
index 7fba87b001..b592d583c4 100644
--- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/MasterHandler.java
@@ -337,6 +337,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -594,6 +595,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java
index 3388537af2..f0fe3d7221 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/Config.java
@@ -1141,6 +1141,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3367,6 +3368,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/MasterHandler.java
index f69aee4fd6..49c80ee056 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/MasterHandler.java
@@ -338,6 +338,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -596,6 +597,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
index 98c86f852a..5a57dac542 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/Config.java
@@ -1152,6 +1152,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3403,6 +3404,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_10.1_MasterClass/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_10.1_MasterClass/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_10.1_MasterClass/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
index f69aee4fd6..49c80ee056 100644
--- a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
@@ -338,6 +338,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -596,6 +597,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_10.1_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/Config.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/Config.java
index 2719c602e1..7daa7d1702 100644
--- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/Config.java
@@ -1152,6 +1152,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3403,6 +3404,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_10.1_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_10.2_MasterClass/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_10.2_MasterClass/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_10.2_MasterClass/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
index f69aee4fd6..49c80ee056 100644
--- a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/MasterHandler.java
@@ -338,6 +338,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -596,6 +597,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_10.2_MasterClass/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java
index 2719c602e1..7daa7d1702 100644
--- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/Config.java
@@ -1152,6 +1152,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static boolean WELCOME_MESSAGE_ENABLED;
public static String WELCOME_MESSAGE_TEXT;
@@ -3403,6 +3404,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_10.2_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_CT_0_Interlude/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_CT_0_Interlude/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_CT_0_Interlude/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_CT_0_Interlude/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
index 5d12071a91..c69a5e2671 100644
--- a/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
@@ -281,6 +281,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
import handlers.voicedcommandhandlers.Wedding;
@@ -526,6 +527,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..4c004a174b
--- /dev/null
+++ b/L2J_Mobius_CT_0_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java
index 44db0a991f..1abf6d25a4 100644
--- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/Config.java
@@ -1117,6 +1117,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -2760,6 +2761,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 90ec5f4688..90dd003d71 100644
--- a/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_CT_0_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -27,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.Olympiad;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -88,6 +93,40 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Remove player from boss zone.
+ player.removeFromBossZone();
+
+ // Unregister from olympiad.
+ if (Olympiad.getInstance().isRegistered(player))
+ {
+ Olympiad.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_MAKING_AN_ATTEMPT_TO_RESURRECT_YOU_IF_YOU_CHOOSE_THIS_PATH_S2_EXPERIENCE_POINTS_WILL_BE_RETURNED_TO_YOU_DO_YOU_WANT_TO_BE_RESURRECTED.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/MasterHandler.java
index 6f823eb744..e7d5ea995f 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/MasterHandler.java
@@ -297,6 +297,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
import handlers.voicedcommandhandlers.Wedding;
@@ -557,6 +558,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..4c004a174b
--- /dev/null
+++ b/L2J_Mobius_CT_2.4_Epilogue/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
index a06274abbc..c60b7fb4fb 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/Config.java
@@ -1171,6 +1171,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -2878,6 +2879,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 90ec5f4688..90dd003d71 100644
--- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -27,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.Olympiad;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -88,6 +93,40 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Remove player from boss zone.
+ player.removeFromBossZone();
+
+ // Unregister from olympiad.
+ if (Olympiad.getInstance().isRegistered(player))
+ {
+ Olympiad.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_MAKING_AN_ATTEMPT_TO_RESURRECT_YOU_IF_YOU_CHOOSE_THIS_PATH_S2_EXPERIENCE_POINTS_WILL_BE_RETURNED_TO_YOU_DO_YOU_WANT_TO_BE_RESURRECTED.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/MasterHandler.java
index 4c0dd50ccf..bb0cd2421a 100644
--- a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/MasterHandler.java
@@ -298,6 +298,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
import handlers.voicedcommandhandlers.Wedding;
@@ -559,6 +560,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..4c004a174b
--- /dev/null
+++ b/L2J_Mobius_CT_2.6_HighFive/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
index a12d04fe6d..abf6318c75 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/Config.java
@@ -1171,6 +1171,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -2885,6 +2886,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 90ec5f4688..69ada66b3d 100644
--- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -27,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -88,6 +93,40 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if ((player.getInstanceId() > 0) || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Remove player from boss zone.
+ player.removeFromBossZone();
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_MAKING_AN_ATTEMPT_TO_RESURRECT_YOU_IF_YOU_CHOOSE_THIS_PATH_S2_EXPERIENCE_POINTS_WILL_BE_RETURNED_TO_YOU_DO_YOU_WANT_TO_BE_RESURRECTED.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_1.0/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_1.0/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_1.0/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_1.0/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/MasterHandler.java
index cadcf8b9ef..ad95436773 100644
--- a/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/MasterHandler.java
@@ -335,6 +335,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -590,6 +591,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_1.0/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java
index 513d9da201..edd94e378f 100644
--- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/Config.java
@@ -1052,6 +1052,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3190,6 +3191,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_1.0/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/MasterHandler.java
index cadcf8b9ef..ad95436773 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/MasterHandler.java
@@ -335,6 +335,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -590,6 +591,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java
index 558382f529..5df4392a40 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/Config.java
@@ -1062,6 +1062,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3219,6 +3220,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_1.5_AgeOfSplendor/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/MasterHandler.java
index 6f99f0e69e..c304ddaf00 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
index 18cbc2b3e3..b10f877c16 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java
@@ -1061,6 +1061,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3217,6 +3218,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/MasterHandler.java
index 6f99f0e69e..c304ddaf00 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_2.5_Zaken/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java
index ecdbe8252b..eae9a675fd 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/Config.java
@@ -1065,6 +1065,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3223,6 +3224,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_2.5_Zaken/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/MasterHandler.java
index 6f99f0e69e..c304ddaf00 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/MasterHandler.java
@@ -336,6 +336,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -592,6 +593,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_2.7_Antharas/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java
index ecdbe8252b..eae9a675fd 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/Config.java
@@ -1065,6 +1065,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3223,6 +3224,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_2.7_Antharas/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/MasterHandler.java
index b06aebda03..2e1d5eb378 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/MasterHandler.java
@@ -337,6 +337,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -594,6 +595,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java
index ecdbe8252b..eae9a675fd 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/Config.java
@@ -1065,6 +1065,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3223,6 +3224,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_2.8_SevenSigns/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/MasterHandler.java
index 2900405bb2..d3a5d0b07a 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/MasterHandler.java
@@ -338,6 +338,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -596,6 +597,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java
index e88a36a9a6..55526af84a 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/Config.java
@@ -1070,6 +1070,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3232,6 +3233,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_2.9_SecretOfEmpire/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/MasterHandler.java
index 2900405bb2..d3a5d0b07a 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/MasterHandler.java
@@ -338,6 +338,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -596,6 +597,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_3.0_TheKamael/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ 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 f12d04e84a..b79fa0af6c 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
@@ -1076,6 +1076,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3277,6 +3278,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Classic_Interlude/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Classic_Interlude/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
index 4376733d90..88e80c1721 100644
--- a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/MasterHandler.java
@@ -337,6 +337,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -594,6 +595,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Classic_Interlude/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
index 37da188b02..9e2e044edc 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/Config.java
@@ -1077,6 +1077,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3237,6 +3238,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/MasterHandler.java
index 8b5902c0f0..6e0ec9747a 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/MasterHandler.java
@@ -341,6 +341,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -601,6 +602,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java
index 5a251bafd3..2acef6df97 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/Config.java
@@ -1102,6 +1102,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3330,6 +3331,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/MasterHandler.java
index 8b5902c0f0..6e0ec9747a 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/MasterHandler.java
@@ -341,6 +341,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -601,6 +602,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java
index 6425ca6a01..671618170a 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/Config.java
@@ -1110,6 +1110,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3432,6 +3433,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/MasterHandler.java
index 8b5902c0f0..6e0ec9747a 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/MasterHandler.java
@@ -341,6 +341,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -601,6 +602,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java
index 74c9a19491..4756e96998 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/Config.java
@@ -1117,6 +1117,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3446,6 +3447,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Essence_6.1_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/Custom/OfflineTrade.ini b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/Custom/OfflineTrade.ini
index 0da95393a1..82e246dc9a 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/Custom/OfflineTrade.ini
+++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/config/Custom/OfflineTrade.ini
@@ -41,3 +41,6 @@ OfflineDisconnectSameAccount = False
# Uses more datatabase resources, but helps if server shuts down unexpectedly.
StoreOfflineTradeInRealtime = True
+# Enable .offline command for logging out.
+EnableOfflineCommand = True
+
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/MasterHandler.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/MasterHandler.java
index 8b5902c0f0..6e0ec9747a 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/MasterHandler.java
+++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/MasterHandler.java
@@ -341,6 +341,7 @@ import handlers.voicedcommandhandlers.Banking;
import handlers.voicedcommandhandlers.ChangePassword;
import handlers.voicedcommandhandlers.ChatAdmin;
import handlers.voicedcommandhandlers.Lang;
+import handlers.voicedcommandhandlers.Offline;
import handlers.voicedcommandhandlers.Premium;
/**
@@ -601,6 +602,7 @@ public class MasterHandler
Config.CHAT_ADMIN ? ChatAdmin.class : null,
Config.MULTILANG_ENABLE && Config.MULTILANG_VOICED_ALLOW ? Lang.class : null,
Config.ALLOW_CHANGE_PASSWORD ? ChangePassword.class : null,
+ Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE) ? Offline.class : null,
Config.PREMIUM_SYSTEM_ENABLED ? Premium.class : null,
Config.AUTO_POTIONS_ENABLED ? AutoPotion.class : null,
},
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
new file mode 100644
index 0000000000..614e455fb5
--- /dev/null
+++ b/L2J_Mobius_Essence_6.2_Vanguard/dist/game/data/scripts/handlers/voicedcommandhandlers/Offline.java
@@ -0,0 +1,65 @@
+/*
+ * 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.voicedcommandhandlers;
+
+import org.l2jmobius.Config;
+import org.l2jmobius.gameserver.handler.IVoicedCommandHandler;
+import org.l2jmobius.gameserver.model.actor.Player;
+import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.ConfirmDlg;
+
+/**
+ * @author Mobius
+ */
+public class Offline implements IVoicedCommandHandler
+{
+ private static final String[] VOICED_COMMANDS =
+ {
+ "offline"
+ };
+
+ @Override
+ public boolean useVoicedCommand(String command, Player player, String target)
+ {
+ if (command.equals("offline") && Config.ENABLE_OFFLINE_COMMAND && (Config.OFFLINE_TRADE_ENABLE || Config.OFFLINE_CRAFT_ENABLE))
+ {
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return false;
+ }
+
+ player.sendPacket(new ConfirmDlg(SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME));
+ }
+
+ return true;
+ }
+
+ @Override
+ public String[] getVoicedCommandList()
+ {
+ return VOICED_COMMANDS;
+ }
+}
\ No newline at end of file
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java
index 9cd892bcb8..b6cf64ce1c 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java
+++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/Config.java
@@ -1117,6 +1117,7 @@ public class Config
public static int OFFLINE_NAME_COLOR;
public static boolean OFFLINE_FAME;
public static boolean STORE_OFFLINE_TRADE_IN_REALTIME;
+ public static boolean ENABLE_OFFLINE_COMMAND;
public static boolean DISPLAY_SERVER_TIME;
public static int BUFFER_MAX_SCHEMES;
public static int BUFFER_STATIC_BUFF_COST;
@@ -3446,6 +3447,7 @@ public class Config
OFFLINE_DISCONNECT_FINISHED = offlineTradeConfig.getBoolean("OfflineDisconnectFinished", true);
OFFLINE_DISCONNECT_SAME_ACCOUNT = offlineTradeConfig.getBoolean("OfflineDisconnectSameAccount", false);
STORE_OFFLINE_TRADE_IN_REALTIME = offlineTradeConfig.getBoolean("StoreOfflineTradeInRealtime", true);
+ ENABLE_OFFLINE_COMMAND = offlineTradeConfig.getBoolean("EnableOfflineCommand", true);
// Load PasswordChange config file (if exists)
final PropertiesParser passwordChangeConfig = new PropertiesParser(CUSTOM_PASSWORD_CHANGE_CONFIG_FILE);
diff --git a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
index 4b30b413fe..a1b815e9ea 100644
--- a/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
+++ b/L2J_Mobius_Essence_6.2_Vanguard/java/org/l2jmobius/gameserver/network/clientpackets/DlgAnswer.java
@@ -16,6 +16,7 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
+import org.l2jmobius.Config;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.PlayerAction;
import org.l2jmobius.gameserver.handler.AdminCommandHandler;
@@ -26,8 +27,13 @@ import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerDlgAns
import org.l2jmobius.gameserver.model.events.returns.TerminateReturn;
import org.l2jmobius.gameserver.model.holders.DoorRequestHolder;
import org.l2jmobius.gameserver.model.holders.SummonRequestHolder;
+import org.l2jmobius.gameserver.model.olympiad.OlympiadManager;
+import org.l2jmobius.gameserver.network.Disconnection;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.SystemMessageId;
+import org.l2jmobius.gameserver.network.serverpackets.ActionFailed;
+import org.l2jmobius.gameserver.network.serverpackets.LeaveWorld;
+import org.l2jmobius.gameserver.util.OfflineTradeUtil;
/**
* @author Dezmond_snz
@@ -80,6 +86,37 @@ public class DlgAnswer implements IClientIncomingPacket
AdminCommandHandler.getInstance().useAdminCommand(player, cmd, false);
}
}
+ else if (_messageId == SystemMessageId.DO_YOU_WISH_TO_EXIT_THE_GAME.getId())
+ {
+ if ((_answer == 0) || !Config.ENABLE_OFFLINE_COMMAND || (!Config.OFFLINE_TRADE_ENABLE && !Config.OFFLINE_CRAFT_ENABLE))
+ {
+ return;
+ }
+
+ if (!player.isInStoreMode())
+ {
+ player.sendPacket(SystemMessageId.PRIVATE_STORE_ALREADY_CLOSED);
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ if (player.isInInstance() || player.isInVehicle() || !player.canLogout())
+ {
+ player.sendPacket(ActionFailed.STATIC_PACKET);
+ return;
+ }
+
+ // Unregister from olympiad.
+ if (OlympiadManager.getInstance().isRegistered(player))
+ {
+ OlympiadManager.getInstance().unRegisterNoble(player);
+ }
+
+ if (!OfflineTradeUtil.enteredOfflineMode(player))
+ {
+ Disconnection.of(client, player).defaultSequence(LeaveWorld.STATIC_PACKET);
+ }
+ }
else if ((_messageId == SystemMessageId.C1_IS_ATTEMPTING_TO_DO_A_RESURRECTION_THAT_RESTORES_S2_S3_XP_ACCEPT.getId()) || (_messageId == SystemMessageId.YOUR_CHARM_OF_COURAGE_IS_TRYING_TO_RESURRECT_YOU_WOULD_YOU_LIKE_TO_RESURRECT_NOW.getId()))
{
player.reviveAnswer(_answer);