package main;
import java.util.ArrayList;
import java.util.List;
import clientdata.*;
import clientdata.visitors.TerrainVisitor;
import database.odb.ObjectDatabase;
import protocol.SoeProtocolHandler;
import network.NetworkDispatch;
import network.UDPServer;
import services.login.Account;
import services.login.LoginService;
import services.terrain.TerrainService;
import utils.*;
public class Core {
public static Core instance;
private GalaxyStatus galaxyStatus = GalaxyStatus.Offline;
private TerrainService terrainService;
private Config config;
private long galacticTime = System.currentTimeMillis();
private UDPServer loginServer;
private UDPServer pingServer;
private UDPServer zoneServer;
private NetworkDispatch loginDispatch;
private NetworkDispatch zoneDispatch;
private List<ObjectDatabase> odbs = new ArrayList<ObjectDatabase>();
public LoginService loginService;
private String galaxyName;
public enum GalaxyStatus {
Offline,
Loading,
Online,
Locked
}
public Core() {
instance = this;
config = new Config();
config.setFilePath("config.cfg");
if (!(config.loadConfigFile())) {
config = DefaultConfig.getConfig();
}
}
public void start() {
setGalaxyName(config.getString("GalaxyName"));
setGalaxyStatus(GalaxyStatus.Loading);
odbs.add(new ObjectDatabase("accounts", true, true, true, Account.class));
odbs.add(new ObjectDatabase("characters", true, true, true, Character.class));
//terrainService = new TerrainService();
pingServer = new UDPServer(config.getInt("PING.PORT"), 0, "Ping");
loginServer = new UDPServer(config.getInt("LOGIN.PORT"), 5, "Login");
zoneServer = new UDPServer(config.getInt("ZONE.PORT"), 5, "Zone");
loginDispatch = new NetworkDispatch(new SoeProtocolHandler(), false, loginServer);
zoneDispatch = new NetworkDispatch(new SoeProtocolHandler(), true, zoneServer);
loginServer.setDispatch(loginDispatch);
zoneServer.setDispatch(zoneDispatch);
loginService = new LoginService(this);
loginDispatch.addService(loginService);
pingServer.start();
loginServer.start();
zoneServer.start();
setGalaxyStatus(GalaxyStatus.Online);
}
public static void main(String args[]) throws Exception {
Core core = new Core();
core.start();
ClientFileManager.loadFile("terrain/tatooine.trn", TerrainVisitor.class);
while(core.getGalaxyStatus() != GalaxyStatus.Offline) {
Thread.sleep(1000);
}
}
public void stop() {
setGalaxyStatus(GalaxyStatus.Offline);
}
public void saveODBs() {
}
public ObjectDatabase getObjectDatabase(int index) {
return odbs.get(index);
}
public static Core getInstance() {
return instance;
}
public GalaxyStatus getGalaxyStatus() {
return galaxyStatus;
}
public void setGalaxyStatus(GalaxyStatus galaxyStatus) {
this.galaxyStatus = galaxyStatus;
}
public void lockGalaxy() {
setGalaxyStatus(GalaxyStatus.Locked);
}
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
public long getGalacticTime() {
return galacticTime;
}
public void setGalacticTime(long galacticTime) {
this.galacticTime = galacticTime;
}
public UDPServer getLoginServer() {
return loginServer;
}
public void setLoginServer(UDPServer loginServer) {
this.loginServer = loginServer;
}
public UDPServer getPingServer() {
return pingServer;
}
public void setPingServer(UDPServer pingServer) {
this.pingServer = pingServer;
}
public UDPServer getZoneServer() {
return zoneServer;
}
public void setZoneServer(UDPServer zoneServer) {
this.zoneServer = zoneServer;
}
public NetworkDispatch getLoginDispatch() {
return loginDispatch;
}
public void setLoginDispatch(NetworkDispatch loginDispatch) {
this.loginDispatch = loginDispatch;
}
public NetworkDispatch getZoneDispatch() {
return zoneDispatch;
}
public void setZoneDispatch(NetworkDispatch zoneDispatch) {
this.zoneDispatch = zoneDispatch;
}
public int getNumberOfConnectedCharacters() {
return zoneServer.getClients().size();
}
public String getGalaxyName() {
return galaxyName;
}
public void setGalaxyName(String galaxyName) {
this.galaxyName = galaxyName;
}
}