package net.cis.client.game.ctrl;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import net.cis.client.game.common.ctrl.IDispatcher;
import net.cis.client.game.common.ctrl.IObjectController;
import net.cis.client.game.common.threading.IGameDestroyCallback;
import net.cis.client.game.common.util.GlobalObjectStore;
import net.cis.client.game.ctrl.ai.AIController;
import net.cis.client.game.ctrl.scene.ObjectController;
import net.cis.client.game.model.DebugGuiNode;
import net.cis.client.game.scenery.ctrl.flight.AttitudeFlightAssistent;
import net.cis.client.game.scenery.ctrl.flight.RotationFlightAssistent;
import net.cis.client.game.scenery.factory.PlayerFactory;
import net.cis.client.game.scenery.factory.SectorFactory;
import net.cis.client.game.scenery.model.PlayerVehicleUpdates;
import net.cis.client.game.ui.hud.ctrl.OnBoardUIController;
import net.cis.client.game.ui.util.ResourceConstants;
import net.cis.common.model.sector.Sector;
import net.cis.common.model.spaceobject.SpaceObject;
import net.cis.common.model.system.UserData;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.math.Vector3f;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.system.Timer;
import de.lessvoid.nifty.Nifty;
/**
* Globale Gamelogik ist hier !
*/
public class GameController extends AbstractAppState {
private GameApplication gameApp;
private IObjectController objectController;
private Dispatcher dispatcher;
private LogicThreadCtrl logicCallbacksCtrl;
private AIController aiCtrl;
private ExecutorService threadPool;
private UserData userData;
private InputCtrl inputCtrl;
private NiftyJmeDisplay niftyDisplay;
public GameController(UserData userData, NiftyJmeDisplay niftyDisplay) {
this.userData = userData;
this.niftyDisplay = niftyDisplay;
}
@Override
public void initialize(AppStateManager stateManager, Application app) {
gameApp = (GameApplication) app;
gameApp.addGameDestroyCallback(createDestroyCallback());
gameApp.getInputManager().setCursorVisible(false);
BulletAppState state = new BulletAppState();
gameApp.getStateManager().attach(state);
state.getPhysicsSpace().setGravity(Vector3f.ZERO);
// The glorious one and only Object store
GlobalObjectStore.setAccessLog(false);
GlobalObjectStore.registerObject(gameApp.getAssetManager(), AssetManager.class);
// /////////////////
GlobalObjectStore.registerObject(dispatcher = new Dispatcher(GlobalObjectStore.<Timer>getObject(Timer.class)), IDispatcher.class, Dispatcher.class);
GlobalObjectStore.registerObject(objectController = new ObjectController(gameApp), IObjectController.class, ObjectController.class);
aiCtrl = new AIController(gameApp);
logicCallbacksCtrl = new LogicThreadCtrl(gameApp, GlobalObjectStore.<Timer>getObject(Timer.class));
// Nifty: Hud, Usermenu, etc...
Nifty nifty = niftyDisplay.getNifty();
nifty.setGlobalProperties(ResourceConstants.getUserProperties());
nifty.fromXml("hud/onBoardUI.xml", "onBoard");
((OnBoardUIController) nifty.getScreen("onBoard").getScreenController()).initialize();
// datamodel laden
// int sectorID = userData.getSectorId();
Sector sector = null;
// co erzeugen
SectorFactory sf = new SectorFactory();
sf.addControlledObject(sector);
PlayerFactory pf = new PlayerFactory();
pf.addControlledObject((SpaceObject) null, true);
// Inputs laden
RigidBodyControl playerVehicle = objectController.getPlayer().getRigidBodyControl();
PlayerVehicleUpdates pvu = new PlayerVehicleUpdates();
initializeInput(pvu);
// Flugsteuerung laden
RotationFlightAssistent rfa = new RotationFlightAssistent(playerVehicle, pvu);
AttitudeFlightAssistent afa = new AttitudeFlightAssistent(playerVehicle, pvu);
logicCallbacksCtrl.addCallee(rfa, afa);
// Camera
CameraCtrl cc = new CameraCtrl(gameApp);
inputCtrl.initCameraControlKeyListener(cc);
// debug stuff
gameApp.getGuiNode().attachChild(new DebugGuiNode(gameApp.getCamera()));
// start thread pool
threadPool = Executors.newFixedThreadPool(3);
threadPool.execute(logicCallbacksCtrl);
threadPool.execute(aiCtrl);
threadPool.execute(dispatcher);
// initialized = true
super.initialize(stateManager, app);
}
private void initializeInput(PlayerVehicleUpdates pvu) {
inputCtrl = new InputCtrl(gameApp.getInputManager(), pvu);
}
private IGameDestroyCallback createDestroyCallback() {
return new IGameDestroyCallback() {
@Override
public void destroy() {
//graceful threadpool shutdown
aiCtrl.stopWait(1000);
logicCallbacksCtrl.stopWait(1000);
dispatcher.stopWait(1000);
//hardcore threadpool shutdown
threadPool.shutdownNow();
}
};
}
}