147 lines
3.5 KiB
C#
147 lines
3.5 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Torque Game Engine
|
|
//
|
|
// Copyright (c) 2001 GarageGames.Com
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function portInit(%port)
|
|
{
|
|
%failCount = 0;
|
|
while(%failCount < 10 && !setNetPort(%port)) {
|
|
echo("Port init failed on port " @ %port @ " trying next port.");
|
|
%port++; %failCount++;
|
|
}
|
|
}
|
|
|
|
function createServer(%serverType, %mission)
|
|
{
|
|
if (%mission $= "") {
|
|
error("createServer: mission name unspecified");
|
|
return;
|
|
}
|
|
|
|
destroyServer();
|
|
|
|
//
|
|
$missionSequence = 0;
|
|
$Server::PlayerCount = 0;
|
|
$Server::ServerType = %serverType;
|
|
|
|
// Setup for multi-player, the network must have been
|
|
// initialized before now.
|
|
if (%serverType $= "MultiPlayer") {
|
|
echo("Starting multiplayer mode");
|
|
|
|
// Make sure the network port is set to the correct pref.
|
|
portInit($Pref::Server::Port);
|
|
allowConnections(true);
|
|
|
|
if ($pref::Net::DisplayOnMaster !$= "Never" )
|
|
schedule(0,0,startHeartbeat);
|
|
}
|
|
|
|
// Load the mission
|
|
$ServerGroup = new SimGroup(ServerGroup);
|
|
onServerCreated();
|
|
loadMission(%mission, true);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function destroyServer()
|
|
{
|
|
$Server::ServerType = "";
|
|
$missionRunning = false;
|
|
allowConnections(false);
|
|
stopHeartbeat();
|
|
|
|
// Clean up the game scripts
|
|
onServerDestroyed();
|
|
|
|
// Delete all the server objects
|
|
if (isObject(MissionGroup))
|
|
MissionGroup.delete();
|
|
if (isObject(MissionCleanup))
|
|
MissionCleanup.delete();
|
|
if (isObject($ServerGroup))
|
|
$ServerGroup.delete();
|
|
if (isObject(MissionInfo))
|
|
MissionInfo.delete();
|
|
|
|
// Delete all the connections:
|
|
while (ClientGroup.getCount())
|
|
{
|
|
%client = ClientGroup.getObject(0);
|
|
%client.delete();
|
|
}
|
|
|
|
$Server::GuidList = "";
|
|
|
|
// Delete all the data blocks...
|
|
deleteDataBlocks();
|
|
|
|
// Dump anything we're not using
|
|
purgeResources();
|
|
}
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
|
|
function resetServerDefaults()
|
|
{
|
|
echo( "Resetting server defaults..." );
|
|
|
|
// Override server defaults with prefs:
|
|
exec( "~/defaults.cs" );
|
|
exec( "~/prefs.cs" );
|
|
|
|
loadMission( $Server::MissionFile );
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Guid list maintenance functions:
|
|
function addToServerGuidList( %guid )
|
|
{
|
|
%count = getFieldCount( $Server::GuidList );
|
|
for ( %i = 0; %i < %count; %i++ )
|
|
{
|
|
if ( getField( $Server::GuidList, %i ) == %guid )
|
|
return;
|
|
}
|
|
|
|
$Server::GuidList = $Server::GuidList $= "" ? %guid : $Server::GuidList TAB %guid;
|
|
}
|
|
|
|
function removeFromServerGuidList( %guid )
|
|
{
|
|
%count = getFieldCount( $Server::GuidList );
|
|
for ( %i = 0; %i < %count; %i++ )
|
|
{
|
|
if ( getField( $Server::GuidList, %i ) == %guid )
|
|
{
|
|
$Server::GuidList = removeField( $Server::GuidList, %i );
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Huh, didn't find it.
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function onServerInfoQuery()
|
|
{
|
|
// When the server is queried for information, the value
|
|
// of this function is returned as the status field of
|
|
// the query packet. This information is accessible as
|
|
// the ServerInfo::State variable.
|
|
return "Doing Ok";
|
|
}
|
|
|