/**
* This file is part of aion-emu <aion-emu.com>.
*
* aion-emu is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-emu is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-emu. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.loginserver;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.aionemu.commons.network.IPRange;
import com.aionemu.loginserver.model.Account;
import com.aionemu.loginserver.network.gameserver.GsConnection;
import com.aionemu.loginserver.network.gameserver.GsConnection.State;
/**
* This class represents GameServer at LoginServer side. It contain info about id, ip etc.
*
* @author -Nemesiss-
*
*/
public class GameServerInfo
{
/**
* Id of this GameServer
*/
private final byte id;
/**
* Allowed IP for this GameServer if gs will connect from another ip wont be registered.
*/
private final String ip;
/**
* Password
*/
private final String password;
/**
* Default server address, usually internet address
*/
private byte[] defaultAddress;
/**
* Mapping of ip ranges, usually used for local area connections
*/
private List<IPRange> ipRanges;
/**
* Port on with this GameServer is accepting clients.
*/
private int port;
/**
* gsConnection - if GameServer is connected to LoginServer.
*/
private GsConnection gsConnection;
/**
* Max players count that may play on this GameServer.
*/
private int maxPlayers;
/**
* Map<AccId,Account> of accounts logged in on this GameServer.
*/
private final Map<Integer, Account> accountsOnGameServer = new HashMap<Integer, Account>();
/**
* Constructor.
*
* @param id
* @param ip
* @param password
*/
public GameServerInfo(byte id, String ip, String password)
{
this.id = id;
this.ip = ip;
this.password = password;
}
/**
* Returns id of this GameServer.
*
* @return byte id
*/
public byte getId()
{
return id;
}
/**
* Returns Password of this GameServer.
*
* @return String password
*/
public String getPassword()
{
return password;
}
/**
* Returns allowed IP for this GameServer.
*
* @return String ip
*/
public String getIp()
{
return ip;
}
/**
* Returns port of this GameServer.
*
* @return in port
*/
public int getPort()
{
return port;
}
/**
* Set port for this GameServer.
*
* @param port
*/
public void setPort(int port)
{
this.port = port;
}
/**
* Retunrs default server address, usually used as internet address
*
* @return default server address
*/
public byte[] getDefaultAddress()
{
return defaultAddress;
}
/**
* Sets default server address
*
* @param defaultAddress
* default server address
*/
public void setDefaultAddress(byte[] defaultAddress)
{
this.defaultAddress = defaultAddress;
}
/**
* Returns IP range mappings
*
* @return IPRange mappings
*/
public List<IPRange> getIpRanges()
{
return ipRanges;
}
/**
* Sets IPRange mappings
*
* @param ipRanges
* ipRangeMappings
*/
public void setIpRanges(List<IPRange> ipRanges)
{
this.ipRanges = ipRanges;
}
/**
* Returns active GsConnection for this GameServer or null if this GameServer is down.
*
* @return GsConnection
*/
public final GsConnection getGsConnection()
{
return gsConnection;
}
/**
* Set active GsConnection.
*
* @param gsConnection
*/
public final void setGsConnection(GsConnection gsConnection)
{
if (gsConnection == null)
setPort(0);
this.gsConnection = gsConnection;
}
/**
* Returns number of max allowed players for this GameServer.
*
* @return int maxPlayers
*/
public final int getMaxPlayers()
{
return maxPlayers;
}
/**
* Set max allowed players for this GameServer.
*
* @param maxPlayers
*/
public final void setMaxPlayers(int maxPlayers)
{
this.maxPlayers = maxPlayers;
}
/**
* Check if GameServer is Online
*
* @return true if GameServer is Online.
*/
public final boolean isOnline()
{
return gsConnection != null && gsConnection.getState() == State.AUTHED;
}
/**
* Check if given account is already on This GameServer
*
* @param accountId
* @return true if account is on this GameServer
*/
public final boolean isAccountOnGameServer(int accountId)
{
return accountsOnGameServer.containsKey(accountId);
}
/**
* Remove account from this GameServer
*
* @param accountId
* @return removed account.
*/
public final Account removeAccountFromGameServer(int accountId)
{
return accountsOnGameServer.remove(accountId);
}
/**
* Add account to this GameServer
*
* @param acc
*/
public final void addAccountToGameServer(Account acc)
{
accountsOnGameServer.put(acc.getId(), acc);
}
/**
* Get Account object from account on GameServer list.
* @param accountId
* @return Account object if account is on this game server or null.
*/
public final Account getAccountFromGameServer(int accountId)
{
return accountsOnGameServer.get(accountId);
}
/**
* Clears all accounts on this gameServer
*/
public void clearAccountsOnGameServer()
{
accountsOnGameServer.clear();
}
/**
* Return number of online players connected to this GameServer.
*
* @return number of online players
*/
public int getCurrentPlayers()
{
return accountsOnGameServer.size();
}
/**
* Return true if server is full.
* @return true if full.
*/
public boolean isFull()
{
return getCurrentPlayers() >= getMaxPlayers();
}
/**
* Returns ip address that will be used as server ip for specific player.<br>
* The problem is that players can access server from various subnetworks so we need to send different ip adresses.<br>
* If gameserver is not online - it returns 127.0.0.1 as server address.
*
* @param playerIp
* Player address
* @return ip address that is valid for player
*/
public byte[] getIPAddressForPlayer(String playerIp)
{
if(!isOnline())
{
return new byte[]{127, 0, 0, 1};
}
for (IPRange ipr : ipRanges)
{
if (ipr.isInRange(playerIp))
{
return ipr.getAddress();
}
}
return defaultAddress;
}
}