From 003558ce6625110c229c39526d04f03a65455ff4 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sat, 2 Nov 2019 13:30:53 +0000 Subject: [PATCH] Prevent players from logging in during server shutdown. Contributed by Sahar. --- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- .../gameserver/LoginServerThread.java | 5 ++ .../org/l2jmobius/gameserver/Shutdown.java | 89 ++++--------------- .../loginserver/GameServerTable.java | 19 ++++ .../loginserver/LoginController.java | 5 +- .../network/serverpackets/ServerList.java | 2 +- 85 files changed, 748 insertions(+), 1292 deletions(-) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/LoginServerThread.java index dc150a9f73..0f31dee771 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -709,6 +709,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 0ade8a17fb..a583ab9df8 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = (gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/LoginServerThread.java index dc150a9f73..0f31dee771 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -709,6 +709,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java index 082facac87..2085a35735 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java index be10344be5..2fd7de3a48 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/Shutdown.java @@ -274,7 +274,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -357,100 +357,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/LoginServerThread.java index 013456b1bf..2a35fbe303 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -711,6 +711,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java index 50b09d814a..1915abe5c5 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/Shutdown.java @@ -276,7 +276,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -359,100 +359,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/GameServerTable.java index 1b0a509126..67b4f38721 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginController.java index 7a7e9837e0..d8bffb7b20 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 0ade8a17fb..a583ab9df8 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = (gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/LoginServerThread.java index 013456b1bf..2a35fbe303 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -711,6 +711,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java index 50b09d814a..1915abe5c5 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/Shutdown.java @@ -276,7 +276,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -359,100 +359,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/GameServerTable.java index 1b0a509126..67b4f38721 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginController.java index 7a7e9837e0..d8bffb7b20 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 0ade8a17fb..a583ab9df8 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = (gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java index 755b5a5f3a..e1733db60c 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/LoginServerThread.java @@ -712,6 +712,11 @@ public class LoginServerThread extends Thread } } + public int getServerStatus() + { + return _status; + } + /** * Gets the status string. * @return the status string diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java index 57f876dd02..c59402479c 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/Shutdown.java @@ -275,7 +275,7 @@ public class Shutdown extends Thread } else { - LOGGER.warning("Server scheduled restart issued shutdown command. Restart in " + seconds + " seconds!"); + LOGGER.warning("Server scheduled restart issued shutdown command. " + (restart ? "Restart" : "Shutdown") + " in " + seconds + " seconds!"); } if (_shutdownMode > 0) @@ -358,100 +358,47 @@ public class Shutdown extends Thread { while (_secondsShut > 0) { + // Rehabilitate previous server status if shutdown is aborted. + if (_shutdownMode == ABORT) + { + if (LoginServerThread.getInstance().getServerStatus() == ServerStatus.STATUS_DOWN) + { + LoginServerThread.getInstance().setServerStatus((Config.SERVER_GMONLY) ? ServerStatus.STATUS_GM_ONLY : ServerStatus.STATUS_AUTO); + } + break; + } + switch (_secondsShut) { case 540: - { - SendServerQuit(540); - break; - } case 480: - { - SendServerQuit(480); - break; - } case 420: - { - SendServerQuit(420); - break; - } case 360: - { - SendServerQuit(360); - break; - } case 300: - { - SendServerQuit(300); - break; - } case 240: - { - SendServerQuit(240); - break; - } case 180: - { - SendServerQuit(180); - break; - } case 120: - { - SendServerQuit(120); - break; - } case 60: - { - LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in - SendServerQuit(60); - break; - } case 30: - { - SendServerQuit(30); - break; - } case 10: - { - SendServerQuit(10); - break; - } case 5: - { - SendServerQuit(5); - break; - } case 4: - { - SendServerQuit(4); - break; - } case 3: - { - SendServerQuit(3); - break; - } case 2: - { - SendServerQuit(2); - break; - } case 1: - { - SendServerQuit(1); - break; - } + SendServerQuit(_secondsShut); + } + + // Prevent players from logging in. + if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN)) + { + LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); } _secondsShut--; final int delay = 1000; // milliseconds Thread.sleep(delay); - - if (_shutdownMode == ABORT) - { - break; - } } } catch (InterruptedException e) diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/GameServerTable.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/GameServerTable.java index 52c4734e3e..537b0883e7 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/GameServerTable.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/GameServerTable.java @@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory; import org.l2jmobius.commons.util.IPSubnet; import org.l2jmobius.commons.util.IXmlReader; import org.l2jmobius.commons.util.Rnd; +import org.l2jmobius.loginserver.network.LoginClient; import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; /** @@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader return _gst.getPlayerCount(); } + public boolean canLogin(LoginClient client) + { + // DOWN status doesn't allow anyone to login. + if (_status == ServerStatus.STATUS_DOWN) + { + return false; + } + + // GM_ONLY status or full server only allows superior access levels accounts to login. + if ((_status == ServerStatus.STATUS_GM_ONLY) || (getCurrentPlayerCount() >= getMaxPlayers())) + { + return client.getAccessLevel() > 0; + } + + // Otherwise, any positive access level account can login. + return client.getAccessLevel() >= 0; + } + /** * Gets the external host. * @return the external host diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginController.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginController.java index 22c3683680..4a7ce14b42 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginController.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/LoginController.java @@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair; import org.l2jmobius.loginserver.GameServerTable.GameServerInfo; import org.l2jmobius.loginserver.model.data.AccountInfo; import org.l2jmobius.loginserver.network.LoginClient; -import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus; import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason; public class LoginController @@ -398,11 +397,9 @@ public class LoginController public boolean isLoginPossible(LoginClient client, int serverId) { final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId); - final int access = client.getAccessLevel(); if ((gsi != null) && gsi.isAuthed()) { - final boolean loginOk = ((gsi.getCurrentPlayerCount() < gsi.getMaxPlayers()) && (gsi.getStatus() != ServerStatus.STATUS_GM_ONLY)) || (access > 0); - + final boolean loginOk = gsi.canLogin(client); if (loginOk && (client.getLastServer() != serverId)) { try (Connection con = DatabaseFactory.getConnection(); diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java index 9743abc183..7776cef9b3 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/loginserver/network/serverpackets/ServerList.java @@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket _ageLimit = 0; _brackets = gsi.isShowingBrackets(); // If server GM-only - show status only to GMs - _status = gsi.getStatus() != ServerStatus.STATUS_GM_ONLY ? gsi.getStatus() : client.getAccessLevel() > 0 ? gsi.getStatus() : ServerStatus.STATUS_DOWN; + _status = (client.getAccessLevel() < 0) || ((gsi.getStatus() == ServerStatus.STATUS_GM_ONLY) && (client.getAccessLevel() <= 0)) ? ServerStatus.STATUS_DOWN : gsi.getStatus(); _serverId = gsi.getId(); } }