| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // The general flow of a gane - server's creation, loading and hosting clients, and then destruction is as follows:
- // First, a client will always create a server in the event that they want to host a single player
- // game. Torque3D treats even single player connections as a soft multiplayer game, with some stuff
- // in the networking short-circuited to sidestep around lag and packet transmission times.
- // initServer() is called, loading the default server scripts.
- // After that, if this is a dedicated server session, initDedicated() is called, otherwise initClient is called
- // to prep a playable client session.
- // When a local game is started - a listen server - via calling StartGame() a server is created and then the client is
- // connected to it via createAndConnectToLocalServer().
- function BlankGame::create( %this )
- {
- exec("./scripts/guis/playGui.gui");
-
- datablock CameraData(Observer) {};
-
- // Create a local game server and connect to it.
- new SimGroup(ServerGroup);
- new GameConnection(ServerConnection);
- // This calls GameConnection::onConnect.
- ServerConnection.connectLocal();
- //-----------------------------------------------------------------------------
- // Add a material to give the ground some colour (even if it's just white).
- singleton Material(BlankWhite) {
- diffuseColor[0] = "White";
- };
- // Create objects!
- new SimGroup(MissionGroup)
- {
- new LevelInfo(TheLevelInfo)
- {
- canvasClearColor = "0 0 0";
- };
- new GroundPlane(TheGround)
- {
- position = "0 0 0";
- material = BlankWhite;
- };
- new Sun(TheSun)
- {
- azimuth = 230;
- elevation = 45;
- color = "1 1 1";
- ambient = "0.1 0.1 0.1";
- castShadows = true;
- };
- };
-
- new SimGroup(MissionCleanup);
- // Allow us to exit the game...
- GlobalActionMap.bind("keyboard", "escape", "quit");
- }
- function BlankGame::destroy( %this )
- {
- // Clean up ghosts.
- ServerConnection.delete();
- // Delete the objects we created.
- MissionGroup.delete();
- MissionCleanup.delete();
- // Delete server-side objects and datablocks.
- ServerGroup.delete();
- deleteDataBlocks();
- }
- //-----------------------------------------------------------------------------
- // Called when all datablocks have been transmitted.
- function GameConnection::onEnterGame(%client) {
- // Create a camera for the client.
- new Camera(TheCamera) {
- datablock = Observer;
- };
- TheCamera.setTransform("0 0 2 1 0 0 0");
-
- // Cameras are not ghosted (sent across the network) by default; we need to
- // do it manually for the client that owns the camera or things will go south
- // quickly.
- TheCamera.scopeToClient(%client);
-
- // And let the client control the camera.
- %client.setControlObject(TheCamera);
-
- // Add the camera to the group of game objects so that it's cleaned up when
- // we close the game.
- MissionGroup.add(TheCamera);
-
- LocalClientConnection.camera = TheCamera;
-
- // Activate HUD which allows us to see the game. This should technically be
- // a commandToClient, but since the client and server are on the same
- // machine...
- Canvas.setContent(PlayGui);
- activateDirectInput();
- }
- // Called when we connect to the local game.
- function GameConnection::onConnect(%this) {
- %this.transmitDataBlocks(0);
- }
- // Called when all datablocks from above have been transmitted.
- function GameConnection::onDataBlocksDone(%this) {
- closeSplashWindow();
- Canvas.showWindow();
- // Start sending ghosts to the client.
- %this.activateGhosting();
- %this.onEnterGame();
- }
- //stubs to keep the console clean. These aren't needed for such a lightweight implementation.
- function serverCmdsetClientAspectRatio(){}
- function onDataBlockObjectReceived(){}
- function onGhostAlwaysObjectReceived(){}
- function onGhostAlwaysStarted(){}
- function onGhostAlwaysObjectReceived(){}
|