Prevent players from logging in during server shutdown.
Contributed by Sahar.
This commit is contained in:
parent
8861770e73
commit
003558ce66
@ -709,6 +709,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -709,6 +709,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -274,7 +274,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -357,100 +357,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -711,6 +711,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -276,7 +276,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -359,100 +359,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -711,6 +711,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -276,7 +276,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -359,100 +359,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -106,7 +106,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -712,6 +712,11 @@ public class LoginServerThread extends Thread
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getServerStatus()
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the status string.
|
* Gets the status string.
|
||||||
* @return the status string
|
* @return the status string
|
||||||
|
@ -275,7 +275,7 @@ public class Shutdown extends Thread
|
|||||||
}
|
}
|
||||||
else
|
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)
|
if (_shutdownMode > 0)
|
||||||
@ -358,100 +358,47 @@ public class Shutdown extends Thread
|
|||||||
{
|
{
|
||||||
while (_secondsShut > 0)
|
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)
|
switch (_secondsShut)
|
||||||
{
|
{
|
||||||
case 540:
|
case 540:
|
||||||
{
|
|
||||||
SendServerQuit(540);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 480:
|
case 480:
|
||||||
{
|
|
||||||
SendServerQuit(480);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 420:
|
case 420:
|
||||||
{
|
|
||||||
SendServerQuit(420);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 360:
|
case 360:
|
||||||
{
|
|
||||||
SendServerQuit(360);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 300:
|
case 300:
|
||||||
{
|
|
||||||
SendServerQuit(300);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 240:
|
case 240:
|
||||||
{
|
|
||||||
SendServerQuit(240);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 180:
|
case 180:
|
||||||
{
|
|
||||||
SendServerQuit(180);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 120:
|
case 120:
|
||||||
{
|
|
||||||
SendServerQuit(120);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 60:
|
case 60:
|
||||||
{
|
|
||||||
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN); // avoids new players from logging in
|
|
||||||
SendServerQuit(60);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 30:
|
case 30:
|
||||||
{
|
|
||||||
SendServerQuit(30);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 10:
|
case 10:
|
||||||
{
|
|
||||||
SendServerQuit(10);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 5:
|
case 5:
|
||||||
{
|
|
||||||
SendServerQuit(5);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 4:
|
case 4:
|
||||||
{
|
|
||||||
SendServerQuit(4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
case 3:
|
||||||
{
|
|
||||||
SendServerQuit(3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
case 2:
|
||||||
{
|
|
||||||
SendServerQuit(2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
case 1:
|
||||||
{
|
SendServerQuit(_secondsShut);
|
||||||
SendServerQuit(1);
|
}
|
||||||
break;
|
|
||||||
}
|
// Prevent players from logging in.
|
||||||
|
if ((_secondsShut <= 60) && (LoginServerThread.getInstance().getServerStatus() != ServerStatus.STATUS_DOWN))
|
||||||
|
{
|
||||||
|
LoginServerThread.getInstance().setServerStatus(ServerStatus.STATUS_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
_secondsShut--;
|
_secondsShut--;
|
||||||
|
|
||||||
final int delay = 1000; // milliseconds
|
final int delay = 1000; // milliseconds
|
||||||
Thread.sleep(delay);
|
Thread.sleep(delay);
|
||||||
|
|
||||||
if (_shutdownMode == ABORT)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (InterruptedException e)
|
catch (InterruptedException e)
|
||||||
|
@ -39,6 +39,7 @@ import org.l2jmobius.commons.database.DatabaseFactory;
|
|||||||
import org.l2jmobius.commons.util.IPSubnet;
|
import org.l2jmobius.commons.util.IPSubnet;
|
||||||
import org.l2jmobius.commons.util.IXmlReader;
|
import org.l2jmobius.commons.util.IXmlReader;
|
||||||
import org.l2jmobius.commons.util.Rnd;
|
import org.l2jmobius.commons.util.Rnd;
|
||||||
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -480,6 +481,24 @@ public class GameServerTable implements IXmlReader
|
|||||||
return _gst.getPlayerCount();
|
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.
|
* Gets the external host.
|
||||||
* @return the external host
|
* @return the external host
|
||||||
|
@ -46,7 +46,6 @@ import org.l2jmobius.commons.util.crypt.ScrambledKeyPair;
|
|||||||
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
import org.l2jmobius.loginserver.GameServerTable.GameServerInfo;
|
||||||
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
import org.l2jmobius.loginserver.model.data.AccountInfo;
|
||||||
import org.l2jmobius.loginserver.network.LoginClient;
|
import org.l2jmobius.loginserver.network.LoginClient;
|
||||||
import org.l2jmobius.loginserver.network.gameserverpackets.ServerStatus;
|
|
||||||
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
import org.l2jmobius.loginserver.network.serverpackets.LoginFail.LoginFailReason;
|
||||||
|
|
||||||
public class LoginController
|
public class LoginController
|
||||||
@ -398,11 +397,9 @@ public class LoginController
|
|||||||
public boolean isLoginPossible(LoginClient client, int serverId)
|
public boolean isLoginPossible(LoginClient client, int serverId)
|
||||||
{
|
{
|
||||||
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
final GameServerInfo gsi = GameServerTable.getInstance().getRegisteredGameServerById(serverId);
|
||||||
final int access = client.getAccessLevel();
|
|
||||||
if ((gsi != null) && gsi.isAuthed())
|
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))
|
if (loginOk && (client.getLastServer() != serverId))
|
||||||
{
|
{
|
||||||
try (Connection con = DatabaseFactory.getConnection();
|
try (Connection con = DatabaseFactory.getConnection();
|
||||||
|
@ -105,7 +105,7 @@ public class ServerList implements IOutgoingPacket
|
|||||||
_ageLimit = 0;
|
_ageLimit = 0;
|
||||||
_brackets = gsi.isShowingBrackets();
|
_brackets = gsi.isShowingBrackets();
|
||||||
// If server GM-only - show status only to GMs
|
// 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();
|
_serverId = gsi.getId();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user