| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // What kind of "player" is spawned is either controlled directly by the
- // SpawnSphere or it defaults back to the values set here. This also controls
- // which SimGroups to attempt to select the spawn sphere's from by walking down
- // the list of SpawnGroups till it finds a valid spawn object.
- // These override the values set in core/scripts/server/spawn.cs
- //-----------------------------------------------------------------------------
- // Leave $Game::defaultPlayerClass and $Game::defaultPlayerDataBlock as empty strings ("")
- // to spawn a the $Game::defaultCameraClass as the control object.
- $Game::DefaultPlayerClass = "";
- $Game::DefaultPlayerDataBlock = "";
- $Game::DefaultPlayerSpawnGroups = "CameraSpawnPoints PlayerSpawnPoints PlayerDropPoints";
- //-----------------------------------------------------------------------------
- // What kind of "camera" is spawned is either controlled directly by the
- // SpawnSphere or it defaults back to the values set here. This also controls
- // which SimGroups to attempt to select the spawn sphere's from by walking down
- // the list of SpawnGroups till it finds a valid spawn object.
- // These override the values set in core/scripts/server/spawn.cs
- //-----------------------------------------------------------------------------
- $Game::DefaultCameraClass = "Camera";
- $Game::DefaultCameraDataBlock = "Observer";
- $Game::DefaultCameraSpawnGroups = "CameraSpawnPoints PlayerSpawnPoints PlayerDropPoints";
- // Global movement speed that affects all Cameras
- $Camera::MovementSpeed = 30;
- //-----------------------------------------------------------------------------
- // GameConnection manages the communication between the server's world and the
- // client's simulation. These functions are responsible for maintaining the
- // client's camera and player objects.
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // This is the main entry point for spawning a control object for the client.
- // The control object is the actual game object that the client is responsible
- // for controlling in the client and server simulations. We also spawn a
- // convenient camera object for use as an alternate control object. We do not
- // have to spawn this camera object in order to function in the simulation.
- //
- // Called for each client after it's finished downloading the mission and is
- // ready to start playing.
- //-----------------------------------------------------------------------------
- function GameConnection::onClientEnterGame(%this)
- {
- // This function currently relies on some helper functions defined in
- // core/scripts/spawn.cs. For custom spawn behaviors one can either
- // override the properties on the SpawnSphere's or directly override the
- // functions themselves.
- // Find a spawn point for the camera
- %cameraSpawnPoint = pickCameraSpawnPoint($Game::DefaultCameraSpawnGroups);
- // Spawn a camera for this client using the found %spawnPoint
- %this.spawnCamera(%cameraSpawnPoint);
- // Find a spawn point for the player
- %playerSpawnPoint = pickPlayerSpawnPoint($Game::DefaultPlayerSpawnGroups);
- // Spawn a camera for this client using the found %spawnPoint
- %this.spawnPlayer(%playerSpawnPoint);
- }
- //-----------------------------------------------------------------------------
- // Clean up the client's control objects
- //-----------------------------------------------------------------------------
- function GameConnection::onClientLeaveGame(%this)
- {
- // Cleanup the camera
- if (isObject(%this.camera))
- %this.camera.delete();
- // Cleanup the player
- if (isObject(%this.player))
- %this.player.delete();
- }
- //-----------------------------------------------------------------------------
- // Handle a player's death
- //-----------------------------------------------------------------------------
- function GameConnection::onDeath(%this, %sourceObject, %sourceClient, %damageType, %damLoc)
- {
- // Clear out the name on the corpse
- if (isObject(%this.player))
- {
- if (%this.player.isMethod("setShapeName"))
- %this.player.setShapeName("");
- }
- // Switch the client over to the death cam
- if (isObject(%this.camera) && isObject(%this.player))
- {
- %this.camera.setMode("Corpse", %this.player);
- %this.setControlObject(%this.camera);
- }
- // Unhook the player object
- %this.player = 0;
- }
- //-----------------------------------------------------------------------------
- // Server, mission, and game management
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- // The server has started up so do some game start up
- //-----------------------------------------------------------------------------
- function onServerCreated()
- {
- // Server::GameType is sent to the master server.
- // This variable should uniquely identify your game and/or mod.
- $Server::GameType = "Torque 3D";
- // Server::MissionType sent to the master server. Clients can
- // filter servers based on mission type.
- $Server::MissionType = "pureLIGHT";
- // GameStartTime is the sim time the game started. Used to calculated
- // game elapsed time.
- $Game::StartTime = 0;
- // Create the server physics world.
- physicsInitWorld( "server" );
-
- // Load up any objects or datablocks saved to the editor managed scripts
- %datablockFiles = new ArrayObject();
- %datablockFiles.add( "art/ribbons/ribbonExec.cs" );
- %datablockFiles.add( "art/particles/managedParticleData.cs" );
- %datablockFiles.add( "art/particles/managedParticleEmitterData.cs" );
- %datablockFiles.add( "art/decals/managedDecalData.cs" );
- %datablockFiles.add( "art/datablocks/managedDatablocks.cs" );
- %datablockFiles.add( "art/forest/managedItemData.cs" );
- %datablockFiles.add( "art/datablocks/datablockExec.cs" );
- loadDatablockFiles( %datablockFiles, true );
- // Run the other gameplay scripts in this folder
- exec("./scriptExec.cs");
- // Keep track of when the game started
- $Game::StartTime = $Sim::Time;
- }
- //-----------------------------------------------------------------------------
- // This function is called as part of a server shutdown
- //-----------------------------------------------------------------------------
- function onServerDestroyed()
- {
- // Destroy the server physcis world
- physicsDestroyWorld( "server" );
- }
- //-----------------------------------------------------------------------------
- // Called by loadMission() once the mission is finished loading
- //-----------------------------------------------------------------------------
- function onMissionLoaded()
- {
- // Start the server side physics simulation
- physicsStartSimulation( "server" );
- // Nothing special for now, just start up the game play
- startGame();
- }
- //-----------------------------------------------------------------------------
- // Called by endMission(), right before the mission is destroyed
- //-----------------------------------------------------------------------------
- function onMissionEnded()
- {
- // Stop the server physics simulation
- physicsStopSimulation( "server" );
-
- // Normally the game should be ended first before the next
- // mission is loaded, this is here in case loadMission has been
- // called directly. The mission will be ended if the server
- // is destroyed, so we only need to cleanup here.
- $Game::Running = false;
- }
- //-----------------------------------------------------------------------------
- // Called once the game has started
- //-----------------------------------------------------------------------------
- function startGame()
- {
- if ($Game::Running)
- {
- error("startGame(): End the game first!");
- return;
- }
- $Game::Running = true;
- }
- //-----------------------------------------------------------------------------
- // Called once the game has ended
- //-----------------------------------------------------------------------------
- function endGame()
- {
- if (!$Game::Running)
- {
- error("endGame(): No game running!");
- return;
- }
- // Inform the client the game is over
- for( %clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++ )
- {
- %cl = ClientGroup.getObject( %clientIndex );
- commandToClient(%cl, 'GameEnd');
- }
- // Delete all the temporary mission objects
- resetMission();
- $Game::Running = false;
- }
|