mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-20 04:34:48 +00:00
112 lines
3.2 KiB
C#
112 lines
3.2 KiB
C#
|
|
// 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 ClientServer::create( %this )
|
|
{
|
|
echo("\n--------- Initializing Directory: scripts ---------");
|
|
exec( "./scripts/client/client.cs" );
|
|
exec( "./scripts/server/server.cs" );
|
|
|
|
$Game::MissionGroup = "MissionGroup";
|
|
|
|
initServer();
|
|
|
|
%dbList = new ArrayObject(DatablockFilesList);
|
|
|
|
// Start up in either client, or dedicated server mode
|
|
if ($Server::Dedicated)
|
|
{
|
|
initDedicated();
|
|
}
|
|
else
|
|
{
|
|
initClient();
|
|
}
|
|
}
|
|
|
|
function ClientServer::destroy( %this )
|
|
{
|
|
// Ensure that we are disconnected and/or the server is destroyed.
|
|
// This prevents crashes due to the SceneGraph being deleted before
|
|
// the objects it contains.
|
|
if ($Server::Dedicated)
|
|
destroyServer();
|
|
else
|
|
disconnect();
|
|
|
|
// Destroy the physics plugin.
|
|
//physicsDestroy();
|
|
|
|
sfxShutdown();
|
|
|
|
echo("Exporting client prefs");
|
|
%prefPath = getPrefpath();
|
|
export("$pref::*", %prefPath @ "/clientPrefs.cs", false);
|
|
|
|
echo("Exporting server prefs");
|
|
export("$Pref::Server::*", %prefPath @ "/serverPrefs.cs", false);
|
|
BanList::Export(%prefPath @ "/banlist.cs");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
function StartGame( %mission, %hostingType )
|
|
{
|
|
if( %mission $= "" )
|
|
{
|
|
%id = CL_levelList.getSelectedId();
|
|
%mission = getField(CL_levelList.getRowTextById(%id), 1);
|
|
//error("Cannot start a level with no level selected!");
|
|
}
|
|
|
|
if (%hostingType !$= "")
|
|
{
|
|
%serverType = %hostingType;
|
|
}
|
|
else
|
|
{
|
|
if ($pref::HostMultiPlayer)
|
|
%serverType = "MultiPlayer";
|
|
else
|
|
%serverType = "SinglePlayer";
|
|
}
|
|
|
|
// Show the loading screen immediately.
|
|
if ( isObject( LoadingGui ) )
|
|
{
|
|
Canvas.setContent("LoadingGui");
|
|
LoadingProgress.setValue(1);
|
|
LoadingProgressTxt.setValue("LOADING MISSION FILE");
|
|
Canvas.repaint();
|
|
}
|
|
|
|
createAndConnectToLocalServer( %serverType, %mission );
|
|
}
|
|
|
|
function JoinGame( %serverIndex )
|
|
{
|
|
// The server info index is stored in the row along with the
|
|
// rest of displayed info.
|
|
if( setServerInfo( %serverIndex ) )
|
|
{
|
|
Canvas.setContent("LoadingGui");
|
|
LoadingProgress.setValue(1);
|
|
LoadingProgressTxt.setValue("WAITING FOR SERVER");
|
|
Canvas.repaint();
|
|
|
|
%conn = new GameConnection(ServerConnection);
|
|
%conn.setConnectArgs($pref::Player::Name);
|
|
%conn.setJoinPassword($Client::Password);
|
|
%conn.connect($ServerInfo::Address);
|
|
}
|
|
} |