Code:
package server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.text.DecimalFormat;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
import server.engine.event.EventManager;
import server.engine.network.ConnectionHandler;
import server.engine.network.ConnectionThrottleFilter;
import server.engine.util.Logger;
import server.engine.util.SimpleTimer;
import server.engine.world.ItemHandler;
import server.engine.world.ObjectHandler;
import server.engine.world.ObjectManager;
import server.engine.world.ShopHandler;
import server.game.minigame.CastleWars;
import server.game.minigame.FightCaves;
import server.game.minigame.FightPits;
import server.game.minigame.PestControl;
import server.game.npc.NPCDrops;
import server.game.npc.NPCHandler;
import server.game.player.ClanChatHandler;
import server.game.player.Client;
import server.game.player.Player;
import server.game.player.PlayerHandler;
import server.game.player.PlayerSave;
public class Server {
public static boolean sleeping;
public static final int cycleRate;
public static boolean UpdateServer = false;
public static long lastMassSave = System.currentTimeMillis();
private static IoAcceptor acceptor;
private static ConnectionHandler connectionHandler;
private static ConnectionThrottleFilter throttleFilter;
private static SimpleTimer engineTimer, debugTimer;
private static long cycleTime, cycles, totalCycleTime, sleepTime;
private static DecimalFormat debugPercentFormat;
public static boolean shutdownServer = false;
public static int garbageCollectDelay = 40;
public static boolean shutdownClientHandler;
public static int serverlistenerPort;
public static ItemHandler itemHandler = new ItemHandler();
public static PlayerHandler playerHandler = new PlayerHandler();
public static NPCHandler npcHandler = new NPCHandler();
public static ShopHandler shopHandler = new ShopHandler();
public static ObjectHandler objectHandler = new ObjectHandler();
public static ObjectManager objectManager = new ObjectManager();
public static CastleWars castleWars = new CastleWars();
public static FightPits fightPits = new FightPits();
public static PestControl pestControl = new PestControl();
public static NPCDrops npcDrops = new NPCDrops();
public static ClanChatHandler clanChat = new ClanChatHandler();
public static FightCaves fightCaves = new FightCaves();
//public static WorldMap worldMap = new WorldMap();
//private static final WorkerThread engine = new WorkerThread();
static {
if(!Config.SERVER_DEBUG) {
Server.serverlistenerPort = 43594;
} else {
Server.serverlistenerPort = 43594;
}
cycleRate = 600;
Server.shutdownServer = false;
Server.engineTimer = new SimpleTimer();
Server.debugTimer = new SimpleTimer();
Server.sleepTime = 0;
Server.debugPercentFormat = new DecimalFormat("0.0#%");
}
public static boolean playerExecuted = false;
private static void debug() {
if (Server.debugTimer.elapsed() > 360*1000 || Server.playerExecuted) {
final long averageCycleTime = Server.totalCycleTime / Server.cycles;
System.out.println("Average Cycle Time: " + averageCycleTime + "ms");
final double engineLoad = (double) averageCycleTime / (double) Server.cycleRate;
System.out.println("Players online: " + PlayerHandler.playerCount+ ", engine load: "+ Server.debugPercentFormat.format(engineLoad));
Server.totalCycleTime = 0;
Server.cycles = 0;
System.gc();
System.runFinalization();
Server.debugTimer.reset();
Server.playerExecuted = false;
}
}
public static long getSleepTimer() {
return Server.sleepTime;
}
//height,absX,absY,toAbsX,toAbsY,type
/*public static final boolean checkPos(int height,int absX,int absY,int toAbsX,int toAbsY,int type)
{
return I.I(height,absX,absY,toAbsX,toAbsY,type);
}*/
public static void main(final java.lang.String args[]) throws NullPointerException, IOException {
/**
* Starting Up Server
*/
System.setOut(new Logger(System.out));
System.setErr(new Logger(System.err));
System.out.println("Launching Project Insanity...");
/**
* World Map Loader
*/
//if(!Config.SERVER_DEBUG)
//VirtualWorld.init();
//WorldMap.loadWorldMap();
/**
* Script Loader
*/
//ScriptManager.loadScripts();
/**
* Accepting Connections
*/
Server.acceptor = new SocketAcceptor();
Server.connectionHandler = new ConnectionHandler();
SocketAcceptorConfig sac = new SocketAcceptorConfig();
sac.getSessionConfig().setTcpNoDelay(false);
sac.setReuseAddress(true);
sac.setBacklog(100);
Server.throttleFilter = new ConnectionThrottleFilter(Config.CONNECTION_DELAY);
sac.getFilterChain().addFirst("throttleFilter", Server.throttleFilter);
Server.acceptor.bind(new InetSocketAddress(Server.serverlistenerPort), Server.connectionHandler, sac);
/**
* Initialise Handlers
*/
EventManager.initialize();
Connection.initialize();
//PlayerSaving.initialize();
//MysqlManager.createConnection();
/**
* Server Successfully Loaded
*/
System.out.println("Server listening on port 0.0.0.0:" + Server.serverlistenerPort);
/**
* Main Server Tick
*/
try {
while (!Server.shutdownServer) {
if (Server.sleepTime >= 0) {
Thread.sleep(Server.sleepTime);
} else {
Thread.sleep(600);
}
Server.engineTimer.reset();
Server.itemHandler.process();
Server.playerHandler.process();
Server.npcHandler.process();
Server.shopHandler.process();
Server.objectManager.process();
Server.fightPits.process();
Server.pestControl.process();
Server.cycleTime = Server.engineTimer.elapsed();
Server.sleepTime = Server.cycleRate - Server.cycleTime;
Server.totalCycleTime += Server.cycleTime;
Server.cycles++;
Server.debug();
Server.garbageCollectDelay--;
if (Server.garbageCollectDelay == 0) {
Server.garbageCollectDelay = 40;
System.gc();
}
if (System.currentTimeMillis() - Server.lastMassSave > 300000) {
for(final Player p : PlayerHandler.players) {
if(p == null) {
continue;
}
PlayerSave.saveGame((Client)p);
System.out.println("Saved game for " + p.playerName + ".");
Server.lastMassSave = System.currentTimeMillis();
}
}
}
} catch (final Exception ex) {
ex.printStackTrace();
System.out.println("A fatal exception has been thrown!");
for(final Player p : PlayerHandler.players) {
if(p == null) {
continue;
}
PlayerSave.saveGame((Client)p);
System.out.println("Saved game for " + p.playerName + ".");
}
}
Server.acceptor = null;
Server.connectionHandler = null;
sac = null;
System.exit(0);
}
public static void processAllPackets() {
for (final Player player : PlayerHandler.players) {
if (player != null) {
while(player.processQueuedPackets()) {
;
}
}
}
}
}