/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain;


import net.sourceforge.pain.data.*;
import net.sourceforge.pain.db.*;
import net.sourceforge.pain.network.console.*;
import net.sourceforge.pain.network.guitool.*;
import net.sourceforge.pain.plugin.*;
import net.sourceforge.pain.util.*;


public class Launcher {

    public static void main(String[] args) throws Exception {
        init();
    }

    private static void init() throws Exception {
        if (Core.getDB() != null) {
            throw new IllegalStateException("already inited!");
        }
        initDb();
        loadWorld();
        loadAllWhatsLeft();
    }

    private static void initDb() throws Exception {
        PainDB db = new PainDB("pain.pdb");
        Core.setDB(db);
    }

    private static void loadWorld() throws Exception {
        PainDB db = Core.getDB();

        Log.info("loading World");
        World world = (World) db.getRoot();
        if (world == null) {
            if (!db.isDatabaseEmpty()) {
                throw new RuntimeException("database is not empty, but world instance not found!");
            }
            Log.debug("Empty database detected!, creating world!");
            world = new World(db);
            Core.setWorld(world);
            Core.processEvent("deploy.CreateInitialWorldEvent", null);
            db.setRoot(world);
            Log.debug("World Created!");
        } else {
            Log.info("World instance found");
            Core.setWorld(world);
        }


        Log.info("flushing all startup fixes");
        db.flush();
        Log.info("Flushed OK!");
    }

    private static void loadAllWhatsLeft() throws Exception {
        Log.info("Creating plugin manager");
        PluginManager plm = new PluginManager(Core.getApplicationPath() + "/classes");
        plm.init();
        Core.setPluginManager(plm);
        Log.info("Creating plugin manager OK");

        checkSafeShutdown(); // checks if server was properly shutted down (mark all players as logged out snd so on..)

        Log.info("Creating console manager");
        Core.setConsoleManager(new ConsoleManager());
        Log.info("Creating console manager OK");

        Log.info("Creating guitool connection manager");
        Core.setGuiToolSessionManager(new GuiToolSessionManager(5555));
        Log.info("Creating console manager OK");

        Log.info("Creating affect processor");
        Core.getTime().addListener(new AffectProcessor(Core.getWorld().getAffectsQueue()));
        Log.info("Creating affect processor OK");

        Log.info("starting timer...");
        new Thread(Core.getTime()).start();
        Log.info("done!");
    }

    private static void checkSafeShutdown() throws Exception {
        Core.processEvent("CheckSafeShutdown", null);
    }
}