public void reconnectWorld() {
// Check if the connection is really gone.
try {
wci.isAvailable();
} catch (RemoteException ex) {
synchronized (worldReady) {
worldReady = false;
}
synchronized (cwi) {
synchronized (worldReady) {
if (worldReady) {
return;
}
}
System.out.println("Reconnecting to world server.");
synchronized (wci) {
// Completely re-establish the rmi connection.
try {
initialProp = new Properties();
FileReader fr = new FileReader(System.getProperty("net.sf.odinms.channel.config"));
initialProp.load(fr);
fr.close();
Registry registry = LocateRegistry.getRegistry(initialProp.getProperty("net.sf.odinms.world.host"),
Registry.REGISTRY_PORT, new SslRMIClientSocketFactory());
worldRegistry = (WorldRegistry) registry.lookup("WorldRegistry");
cwi = new ChannelWorldInterfaceImpl(this);
wci = worldRegistry.registerChannelServer(key, cwi);
props = wci.getGameProperties();
expRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.exp"));
mesoRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.meso"));
dropRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.drop"));
bossdropRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.bossdrop"));
petExpRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.petExp"));
serverMessage = props.getProperty("net.sf.odinms.world.serverMessage");
dropUndroppables = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.alldrop", "false"));
moreThanOne = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.morethanone", "false"));
serverName = props.getProperty("net.sf.odinms.world.serverName");
godlyItems = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.godlyItems", "false"));
itemStatMultiplier = Short.parseShort(props.getProperty("net.sf.odinms.world.itemStatMultiplier"));
godlyItemRate = Short.parseShort(props.getProperty("net.sf.odinms.world.godlyItemRate"));
multiLevel = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.multiLevel", "false"));
levelCap = Integer.parseInt(props.getProperty("net.sf.odinms.world.levelCap"));
AB = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.Autoban", "false"));
CS = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.CashShop", "false"));
MT = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.MTS", "false"));
GMItems = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.GMItems", "false"));
PvPis = Integer.parseInt(props.getProperty("net.sf.odinms.world.PvPis", "4"));
Properties dbProp = new Properties();
fr = new FileReader("db.properties");
dbProp.load(fr);
fr.close();
DatabaseConnection.setProps(dbProp);
DatabaseConnection.getConnection();
wci.serverReady();
} catch (Exception e) {
System.out.println("Reconnecting failed" + e);
}
worldReady = true;
}
}
synchronized (worldReady) {
worldReady.notifyAll();
}
}
}
@Override
public void run() {
try {
cwi = new ChannelWorldInterfaceImpl(this);
wci = worldRegistry.registerChannelServer(key, cwi);
props = wci.getGameProperties();
expRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.exp"));
mesoRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.meso"));
dropRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.drop"));
bossdropRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.bossdrop"));
petExpRate = Integer.parseInt(props.getProperty("net.sf.odinms.world.petExp"));
serverMessage = props.getProperty("net.sf.odinms.world.serverMessage");
dropUndroppables = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.alldrop", "false"));
moreThanOne = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.morethanone", "false"));
eventSM = new EventScriptManager(this, props.getProperty("net.sf.odinms.channel.events").split(","));
serverName = props.getProperty("net.sf.odinms.world.serverName");
godlyItems = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.godlyItems", "false"));
itemStatMultiplier = Short.parseShort(props.getProperty("net.sf.odinms.world.itemStatMultiplier"));
godlyItemRate = Short.parseShort(props.getProperty("net.sf.odinms.world.godlyItemRate"));
multiLevel = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.multiLevel", "false"));
levelCap = Integer.parseInt(props.getProperty("net.sf.odinms.world.levelCap"));
AB = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.Autoban", "false"));
CS = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.CashShop", "false"));
MT = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.MTS", "false"));
GMItems = Boolean.parseBoolean(props.getProperty("net.sf.odinms.world.GMItems", "false"));
PvPis = Integer.parseInt(props.getProperty("net.sf.odinms.world.PvPis", "4"));
Properties dbProp = new Properties();
FileReader fileReader = new FileReader("db.properties");
dbProp.load(fileReader);
fileReader.close();
DatabaseConnection.setProps(dbProp);
DatabaseConnection.getConnection();
Connection c = DatabaseConnection.getConnection();
} catch (Exception e) {
throw new RuntimeException(e);
}
port = Integer.parseInt(props.getProperty("net.sf.odinms.channel.net.port"));
ip = props.getProperty("net.sf.odinms.channel.net.interface") + ":" + port;
ByteBuffer.setUseDirectBuffers(false);
ByteBuffer.setAllocator(new SimpleByteBufferAllocator());
acceptor = new SocketAcceptor();
SocketAcceptorConfig cfg = new SocketAcceptorConfig();
// cfg.setThreadModel(ThreadModel.MANUAL); // *fingers crossed*, I hope the executor filter handles everything
// executor = new ThreadPoolExecutor(16, 16, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
// cfg.getFilterChain().addLast("executor", new ExecutorFilter(executor));
cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MapleCodecFactory()));
// Item.loadInitialDataFromDB();
TimerManager tMan = TimerManager.getInstance();
tMan.start();
tMan.register(AutobanManager.getInstance(), 60000);
try {
MapleServerHandler serverHandler = new MapleServerHandler(PacketProcessor.getProcessor(PacketProcessor.Mode.CHANNELSERVER), channel);
acceptor.bind(new InetSocketAddress(port), serverHandler, cfg);
System.out.println("Channel " + getChannel() + ": Listening on port: " + port);
wci.serverReady();
eventSM.init();
} catch (IOException e) {
System.out.println("Binding to port " + port + " failed (ch: " + getChannel() + ")" + e);
}
}