T2-BoL/scripts/server.cs

3444 lines
106 KiB
C#
Raw Normal View History

2012-07-27 21:22:05 +00:00
if($Host::TimeLimit $= "")
$Host::TimeLimit = 20;
$SB::WODec = 0.004; // whiteout
$SB::DFDec = 0.02; // damageFlash
$Classic::gravSetting = -26.9; // z0dd - ZOD, 9/13/02. Classic Gravity setting
$Classic::cameraSpeed = 50;
$Camera::movementSpeed = $Classic::cameraSpeed; // z0dd - ZOD, 9/13/02. Classic camera speed.
// -----------------------------------------------------
// z0dd - ZOD, 6/22/02. Addition.
// Alert players on server that a remote connection has
// been established to the server.
$TelnetSpam = 0;
function onTelnetConnect(%ip, %access)
{
%level = %access == 1 ? "full" : "read";
%snd = '~wfx/misc/diagnostic_on.wav';
%msg = '\c1Remote telnet connection established.%1';
if($Host::TournamentMode && $TelnetSpam == 0)
{
messageAll('MsgTelnetConnect', %msg, %snd);
logEcho("Incomming telnet connection from: " @ %ip @ " with " @ %level @ " access privledges");
$TelnetSpam = 1;
schedule(2000, 0, "clearTelnetSpam");
}
}
function serverThink()
{
if ($CurrentMissionType $= "RPG")
{
%count = ClientGroup.getCount();
for (%i = 0; %i < %count; %i++)
{
%cl = ClientGroup.getObject(%i);
commandToClient(%cl,'HandleScriptedCommand',9,formatTimeString("HHnn") SPC "Hrs.");
}
}
schedule(100,0,"ServerThink");
}
function clearTelnetSpam()
{
$TelnetSpam = 0;
}
// -----------------------------------------------------
// -----------------------------------------------------
// Reload by JackTL -- I think
function reload(%script)
{
compile(%script); // Added by JackTL - Duh!!
exec(%script);
%count = ClientGroup.getCount();
for(%i = 0; %i < %count; %i++)
{
%cl = ClientGroup.getObject(%i);
if(!%cl.isAIControlled()) // no sending bots datablocks.. LOL
%cl.transmitDataBlocks(0); // all clients on server
}
}
// -----------------------------------------------------
function VerifyCDCheck(%func)
{
if (!cdFileCheck())
messageBoxOkCancel("TRIBES 2 CD CHECK", "You must have the Tribes 2 CD in the CD-ROM drive while playing Tribes 2. Please insert the CD.", "schedule(0, 0, VerifyCDCheck, " @ %func @ ");", "quit();");
else
call(%func);
}
function logEcho(%msg)
{
// z0dd - ZOD, 4/10/02. Changed from $ClassicLogEchoEnabled, allow server owners to modify
if($Host::ClassicLogEchoEnabled)
echo("LOG: " @ %msg);
}
//--------------------------------------------------------------------------
// z0dd - ZOD, 3/27/02. Auto restart server after specified time
function AutoRestart()
{
if(!$Host::TournamentMode)
{
$AutoRestart = 1;
centerPrintAll("<color:ff0000><font:Arial:12>SERVER WILL BE AUTO REBOOTING NEXT MISSION.", 5, 1);
messageAll( 'MsgServerRestart', '\c2SERVER WILL BE AUTO REBOOTING NEXT MISSION.~wfx/misc/red_alert.wav');
logEcho("Automatic server restart on mission end begining.");
}
else
schedule(300000, 0, "AutoRestart"); // Check back in 5 minutes
}
//--------------------------------------------------------------------------
function CreateServer(%mission, %missionType)
{
DestroyServer();
// z0dd - ZOD, 3/27/02. Automatically reboot the server after a specified time.
$AutoRestart = 0; // Paranoia
if($Host::ClassicAutoRestartServer == 1)
schedule($Host::ClassicRestartTime * 3600000, 0, "AutoRestart");
if($Host::ClassicTelnet)
telnetsetparameters($Host::ClassicTelnetPort, $Host::ClassicTelnetPassword, $Host::ClassicTelnetListenPass);
// Load server data blocks
exec("scripts/commanderMapIcons.cs");
exec("scripts/markers.cs");
exec("scripts/serverAudio.cs");
exec("scripts/damageTypes.cs");
exec("scripts/deathMessages.cs");
exec("scripts/inventory.cs");
exec("scripts/camera.cs");
exec("scripts/particleEmitter.cs"); // Must exist before item.cs and explosion.cs
exec("scripts/particleDummies.cs");
exec("scripts/projectiles.cs"); // Must exits before item.cs
exec("scripts/modScripts/server/initialize.cs");
exec("scripts/player.cs");
exec("scripts/gameBase.cs");
exec("scripts/staticShape.cs");
exec("scripts/weapons.cs");
exec("scripts/turret.cs");
exec("scripts/weapTurretCode.cs");
exec("scripts/pack.cs");
exec("scripts/vehicles/vehicle_spec_fx.cs"); // Must exist before other vehicle files or CRASH BOOM
exec("scripts/vehicles/serverVehicleHud.cs");
exec("scripts/vehicles/vehicle_shrike.cs");
exec("scripts/vehicles/vehicle_bomber.cs");
exec("scripts/vehicles/vehicle_havoc.cs");
exec("scripts/vehicles/vehicle_wildcat.cs");
exec("scripts/vehicles/vehicle_tank.cs");
exec("scripts/vehicles/vehicle_mpb.cs");
exec("scripts/vehicles/vehicle.cs"); // Must be added after all other vehicle files or EVIL BAD THINGS
exec("scripts/ai.cs");
exec("scripts/item.cs");
exec("scripts/station.cs");
exec("scripts/simGroup.cs");
exec("scripts/trigger.cs");
exec("scripts/forceField.cs");
exec("scripts/lightning.cs");
exec("scripts/weather.cs");
exec("scripts/deployables.cs");
exec("scripts/stationSetInv.cs");
exec("scripts/navGraph.cs");
exec("scripts/targetManager.cs");
exec("scripts/serverCommanderMap.cs");
exec("scripts/environmentals.cs");
exec("scripts/power.cs");
exec("scripts/supportClassic.cs"); // z0dd - ZOD, 5/13/02. Execute the support functions.
exec("scripts/practice.cs"); // z0dd - ZOD, 3/13/02. Execute practice mode server functions.
exec("scripts/serverTasks.cs");
exec("scripts/admin.cs");
exec("prefs/banlist.cs");
exec("scripts/shared.cs");
//T2Bol executes
exec("scripts/propData.cs");
exec("scripts/looting.cs");
exec("scripts/mining.cs");
exec("scripts/propertyOwning.cs");
exec("scripts/Importer/Building.cs");
//Execute saved data, if possible
if (IsFile("Data/SavedData.cs"))
exec("Data/SavedData.cs");
// ---------------------------------------------------
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
%search = "scripts/*Game.cs";
for(%file = findFirstFile(%search); %file !$= ""; %file = findNextFile(%search))
{
%type = fileBase(%file); // get the name of the script
exec("scripts/" @ %type @ ".cs");
}
// ---------------------------------------------------
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
$missionSequence = 0;
$CurrentMissionType = %missionType;
$HostGameBotCount = 0;
$HostGamePlayerCount = 0;
if ( $HostGameType !$= "SinglePlayer" )
allowConnections(true);
$ServerGroup = new SimGroup (ServerGroup);
if(%mission $= "")
{
%mission = $HostMissionFile[$HostMission[0,0]];
%missionType = $HostTypeName[0];
}
if ( ( $HostGameType $= "Online" && $pref::Net::DisplayOnMaster !$= "Never" ) ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
schedule(0,0,startHeartbeat);
// setup the bots for this server
if( $Host::BotsEnabled ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
initGameBots( %mission, %missionType );
// z0dd - ZOD, 9/13/02. For TR2 compatability
// This is a failsafe way of ensuring that default gravity is always restored
// if a game type (such as TR2) changes it. It is placed here so that listen
// servers will work after opening and closing different gametypes.
$DefaultGravity = getGravity();
// load the mission...
loadMission(%mission, %missionType, true);
}
function SimObject::setRotation(%obj, %rot)
{
setRotation(%obj, %rot);
}
function setRotation(%obj, %rot)
{
%pos = getWords(%obj.getTransform(), 0, 2);
%trans = %pos@" "@%rot;
%obj.setTransform(%trans);
}
function dropAI(%client)
{
//if (!%client.isAIControlled())
//return false;
//clear any flags
AIUnassignClient(%client);
%client.stop();
%client.clearStep();
%client.lastDamageClient = -1;
%client.lastDamageTurret = -1;
%client.shouldEngage = -1;
%client.setEngageTarget(-1);
%client.setTargetObject(-1);
%client.clearTasks();
%client.clearStep();
%client.pilotVehicle = false;
cancel(%client.objectiveThread);
return true;
}
function serverCmdDoRefill(%client) //Shitty hack I used to make the RPG gamemode force clients to pay for refills
{
if (!%client.isatInv)
return;
%obj = %client.player.obj;
%data = %client.player.data;
%colObj = %client.player;
if ($CurrentMissionType $= "RPG")
{
%client.money = %client.money - 100;
messageClient(%client,'MsgSPCurrentObjective2',"\c3$100 has been subtracted from your account.",'Money: $%1.',%client.money);
}
// z0dd - ZOD, 7/13/02 Part of hack to keep people from mounting
// vehicles in disallowed armors.
if(%obj.station.getDataBlock().getName() !$= "StationVehicle")
%colObj.client.inInv = true;
%colObj.inStation = true;
commandToClient(%colObj.client,'setStationKeys', true);
if(Game.stationOnEnterTrigger(%data, %obj, %colObj)) {
//verify station.team is team associated and isn't on player's team
if((%obj.mainObj.team != %colObj.client.team) && (%obj.mainObj.team != 0))
{
//%obj.station.playAudio(2, StationAccessDeniedSound);
messageClient(%colObj.client, 'msgStationDenied', '\c2Access Denied -- Wrong team.~wfx/powered/station_denied.wav');
}
else if(%obj.disableObj.isDisabled())
{
messageClient(%colObj.client, 'msgStationDisabled', '\c2Station is disabled.');
}
else if(!%obj.mainObj.isPowered())
{
messageClient(%colObj.client, 'msgStationNoPower', '\c2Station is not powered.');
}
else if(%obj.station.notDeployed)
{
messageClient(%colObj.client, 'msgStationNotDeployed', '\c2Station is not deployed.');
}
else if(%obj.station.triggeredBy $= "")
{
if(%obj.station.getDataBlock().setPlayersPosition(%obj.station, %obj, %colObj))
{
messageClient(%colObj.client, 'CloseHud', "", 'inventoryScreen');
commandToClient(%colObj.client, 'TogglePlayHuds', true);
%obj.station.triggeredBy = %colObj;
%obj.station.getDataBlock().stationTriggered(%obj.station, 1);
%colObj.station = %obj.station;
%colObj.lastWeapon = ( %colObj.getMountedImage($WeaponSlot) == 0 ) ? "" : %colObj.getMountedImage($WeaponSlot).getName().item;
%colObj.unmountImage($WeaponSlot);
}
}
}
if (%colObj.client.race $= "Draakan")
%colObj.schedule(100,"setInventory","Flamer",1,true); //Make sure our player gets to keep the flame Breath
}
function saveGame()
{
if (!IsObject(ClientGroup))
return;
%count = ClientGroup.getCount();
if ($CurrentMissionType $= "RPG") //If it's not an RPG gamemode, don't do anything except save the variables that are already initialized..
{
for (%i = 0; %i < %count; %i++)
{
%cl = ClientGroup.getObject(%i);
if (!%cl.isAIControlled() && isObject(%cl.player))
{
%trans = %cl.player.getTransform();
%health = %cl.player.getDamageLevel();
%whiteout = %cl.player.getWhiteout();
%damageFlash = %cl.player.getDamageFlash();
%velocity = %cl.player.getVelocity();
%energy = %cl.player.getEnergyLevel();
$Data::Transform[%cl.GUID,$CurrentMission] = %trans;
$Data::Health[%cl.GUID,$CurrentMission] = %health;
$Data::Whiteout[%cl.GUID,$CurrentMission] = %whiteout;
$Data::DamageFlash[%cl.GUID,$CurrentMission] = %damageFlash;
$Data::Velocity[%cl.GUID,$CurrentMission] = %velocity;
$Data::ShouldApply[%cl.GUID,$CurrentMission] = true;
$Data::Energy[%cl.GUID,$CurrentMission] = %energy;
$Data::Money[%cl.GUID,$CurrentMission] = %cl.money;
//A little more complicated, what weapons does our client have?
%armor = %cl.armor;
$Data::Armor[%cl.guid, $CurrentMission] = %armor;
for (%i = 0; %i < 5; %i++)
{
%weap = %cl.player.weaponSlot[%i];
if (%weap !$= "Flamer") //Skip the Flamer, if we try to save it, the player isn't given one on spawn
{
$Data::Weapon[%cl.guid, %i, $CurrentMission] = %weap;
$Data::Ammo[%cl.guid, %i, $CurrentMission] = %cl.player.inv[%cl.player.weaponSlot[%i] @ "ammo"];
}
}
//See WTF else the client may have
%pack = %cl.player.getMountedImage(2).item;
$Data::Pack[%cl.GUID,$CurrentMission] = %pack;
$Data::RepairKits[%cl.GUID,$CurrentMission] = %cl.player.invRepairKit;
//Does the client have a vehicle?
if (IsObject(%cl.vehicleMounted))
{
%veh = %cl.vehicleMounted;
%type = %veh.getClassName();
%transform = %veh.getTransform();
%velocity = %veh.getVelocity();
%damage = %veh.getDamageLevel();
%energy = %veh.getEnergyLevel();
%db = %veh.getDatablock().getName();
$Data::VehicleType[%cl.GUID, $CurrentMission] = %type;
$Data::VehicleTransform[%cl.GUID, $CurrentMission] = %transform;
$Data::VehicleDamage[%cl.GUID, $CurrentMission] = %damage;
$Data::VehicleEnergy[%cl.GUID, $CurrentMission] = %energy;
$Data::VehicleDB[%cl.GUID, $CurrentMission] = %db;
$Data::VehicleVelocity[%cl.GUID, $CurrentMission] = %velocity;
$Data::WasInVehicle[%cl.GUID, $CurrentMission] = true;
}
else
$Data::WasInVehicle[%cl.GUID, $CurrentMission] = false;
//Minerals..
$Data::Steel[%cl.GUID,$CurrentMission] = %cl.units["Steel"];
}
}
}
logEcho("Saved all clients in server.");
export( "$Data::*", "Data/SavedData.cs", false );
}
function applyPlayerSave(%client) //This script is much worse than an eyesore..
{
if ($Data::ShouldApply[%client.GUID, $CurrentMission])
{
%client.sex = $Data::Sex[%client.guid];
%client.race = $Data::Race[%client.guid];
%client.units["Steel"] = $Data::Steel[%client.GUID, $CurrentMission];
%client.money = $Data::Money[%client.GUID, $CurrentMission];
//Clear the defaultGame inventory
%client.player.clearInventory();
for(%i =0; %i<$InventoryHudCount; %i++)
%client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
%client.clearBackpackIcon();
//Armor is set first before anything
%client.player.setArmor($Data::Armor[%client.guid, $CurrentMission]);
//armor and weapons
for (%i = 0; %i < 5; %i++)
{
%client.player.setInventory($Data::Weapon[%client.guid, %i, $CurrentMission],1);
%client.player.setInventory($Data::Weapon[%client.guid, %i, $CurrentMission] @ "ammo",$Data::Ammo[%client.GUID, %i, $CurrentMission]);
%client.player.use(%client.player.weaponSlot0);
}
if (%client.race $= "Draakan")
%client.player.setInventory(Flamer, 1, 1); //Apply player save fucks this up
//Pack and rep kits..
%client.player.setInventory("RepairKit",$Data::RepairKits[%client.guid, $CurrentMission]);
%client.player.setInventory($Data::Pack[%client.guid, $CurrentMission],1);
//Now apply other stuff
%client.player.setDamageLevel($Data::Health[%client.GUID, $CurrentMission]);
%client.player.setEnergyLevel($Data::Energy[%client.GUID, $CurrentMission]);
%client.player.setWhiteout($Data::Whiteout[%client.GUID, $CurrentMission]);
%client.player.setDamageFlash($Data::DamageFlash[%client.GUID, $CurrentMission]);
%client.player.setTransform($Data::Transform[%client.GUID, $CurrentMission]);
%client.player.setVelocity($Data::Velocity[%client.GUID, $CurrentMission]);
//Since the player is setup, was the player in a vehicle when saved?
if ($Data::wasInVehicle[%client.GUID, $CurrentMission]) //Yes, we need to setup the vehicle then mount the player to it
{
%veh = new ($Data::VehicleType[%client.GUID, $CurrentMission])()
{
Datablock = $Data::VehicleDB[%client.GUID, $CurrentMission];
Team = %client.team;
};
%veh.mountObject(%client.player,0);
%veh.setTransform($Data::VehicleTransform[%client.GUID, $CurrentMission]);
%veh.setEnergyLevel($Data::VehicleEnergy[%client.GUID, $CurrentMission]);
%veh.setDamageLevel($Data::VehicleDamage[%client.GUID, $CurrentMission]);
%veh.setVelocity($Data::VehicleVelocity[%client.GUID, $CurrentMission]);
}
}
else
%client.player.setTransform(Game.pickPlayerSpawn(%client,false));
//Clan Data - Fixed to prevent the tag being appended multiple times
if (%client.oldName $= "")
%client.oldName = %client.namebase;
if ($Data::IsInClan[%client.GUID])
{
%client.namebase = %client.oldName;
%client.name = addTaggedString(%client.oldName);
setName(%client,"\cp\c7" @ $Data::ClanTag[$Data::ClanID[%client.GUID]] @ "\c6" @ %client.namebase @ "\co");
}
}
function delete(%obj)
{
%obj.delete();
}
function clientDisconnect(%client,%reason)
{
messageClient(%client, 'onClientKicked', "");
messageAllExcept( %client, -1, 'MsgClientDrop', "", Game.kickClientName, %client );
if( isObject( %client.player ) )
%client.player.scriptKill(0);
%client.setDisconnectReason( %reason );
%client.schedule(700, "delete");
return %client SPC %reason;
}
function HideClient(%client)
{
messageAll('MsgClientDrop', "", Game.kickClientName, %client );
return %client;
}
function ShowClient(%client)
{
messageAll('MsgClientJoin', "", %client.name, %client, %client.target, %client.isAIControlled(), %client.isAdmin, %client.isSuperAdmin, %client.isSmurf, %client.Guid);
return %client;
}
function forceClientSpawn(%client,%setupBool)
{
%client.race = $Data::Race[%client.GUID];
%client.sex = $Data::Sex[%client.GUID];
%client.team = getRaceTeam(%client.race);
Game.spawnPlayer( %client, false );
%client.setControlObject(%client.player);
CloseScoreScreen(%client);
commandToClient(%client,'HandleScriptedCommand',7);
commandToClient(%client,'HandleScriptedCommand',3,3000);
commandToClient(%client,'bottomPrint',"Try not to die.",3);
if (%setupBool)
applyPlayerSave(%client);
setClientTeam(%client,0); //Has to be after everything else, or the player spawns in the middle of fucking nowhere..
}
function setClientTeam(%client,%team)
{
if (%client.oldTeam $= "")
%client.oldTeam = %client.team;
%client.team = %team;
%client.setSensorGroup(%team);
setTargetSensorGroup(%client.target,%team);
}
function forceScoreScreenOpen(%client,%page)
{
messageClient(%client, 'OpenHud', "", 'scoreScreen' SPC "scoreScreen");
RPGGame::processGameLink(Game, %client, %page);
}
function closeScoreScreen(%client)
{
%client.PDAPage = "MAIN";
serverCmdProcessGameLink(%client,"BACK");
serverCmdHideHud(%client, 'scoreScreen');
commandToClient(%client, 'setHudMode', 'Standard', "", 0);
}
function setVoice(%client, %voice, %voicepitch)
{
freeClientTarget(%client);
%client.voice = %voice;
%client.voicetag = addtaggedstring(%voice);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', %client.team, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
return %client SPC %voice;
}
function setSkin(%client, %skin)
{
freeClientTarget(%client);
%client.skin = addtaggedstring(%skin);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', %client.team, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
return %client SPC %voice;
}
function setName(%client, %name)
{
freeClientTarget(%client);
%client.namebase = %name;
%client.name = addtaggedstring(%name);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', %client.team, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
//Update the client in the lobby.
HideClient(%client);
ShowClient(%client);
return %client SPC %voice;
}
function setTeam(%client, %team)
{
freeClientTarget(%client);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', %team, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
//Update the client in the lobby.
HideClient(%client);
ShowClient(%client);
return %client SPC %voice;
}
function initGameBots( %mission, %mType )
{
echo( "adding bots..." );
AISystemEnabled( false );
if ( $Host::BotCount > 0 && %mType !$= "SinglePlayer" )
{
// Make sure this mission is bot enabled:
for ( %idx = 0; %idx < $HostMissionCount; %idx++ )
{
if ( $HostMissionFile[%idx] $= %mission )
break;
}
if ( $BotEnabled[%idx] )
{
if ( $Host::BotCount > 16 )
$HostGameBotCount = 16;
else
$HostGameBotCount = $Host::BotCount;
if ( $Host::BotCount > $Host::MaxPlayers - 1 )
$HostGameBotCount = $Host::MaxPlayers - 1;
//set the objective reassessment timeslice var
$AITimeSliceReassess = 0;
aiConnectMultiple( $HostGameBotCount, $Host::MinBotDifficulty, $Host::MaxBotDifficulty, -1 );
}
else
{
$HostGameBotCount = 0;
}
}
}
function findNextCycleMission()
{
%numPlayers = ClientGroup.getCount();
%tempMission = $CurrentMission;
%failsafe = 0;
while (1)
{
%nextMissionIndex = getNextMission(%tempMission, $CurrentMissionType);
%nextPotentialMission = $HostMissionFile[%nextMissionIndex];
//just cycle to the next if we've gone all the way around...
if (%nextPotentialMission $= $CurrentMission || %failsafe >= 1000)
{
%nextMissionIndex = getNextMission($CurrentMission, $CurrentMissionType);
//return $HostMissionName[%nextMissionIndex]; // z0dd - ZOD - Founder, 10/06/02. Was trying to load a mission name instead of file.
return $HostMissionFile[%nextMissionIndex];
}
//get the player count limits for this mission
%limits = $Host::MapPlayerLimits[%nextPotentialMission, $CurrentMissionType];
if (%limits $= "")
return %nextPotentialMission;
else
{
%minPlayers = getWord(%limits, 0);
%maxPlayers = getWord(%limits, 1);
if ((%minPlayers < 0 || %numPlayers >= %minPlayers) && (%maxPlayers < 0 || %numPlayers <= %maxPlayers))
return %nextPotentialMission;
}
//since we didn't return the mission, we must not have an acceptable number of players - check the next
%tempMission = %nextPotentialMission;
%failsafe++;
}
}
function CycleMissions()
{
echo( "cycling mission. " @ ClientGroup.getCount() @ " clients in game." );
%nextMission = findNextCycleMission();
messageAll( 'MsgClient', 'Loading %1 (%2)...', %nextMission, $MissionTypeDisplayName );
loadMission( %nextMission, $CurrentMissionType );
}
function DestroyServer()
{
$missionRunning = false;
allowConnections(false);
stopHeartbeat();
if ( isObject( MissionGroup ) )
MissionGroup.delete();
if ( isObject( MissionCleanup ) )
MissionCleanup.delete();
if(isObject(game))
{
game.deactivatePackages();
game.delete();
}
if(isObject($ServerGroup))
$ServerGroup.delete();
// delete all the connections:
while(ClientGroup.getCount())
{
%client = ClientGroup.getObject(0);
if (%client.isAIControlled())
%client.drop();
else
%client.delete();
}
// delete all the data blocks...
// this will cause problems if there are any connections
deleteDataBlocks();
// reset the target manager
resetTargetManager();
echo( "exporting server prefs..." );
export( "$Host::*", "prefs/ServerPrefs.cs", false );
purgeResources();
// z0dd - ZOD, 9/13/02. For TR2 compatability.
// This is a failsafe way of ensuring that default gravity is always restored
// if a game type (such as TR2) changes it. It is placed here so that listen
// servers will work after opening and closing different gametypes.
if ($DefaultGravity !$= "")
setGravity($DefaultGravity);
}
function Disconnect()
{
if ( isObject( ServerConnection ) )
ServerConnection.delete();
DisconnectedCleanup();
DestroyServer();
}
function DisconnectedCleanup()
{
$CurrentMissionType = "";
$CurrentMission = "";
// Make sure we're not still waiting for the loading info:
cancelLoadInfoCheck();
// clear the chat hud message vector
HudMessageVector.clear();
if ( isObject( PlayerListGroup ) )
PlayerListGroup.delete();
// terminate all playing sounds
alxStopAll();
// clean up voting
voteHud.voting = false;
mainVoteHud.setvisible(0);
// clear all print messages
clientCmdclearBottomPrint();
clientCmdClearCenterPrint();
// clear the inventory and weapons hud
weaponsHud.clearAll();
inventoryHud.clearAll();
// back to the launch screen
Canvas.setContent(LaunchGui);
if ( isObject( MusicPlayer ) )
MusicPlayer.stop();
clearTextureHolds();
purgeResources();
if ( $PlayingOnline )
{
// Restart the email check:
if ( !EmailGui.checkingEmail && EmailGui.checkSchedule $= "" )
CheckEmail( true );
IRCClient::onLeaveGame();
}
}
// we pass the guid as well, in case this guy leaves the server.
function kick( %client, %admin, %guid )
{
if(%admin)
messageAll( 'MsgAdminForce', '\c2The Admin has kicked %1.', Game.kickClientName );
else
messageAll( 'MsgVotePassed', '\c2%1 was kicked by vote.', Game.kickClientName );
messageClient(%client, 'onClientKicked', "");
messageAllExcept( %client, -1, 'MsgClientDrop', "", Game.kickClientName, %client );
if( %client.isAIControlled() )
{
$HostGameBotCount--;
%client.drop();
}
else
{
if( $playingOnline ) // won games
{
%count = ClientGroup.getCount();
%found = false;
for( %i = 0; %i < %count; %i++ ) // see if this guy is still here...
{
%cl = ClientGroup.getObject( %i );
if( %cl.guid == %guid )
{
%found = true;
// kill and delete this client, their done in this server.
if( isObject( %cl.player ) )
%cl.player.scriptKill(0);
if ( isObject( %cl ) )
{
%cl.setDisconnectReason( "You have been kicked out of the game." );
%cl.schedule(700, "delete");
}
BanList::add( %guid, "0", $Host::KickBanTime );
}
}
if( !%found )
BanList::add( %guid, "0", $Host::KickBanTime ); // keep this guy out for a while since he left.
}
else // lan games
{
// kill and delete this client
if( isObject( %client.player ) )
%client.player.scriptKill(0);
if ( isObject( %client ) )
{
%client.setDisconnectReason( "You have been kicked out of the game." );
%client.schedule(700, "delete");
}
BanList::add( 0, %client.getAddress(), $Host::KickBanTime );
}
}
}
function ban( %client, %admin )
{
if ( %admin )
messageAll('MsgAdminForce', '\c2%1 has banned %2.', %admin.name, %client.name); // z0dd - ZOD, 10/03/2. Tell who banned
else
messageAll( 'MsgVotePassed', '\c2%1 was banned by vote.', %client.name );
messageClient(%client, 'onClientBanned', "");
messageAllExcept( %client, -1, 'MsgClientDrop', "", %client.name, %client );
// kill and delete this client
if( isObject(%client.player) )
%client.player.scriptKill(0);
if ( isObject( %client ) )
{
%client.setDisconnectReason( %admin.nameBase @ " has banned you from this server." ); // z0dd - ZOD, 10/03/2. Tell who banned
%client.schedule(700, "delete");
}
BanList::add(%client.guid, %client.getAddress(), $Host::BanTime);
}
function getValidVoicePitch(%voice, %voicePitch)
{
if (%voicePitch < -1.0)
%voicePitch = -1.0;
else if (%voicePitch > 1.0)
%voicePitch = 1.0;
//Voice pitch range is from 0.5 to 2.0, however, we should tighten the range to
//avoid players sounding like mickey mouse, etc...
//see if we're pitching down - clamp the min pitch at 0.875
if (%voicePitch < 0)
return (1.0 + (0.125 * %voicePitch));
//max voice pitch is 1.125
else if (%voicePitch > 0)
return 1.0 + (0.125 * %voicePitch);
else
return 1.0;
}
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch )
{
%client.setMissionCRC($missionCRC);
sendLoadInfoToClient( %client );
//%client.setSimulatedNetParams(0.1, 30);
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// ---------------------------------------------------
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// if hosting this server, set this client to superAdmin
if(%client.getAddress() $= "Local")
{
%client.isAdmin = true;
%client.isSuperAdmin = true;
}
// Get the client's unique id:
%authInfo = %client.getAuthInfo();
%client.guid = getField( %authInfo, 3 );
// check admin and super admin list, and set status accordingly
if ( !%client.isSuperAdmin )
{
if ( isOnSuperAdminList( %client ) )
{
%client.isAdmin = true;
%client.isSuperAdmin = true;
}
else if( isOnAdminList( %client ) )
{
%client.isAdmin = true;
}
}
// Sex/Race defaults
switch$ ( %raceGender )
{
case "Human Male":
%client.sex = "Male";
%client.race = "Human";
case "Human Female":
%client.sex = "Female";
%client.race = "Human";
case "Bioderm":
%client.sex = "Male";
%client.race = "Bioderm";
case "Draakan A":
%client.sex = "A";
%client.race = "Draakan";
case "Draakan B":
%client.sex = "B";
%client.race = "Draakan";
case "Draakan C":
%client.sex = "C";
%client.race = "Draakan";
case "Criollos":
%client.sex = "Male";
%client.race = "Criollos";
default:
error("Invalid race/gender combo passed: " @ %raceGender);
%client.sex = "Male";
%client.race = "Human";
}
%client.armor = "Light";
// Override the connect name if this server does not allow smurfs:
%realName = getField( %authInfo, 0 );
if ( $PlayingOnline && $Host::NoSmurfs )
%name = %realName;
if ( strcmp( %name, %realName ) == 0 )
{
%client.isSmurf = false;
//make sure the name is unique - that a smurf isn't using this name...
%dup = -1;
%count = ClientGroup.getCount();
for (%i = 0; %i < %count; %i++)
{
%test = ClientGroup.getObject( %i );
if (%test != %client)
{
%rawName = stripChars( detag( getTaggedString( %test.name ) ), "\cp\co\c6\c7\c8\c9" );
if (%realName $= %rawName)
{
%dup = %test;
%dupName = %rawName;
break;
}
}
}
//see if we found a duplicate name
if (isObject(%dup))
{
//change the name of the dup
%isUnique = false;
%suffixCount = 1;
while (!%isUnique)
{
%found = false;
%testName = %dupName @ "." @ %suffixCount;
for (%i = 0; %i < %count; %i++)
{
%cl = ClientGroup.getObject(%i);
%rawName = stripChars( detag( getTaggedString( %cl.name ) ), "\cp\co\c6\c7\c8\c9" );
if (%rawName $= %testName)
{
%found = true;
break;
}
}
if (%found)
%suffixCount++;
else
%isUnique = true;
}
//%testName will now have the new unique name...
%oldName = %dupName;
%newName = %testName;
MessageAll( 'MsgSmurfDupName', '\c2The real \"%1\" has joined the server.', %dupName );
MessageAll( 'MsgClientNameChanged', '\c2The smurf \"%1\" is now called \"%2\".', %oldName, %newName, %dup );
%dup.name = addTaggedString(%newName);
setTargetName(%dup.target, %dup.name);
}
// Add the tribal tag:
%tag = getField( %authInfo, 1 );
%append = getField( %authInfo, 2 );
if ( %append )
%name = "\cp\c6" @ %name @ "\c7" @ %tag @ "\co";
else
%name = "\cp\c7" @ %tag @ "\c6" @ %name @ "\co";
%client.sendGuid = %client.guid;
}
else
{
%client.isSmurf = true;
%client.sendGuid = 0;
%name = stripTrailingSpaces( strToPlayerName( %name ) );
if ( strlen( %name ) < 3 )
%name = "Poser";
// Make sure the alias is unique:
%isUnique = true;
%count = ClientGroup.getCount();
for ( %i = 0; %i < %count; %i++ )
{
%test = ClientGroup.getObject( %i );
%rawName = stripChars( detag( getTaggedString( %test.name ) ), "\cp\co\c6\c7\c8\c9" );
if ( strcmp( %name, %rawName ) == 0 )
{
%isUnique = false;
break;
}
}
// Append a number to make the alias unique:
if ( !%isUnique )
{
%suffix = 1;
while ( !%isUnique )
{
%nameTry = %name @ "." @ %suffix;
%isUnique = true;
%count = ClientGroup.getCount();
for ( %i = 0; %i < %count; %i++ )
{
%test = ClientGroup.getObject( %i );
%rawName = stripChars( detag( getTaggedString( %test.name ) ), "\cp\co\c6\c7\c8\c9" );
if ( strcmp( %nameTry, %rawName ) == 0 )
{
%isUnique = false;
break;
}
}
%suffix++;
}
// Success!
%name = %nameTry;
}
%smurfName = %name;
// Tag the name with the "smurf" color:
%name = "\cp\c8" @ %name @ "\co";
}
%client.name = addTaggedString(%name);
if(%client.isSmurf)
%client.nameBase = %smurfName;
else
%client.nameBase = %realName;
// Make sure that the connecting client is not trying to use a bot skin:
%temp = detag( %skin );
if ( %temp $= "basebot" || %temp $= "basebbot" )
%client.skin = addTaggedString( "base" );
else
%client.skin = addTaggedString( %skin );
%client.voice = %voice;
%client.voiceTag = addtaggedString(%voice);
//set the voice pitch based on a lookup table from their chosen voice
%client.voicePitch = getValidVoicePitch(%voice, %voicePitch);
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// ---------------------------------------------------
%client.justConnected = true;
%client.isReady = false;
// full reset of client target manager
clientResetTargets(%client, false);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', 0, 0, %client.voicePitch);
%client.score = 0;
%client.team = 0;
$instantGroup = ServerGroup;
$instantGroup = MissionCleanup;
echo("CADD: " @ %client @ " " @ %client.getAddress());
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%recipient = ClientGroup.getObject(%cl);
if((%recipient != %client))
{
// These should be "silent" versions of these messages...
messageClient(%client, 'MsgClientJoin', "",
%recipient.name,
%recipient,
%recipient.target,
%recipient.isAIControlled(),
%recipient.isAdmin,
%recipient.isSuperAdmin,
%recipient.isSmurf,
%recipient.sendGuid);
messageClient(%client, 'MsgClientJoinTeam', "", %recipient.name, $teamName[%recipient.team], %recipient, %recipient.team );
}
}
// commandToClient(%client, 'getManagerID', %client);
commandToClient(%client, 'setBeaconNames', "Target Beacon", "Marker Beacon", "Bomb Target");
if ( $CurrentMissionType !$= "SinglePlayer" )
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
messageClient(%client, 'MsgClientJoin', '\c2Welcome to Tribes 2: Birth of Legend %1.',
%client.name,
%client,
%client.target,
false, // isBot
%client.isAdmin,
%client.isSuperAdmin,
%client.isSmurf,
%client.sendGuid );
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
messageAllExcept(%client, -1, 'MsgClientJoin', '\c1%1 joined the game.',
%client.name,
%client,
%client.target,
false, // isBot
%client.isAdmin,
%client.isSuperAdmin,
%client.isSmurf,
%client.sendGuid );
}
else
messageClient(%client, 'MsgClientJoin', "\c0Mission Insertion complete...",
%client.name,
%client,
%client.target,
false, // isBot
false, // isAdmin
false, // isSuperAdmin
false, // isSmurf
%client.sendGuid );
//Game.missionStart(%client);
setDefaultInventory(%client);
if($missionRunning)
%client.startMission();
$HostGamePlayerCount++;
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// z0dd - ZOD 4/29/02. Activate the clients Classic Huds
// and start off with 0 SAD access attempts.
%client.SadAttempts = 0;
messageClient(%client, 'MsgBomberPilotHud', ""); // Activate the bomber pilot hud
// z0dd - ZOD, 8/10/02. Get player hit sounds etc.
commandToClient(%client, 'GetClassicModSettings', 1);
//---------------------------------------------------------
// z0dd - ZOD, 7/12/02. New AutoPW server function. Sets
// server join password when server reaches x player count.
if($Host::ClassicAutoPWEnabled)
{
if(($Host::ClassicAutoPWPlayerCount != 0 && $Host::ClassicAutoPWPlayerCount !$= "") && ($HostGamePlayerCount >= $Host::ClassicAutoPWPlayerCount))
AutoPWServer(1);
}
}
function GameConnection::onDrop(%client, %reason)
{
if (!%client.isAIControlled()) //Bots disconnect left and right in this mod, ignore the client if it's a bot
saveGame();
if(isObject(Game))
Game.onClientLeaveGame(%client);
// make sure that tagged string of player name is not used
if (%client.isAIControlled() && $CurrentMissionType !$= "RPG")
{
if ( $CurrentMissionType $= "SinglePlayer" || $CurrentMissionType $= "SV")
messageAllExcept(%client, -1, 'MsgClientDrop', "", getTaggedString(%client.name), %client);
else
messageAllExcept(%client, -1, 'MsgClientDrop', '\c1%1 has left the game.', getTaggedString(%client.name), %client);
}
if ( isObject( %client.camera ) )
%client.camera.delete();
// z0dd - ZOD, 6/19/02. Strip the hit sound tags
removeTaggedString(%client.playerHitWav);
removeTaggedString(%client.vehicleHitWav);
removeTaggedString(%client.name);
removeTaggedString(%client.voiceTag);
removeTaggedString(%client.skin);
freeClientTarget(%client);
echo("CDROP: " @ %client @ " " @ %client.getAddress());
$HostGamePlayerCount--;
//---------------------------------------------------------
// z0dd - ZOD, 7/12/02. New AutoPW server function. Sets
// server join password when server reaches x player count.
if($Host::ClassicAutoPWEnabled)
{
if($HostGamePlayerCount < $Host::ClassicAutoPWPlayerCount)
AutoPWServer(0);
}
// reset the server if everyone has left the game
//if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::Dedicated && !$resettingServer && !$LoadingMission )
// schedule(0, 0, "resetServerDefaults");
// ------------------------------------------------------------------------------------------------------------
// z0dd - ZOD, 5/12/02. Reset the server if everyone has left the game and set this mission as startup mission.
// This helps with $Host::ClassicRandomMissions to keep the random more random.
if( $HostGamePlayerCount - $HostGameBotCount == 0 && $Host::Dedicated && !$resettingServer && !$LoadingMission && $CurrentMissionType !$= "RPG" ) //The server should never reset itself..
{
$Host::Map = $CurrentMission;
export("$Host::*", "prefs/ServerPrefs.cs", false);
$Host::MissionType = $CurrentMissionType;
export("$Host::*", "prefs/ServerPrefs.cs", false);
schedule(10, 0, "resetServerDefaults");
}
// ------------------------------------------------------------------------------------------------------------
}
function dismountPlayers()
{
// make sure all palyers are dismounted from vehicles and have normal huds
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
%player = %client.player;
if(%player.isMounted()) {
%player.unmount();
commandToClient(%client, 'setHudMode', 'Standard', "", 0);
}
}
}
function loadMission( %missionName, %missionType, %firstMission )
{
if ($AutoRestart) // z0dd - ZOD, 3/26/02. Auto restart server after a specified time.
{
$AutoRestart = 0;
messageAll( 'MsgServerRestart', '\c2SERVER IS AUTO REBOOTING! COME BACK IN 5 MINUTES.~wfx/misc/red_alert.wav');
logEcho("Auto server restart commencing.");
//schedule(10000, 0, "CreateServer", %missionName, %missionType); // this wasn't working as a cure for servers with NULLs
schedule(10000, 0, quit );
}
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// z0dd - ZOD, 9/13/02. TR2 needs this.
if( %missionType $= "TR2" )
{
$_Camera::movementSpeed = $Camera::movementSpeed;
$Camera::movementSpeed = 80;
}
else
{
%val = ($_Camera::movementSpeed $= "") ? $Classic::cameraSpeed : $_Camera::movementSpeed; // z0dd - ZOD, 9/13/02. Classic camera speed.
$Camera::movementSpeed = %val;
}
$LoadingMission = true;
disableCyclingConnections(true);
if (!$pref::NoClearConsole)
cls();
if ( isObject( LoadingGui ) )
LoadingGui.gotLoadInfo = "";
buildLoadInfo( %missionName, %missionType );
// reset all of these
ClearCenterPrintAll();
ClearBottomPrintAll();
if( $Host::TournamentMode ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
resetTournamentPlayers();
// Send load info to all the connected clients:
%count = ClientGroup.getCount();
for ( %cl = 0; %cl < %count; %cl++ )
{
%client = ClientGroup.getObject( %cl );
if ( !%client.isAIControlled() )
sendLoadInfoToClient( %client );
}
// allow load condition to exit out
schedule(0,ServerGroup,loadMissionStage1,%missionName,%missionType,%firstMission);
}
function loadMissionStage1(%missionName, %missionType, %firstMission)
{
// if a mission group was there, delete prior mission stuff
if(isObject(MissionGroup))
{
// clear out the previous mission paths
for(%clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++)
{
// clear ghosts and paths from all clients
%cl = ClientGroup.getObject(%clientIndex);
%cl.resetGhosting();
%cl.clearPaths();
%cl.isReady = "";
%cl.matchStartReady = false;
}
Game.endMission();
$lastMissionTeamCount = Game.numTeams;
MissionGroup.delete();
MissionCleanup.delete();
Game.deactivatePackages();
Game.delete();
$ServerGroup.delete();
$ServerGroup = new SimGroup(ServerGroup);
}
%oldMissionType = $CurrentMissionType;
//Ok, make sure we deactivate the mission package before loading a new one
deactivatePackage($CurrentMission);
$CurrentMission = %missionName;
$CurrentMissionType = %missionType;
createInvBanCount();
echo("LOADING MISSION: " @ %missionName);
// increment the mission sequence (used for ghost sequencing)
$missionSequence++;
// if this isn't the first mission, allow some time for the server
// to transmit information to the clients:
// jff: $currentMission already being used for this purpose, used in 'finishLoadMission'
$MissionName = %missionName;
$missionRunning = false;
if(!%firstMission)
schedule(15000, ServerGroup, loadMissionStage2);
else
loadMissionStage2();
}
function loadMissionStage2()
{
// create the mission group off the ServerGroup
echo("Stage 2 load");
$instantGroup = ServerGroup;
new SimGroup (MissionCleanup);
if($CurrentMissionType $= "")
{
new ScriptObject(Game) {
class = DefaultGame;
};
}
else
{
new ScriptObject(Game) {
class = $CurrentMissionType @ "Game";
superClass = DefaultGame;
};
}
// allow the game to activate any packages.
Game.activatePackages();
// reset the target manager
resetTargetManager();
%file = "missions/" @ $missionName @ ".mis";
%script = "missions/" @ $missionName @ ".cs";
if(!isFile(%file))
return;
// send the mission file crc to the clients (used for mission lighting)
$missionCRC = getFileCRC(%file);
%count = ClientGroup.getCount();
for(%i = 0; %i < %count; %i++)
{
%client = ClientGroup.getObject(%i);
if(!%client.isAIControlled())
%client.setMissionCRC($missionCRC);
}
$countDownStarted = false;
if (IsFile(%script)) //If the mission has a script..
exec(%script); //execute
exec(%file); //Load our mission while we're at it
$instantGroup = MissionCleanup;
// pre-game mission stuff
if(!isObject(MissionGroup))
{
error("No 'MissionGroup' found in mission \"" @ $missionName @ "\".");
schedule(3000, ServerGroup, CycleMissions);
return;
}
MissionGroup.cleanNonType($CurrentMissionType);
// construct paths
pathOnMissionLoadDone();
$ReadyCount = 0;
$MatchStarted = false;
$CountdownStarted = false;
AISystemEnabled( false );
// Set the team damage here so that the game type can override it:
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if ( $Host::TournamentMode )
$TeamDamage = 1;
else
$TeamDamage = $Host::TeamDamageOn;
// ----------------------------------------
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// z0dd - ZOD, 8/4/02. Gravity change
if(getGravity() !$= $Classic::gravSetting)
setGravity($Classic::gravSetting);
// ---------------------------------------------
Game.missionLoadDone();
// start all the clients in the mission
$missionRunning = true;
for(%clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++)
ClientGroup.getObject(%clientIndex).startMission();
if(!$MatchStarted && $LaunchMode !$= "NavBuild" && $LaunchMode !$= "SpnBuild" )
{
if( $Host::TournamentMode ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
checkTourneyMatchStart();
else if( $currentMissionType !$= "SinglePlayer" )
checkMissionStart();
}
// offline graph builder...
if( $LaunchMode $= "NavBuild" )
buildNavigationGraph( "Nav" );
if( $LaunchMode $= "SpnBuild" )
buildNavigationGraph( "Spn" );
purgeResources();
disableCyclingConnections(false);
$LoadingMission = false;
//Ok, if the script exists, activate the package and load AI's for this map
if (IsFile(%script) && $CurrentMissionType $= "RPG")
{
activatePackage($missionName);
DefineGeneralAI(); //Load the AI's
//Now, the game is pretty much done. We got to spawn our AI's
for (%i = 0; %i < $BotCount; %i++)
{
spawnGeneralBot(%i);
}
}
serverThink(); //Start server think loop
if (%oldMissionType !$= "RPG" && %missionType $= "RPG") //Going from some gamemode to RPG
disconnectAllBots();
else if (%oldMissionType $= "RPG" && %missionType !$= "RPG") //Going from RPG to some gamemode
discconectAllBots();
}
function spawnGeneralBot(%id)
{
%bot = aiConnectByName($Bot[%id,"Name"],$Bot[%id,"Team"]);
%bot.race = $Bot[%id,"Race"];
%bot.sex = $Bot[%id, "Sex"];
%bot.skin = addTaggedString($Bot[%id,"Skin"]);
%bot.voice = $Bot[%id,"Voice"];
%bot.voiceTag = addTaggedString(%bot.voice);
%bot.voicePitch = $Bot[%id,"VoicePitch"];
%bot.player.clearInventory();
%bot.player.setArmor($Bot[%id,"Armor"]);
setClientTeam(%bot,0); //Anyone not within the range of some sensor group is on zero -- always.
%bot.player.setTransform($Bot[%id,"Transform"]); //Now the transform is set, if it's within a territory, the trigger will handle the team
%bot.player.setInventory($Bot[%id,"Pack"], 1);
//Give the bot his weaponz
%count = getWordCount($Bot[%id,"Weapons"]);
for (%i = 0; %i < %count; %i++)
{
%weapon = getWord($Bot[%id,"Weapons"],%i);
%bot.player.setInventory(%weapon, 1);
%bot.player.setInventory(%weapon @ "Ammo",getWord($Bot[%id,"Ammo"],%i));
if (%i == 0) //Use our first weapon
%bot.player.use(%weapon);
}
%bot.id = %id;
if ($Bot[%id,"UsePack"])
%bot.use(%bot.player.getMountedImage(2).item);
setSkin(%bot,getTaggedString(%bot.skin));
setVoice(%bot,%bot.voice);
//We don't want our bot doing anything without being told
if (!$Bot[%id,"Objectives"]) //Should stop the bot cold
{
AIUnassignClient(%bot);
%bot.stop();
%bot.clearTasks();
%bot.clearStep();
%bot.lastDamageClient = -1;
%bot.lastDamageTurret = -1;
%bot.shouldEngage = -1;
%bot.setEngageTarget(-1);
%bot.setTargetObject(-1);
%bot.pilotVehicle = false;
}
}
function ShapeBase::cleanNonType(%this, %type)
{
if(%this.missionTypesList $= "")
return;
for(%i = 0; (%typei = getWord(%this.missionTypesList, %i)) !$= ""; %i++)
if(%typei $= %type)
return;
// first 32 targets are team targets (never allocated/freed)
// - must reallocate the target if unhiding
if(%this.getTarget() >= 32)
{
freeTarget(%this.getTarget());
%this.setTarget(-1);
}
if(isObject(%this.trigger)) // z0dd - ZOD, 8/10/02. Clean them triggers too!
%this.trigger.delete();
%this.hide(true);
}
function SimObject::cleanNonType(%this, %type)
{
}
function SimGroup::cleanNonType(%this, %type)
{
for (%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).cleanNonType(%type);
}
function GameConnection::endMission(%this)
{
commandToClient(%this, 'MissionEnd', $missionSequence);
}
//--------------------------------------------------------------------------
// client start phases:
// 0: start mission
// 1: got phase1 done
// 2: got datablocks done
// 3: got phase2 done
// 4: got phase3 done
function GameConnection::startMission(%this)
{
// send over the information that will display the server info
// when we learn it got there, we'll send the data blocks
%this.currentPhase = 0;
//Make sure the client is an RPG client..
if ($CurrentMissionType $= "RPG")
commandToClient(%this, 'HandleScriptedCommand',5,true); //Send us the current time in military format
else
commandToClient(%this, 'HandleScriptedCommand',5,false); //Not running the RPG gamemode, so don't setup the clock & scoreScreen text change
%this.team = getRaceTeam(%this.race);
commandToClient(%this, 'MissionStartPhase1', $missionSequence, $MissionName, MissionGroup.musicTrack);
}
function serverCMDVerifyClient(%client,%GUID,%version)
{
if (%version < $ModVersion) //Hold your horses! Invalid version comin' through! Although version doesn't really matter..
return clientDisconnect(%client,"Your T2BOL version is outdated. Server is running "@$ModVersion@", you are running "@%version@". Please update your client to play on this server.");
%client.isValid = true;
%GUID = stripNonNumericCharacters(%GUID);
if (%client.GUID $= "") //If the GUID isn't already set, then we must be offline.
%client.GUID = %GUID;
%GUID = %client.GUID;
if (!$Data::IsRegistered[%GUID])
{
$Data::IsRegistered[%GUID] = true;
$Data::Shots[%GUID] = 0;
$Data::Hits[%GUID] = 0;
$Data::Misses[%GUID] = 0;
$Data::Kills[%GUID] = 0;
$Data::Deaths[%GUID] = 0;
$Data::Suicides[%GUID] = 0;
$Data::Headshots[%GUID] = 0;
$Data::Caps[%GUID] = 0;
$Data::FlagReturns[%GUID] = 0;
$Data::Won[%GUID] = 0;
$Data::Lost[%GUID] = 0;
}
if (!$Data::IsRPGReady[%GUID] && $CurrentMissionType $= "RPG")
{
$Data::IsRPGReady[%GUID] = true;
$Data::Sex[%GUID] = %client.sex;
$Data::Race[%GUID] = %client.race;
$Data::Steel[%GUID,$CurrentMission] = 0;
$Data::Money[%GUID,$CurrentMission] = 0;
$Data::EMail::Count[%GUID] = 1;
$Data::EMail::Title[%GUID,1] = "Welcome";
$Data::EMail::Sender[%GUID,1] = "The Comittee";
$Data::EMail::Contents[%GUID,1] = "Welcome to T2Bol, try not to die.";
$Data::EMail::Date[%GUID,1] = formatTimeString("DD, MM dd, yy @ hh:nn A");
if ($Data::ClientCount $= "")
$Data::ClientCount = 0;
$Data::ClientGUID[$Data::ClientCount] = %GUID;
$Data::ClientName[$Data::ClientCount] = %client.namebase;
$Data::ClientCount++;
}
%client.PDAPage = "MAIN";
saveGame();
}
function serverCmdInputDone(%client, %type, %value) //Used when creating/editing clans
{
switch$(%type)
{
case "ClanN":
%client.clanN = %value;
case "ClanT":
%client.clanT = %value;
case "Desc":
%client.description = %value;
case "emailTitle":
%client.emailTitle = %value;
case "emailCont":
//Every 39 chars add a \t tag..
%cont = %value;
%len = strLen(%value);
if (%len > 39)
%value = subStrInsert(%value,"\t",39);
%client.emailCont = %value;
}
if (%type $= "ClanN" || %type $= "ClanT" || %type $= "Desc")
forceScoreScreenOpen(%client,"CLNSTP");
else
forceScoreScreenOpen(%client,"EMAILSEND");
}
function serverCmdMissionStartPhase1Done(%client, %seq)
{
if(%seq != $missionSequence || !$MissionRunning)
return;
if(%client.currentPhase != 0)
return;
%client.currentPhase = 1;
if (!%client.isValid && $RequiresClient[$CurrentMissionType]) //Did this person say he's a client and the gamemode requires clientside stuff?
return clientDisconnect(%client,"You do not have a Tribes 2: Birth of Legend mod client running.");
schedule(1000, 0, "debriefLoad", %client);
// when the datablocks are transmitted, we'll send the ghost always objects
%client.transmitDataBlocks($missionSequence);
}
function GameConnection::dataBlocksDone( %client, %missionSequence )
{
echo("GOT DATA BLOCKS DONE FOR: " @ %client);
if(%missionSequence != $missionSequence)
return;
if(%client.currentPhase != 1)
return;
%client.currentPhase = 2;
// only want to set this once... (targets will not be updated/sent until a
// client has this flag set)
if(!%client.getReceivedDataBlocks())
{
%client.setReceivedDataBlocks(true);
sendTargetsToClient(%client);
}
commandToClient(%client, 'MissionStartPhase2', $missionSequence);
}
function serverCmdMissionStartPhase2Done(%client, %seq)
{
if(%seq != $missionSequence || !$MissionRunning)
return;
if(%client.currentPhase != 2)
return;
%client.currentPhase = 3;
// when all this good love is over, we'll know that the mission lighting is done
%client.transmitPaths();
// setup the client team state
if ( $CurrentMissionType !$= "SinglePlayer" )
serverSetClientTeamState( %client );
// start ghosting
%client.activateGhosting();
%client.camera.scopeToClient(%client);
// to the next phase...
commandToClient(%client, 'MissionStartPhase3', $missionSequence, $CurrentMission);
}
function serverCmdMissionStartPhase3Done(%client, %seq)
{
if(%seq != $missionSequence || !$MissionRunning)
return;
if(%client.currentPhase != 3)
return;
%client.currentPhase = 4;
%client.isReady = true;
Game.clientMissionDropReady(%client);
}
function serverSetClientTeamState( %client )
{
// set all player states prior to mission drop ready
// create a new camera for this client
%client.camera = new Camera()
{
dataBlock = Observer;
};
if( isObject( %client.rescheduleVote ) )
Cancel( %client.rescheduleVote );
%client.canVote = true;
%client.rescheduleVote = "";
MissionCleanup.add( %client.camera ); // we get automatic cleanup this way.
%observer = false;
if( !$Host::TournamentMode ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
{
if( %client.justConnected )
{
%client.justConnected = false;
%client.camera.getDataBlock().setMode( %client.camera, "justJoined" );
}
else
{
// server just changed maps - this guy was here before
if( %client.lastTeam !$= "" )
{
// see if this guy was an observer from last game
if(%client.lastTeam == 0)
{
%observer = true;
%client.camera.getDataBlock().setMode( %client.camera, "ObserverFly" );
}
else // let this player join the team he was on last game
{
if(Game.numTeams > 1 && %client.lastTeam <= Game.numTeams )
{
Game.clientJoinTeam( %client, %client.lastTeam, false );
}
else
{
Game.assignClientTeam( %client );
// spawn the player
Game.spawnPlayer( %client, false );
}
}
}
else
{
Game.assignClientTeam( %client );
// spawn the player
Game.spawnPlayer( %client, false );
}
if( !%observer )
{
if(!$MatchStarted && !$CountdownStarted)
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
else if(!$MatchStarted && $CountdownStarted)
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
}
}
}
else
{
// don't need to do anything. MissionDrop will handle things from here.
}
}
//function serverCmdPreviewDropReady( %client )
//{
// $MatchStarted = true;
// commandToClient( %client, 'SetMoveKeys', true);
// %markerObj = "0 0 0";
// %client.camera.mode = "PreviewMode";
// %client.camera.setTransform( %markerObj );
// %client.camera.setFlyMode();
//
// %client.setControlObject( %client.camera );
//}
function HideHudHACK(%visible)
{
//compassHud.setVisible(%visible);
//enerDamgHud.setVisible(%visible);
retCenterHud.setVisible(%visible);
reticleFrameHud.setVisible(%visible);
//invPackHud.setVisible(%visible);
weaponsHud.setVisible(%visible);
outerChatHud.setVisible(%visible);
objectiveHud.setVisible(%visible);
chatHud.setVisible(%visible);
navHud.setVisible(%visible);
//watermarkHud.setVisible(%visible);
hudClusterBack.setVisible(%visible);
inventoryHud.setVisible(%visible);
clockHUD.setVisible(%visible);
}
function ServerPlay2D(%profile)
{
for(%idx = 0; %idx < ClientGroup.getCount(); %idx++)
ClientGroup.getObject(%idx).play2D(%profile);
}
function ServerPlay3D(%profile,%transform)
{
for(%idx = 0; %idx < ClientGroup.getCount(); %idx++)
ClientGroup.getObject(%idx).play3D(%profile,%transform);
}
function clientCmdSetFirstPerson(%value)
{
$firstPerson = %value;
if(%value)
ammoHud.setVisible(true);
else
ammoHud.setVisible(false);
}
function clientCmdGetFirstPerson()
{
commandToServer('FirstPersonValue', $firstPerson);
}
function serverCmdFirstPersonValue(%client, %firstPerson)
{
%client.player.firstPerson = %firstPerson;
}
function clientCmdVehicleMount()
{
if ( $pref::toggleVehicleView )
{
$wasFirstPerson = $firstPerson;
$firstPerson = false;
}
}
function clientCmdVehicleDismount()
{
if ( $pref::toggleVehicleView )
$firstPerson = $wasFirstPerson;
}
//----------------------------------------------------
// z0dd - ZOD, 3/09/02. Re-write. It's more flexible.
function serverCmdSAD(%client, %password)
{
if(%password $= "")
{
messageClient(%client, 'MsgPasswordFailed', '\c2You did not supply a PW.');
return;
}
%name = %client.name;
switch$ (%password)
{
case $Host::ClassicSuperAdminPassword:
if(!%client.isSuperAdmin)
{
if(%password $= "changeme")
{
messageClient(%client, 'MsgPasswordFailed', '\c2Illegal SAD PW. You need to change the default \"$Host::ClassicSuperAdminPassword\" value in \"ServerPrefs.cs\"!');
return;
}
%client.isAdmin = true;
%client.isSuperAdmin = true;
MessageAll( 'MsgSuperAdminPlayer', '\c2%2 has become a Super Admin by force.', %client, %name);
logEcho(%client.nameBase @ " has become a Super Admin by force.");
}
case $Host::AdminPassword:
if(!%client.isAdmin)
{
if(%password $= "changethis")
{
messageClient(%client, 'MsgPasswordFailed', '\c2Illegal Admin PW. You need to change the default \"$Host::AdminPassword\" value in \"ServerPrefs.cs\"!');
return;
}
%client.isAdmin = true;
%client.isSuperAdmin = false;
MessageAll( 'MsgAdminForce', '\c2%2 has become a Admin by force.', %client, %name);
logEcho(%client.nameBase @ " has become an Admin by force.");
}
default:
messageClient(%client, 'MsgPasswordFailed', '\c2Illegal SAD PW.');
%client.SadAttempts++;
if(%client.SadAttempts >= 6 && !%client.isSuperAdmin)
{
%client.getAddress();
%client.getAuthInfo();
messageClient(%client, 'onClientBanned', 'For attempting to exploit SAD to gain unauthorized Admin by entering\ntoo many passwords, you are being Banned');
if( isObject(%client.player) )
{
%client.player.scriptKill(0);
%client.schedule(700, "delete");
}
schedule(10, %client @ "ResetSadAttp", %client);
%client.setDisconnectReason( 'For attempting to exploit SAD to gain unauthorized Admin by entering\ntoo many passwords, you are being Banned.' );
%client.schedule(700, "delete");
BanList::add(%client.guid, %client.getAddress(), $Host::BanTime);
logEcho(%client.nameBase @ " " @ %client.guid @ " has been banned for excessive use of SAD");
}
}
}
function ResetSadAttp(%client)
{
%client.SadAttempts = 0;
}
//---------------------------------------------------------------
// z0dd - ZOD, 8/13/02. Added this function. Writen by Writer
//
// Returns true if %text consists of nothing but digits and/or
// decimals.
// Note: rejects strings with more than one decimal, or with a +
// or - as anything but the first character (+ or - are only
// allowed as the first character in the string)
function isNumber(%text)
{
for(%i = 0; (%char = getSubStr(%text, %i, 1)) !$= ""; %i++)
{
switch$(%char)
{
case "0":
continue;
case "1":
continue;
case "2":
continue;
case "3":
continue;
case "4":
continue;
case "5":
continue;
case "6":
continue;
case "7":
continue;
case "8":
continue;
case "9":
continue;
case ".":
if(%dot_count > 1)
return false;
%dot_count++;
continue;
case "-":
if(%i) // only valid as first character
return false;
continue;
case "+":
if(%i) // only valid as first character
return false;
continue;
default:
return false;
}
}
// %text passed the test
return true;
}
//---------------------------------------------------------------
//----------------------------------------------------
// z0dd - ZOD, 3/09/02. Replaced by function below.
//function serverCmdSADSetPassword(%client, %password)
//{
// if(%client.isSuperAdmin)
// $Host::AdminPassword = %password;
//}
//----------------------------------------------------
//---------------------------------------------------------
// z0dd - ZOD, 3/10/02. New remote admin control function
function serverCmdSet(%client, %type, %val)
{
// USAGE: commandToServer('Set', type, value);
%type = deTag(%type);
%val = deTag(%val);
if(!%client.isSuperAdmin)
{
messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use that command.');
return;
}
if(%type $= "")
{
messageClient(%client, 'MsgTypeFailed', '\c2No Changes. You did not supply a type.');
return;
}
//if( (%val $= "") && (%type !$= "joinpw") )
if(%val $= "")
{
if(%type $= "joinpw")
messageClient(%client, 'MsgValueFailed', '\c2No Changes. You did not supply a value. Use \"remove\" to remove join pw.');
else
messageClient(%client, 'MsgValueFailed', '\c2No Changes. You did not supply a value.');
return;
}
%name = %client.name;
switch$ (%type)
{
case "superpw":
$Host::ClassicSuperAdminPassword = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%client, 'MsgSuperPassword', '\c2\"Super Admin\" PW changed to: \c3%1\c2.', addTaggedString(%val));
logEcho(%client.nameBase @ " changed the Super Admin password.");
case "adminpw":
$Host::AdminPassword = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%client, 'MsgAdminPassword', '\c2\"Admin\" PW changed to: \c3%1\c2.', addTaggedString(%val));
logEcho(%client.nameBase @ " changed the Admin password.");
case "joinpw":
if(%val $= "remove")
$Host::Password = "";
else
$Host::Password = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageAll( 'MsgServerPassword', '\c3%1\c2: JOIN PASSWORD CHANGED.~wfx/misc/diagnostic_on.wav', %name);
if(%val $= "remove")
messageClient(%client, 'MsgServerPassword', '\c2Join PW removed.');
else
messageClient(%client, 'MsgServerPassword', '\c2Join PW changed to: \c3%1\c2.', addTaggedString(%val));
logEcho(%client.nameBase @ " changed the join password.");
case "maxplayers":
if(isNumber(%val) && (%val > 0))
{
$Host::MaxPlayers = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageAll( 'MsgMaxPlayersSet', '\c3%1\c2: PLAYER LIMIT CHANGED TO: \c3%2\c2.~wfx/misc/diagnostic_on.wav', %name, %val);
logEcho(%client.nameBase @ " changed the Player Limit.");
}
else
{
messageClient( %client, 'MsgAdmin', '\c2Value must be a positive number.' );
}
case "restart":
if (%val $= "0")
{
$AutoRestart = 0;
messageClient( %client, 'MsgAdmin', '\c2Server restart at mission end aborted.' );
messageAll( 'MsgServerRestart', '\c3%1\c2: SERVER RESTART HAS BEEN CANCELED.~wfx/misc/diagnostic_on.wav', %name);
}
else if (%val $= "1")
{
messageAll( 'MsgServerRestart', '\c3%1\c2: SERVER WILL BE REBOOTING IN 30 SECONDS!.~wfx/misc/red_alert.wav', %name);
schedule(20000, 0, "messageAll", 'MsgServerRestart', '\c2SERVER WILL REBOOT IN 10 SECONDS!.~wfx/misc/hunters_10.wav');
schedule(30000, 0, quit);
logEcho(%client.nameBase @ " forced a server restrart.");
}
else
{
messageClient( %client, 'MsgAdmin', '\c2Unknown restart value. 0 cancels restart, 1 forces restart.' );
}
case "random":
if(%val $= "0" || %val $= "1")
{
if($CurrentMissionType $= TR2) // z0dd - ZOD, 9/17/02. Check for Team Rabbit 2
{
messageClient( %client, 'MsgAdmin', '\c2This feature is unavailable in Team Rabbit 2.' );
return;
}
$Host::ClassicRandomizeTeams = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
%detail = ($Host::ClassicRandomizeTeams ? "ENABLED" : "DISABLED");
messageAll( 'MsgRandomTeams', '\c3%1\c2: RANDOM TEAMS %2. Changes will take place next mission.~wfx/misc/diagnostic_on.wav', %name, %detail);
logEcho(%client.nameBase @ " " @ %detail @ " random teams.");
}
else
{
messageClient( %client, 'MsgAdmin', '\c2Unknown input value. 0 disables Random Teams, 1 enables Random Teams.' );
}
case "fairteams":
if(%val $= "0" || %val $= "1")
{
if($CurrentMissionType $= TR2) // z0dd - ZOD, 9/17/02. Check for Team Rabbit 2
{
messageClient( %client, 'MsgAdmin', '\c2This feature is unavailable in Team Rabbit 2.' );
return;
}
$Host::ClassicFairTeams = %val;
export( "$Host::*", "prefs/ServerPrefs.cs", false );
%detail = ($Host::ClassicFairTeams ? "ENABLED" : "DISABLED");
messageAll( 'MsgRandomTeams', '\c3%1\c2: FAIR TEAMS %2.~wfx/misc/diagnostic_on.wav', %name, %detail );
logEcho(%client.nameBase @ " " @ %detail @ " fair teams.");
}
else
{
messageClient( %client, 'MsgAdmin', '\c2Unknown input value. 0 disables Fair Teams, 1 enables Fair Teams.' );
}
default:
messageClient(%client, 'MsgValueFailed', '\c2No Changes. You did not specify a valid type.');
}
}
//----------------------------------------------------------
// z0dd - ZOD, 7/12/02. New AutoPW server functions. Sets
// server join password when server reaches x player count.
function AutoPWServer(%val)
{
if(%val && ($Host::ClassicAutoPWPassword !$= "changeit"))
$Host::Password = $Host::ClassicAutoPWPassword;
else
$Host::Password = "";
// z0dd - ZOD, 9/27/02, Chat was being spammed every time someone joined if limit was hit or above
// %detail = (($Host::Password $= "") ? "removed" : "set");
// messageAll( 'MsgAdmin', '\c2Join password %1 by Auto-password feature.', %detail );
}
function serverCmdAutoPWSetup(%client, %type, %val)
{
// USAGE: commandToServer('AutoPWSetup', type, value);
%type = deTag(%type);
%val = deTag(%val);
if(!%client.isSuperAdmin)
{
messageClient(%client, 'MsgNotSuperAdmin', '\c2Only Super Admins can use this command.');
return;
}
if(%type $= "")
{
messageClient(%client, 'MsgTypeFailed', '\c2No Changes. You did not supply a type.');
return;
}
switch$ (%type)
{
case "autopw":
if (%val $= "0")
{
$Host::ClassicAutoPWEnabled = 0;
AutoPWServer(0);
messageClient( %client, 'MsgAdmin', '\c2Auto-password disabled.' );
}
else if (%val $= "1")
{
$Host::ClassicAutoPWEnabled = 1;
messageClient( %client, 'MsgAdmin', '\c2Auto-password enabled.' );
logEcho(%client.nameBase @ " enabled Auto-password.");
}
else
{
messageClient( %client, 'MsgAdmin', '\c2Unknown value. 0 disables Auto-password, 1 enables Auto-password.' );
}
case "autopwpass":
if(%val !$= "")
{
$Host::ClassicAutoPWPassword = %val;
}
else
{
messageClient( %client, 'MsgAdmin', '\c2You must specify a password.' );
return;
}
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%client, 'MsgServerPassword', '\c2Server Auto-password PW changed to: \c3%1\c2.', addTaggedString(%val));
logEcho(%client.nameBase @ " changed the Auto-password PW.");
case "autopwcount":
if(%val !$= "" && %val !$= "0")
{
$Host::ClassicAutoPWPlayerCount = %val;
}
else
{
messageClient( %client, 'MsgAdmin', '\c2You must specify a numerical value.' );
return;
}
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%client, 'MsgServerPassword', '\c2Server Auto-password player count changed to: \c3%1\c2.', addTaggedString(%val));
logEcho(%client.nameBase @ " changed the Auto-password player count.");
}
}
//---------------------------------------------------------------------------------------------------
// z0dd - ZOD, 4-15-02. Pick spawn spot by killing self during tourney wait. Also addresses
// team switching to crash server exploit. New function
$WAIT_PERIOD = 20000;
$WAIT_MESSAGE = '\c3WAIT MESSAGE:\cr You must wait another %1 seconds';
function GameConnection::waitTimeout(%this)
{
%this.isWaiting = false;
}
function SpawnPosChange( %client )
{
if( isObject( Game ) && %client != Game.kickClient && $Host::TournamentMode && !$CountdownStarted)
{
if (!%client.isWaiting)
{
%client.isWaiting = true;
%client.waitStart = getSimTime();
%client.schedule($WAIT_PERIOD, waitTimeout);
clearBottomPrint(%client);
Game.clientChangeTeam( %client, %client.team, 0, true );
if(!$MatchStarted)
{
%client.observerMode = "pregame";
%client.notReady = true;
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
%client.setControlObject( %client.camera );
if( !$CountdownStarted)
{
%client.notReady = true;
centerprint( %client, "\nPress FIRE when ready.", 0, 3 );
}
}
else
{
commandToClient(%client, 'setHudMode', 'Standard', "", 0);
}
}
else
{
%wait = mFloor(($WAIT_PERIOD - (getSimTime() - %client.waitStart)) / 1000);
messageClient(%client, "", $WAIT_MESSAGE, %wait);
}
}
}
//---------------------------------------------------------------------------------------------------
function serverCmdSuicide(%client)
{
if ($CurrentMissionType $= "RPG") //If it's RPG, stop here!
return;
if(!isObject(%client.player)) // z0dd - ZOD, 4-15-02. Console spam fix.
return;
// z0dd - ZOD, 4-15-02: Pick spawn spot by killing self during tourney wait
if( $MatchStarted )
{
%client.player.scriptKill($DamageType::Suicide);
}
else
{
if($CurrentMissionType !$= TR2) // z0dd - ZOD, 9/17/02. Check for Team Rabbit 2
SpawnPosChange( %client );
}
}
function serverCmdToggleCamera(%client)
{
if ($testcheats || $CurrentMissionType $= "SinglePlayer")
{
%control = %client.getControlObject();
if (%control == %client.player)
{
%control = %client.camera;
%control.mode = toggleCameraFly;
%control.setFlyMode();
}
else
{
%control = %client.player;
%control.mode = observerFly;
%control.setFlyMode();
}
%client.setControlObject(%control);
}
}
function serverCmdDropPlayerAtCamera(%client)
{
if ($testcheats)
{
%client.player.setTransform(%client.camera.getTransform());
%client.player.setVelocity("0 0 0");
%client.setControlObject(%client.player);
}
}
function serverCmdDropCameraAtPlayer(%client)
{
if ($testcheats)
{
%client.camera.setTransform(%client.player.getTransform());
%client.camera.setVelocity("0 0 0");
%client.setControlObject(%client.camera);
}
}
function serverCmdToggleRace(%client)
{
if ($testcheats)
{
if (%client.race $= "Human")
%client.race = "Bioderm";
else
%client.race = "Human";
%client.player.setArmor(%client.armor);
}
}
function serverCmdToggleGender(%client)
{
if ($testcheats)
{
if (%client.sex $= "Male")
%client.sex = "Female";
else
%client.sex = "Male";
%client.player.setArmor(%client.armor);
}
}
function serverCmdToggleArmor(%client)
{
if ($testcheats)
{
if (%client.armor $= "Light")
%client.armor = "Medium";
else
if (%client.armor $= "Medium")
%client.armor = "Heavy";
else
%client.armor = "Light";
%client.player.setArmor(%client.armor);
}
}
function serverCmdPlayCel(%client,%anim)
{
if ($testcheats)
{
%anim = %client.player.celIdx;
if (%anim++ > 8)
%anim = 1;
%client.player.setActionThread("cel"@%anim);
%client.player.celIdx = %anim;
}
}
// NOTENOTENOTE: Review
function PlayAnim(%client, %anim) // z0dd - ZOD, 8/15/02. Remove client direct requests to start animations. Was: serverCmdPlayAnim
{
if( %anim $= "Death1" || %anim $= "Death2" || %anim $= "Death3" || %anim $= "Death4" || %anim $= "Death5" ||
%anim $= "Death6" || %anim $= "Death7" || %anim $= "Death8" || %anim $= "Death9" || %anim $= "Death10" || %anim $= "Death11" )
return;
%player = %client.player;
// don't play animations if player is in a vehicle
// z0dd - ZOD, 4-15-02. Console spam fix, check for player object.
if(%player.isMounted() || !isObject(%player))
return;
%weapon = ( %player.getMountedImage($WeaponSlot) == 0 ) ? "" : %player.getMountedImage($WeaponSlot).getName().item;
if(%weapon $= "MissileLauncher" || %weapon $= "SniperRifle")
{
%player.animResetWeapon = true;
%player.lastWeapon = %weapon;
%player.unmountImage($WeaponSlot);
%player.setArmThread(look); // z0dd - ZOD, 4-15-02. Dynamix used %obj.
}
%player.setActionThread(%anim);
}
function serverCmdPlayDeath(%client,%anim)
{
if ($testcheats)
{
%anim = %client.player.deathIdx;
if (%anim++ > 11)
%anim = 1;
%client.player.setActionThread("death"@%anim,true);
%client.player.deathIdx = %anim;
}
}
// NOTENOTENOTE: Review these!
//------------------------------------------------------------
// TODO - make this function specify a team to switch to...
function serverCmdClientTeamChange( %client )
{
// pass this to the game object to handle:
if ( isObject( Game ) && Game.kickClient != %client)
{
%fromObs = %client.team == 0;
if(%fromObs)
clearBottomPrint(%client);
Game.clientChangeTeam( %client, "", %fromObs );
}
}
function serverCanAddBot()
{
//find out how many bots are already playing
%botCount = 0;
%numClients = ClientGroup.getCount();
for (%i = 0; %i < %numClients; %i++)
{
%cl = ClientGroup.getObject(%i);
if (%cl.isAIcontrolled())
%botCount++;
}
//add only if we have less bots than the bot count, and if there would still be room for a
if ($HostGameBotCount > 0 && %botCount < $Host::botCount && %numClients < $Host::maxPlayers - 1)
return true;
else
return false;
}
function serverCmdAddBot( %client )
{
//only admins can add bots...
if (%client.isAdmin)
{
if (serverCanAddBot())
aiConnectMultiple( 1, $Host::MinBotDifficulty, $Host::MaxBotDifficulty, -1 );
}
}
// ---------------------------------------------------------------------------------
// z0dd - ZOD, 6/22/02. Changed function to use a waiting period when changing teams
// to prevent team change exploit to crash servers. Added admin varible so admins
// can teamchange whoever they want.
function serverCmdClientJoinTeam( %client, %team, %admin )
{
if( %team == -1 )
{
if( %client.team == 1 )
%team = 2;
else
%team = 1;
}
if ( isObject( Game ) && Game.kickClient != %client)
{
if(%client.team != %team)
{
// z0dd - ZOD, 9/17/02. Fair teams, check for Team Rabbit 2 as well.
if(($Host::ClassicFairTeams && !%client.isAdmin) && ($CurrentMissionType !$= TR2))
{
%otherTeam = %team == 1 ? 2 : 1;
if(!%admin.isAdmin && %team != 0 && ($TeamRank[%team, count]+1) > $TeamRank[%otherTeam, count])
{
messageClient(%client, 'MsgFairTeams', '\c2Teams will be uneven, please choose another team.');
return;
}
}
if(!%client.isWaiting || %admin.isAdmin)
{
%client.isWaiting = true;
%client.waitStart = getSimTime();
%client.schedule($WAIT_PERIOD, waitTimeout);
%fromObs = %client.team == 0;
if(%fromObs)
clearBottomPrint(%client);
if( %client.isAIControlled() )
Game.AIChangeTeam( %client, %team );
else
Game.clientChangeTeam( %client, %team, %fromObs );
}
else
{
%wait = mFloor(($WAIT_PERIOD - (getSimTime() - %client.waitStart)) / 1000);
messageClient(%client, "", $WAIT_MESSAGE, %wait);
}
}
}
}
// ---------------------------------------------------------------------------------
// this should only happen in single team games
function serverCmdClientAddToGame( %client, %targetClient )
{
if ( isObject( Game ) )
Game.clientJoinTeam( %targetClient, 0, $matchstarted );
clearBottomPrint(%targetClient);
if($matchstarted)
{
%targetClient.setControlObject( %targetClient.player );
commandToClient(%targetClient, 'setHudMode', 'Standard');
}
else
{
%targetClient.notReady = true;
%targetClient.camera.getDataBlock().setMode( %targetClient.camera, "pre-game", %targetClient.player );
%targetClient.setControlObject( %targetClient.camera );
}
if( $Host::TournamentMode && !$CountdownStarted) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
{
%targetClient.notReady = true;
centerprint( %targetClient, "\nPress FIRE when ready.", 0, 3 );
}
}
function serverCmdClientJoinGame( %client )
{
if ( isObject( Game ) )
Game.clientJoinTeam( %client, 0, 1 );
%client.setControlObject( %client.player );
clearBottomPrint(%client);
commandToClient(%client, 'setHudMode', 'Standard');
}
function serverCmdClientMakeObserver( %client )
{
if ( isObject( Game ) && Game.kickClient != %client )
Game.forceObserver( %client, "playerChoose" );
}
function serverCmdChangePlayersTeam( %clientRequesting, %client, %team)
{
if( isObject( Game ) && %client != Game.kickClient && %clientRequesting.isAdmin)
{
// z0dd - ZOD, 6/22/02. Added admin varible to enable admins to teamchange
// even players under the Wait timer.
//serverCmdClientJoinTeam(%client, %team);
serverCmdClientJoinTeam(%client, %team, %clientRequesting);
if(!$MatchStarted)
{
%client.observerMode = "pregame";
%client.notReady = true;
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
%client.setControlObject( %client.camera );
if( $Host::TournamentMode && !$CountdownStarted) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
{
%client.notReady = true;
centerprint( %client, "\nPress FIRE when ready.", 0, 3 );
}
}
else
commandToClient(%client, 'setHudMode', 'Standard', "", 0);
%multiTeam = (Game.numTeams > 1);
%aname = %clientRequesting.name; // z0dd - ZOD, 4-15-02. who did what
%name = %client.name; // z0dd - ZOD, 4-15-02. who did what
if(%multiTeam)
{
messageClient( %client, 'MsgClient', '\c2%1 has changed your team.', %aname); // z0dd - ZOD, 4-15-02. who did what
messageAllExcept( %client, -1, 'MsgClient', '\c2%1 forced %2 to join the %3 team.', %aname, %name, game.getTeamName(%client.team) ); // z0dd - ZOD, 4-15-02. who did what
}
else
{
messageClient( %client, 'MsgClient', '\c2%1 has added you to the game.', %aname); // z0dd - ZOD, 4-15-02. who did what
messageAllExcept( %client, -1, 'MsgClient', '\c2%1 added %2 to the game.', %aname, %name); // z0dd - ZOD, 4-15-02. who did what
}
}
}
//---------------------------------------------------------------------------------------------------------
// z0dd - ZOD 4/18/02. Allow SuperAdmins to De-Admin normal Admins
function serverCmdStripAdmin(%client, %admin)
{
if(!%admin.isAdmin)
return;
if(%client.isSuperAdmin)
{
messageAll( 'MsgStripAdminPlayer', '\c2%1 removed %2\'s admin privledges.', %client.name, %admin.name, %admin );
messageClient(%admin, 'MsgStripAdminPlayer', 'You are being stripped of your admin privledges by %1.', %client.name);
%admin.isAdmin = 0;
logEcho(%client.nameBase @ " stripped admin from " @ %admin.nameBase);
}
else
messageClient(%client, 'MsgError', '\c2Only Super Admins can use this command.');
}
// z0dd - ZOD 4/18/02. Allow Admins to warn players
function serverCmdWarnPlayer(%client, %target)
{
if(%client.isAdmin)
{
messageAllExcept(%target, -1, 'MsgAdminForce', '%1 has been warned for inappropriate conduct by %2.', %target.name, %client.name);
messageClient(%target, 'MsgAdminForce', 'You are recieving this warning for inappropriate conduct by %1. Behave or you will be kicked..~wfx/misc/lightning_impact.wav', %client.name);
centerprint(%target, "You are recieving this warning for inappropriate conduct.\nBehave or you will be kicked.", 10, 2);
logEcho(%client.nameBase @ " sent warning to " @ %target.nameBase);
}
else
messageClient(%client, 'MsgError', '\c2Only Admins can use this command.');
}
//---------------------------------------------------------------------------------------------------------
function serverCmdForcePlayerToObserver( %clientRequesting, %client )
{
if( isObject( Game ) && %clientRequesting.isAdmin)
Game.forceObserver( %client, "adminForce" );
}
//--------------------------------------------------------------------------
function serverCmdTogglePlayerMute(%client, %who)
{
if (%client.muted[%who])
{
%client.muted[%who] = false;
messageClient(%client, 'MsgPlayerMuted', '%1 has been unmuted.', %who.name, %who, false);
}
else
{
%client.muted[%who] = true;
messageClient(%client, 'MsgPlayerMuted', '%1 has been muted.', %who.name, %who, true);
}
}
//--------------------------------------------------------------------------
// VOTE MENU FUNCTIONS:
function serverCmdGetVoteMenu( %client, %key )
{
if ( isObject( Game ) )
Game.sendGameVoteMenu( %client, %key );
}
function serverCmdGetPlayerPopupMenu( %client, %targetClient, %key )
{
if ( isObject( Game ) )
Game.sendGamePlayerPopupMenu( %client, %targetClient, %key );
}
function serverCmdGetTeamList( %client, %key )
{
if ( isObject( Game ) )
Game.sendGameTeamList( %client, %key );
}
function serverCmdGetMissionTypes( %client, %key )
{
for ( %type = 0; %type < $HostTypeCount; %type++ )
messageClient( %client, 'MsgVoteItem', "", %key, %type, "", $HostTypeDisplayName[%type], true );
}
function serverCmdGetMissionList( %client, %key, %type )
{
if ( %type < 0 || %type >= $HostTypeCount )
return;
for ( %i = $HostMissionCount[%type] - 1; %i >= 0; %i-- )
{
%idx = $HostMission[%type, %i];
// If we have bots, don't change to a mission that doesn't support bots:
if ( $HostGameBotCount > 0 )
{
if( !$BotEnabled[%idx] )
continue;
}
messageClient( %client, 'MsgVoteItem', "", %key,
%idx, // mission index, will be stored in $clVoteCmd
"",
$HostMissionName[%idx],
true );
}
}
function serverCmdGetTimeLimitList( %client, %key, %type )
{
if ( isObject( Game ) )
Game.sendTimeLimitList( %client, %key );
}
function serverCmdClientPickedTeam( %client, %option )
{
// -------------------------------------------------------------------------------------
// z0dd - ZOD 4/18/02. Tourney mode bug fix. Fix provided by FSB-AO
// Bug description: In tournament mode, If a player is teamchanged by an admin before
// they select a team, the server just changes their team and re-skins the player. They
// are not moved from their initial spawn point, meaning they could spawn very close to
// the other teams flag. This script kills the player if they are already teamed when
// they select an option and spawns them on the correct side of the map.
switch(%option)
{
case 1:
if ( isObject(%client.player) )
{
%client.player.scriptKill(0);
Game.clientChangeTeam(%client, %option, 0);
}
else
Game.clientJoinTeam( %client, %option, false );
case 2:
if ( isObject(%client.player) )
{
%client.player.scriptKill(0);
Game.clientChangeTeam(%client, %option, 0);
}
else
Game.clientJoinTeam( %client, %option, false );
case 3:
if( !isObject(%client.player) )
{
Game.assignClientTeam( %client, $MatchStarted );
Game.spawnPlayer( %client, false );
}
default:
if( isObject(%client.player) )
{
%client.player.scriptKill(0);
ClearBottomPrint(%client);
}
Game.forceObserver( %client, "playerChoose" );
%client.observerMode = "observer";
%client.notReady = false;
return;
}
// -------------------------------------------------------------------------------------
ClearBottomPrint(%client);
%client.observerMode = "pregame";
%client.notReady = true;
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
commandToClient(%client, 'setHudMode', 'Observer');
%client.setControlObject( %client.camera );
centerprint( %client, "\nPress FIRE when ready.", 0, 3 );
}
function playerPickTeam( %client )
{
%numTeams = Game.numTeams;
if(%numTeams > 1)
{
%client.camera.mode = "PickingTeam";
schedule( 0, 0, "commandToClient", %client, 'pickTeamMenu', Game.getTeamName(1), Game.getTeamName(2));
}
else
{
Game.clientJoinTeam(%client, 0, 0);
%client.observerMode = "pregame";
%client.notReady = true;
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
centerprint( %client, "\nPress FIRE when ready.", 0, 3 );
%client.setControlObject( %client.camera );
}
}
function serverCmdPlayContentSet( %client )
{
if( $Host::TournamentMode && !$CountdownStarted && !$MatchStarted ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
playerPickTeam( %client );
}
//--------------------------------------------------------------------------
// This will probably move elsewhere...
function getServerStatusString()
{
return isObject(Game) ? Game.getServerStatusString() : "NoGame";
}
function dumpGameString()
{
error( getServerStatusString() );
}
function isOnAdminList(%client)
{
if( !%totalRecords = getFieldCount( $Host::AdminList ) )
{
return false;
}
for(%i = 0; %i < %totalRecords; %i++)
{
%record = getField( getRecord( $Host::AdminList, 0 ), %i);
if(%record == %client.guid)
return true;
}
return false;
}
function isOnSuperAdminList(%client)
{
if( !%totalRecords = getFieldCount( $Host::superAdminList ) )
{
return false;
}
for(%i = 0; %i < %totalRecords; %i++)
{
%record = getField( getRecord( $Host::superAdminList, 0 ), %i);
if(%record == %client.guid)
return true;
}
return false;
}
function ServerCmdAddToAdminList( %admin, %client )
{
if( !%admin.isSuperAdmin )
return;
%count = getFieldCount( $Host::AdminList );
for ( %i = 0; %i < %count; %i++ )
{
%id = getField( $Host::AdminList, %i );
if ( %id == %client.guid )
{
return; // They're already there!
}
}
if( %count == 0 )
$Host::AdminList = %client.guid;
else
$Host::AdminList = $Host::AdminList TAB %client.guid;
// z0dd - ZOD, 4/29/02. Was not exporting to serverPrefs and did not message admin
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%admin, 'MsgAdmin', '\c3\"%1\"\c2 added to Admin list: \c3%2\c2.', %client.name, %client.guid);
logEcho(%admin.nameBase @ " added " @ %client.nameBase @ " " @ %client.guid @ " to Admin list.");
}
function ServerCmdAddToSuperAdminList( %admin, %client )
{
if( !%admin.isSuperAdmin )
return;
%count = getFieldCount( $Host::SuperAdminList );
for ( %i = 0; %i < %count; %i++ )
{
%id = getField( $Host::SuperAdminList, %i );
if ( %id == %client.guid )
return; // They're already there!
}
if( %count == 0 )
$Host::SuperAdminList = %client.guid;
else
$Host::SuperAdminList = $Host::SuperAdminList TAB %client.guid;
// z0dd - ZOD, 4/29/02. Was not exporting to serverPrefs and did not message admin
export( "$Host::*", "prefs/ServerPrefs.cs", false );
messageClient(%admin, 'MsgAdmin', '\c3\"%1\"\c2 added to Super Admin list: \c3%2\c2.', %client.name, %client.guid);
logEcho(%admin.nameBase @ " added " @ %client.nameBase @ " " @ %client.guid @ " to Super Admin list.");
}
function resetTournamentPlayers()
{
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
%cl.notready = 1;
%cl.notReadyCount = "";
}
}
function forceTourneyMatchStart()
{
%playerCount = 0;
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
if(%cl.camera.Mode $= "pre-game")
%playerCount++;
}
// don't start the mission until we have players
if(%playerCount == 0)
{
return false;
}
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
if(%cl.camera.Mode $= "pickingTeam")
{
// throw these guys into observer mode
if(Game.numTeams > 1)
commandToClient( %cl, 'processPickTeam'); // clear the pickteam menu
Game.forceObserver( %cl, "adminForce" );
}
}
return true;
}
function startTourneyCountdown()
{
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
ClearCenterPrint(%cl);
ClearBottomPrint(%cl);
}
// lets get it on!
Countdown( 30 * 1000 );
}
function checkTourneyMatchStart()
{
if( $CountdownStarted || $matchStarted )
return;
// loop through all the clients and see if any are still notready
%playerCount = 0;
%notReadyCount = 0;
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
if(%cl.camera.mode $= "pickingTeam")
{
%notReady[%notReadyCount] = %cl;
%notReadyCount++;
}
else if(%cl.camera.Mode $= "pre-game")
{
if(%cl.notready)
{
%notReady[%notReadyCount] = %cl;
%notReadyCount++;
}
else
{
%playerCount++;
}
}
else if(%cl.camera.Mode $= "observer")
{
// this guy is watching
}
}
if(%notReadyCount)
{
if(%notReadyCount == 1)
MessageAll( 'msgHoldingUp', '\c1%1 is holding things up!', %notReady[0].name);
else if(%notReadyCount < 4)
{
for(%i = 0; %i < %notReadyCount - 2; %i++)
%str = getTaggedString(%notReady[%i].name) @ ", " @ %str;
%str = "\c2" @ %str @ getTaggedString(%notReady[%i].name) @ " and " @ getTaggedString(%notReady[%i+1].name)
@ " are holding things up!";
MessageAll( 'msgHoldingUp', %str );
}
return;
}
if(%playerCount != 0)
{
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
%cl.notready = "";
%cl.notReadyCount = "";
ClearCenterPrint(%cl);
ClearBottomPrint(%cl);
}
if ( Game.scheduleVote !$= "" && Game.voteType $= "VoteMatchStart")
{
messageAll('closeVoteHud', "");
cancel(Game.scheduleVote);
Game.scheduleVote = "";
}
Countdown(30 * 1000);
}
}
function checkMissionStart()
{
%readyToStart = false;
for(%clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++)
{
%client = ClientGroup.getObject(%clientIndex);
if(%client.isReady)
{
%readyToStart = true;
break;
}
}
if(%readyToStart || ClientGroup.getCount() < 1)
{
if($Host::warmupTime > 0 && $CurrentMissionType !$= "SinglePlayer")
countDown($Host::warmupTime * 1000);
else
Game.startMatch();
for(%x = 0; %x < $NumVehiclesDeploy; %x++)
$VehiclesDeploy[%x].getDataBlock().schedule(%timeMS / 2, "vehicleDeploy", $VehiclesDeploy[%x], 0, 1);
$NumVehiclesDeploy = 0;
}
else
{
schedule(2000, ServerGroup, "checkMissionStart");
}
}
function Countdown(%timeMS)
{
if($countdownStarted)
return;
echo("starting mission countdown...");
if(isObject(Game))
%game = Game.getId();
else
return;
$countdownStarted = true;
Game.matchStart = Game.schedule( %timeMS, "StartMatch" );
if (%timeMS > 30000)
notifyMatchStart(%timeMS);
if(%timeMS >= 30000)
Game.thirtyCount = schedule(%timeMS - 30000, Game, "notifyMatchStart", 30000);
if(%timeMS >= 15000)
Game.fifteenCount = schedule(%timeMS - 15000, Game, "notifyMatchStart", 15000);
if(%timeMS >= 10000)
Game.tenCount = schedule(%timeMS - 10000, Game, "notifyMatchStart", 10000);
if(%timeMS >= 5000)
Game.fiveCount = schedule(%timeMS - 5000, Game, "notifyMatchStart", 5000);
if(%timeMS >= 4000)
Game.fourCount = schedule(%timeMS - 4000, Game, "notifyMatchStart", 4000);
if(%timeMS >= 3000)
Game.threeCount = schedule(%timeMS - 3000, Game, "notifyMatchStart", 3000);
if(%timeMS >= 2000)
Game.twoCount = schedule(%timeMS - 2000, Game, "notifyMatchStart", 2000);
if(%timeMS >= 1000)
Game.oneCount = schedule(%timeMS - 1000, Game, "notifyMatchStart", 1000);
}
function EndCountdown(%timeMS)
{
echo("mission end countdown...");
if(isObject(Game))
%game = Game.getId();
else
return;
if(%timeMS >= 60000)
Game.endsixtyCount = schedule(%timeMS - 60000, Game, "notifyMatchEnd", 60000);
if(%timeMS >= 30000)
Game.endthirtyCount = schedule(%timeMS - 30000, Game, "notifyMatchEnd", 30000);
if(%timeMS >= 10000)
Game.endtenCount = schedule(%timeMS - 10000, Game, "notifyMatchEnd", 10000);
if(%timeMS >= 5000)
Game.endfiveCount = schedule(%timeMS - 5000, Game, "notifyMatchEnd", 5000);
if(%timeMS >= 4000)
Game.endfourCount = schedule(%timeMS - 4000, Game, "notifyMatchEnd", 4000);
if(%timeMS >= 3000)
Game.endthreeCount = schedule(%timeMS - 3000, Game, "notifyMatchEnd", 3000);
if(%timeMS >= 2000)
Game.endtwoCount = schedule(%timeMS - 2000, Game, "notifyMatchEnd", 2000);
if(%timeMS >= 1000)
Game.endoneCount = schedule(%timeMS - 1000, Game, "notifyMatchEnd", 1000);
}
function CancelCountdown()
{
if(Game.sixtyCount !$= "")
cancel(Game.sixtyCount);
if(Game.thirtyCount !$= "")
cancel(Game.thirtyCount);
if(Game.fifteenCount !$= "")
cancel(Game.fifteenCount);
if(Game.tenCount !$= "")
cancel(Game.tenCount);
if(Game.fiveCount !$= "")
cancel(Game.fiveCount);
if(Game.fourCount !$= "")
cancel(Game.fourCount);
if(Game.threeCount !$= "")
cancel(Game.threeCount);
if(Game.twoCount !$= "")
cancel(Game.twoCount);
if(Game.oneCount !$= "")
cancel(Game.oneCount);
if(isObject(Game))
cancel(Game.matchStart);
Game.matchStart = "";
Game.thirtyCount = "";
Game.fifteenCount = "";
Game.tenCount = "";
Game.fiveCount = "";
Game.fourCount = "";
Game.threeCount = "";
Game.twoCount = "";
Game.oneCount = "";
$countdownStarted = false;
}
function CancelEndCountdown()
{
//cancel the mission end countdown...
if(Game.endsixtyCount !$= "")
cancel(Game.endsixtyCount);
if(Game.endthirtyCount !$= "")
cancel(Game.endthirtyCount);
if(Game.endtenCount !$= "")
cancel(Game.endtenCount);
if(Game.endfiveCount !$= "")
cancel(Game.endfiveCount);
if(Game.endfourCount !$= "")
cancel(Game.endfourCount);
if(Game.endthreeCount !$= "")
cancel(Game.endthreeCount);
if(Game.endtwoCount !$= "")
cancel(Game.endtwoCount);
if(Game.endoneCount !$= "")
cancel(Game.endoneCount);
Game.endmatchStart = "";
Game.endthirtyCount = "";
Game.endtenCount = "";
Game.endfiveCount = "";
Game.endfourCount = "";
Game.endthreeCount = "";
Game.endtwoCount = "";
Game.endoneCount = "";
}
function resetServerDefaults()
{
$resettingServer = true;
echo( "Resetting server defaults..." );
if( isObject( Game ) )
Game.gameOver();
// Override server defaults with prefs:
exec( "scripts/ServerDefaults.cs" );
exec( $serverprefs );
// ---------------------------------------------------
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
//convert the team skin and name vars to tags...
%index = 0;
while ($Host::TeamSkin[%index] !$= "")
{
$TeamSkin[%index] = addTaggedString($Host::TeamSkin[%index]);
%index++;
}
%index = 0;
while ($Host::TeamName[%index] !$= "")
{
$TeamName[%index] = addTaggedString($Host::TeamName[%index]);
%index++;
}
// Get the hologram names from the prefs...
%index = 1;
while ( $Host::holoName[%index] !$= "" )
{
$holoName[%index] = $Host::holoName[%index];
%index++;
}
// ---------------------------------------------------
// kick all bots...
removeAllBots();
// add bots back if they were there before..
if( $Host::botsEnabled ) // z0dd - ZOD, 9/29/02. Removed T2 demo code from here
initGameBots( $Host::Map, $Host::MissionType );
// load the missions
loadMission( $Host::Map, $Host::MissionType );
$resettingServer = false;
echo( "Server reset complete." );
}
function removeAllBots() //Wtf -- it crashes.
{
while( ClientGroup.getCount() )
{
%client = ClientGroup.getObject(0);
if(%client.isAIControlled())
{
%client.drop();
}
else
%client.delete();
}
}
function disconnectAllBots()
{
%count = ClientGroup.getCount();
for (%i = 0; %i < ClientGroup.getCount(); %i++)
{
%cl = ClientGroup.getObject(%i);
if (%cl.isAIControlled())
schedule(100,0,"Drop",%cl); //Needs a bit of a delay; or else the bots won't disconnect
}
}
function drop(%cl)
{
%cl.drop();
}
package ServerPackage
{
function AIConnection::Drop(%cl) //Fix the game crashing when .drop() is called on a bot more than once
{
if (%cl.dropped)
return;
%cl.dropped = true;
Parent::Drop(%cl);
}
};
activatePackage(ServerPackage);
//------------------------------------------------------------------------------
function getServerGUIDList()
{
%count = ClientGroup.getCount();
for ( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject( %i );
if ( isObject( %cl ) && !%cl.isSmurf && !%cl.isAIControlled() )
{
%guid = getField( %cl.getAuthInfo(), 3 );
if ( %guid != 0 )
{
if ( %list $= "" )
%list = %guid;
else
%list = %list TAB %guid;
}
}
}
return( %list );
}
//------------------------------------------------------------------------------
// will return the first admin found on the server
function getAdmin()
{
%admin = 0;
for ( %clientIndex = 0; %clientIndex < ClientGroup.getCount(); %clientIndex++ )
{
%cl = ClientGroup.getObject( %clientIndex );
if(%cl.isAdmin || %cl.isSuperAdmin)
{
%admin = %cl;
break;
}
}
return %admin;
}
function serverCmdSetPDAPose(%client, %val)
{
if(!isObject(%client.player))
return;
// if client is in a vehicle, return
if(%client.player.isMounted())
return;
if(%val)
{
// play "PDA" animation thread on player
if (%client.race $="Bioderm" || %client.race $="Draakan" || %client.race $= "Criollos") //PDA pose hackery to allow the Bioderm PDA anim
%client.player.setActionThread("IdlePDA", true);
else
%client.player.setActionThread("PDA", true);
}
else
{
// cancel PDA animation thread with another one.
%client.player.setActionThread("light_recoil", false);
}
}
function serverCmdProcessGameLink(%client, %arg1, %arg2, %arg3, %arg4, %arg5)
{
Game.processGameLink(%client, %arg1, %arg2, %arg3, %arg4, %arg5);
}
//-----------------------------------------------------------------------------------
// Dark Dragon DX - 1/26/10. I noticed certain objects are missing some functions.
function InteriorInstance::GetClassName(%this)
{
return "InteriorInstance";
}
function Terraformer::GetClassName(%this)
{
return "Terraformer";
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
// z0dd - ZOD, 6/03/02. New function. Impact hit sounds settings from clientprefs.cs.
function serverCmdSetHitSounds( %client, %playerHitsOn, %playerHitWav, %vehicleHitsOn, %vehicleHitWav )
{
%client.playerHitSound = %playerHitsOn;
%client.playerHitWav = addtaggedString(%playerHitWav);
%client.vehicleHitSound = %vehicleHitsOn;
%client.vehicleHitWav = addtaggedString(%vehicleHitWav);
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
// z0dd - ZOD, 6/03/02. New function. Get mod name from server.
function serverCMDgetMod(%client)
{
%paths = getModPaths();
commandToClient(%client, 'serverMod', %paths);
}
//-----------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------
// z0dd - ZOD, 10/03/02. New function. Admin HUD print feature
function serverCMDaprint(%client, %msg, %bottom)
{
if(%client.isAdmin)
{
%name = getTaggedString(%client.name);
%message = %name @ ": " @ %msg;
if(%bottom)
bottomprintAll(%message, 8, 3);
else
centerprintAll(%message, 8, 3);
}
}
//-----------------------------------------------------------------------------------