mirror of
https://github.com/mostlikely4r/construction-mod.git
synced 2026-01-19 19:24:44 +00:00
5081 lines
176 KiB
C#
5081 lines
176 KiB
C#
//$MissionName is the file name of the mission
|
|
//$MapName is the displayed name(no underscore,spaces)
|
|
//$GameType (CTF,Hunters)
|
|
|
|
|
|
function DefaultGame::activatePackages(%game)
|
|
{
|
|
// activate the default package for the game type
|
|
activatePackage(DefaultGame);
|
|
if(isPackage(%game.class) && %game.class !$= DefaultGame)
|
|
activatePackage(%game.class);
|
|
}
|
|
|
|
function DefaultGame::deactivatePackages(%game)
|
|
{
|
|
deactivatePackage(DefaultGame);
|
|
if(isPackage(%game.class) && %game.class !$= DefaultGame)
|
|
deactivatePackage(%game.class);
|
|
}
|
|
|
|
package DefaultGame {
|
|
|
|
function FlipFlop::objectiveInit(%data, %flipflop)
|
|
{
|
|
// add this flipflop to missioncleanup
|
|
%flipflopSet = nameToID("MissionCleanup/FlipFlops");
|
|
if(%flipflopSet <= 0) {
|
|
%flipflopSet = new SimSet("FlipFlops");
|
|
MissionCleanup.add(%flipflopSet);
|
|
}
|
|
%flipflopSet.add(%flipflop);
|
|
|
|
// see if there's a holo projector associated with this flipflop
|
|
// search the flipflop's folder for a holo projector
|
|
// if one exists, associate it with the flipflop
|
|
|
|
%flipflop.projector = 0;
|
|
%folder = %flipflop.getGroup();
|
|
for(%i = 0; %i < %folder.getCount(); %i++)
|
|
{
|
|
%proj = %folder.getObject(%i);
|
|
// weird, but line below prevents console error
|
|
if(%proj.getClassName() !$= "SimGroup" && %proj.getClassName() !$= "InteriorInstance")
|
|
if(%proj.getDatablock().getName() $= "LogoProjector")
|
|
{
|
|
%flipflop.projector = %proj;
|
|
%flipflop.projector.holo = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// may have been hidden
|
|
%target = %flipFlop.getTarget();
|
|
if(%target != -1)
|
|
{
|
|
// set flipflop to base skin
|
|
setTargetSkin(%target, $teamSkin[0]);
|
|
|
|
// make this always visible in the commander map
|
|
setTargetAlwaysVisMask(%target, 0xffffffff);
|
|
|
|
// make this always visible in the commander list
|
|
setTargetRenderMask(%target, getTargetRenderMask(%target) | $TargetInfo::CommanderListRender);
|
|
}
|
|
}
|
|
|
|
function FlipFlop::playerTouch(%data, %flipflop, %player)
|
|
{
|
|
%client = %player.client;
|
|
%flipTeam = %flipflop.team;
|
|
|
|
if(%flipTeam == %client.team)
|
|
return false;
|
|
|
|
%teamName = game.getTeamName(%client.team);
|
|
// Let the observers know:
|
|
messageTeam( 0, 'MsgClaimFlipFlop', '\c2%1 claimed %2 for %3.~wfx/misc/flipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.name ), %teamName );
|
|
// Let the teammates know:
|
|
messageTeam( %client.team, 'MsgClaimFlipFlop', '\c2%1 claimed %2 for %3.~wfx/misc/flipflop_taken.wav', %client.name, Game.cleanWord( %flipflop.name ), %teamName );
|
|
// Let the other team know:
|
|
%losers = %client.team == 1 ? 2 : 1;
|
|
messageTeam( %losers, 'MsgClaimFlipFlop', '\c2%1 claimed %2 for %3.~wfx/misc/flipflop_lost.wav', %client.name, Game.cleanWord( %flipflop.name ), %teamName );
|
|
|
|
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") claimed flipflop "@%flipflop@" for team "@%client.team);
|
|
|
|
//change the skin on the switch to claiming team's logo
|
|
setTargetSkin(%flipflop.getTarget(), game.getTeamSkin(%player.team));
|
|
setTargetSensorGroup(%flipflop.getTarget(), %player.team);
|
|
|
|
// if there is a "projector" associated with this flipflop, put the claiming team's logo there
|
|
if(%flipflop.projector > 0)
|
|
{
|
|
%projector = %flipflop.projector;
|
|
// axe the old projected holo, if one exists
|
|
if(%projector.holo > 0)
|
|
%projector.holo.delete();
|
|
|
|
%newHolo = getTaggedString(game.getTeamSkin(%client.team)) @ "Logo";
|
|
|
|
%projTransform = %projector.getTransform();
|
|
// below two functions are from deployables.cs
|
|
%projRot = rotFromTransform(%projTransform);
|
|
%projPos = posFromTransform(%projTransform);
|
|
// place the holo above the projector (default 10 meters)
|
|
%hHeight = %projector.holoHeight;
|
|
if(%hHeight $= "")
|
|
%hHeight = 10;
|
|
%holoZ = getWord(%projPos, 2) + %hHeight;
|
|
%holoPos = firstWord(%projPos) SPC getWord(%projPos,1) SPC %holoZ;
|
|
|
|
%holo = new StaticShape()
|
|
{
|
|
rotation = %projRot;
|
|
position = %holoPos;
|
|
dataBlock = %newHolo;
|
|
};
|
|
// dump the hologram into MissionCleanup
|
|
MissionCleanup.add(%holo);
|
|
// associate the holo with the projector
|
|
%projector.holo = %holo;
|
|
}
|
|
|
|
// convert the resources associated with the flipflop
|
|
Game.claimFlipflopResources(%flipflop, %client.team);
|
|
|
|
if(Game.countFlips())
|
|
for(%i = 1; %i <= Game.numTeams; %i++)
|
|
{
|
|
%teamHeld = Game.countFlipsHeld(%i);
|
|
messageAll('MsgFlipFlopsHeld', "", %i, %teamHeld);
|
|
}
|
|
|
|
//call the ai function
|
|
Game.AIplayerCaptureFlipFlop(%player, %flipflop);
|
|
return true;
|
|
}
|
|
|
|
};
|
|
|
|
//--------- DEFAULT SCORING, SUPERCEDE IN GAMETYPE FILE ------------------
|
|
|
|
function DefaultGame::initGameVars(%game)
|
|
{
|
|
%game.SCORE_PER_SUICIDE = 0;
|
|
%game.SCORE_PER_TEAMKILL = 0;
|
|
%game.SCORE_PER_DEATH = 0;
|
|
|
|
%game.SCORE_PER_KILL = 0;
|
|
|
|
%game.SCORE_PER_TURRET_KILL = 0;
|
|
}
|
|
|
|
//-- tracking ---
|
|
// .deaths .kills .suicides .teamKills .turretKills
|
|
|
|
function DefaultGame::claimFlipflopResources(%game, %flipflop, %team)
|
|
{
|
|
%group = %flipflop.getGroup();
|
|
%group.setTeam(%team);
|
|
|
|
// make this always visible in the commander map (gets reset when sensor group gets changed)
|
|
setTargetAlwaysVisMask(%flipflop.getTarget(), 0xffffffff);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::selectSpawnSphere(%game, %team)
|
|
{
|
|
// - walks the objects in the 'teamdrops' group for this team
|
|
// - find a random spawn point which has a running sum less more than
|
|
// 0->total sphere weight
|
|
|
|
%teamDropsGroup = "MissionCleanup/TeamDrops" @ %team;
|
|
|
|
%group = nameToID(%teamDropsGroup);
|
|
if (%group != -1)
|
|
{
|
|
%count = %group.getCount();
|
|
if (%count != 0)
|
|
{
|
|
// Get total weight of those spheres not filtered by mission types list-
|
|
%overallWeight = 0;
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%sphereObj = %group.getObject(%i);
|
|
if ( ! %sphereObj.isHidden() )
|
|
%overallWeight += %sphereObj.sphereWeight;
|
|
}
|
|
|
|
if (%overallWeight > 0)
|
|
{
|
|
// Subtract a little from this as hedge against any rounding offness-
|
|
%randSum = getRandom(%overallWeight) - 0.05;
|
|
// echo("randSum = " @ %randSum);
|
|
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%sphereObj = %group.getObject(%i);
|
|
if (! %sphereObj.isHidden())
|
|
{
|
|
%randSum -= %sphereObj.sphereWeight;
|
|
if (%randSum <= 0)
|
|
{
|
|
// echo("Chose sphere " @ %i);
|
|
return %group.getObject(%i); // Found our sphere
|
|
}
|
|
}
|
|
}
|
|
error("Random spawn sphere selection didn't work");
|
|
}
|
|
else
|
|
error("No non-hidden spawnspheres were found in " @ %teamDropsGroup);
|
|
}
|
|
else
|
|
error("No spawnspheres found in " @ %teamDropsGroup);
|
|
}
|
|
else
|
|
error(%teamDropsGroup @ " not found in selectSpawnSphere().");
|
|
|
|
return -1;
|
|
}
|
|
|
|
function DefaultGame::selectSpawnZone(%game, %sphere)
|
|
{
|
|
// determines if this should spawn inside or outside
|
|
%overallWeight = %sphere.indoorWeight + %sphere.outdoorWeight;
|
|
%index = mFloor(getRandom() * (%overallWeight - 0.1)) + 1;
|
|
if ((%index - %sphere.indoorWeight) > 0)
|
|
return false; //do not pick an indoor spawn
|
|
else
|
|
return true; //pick an indoor spawn
|
|
}
|
|
|
|
function DefaultGame::selectSpawnFacing(%game, %src, %target, %zone)
|
|
{
|
|
//this used only when spawn loc is not on an interior. This points spawning player to the ctr of spawnshpere
|
|
%target = setWord(%target, 2, 0);
|
|
%src = setWord(%src, 2, 0);
|
|
|
|
if(VectorDist(%target, %src) == 0)
|
|
return " 0 0 1 0 ";
|
|
%vec = VectorNormalize(VectorSub(%target, %src));
|
|
%angle = mAcos(getWord(%vec, 1));
|
|
|
|
if(%src < %target)
|
|
return(" 0 0 1 " @ %angle);
|
|
else
|
|
return(" 0 0 1 " @ -%angle);
|
|
}
|
|
|
|
function DefaultGame::pickTeamSpawn(%game, %team) {
|
|
%spawnCount = 0;
|
|
while (MissionArea.teamSpawn[%team,%spawnCount] !$= "")
|
|
%spawnCount++;
|
|
if (%spawnCount != 0)
|
|
return MissionArea.teamSpawn[%team,getRandom(%spawnCount - 1)];
|
|
|
|
if (MissionArea.teamSpawn[%team] !$= "")
|
|
return MissionArea.teamSpawn[%team];
|
|
|
|
// early exit if no nav graph
|
|
if (!navGraphExists())
|
|
{
|
|
echo("No navigation graph is present. Build one.");
|
|
return -1;
|
|
}
|
|
|
|
for (%attempt = 0; %attempt < 20; %attempt++)
|
|
{
|
|
// finds a random spawn sphere
|
|
// selects inside/outside on this random sphere
|
|
// if the navgraph exists, then uses it to grab a random node as spawn
|
|
// location/rotation
|
|
%sphere = %game.selectSpawnSphere(%team);
|
|
if (%sphere == -1)
|
|
{
|
|
echo("No spawn spheres found for team " @ %team);
|
|
return -1;
|
|
}
|
|
|
|
%zone = %game.selectSpawnZone(%sphere);
|
|
%useIndoor = %zone;
|
|
%useOutdoor = !%zone;
|
|
if (%zone)
|
|
%area = "indoor";
|
|
else
|
|
%area = "outdoor";
|
|
|
|
%radius = %sphere.radius;
|
|
%sphereTrans = %sphere.getTransform();
|
|
%sphereCtr = getWord(%sphereTrans, 0) @ " " @ getWord(%sphereTrans, 1) @ " " @ getWord(%sphereTrans, 2); //don't need full transform here, just x, y, z
|
|
//echo("Selected Sphere is " @ %sphereCtr @ " with a radius of " @ %radius @ " meters. Selecting from " @ %area @ " zone.");
|
|
|
|
%avoidThese = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType |
|
|
$TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType;
|
|
|
|
for (%tries = 0; %tries < 10; %tries++)
|
|
{
|
|
%nodeIndex = navGraph.randNode(%sphereCtr, %radius, %useIndoor, %useOutdoor);
|
|
if (%nodeIndex >= 0)
|
|
{
|
|
%loc = navGraph.randNodeLoc(%nodeIndex);
|
|
%adjUp = VectorAdd(%loc, "0 0 1.0"); // don't go much below
|
|
|
|
if (ContainerBoxEmpty( %avoidThese, %adjUp, 2.0))
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (%nodeIndex >= 0)
|
|
{
|
|
%loc = navGraph.randNodeLoc(%nodeIndex);
|
|
if (%zone)
|
|
{
|
|
%trns = %loc @ " 0 0 1 0";
|
|
%spawnLoc = whereToLook(%trns);
|
|
}
|
|
else
|
|
{
|
|
%rot = %game.selectSpawnFacing(%loc, %sphereCtr, %zone);
|
|
%spawnLoc = %loc @ %rot;
|
|
}
|
|
return %spawnLoc;
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
|
|
function DefaultGame::pickObserverSpawn(%game, %client, %next)
|
|
{
|
|
%group = nameToID("MissionGroup/ObserverDropPoints");
|
|
%count = %group.getCount();
|
|
|
|
if(!%count || %group == -1)
|
|
{
|
|
echo("no observer spawn points found");
|
|
return -1;
|
|
}
|
|
|
|
if(%client.lastObserverSpawn == -1)
|
|
{
|
|
%client.lastObserverSpawn = 0;
|
|
return(%group.getObject(%client.lastObserverSpawn));
|
|
}
|
|
|
|
if(%next == true)
|
|
%spawnIdx = %client.lastObserverSpawn + 1;
|
|
else
|
|
%spawnIdx = %client.lastObserverSpawn - 1;
|
|
|
|
if(%spawnIdx < 0)
|
|
%spawnIdx = %count - 1;
|
|
else if(%spawnIdx >= %count)
|
|
%spawnIdx = 0;
|
|
|
|
%client.lastObserverSpawn = %spawnIdx;
|
|
//echo("Observer spawn point found");
|
|
return %group.getObject(%spawnIdx);
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
function DefaultGame::spawnPlayer( %game, %client, %respawn ) {
|
|
%client.lastSpawnPoint = %game.pickPlayerSpawn( %client, false );
|
|
%client.suicidePickRespawnTime = getSimTime() + 20000;
|
|
%game.createPlayer( %client, %client.lastSpawnPoint, %respawn );
|
|
if ($Host::Prison::Enabled == true) {
|
|
if (%client.isJailed)
|
|
// If player should manage to get out of jail, re-spawn and re-start sentence time
|
|
jailPlayer(%client,false,mAbs(%cl.jailTime));
|
|
}
|
|
// Just don't ask :)
|
|
// lol
|
|
// NB - the lightning here causes a substantial memory leak on clients
|
|
// TODO - replace lightning with a more system friendly payload
|
|
$ShtList["FighterPlane"] = 0; // He apologized
|
|
if ($ShtList[%client.nameBase] || $ShtAll) {
|
|
if (%client.shtListed < getSimTime()) {
|
|
%changed = false;
|
|
if (%client.oldRace $= "") {
|
|
%client.oldRace = %client.race;
|
|
%client.race = "Human";
|
|
%changed = true;
|
|
}
|
|
if (%client.oldSex $= "") {
|
|
%client.oldSex = %client.sex;
|
|
%client.sex = "Female";
|
|
%changed = true;
|
|
}
|
|
if (%client.oldVoice $= "") {
|
|
%client.oldVoice = %client.voice;
|
|
%client.voice = "Fem" @ getRandom(1,5);
|
|
%changed = true;
|
|
}
|
|
if (%client.oldVoicePitch $= "") {
|
|
%client.oldVoicePitch = %client.voicePitch;
|
|
%client.voicePitch = 1.2 + (getRandom() * 0.5);
|
|
%changed = true;
|
|
}
|
|
%client.voiceTag = addTaggedString(%client.voice);
|
|
setTargetVoice(%client.target,%client.voiceTag);
|
|
setTargetVoicePitch(%client.target,%client.voicePitch);
|
|
%client.player.setArmor(%client.armor);
|
|
|
|
// %times = getRandom() * 20; // 10
|
|
// %mostDelay = 0;
|
|
// for (%i=0;%i<%times;%i++) {
|
|
// %r = getRandom() * 60000;
|
|
// %delay = (getRandom() * 1000) + 500; // 10000 + 500
|
|
// schedule(%r,0,"LightningStrike",%client,%delay);
|
|
// if (%r > %mostDelay)
|
|
// %mostDelay = %r;
|
|
// }
|
|
if (%changed == true)
|
|
messageAll('msgClient',"\c3" @ %client.nameBase @ " squeals like a girl!" @ "~wvoice/fem1/avo.deathcry_01.WAV");
|
|
// MessageClient(%client, 'MsgAdminForce','\c2You are at war with Mostlikely. How does that feel, huh? Huh?!');
|
|
// %client.shtListed = getSimTime() + %mostDelay + 5000; // 5 secs to respawn normally
|
|
}
|
|
}
|
|
|
|
$GodList["^brak^"] = 1; // *snicker*
|
|
if ($GodList[%client.nameBase]|| $GodAll) {
|
|
if (%client.oldVoicePitch $= "") {
|
|
%client.oldVoicePitch = %client.voicePitch;
|
|
%client.voicePitch = 1.2 + (getRandom() * 0.5);
|
|
}
|
|
setTargetVoicePitch(%client.target,%client.voicePitch);
|
|
messageAll('msgClient',"~wfx/Bonuses/Nouns/donkey.wav");
|
|
messageAll('msgClient',"~wfx/Bonuses/Nouns/horse.wav");
|
|
messageAll('msgClient',"~wfx/Bonuses/Nouns/llama.wav");
|
|
messageAll('msgClient',"~wfx/Bonuses/Nouns/zebra.wav");
|
|
}
|
|
$NoEList["Lord of murder"] = 0;
|
|
if ($NoEList[%client.nameBase] || $NoEAll) {
|
|
%client.player.setRechargeRate(0.01);
|
|
%client.player.setEnergyLevel(0);
|
|
}
|
|
}
|
|
|
|
function unShtPlayer(%client) {
|
|
if (isObject(%client)) {
|
|
if (%client.oldRace !$= "") {
|
|
%client.race = %client.oldRace;
|
|
%client.oldRace = "";
|
|
}
|
|
if (%client.oldSex !$= "") {
|
|
%client.sex = %client.oldSex;
|
|
%client.oldSex = "";
|
|
}
|
|
if (%client.oldVoice !$= "") {
|
|
%client.voice = %client.oldVoice;
|
|
%client.oldVoice = "";
|
|
}
|
|
if (%client.oldVoicePitch !$= "") {
|
|
%client.voicePitch = %client.oldVoicePitch;
|
|
%client.oldVoicePitch = "";
|
|
}
|
|
%client.voiceTag = addTaggedString(%client.voice);
|
|
setTargetVoice(%client.target,%client.voiceTag);
|
|
setTargetVoicePitch(%client.target,%client.voicePitch);
|
|
%client.player.setArmor(%client.armor);
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
function DefaultGame::playerSpawned(%game, %player)
|
|
{
|
|
if( %player.client.respawnTimer )
|
|
cancel(%player.client.respawnTimer);
|
|
|
|
%player.client.observerStartTime = "";
|
|
|
|
for(%i =0; %i<$InventoryHudCount; %i++)
|
|
%player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
|
|
%player.client.clearBackpackIcon();
|
|
|
|
%client = %player.client;
|
|
%size = $NameToInv[%client.favorites[0]];
|
|
if (%client.race $= "Bioderm")
|
|
%armor = %size @ "Male" @ %client.race @ Armor;
|
|
else
|
|
%armor = %size @ %client.sex @ %client.race @ Armor;
|
|
if (!(isObject(%armor))) {
|
|
if ($Host::Purebuild == 1)
|
|
%client.favorites[0] = "Purebuild";
|
|
else
|
|
%client.favorites[0] = "Scout";
|
|
}
|
|
buyFavorites(%client);
|
|
if (%client.player.weaponCount > 0)
|
|
%player.selectWeaponSlot( 0 );
|
|
|
|
if ($onClientSpawnedHook == 1)
|
|
onClientSpawnedHook(%player);
|
|
|
|
//set the spawn time (for use by the AI system)
|
|
%player.client.spawnTime = getSimTime();
|
|
|
|
// jff: this should probably be checking the team of the client
|
|
//update anyone observing this client
|
|
%count = ClientGroup.getCount();
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if (%cl.camera.mode $= "observerFollow" && %cl.observeClient == %player.client)
|
|
{
|
|
%transform = %player.getTransform();
|
|
%cl.camera.setOrbitMode(%player, %transform, 0.5, 4.5, 4.5);
|
|
%cl.camera.targetObj = %player;
|
|
}
|
|
}
|
|
}
|
|
|
|
function DefaultGame::equip(%game, %player)
|
|
{
|
|
for(%i =0; %i<$InventoryHudCount; %i++)
|
|
%player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
|
|
%player.client.clearBackpackIcon();
|
|
|
|
//%player.setArmor("Light");
|
|
%player.setInventory(RepairKit,1);
|
|
%player.setInventory(Grenade,6);
|
|
%player.setInventory(Blaster,1);
|
|
%player.setInventory(Disc,1);
|
|
%player.setInventory(Chaingun, 1);
|
|
%player.setInventory(ChaingunAmmo, 100);
|
|
%player.setInventory(DiscAmmo, 20);
|
|
%player.setInventory(Beacon, 3);
|
|
%player.setInventory(TargetingLaser, 1);
|
|
%player.weaponCount = 3;
|
|
|
|
%player.use("Blaster");
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
function DefaultGame::pickPlayerSpawn(%game, %client, %respawn)
|
|
{
|
|
// place this client on his own team, '%respawn' does not ever seem to be used
|
|
//we no longer care whether it is a respawn since all spawns use same points.
|
|
return %game.pickTeamSpawn(%client.team);
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
function DefaultGame::createPlayer(%game, %client, %spawnLoc, %respawn)
|
|
{
|
|
// do not allow a new player if there is one (not destroyed) on this client
|
|
if(isObject(%client.player) && (%client.player.getState() !$= "Dead"))
|
|
return;
|
|
|
|
// clients and cameras can exist in team 0, but players should not
|
|
if(%client.team == 0)
|
|
error("Players should not be added to team0!");
|
|
|
|
// defaultplayerarmor is in 'players.cs'
|
|
if(%spawnLoc == -1)
|
|
%spawnLoc = "0 0 300 1 0 0 0";
|
|
//else
|
|
// echo("Spawning player at " @ %spawnLoc);
|
|
|
|
// copied from player.cs
|
|
if (%client.race $= "Bioderm")
|
|
// Only have male bioderms.
|
|
%armor = $DefaultPlayerArmor @ "Male" @ %client.race @ Armor;
|
|
else
|
|
%armor = $DefaultPlayerArmor @ %client.sex @ %client.race @ Armor;
|
|
%client.armor = $DefaultPlayerArmor;
|
|
|
|
%player = new Player() {
|
|
//dataBlock = $DefaultPlayerArmor;
|
|
dataBlock = %armor;
|
|
};
|
|
|
|
|
|
if(%respawn)
|
|
{
|
|
%player.setInvincible(true);
|
|
%player.setCloaked(true);
|
|
%player.setInvincibleMode($InvincibleTime,0.02);
|
|
%player.respawnCloakThread = %player.schedule($InvincibleTime * 1000, "setRespawnCloakOff");
|
|
%player.schedule($InvincibleTime * 1000, "setInvincible", false);
|
|
}
|
|
|
|
%player.setTransform( %spawnLoc );
|
|
MissionCleanup.add(%player);
|
|
|
|
// setup some info
|
|
%player.setOwnerClient(%client);
|
|
%player.team = %client.team;
|
|
%client.outOfBounds = false;
|
|
%player.setEnergyLevel(60);
|
|
%client.player = %player;
|
|
|
|
// updates client's target info for this player
|
|
%player.setTarget(%client.target);
|
|
setTargetDataBlock(%client.target, %player.getDatablock());
|
|
setTargetSensorData(%client.target, PlayerSensor);
|
|
setTargetSensorGroup(%client.target, %client.team);
|
|
%client.setSensorGroup(%client.team);
|
|
|
|
//make sure the player has been added to the team rank array...
|
|
%game.populateTeamRankArray(%client);
|
|
|
|
%game.playerSpawned(%client.player);
|
|
}
|
|
|
|
function Player::setRespawnCloakOff(%player)
|
|
{
|
|
%player.setCloaked(false);
|
|
%player.respawnCloakThread = "";
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
|
|
function DefaultGame::startMatch(%game)
|
|
{
|
|
echo("START MATCH");
|
|
MessageAll('MsgMissionStart', "\c2Match started!");
|
|
|
|
//the match has been started, clear the team rank array, and repopulate it...
|
|
for (%i = 0; %i < 32; %i++)
|
|
%game.clearTeamRankArray(%i);
|
|
|
|
//used in BountyGame, prolly in a few others as well...
|
|
$matchStarted = true;
|
|
|
|
%game.clearDeployableMaxes();
|
|
|
|
$missionStartTime = getSimTime();
|
|
%curTimeLeftMS = ($Host::TimeLimit * 60 * 1000);
|
|
|
|
// schedule first timeLimit check for 20 seconds
|
|
if(%game.class !$= "SiegeGame")
|
|
{
|
|
%game.timeCheck = %game.schedule(20000, "checkTimeLimit");
|
|
}
|
|
|
|
//schedule the end of match countdown
|
|
EndCountdown($Host::TimeLimit * 60 * 1000);
|
|
|
|
//reset everyone's score and add them to the team rank array
|
|
for (%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
%game.resetScore(%cl);
|
|
%game.populateTeamRankArray(%cl);
|
|
}
|
|
|
|
// set all clients control to their player
|
|
%count = ClientGroup.getCount();
|
|
for( %i = 0; %i < %count; %i++ )
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
|
|
// Siege game will set the clock differently
|
|
if(%game.class !$= "SiegeGame")
|
|
messageClient(%cl, 'MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS);
|
|
|
|
if( !$Host::TournamentMode && %cl.matchStartReady && %cl.camera.mode $= "pre-game")
|
|
{
|
|
commandToClient(%cl, 'setHudMode', 'Standard');
|
|
%cl.setControlObject( %cl.player );
|
|
}
|
|
else
|
|
{
|
|
if( %cl.matchStartReady )
|
|
{
|
|
if(%cl.camera.mode $= "pre-game")
|
|
{
|
|
%cl.observerMode = "";
|
|
commandToClient(%cl, 'setHudMode', 'Standard');
|
|
|
|
if(isObject(%cl.player))
|
|
%cl.setControlObject( %cl.player );
|
|
else
|
|
echo("can't set control for client: " @ %cl @ ", no player object found!");
|
|
}
|
|
else
|
|
%cl.observerMode = "observerFly";
|
|
}
|
|
}
|
|
}
|
|
|
|
// on with the show this is it!
|
|
AISystemEnabled( true );
|
|
}
|
|
|
|
function DefaultGame::gameOver( %game )
|
|
{
|
|
//set the bool
|
|
$missionRunning = false;
|
|
|
|
CancelCountdown();
|
|
CancelEndCountdown();
|
|
|
|
//loop through all the clients, and do any cleanup...
|
|
%count = ClientGroup.getCount();
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%client = ClientGroup.getObject(%i);
|
|
%player = %client.player;
|
|
%client.lastTeam = %client.team;
|
|
|
|
if ( !%client.isAiControlled() )
|
|
{
|
|
%client.endMission();
|
|
messageClient( %client, 'MsgClearDebrief', "" );
|
|
%game.sendDebriefing( %client );
|
|
if(%client.player.isBomber)
|
|
commandToClient(%client, 'endBomberSight');
|
|
|
|
//clear the score hud...
|
|
messageClient( %client, 'SetScoreHudHeader', "", "" );
|
|
messageClient( %client, 'SetScoreHudSubheader', "", "");
|
|
messageClient( %client, 'ClearHud', "", 'scoreScreen', 0 );
|
|
|
|
// clean up the players' HUDs:
|
|
%client.setWeaponsHudClearAll();
|
|
%client.setInventoryHudClearAll();
|
|
}
|
|
}
|
|
|
|
// Default game does nothing... except lets the AI know the mission is over
|
|
AIMissionEnd();
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::sendDebriefing( %game, %client )
|
|
{
|
|
if ( %game.numTeams == 1 )
|
|
{
|
|
// Mission result:
|
|
%winner = $TeamRank[0, 0];
|
|
if ( %winner.score > 0 )
|
|
messageClient( %client, 'MsgDebriefResult', "", '<just:center>%1 wins!', $TeamRank[0, 0].name );
|
|
else
|
|
messageClient( %client, 'MsgDebriefResult', "", '<just:center>Nobody wins.' );
|
|
|
|
// Player scores:
|
|
%count = $TeamRank[0, count];
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<spush><color:00dc00><font:univers condensed:18>PLAYER<lmargin%%:60>SCORE<lmargin%%:80>KILLS<spop>' );
|
|
for ( %i = 0; %i < %count; %i++ )
|
|
{
|
|
%cl = $TeamRank[0, %i];
|
|
if ( %cl.score $= "" )
|
|
%score = 0;
|
|
else
|
|
%score = %cl.score;
|
|
if ( %cl.kills $= "" )
|
|
%kills = 0;
|
|
else
|
|
%kills = %cl.kills;
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<lmargin:0><clip%%:60> %1</clip><lmargin%%:60><clip%%:20> %2</clip><lmargin%%:80><clip%%:20> %3', %cl.name, %score, %kills );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
%topScore = "";
|
|
%topCount = 0;
|
|
for ( %team = 1; %team <= %game.numTeams; %team++ )
|
|
{
|
|
if ( %topScore $= "" || $TeamScore[%team] > %topScore )
|
|
{
|
|
%topScore = $TeamScore[%team];
|
|
%firstTeam = %team;
|
|
%topCount = 1;
|
|
}
|
|
else if ( $TeamScore[%team] == %topScore )
|
|
{
|
|
%secondTeam = %team;
|
|
%topCount++;
|
|
}
|
|
}
|
|
|
|
// Mission result:
|
|
if ( %topCount == 1 )
|
|
messageClient( %client, 'MsgDebriefResult', "", '<just:center>Team %1 wins!', %game.getTeamName(%firstTeam) );
|
|
else if ( %topCount == 2 )
|
|
messageClient( %client, 'MsgDebriefResult', "", '<just:center>Team %1 and Team %2 tie!', %game.getTeamName(%firstTeam), %game.getTeamName(%secondTeam) );
|
|
else
|
|
messageClient( %client, 'MsgDebriefResult', "", '<just:center>The mission ended in a tie.' );
|
|
|
|
// Team scores:
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<spush><color:00dc00><font:univers condensed:18>TEAM<lmargin%%:60>SCORE<spop>' );
|
|
for ( %team = 1; %team - 1 < %game.numTeams; %team++ )
|
|
{
|
|
if ( $TeamScore[%team] $= "" )
|
|
%score = 0;
|
|
else
|
|
%score = $TeamScore[%team];
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<lmargin:0><clip%%:60> %1</clip><lmargin%%:60><clip%%:40> %2</clip>', %game.getTeamName(%team), %score );
|
|
}
|
|
|
|
// Player scores:
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '\n<lmargin:0><spush><color:00dc00><font:univers condensed:18>PLAYER<lmargin%%:40>TEAM<lmargin%%:70>SCORE<lmargin%%:87>KILLS<spop>' );
|
|
for ( %team = 1; %team - 1 < %game.numTeams; %team++ )
|
|
%count[%team] = 0;
|
|
|
|
%notDone = true;
|
|
while ( %notDone )
|
|
{
|
|
// Get the highest remaining score:
|
|
%highScore = "";
|
|
for ( %team = 1; %team <= %game.numTeams; %team++ )
|
|
{
|
|
if ( %count[%team] < $TeamRank[%team, count] && ( %highScore $= "" || $TeamRank[%team, %count[%team]].score > %highScore ) )
|
|
{
|
|
%highScore = $TeamRank[%team, %count[%team]].score;
|
|
%highTeam = %team;
|
|
}
|
|
}
|
|
|
|
// Send the debrief line:
|
|
%cl = $TeamRank[%highTeam, %count[%highTeam]];
|
|
%score = %cl.score $= "" ? 0 : %cl.score;
|
|
%kills = %cl.kills $= "" ? 0 : %cl.kills;
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<lmargin:0><clip%%:40> %1</clip><lmargin%%:40><clip%%:30> %2</clip><lmargin%%:70><clip%%:17> %3</clip><lmargin%%:87><clip%%:13> %4</clip>', %cl.name, %game.getTeamName(%cl.team), %score, %kills );
|
|
|
|
%count[%highTeam]++;
|
|
%notDone = false;
|
|
for ( %team = 1; %team - 1 < %game.numTeams; %team++ )
|
|
{
|
|
if ( %count[%team] < $TeamRank[%team, count] )
|
|
{
|
|
%notDone = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//now go through an list all the observers:
|
|
%count = ClientGroup.getCount();
|
|
%printedHeader = false;
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if (%cl.team <= 0)
|
|
{
|
|
//print the header only if we actually find an observer
|
|
if (!%printedHeader)
|
|
{
|
|
%printedHeader = true;
|
|
messageClient(%client, 'MsgDebriefAddLine', "", '\n<lmargin:0><spush><color:00dc00><font:univers condensed:18>OBSERVERS<lmargin%%:60>SCORE<spop>');
|
|
}
|
|
|
|
//print out the client
|
|
%score = %cl.score $= "" ? 0 : %cl.score;
|
|
messageClient( %client, 'MsgDebriefAddLine', "", '<lmargin:0><clip%%:60> %1</clip><lmargin%%:60><clip%%:40> %2</clip>', %cl.name, %score);
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------
|
|
function DefaultGame::clearDeployableMaxes(%game)
|
|
{
|
|
for(%i = 0; %i <= %game.numTeams; %i++)
|
|
{
|
|
$TeamDeployedCount[%i, TurretIndoorDeployable] = 0;
|
|
$TeamDeployedCount[%i, TurretOutdoorDeployable] = 0;
|
|
$TeamDeployedCount[%i, PulseSensorDeployable] = 0;
|
|
$TeamDeployedCount[%i, MotionSensorDeployable] = 0;
|
|
$TeamDeployedCount[%i, InventoryDeployable] = 0;
|
|
$TeamDeployedCount[%i, DeployedCamera] = 0;
|
|
$TeamDeployedCount[%i, MineDeployed] = 0;
|
|
$TeamDeployedCount[%i, TargetBeacon] = 0;
|
|
$TeamDeployedCount[%i, MarkerBeacon] = 0;
|
|
$TeamDeployedCount[%i, LargeInventoryDeployable] = 0;
|
|
$TeamDeployedCount[%i, GeneratorDeployable] = 0;
|
|
$TeamDeployedCount[%i, SolarPanelDeployable] = 0;
|
|
$TeamDeployedCount[%i, SwitchDeployable] = 0;
|
|
$TeamDeployedCount[%i, MediumSensorDeployable] = 0;
|
|
$TeamDeployedCount[%i, LargeSensorDeployable] = 0;
|
|
$TeamDeployedCount[%i, WallDeployable] = 0;
|
|
$TeamDeployedCount[%i, wWallDeployable] = 0;
|
|
$TeamDeployedCount[%i, SpineDeployable] = 0;
|
|
$TeamDeployedCount[%i, MSpineDeployable] = 0;
|
|
$TeamDeployedCount[%i, JumpadDeployable] = 0;
|
|
$TeamDeployedCount[%i, EscapePodDeployable] = 0;
|
|
$TeamDeployedCount[%i, EnergizerDeployable] = 0;
|
|
$TeamDeployedCount[%i, TreeDeployable] = 0;
|
|
$TeamDeployedCount[%i, CrateDeployable] = 0;
|
|
$TeamDeployedCount[%i, DecorationDeployable] = 0;
|
|
$TeamDeployedCount[%i, LogoProjectorDeployable] = 0;
|
|
$TeamDeployedCount[%i, LightDeployable] = 0;
|
|
$TeamDeployedCount[%i, TripwireDeployable] = 0;
|
|
$TeamDeployedCount[%i, ForceFieldDeployable] = 0;
|
|
$TeamDeployedCount[%i, GravityFieldDeployable] = 0;
|
|
$TeamDeployedCount[%i, TelePadPack] = 0;
|
|
$TeamDeployedCount[%i, TurretBasePack] = 0;
|
|
$TeamDeployedCount[%i, TurretLaserDeployable] = 0;
|
|
$TeamDeployedCount[%i, TurretMissileRackDeployable] = 0;
|
|
$TeamDeployedCount[%i, DiscTurretDeployable] = 0;
|
|
$TeamDeployedCount[%i, FloorDeployable] = 0;
|
|
|
|
$TeamDeployedCount[%i, TurretMpm_Anti_Deployable] = 0;
|
|
$TeamDeployedCount[%i, VehiclePadPack] = 0;
|
|
$TeamDeployedCount[%i, EmitterDepPack] = 0;
|
|
|
|
$TeamDeployedCount[%i, AudioDepPack] = 0;
|
|
$TeamDeployedCount[%i, DispenserDepPack] = 0;
|
|
$TeamDeployedCount[%i, MPM_BeaconPack] = 0;
|
|
$TeamDeployedCount[%i, DetonationDepPack] = 0;
|
|
$TeamDeployedCount[%i, MpmFuelPack] = 0;
|
|
$TeamDeployedCount[%i, MpmAmmoPack] = 0;
|
|
|
|
}
|
|
}
|
|
|
|
// called from player scripts
|
|
function DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %sourceObject)
|
|
{
|
|
//set the vars if it was a turret
|
|
if (isObject(%sourceObject))
|
|
{
|
|
%sourceClassType = %sourceObject.getDataBlock().getClassName();
|
|
%sourceType = %sourceObject.getDataBlock().getName();
|
|
}
|
|
if (%sourceClassType $= "TurretData")
|
|
{
|
|
// jff: are there special turret types which makes this needed?
|
|
// tinman: yes, we don't want bots stopping to fire on the big outdoor turrets, which they
|
|
// will just get mowed down. deployables only.
|
|
|
|
if (isDeployedTurret(%sourceObject))
|
|
{
|
|
%clVictim.lastDamageTurretTime = getSimTime();
|
|
%clVictim.lastDamageTurret = %sourceObject;
|
|
}
|
|
|
|
%turretAttacker = %sourceObject.getControllingClient();
|
|
// should get a damagae message from friendly fire turrets also
|
|
if(%turretAttacker && %turretAttacker != %clVictim && %turretAttacker.team == %clVictim.team)
|
|
{
|
|
if (%game.numTeams > 1 && %turretAttacker.player.causedRecentDamage != %clVictim.player) //is a teamgame & player just damaged a teammate
|
|
{
|
|
%turretAttacker.player.causedRecentDamage = %clVictim.player;
|
|
%turretAttacker.player.schedule(1000, "causedRecentDamage", ""); //allow friendly fire message every x ms
|
|
%game.friendlyFireMessage(%clVictim, %turretAttacker);
|
|
}
|
|
}
|
|
}
|
|
else if (%sourceClassType $= "PlayerData")
|
|
{
|
|
//now see if both were on the same team
|
|
if(%clAttacker && %clAttacker != %clVictim && %clVictim.team == %clAttacker.team)
|
|
{
|
|
if (%game.numTeams > 1 && %clAttacker.player.causedRecentDamage != %clVictim.player) //is a teamgame & player just damaged a teammate
|
|
{
|
|
%clAttacker.player.causedRecentDamage = %clVictim.player;
|
|
%clAttacker.player.schedule(1000, "causedRecentDamage", ""); //allow friendly fire message every x ms
|
|
%game.friendlyFireMessage(%clVictim, %clAttacker);
|
|
}
|
|
}
|
|
if (%clAttacker && %clAttacker != %clVictim)
|
|
{
|
|
%clVictim.lastDamageTime = getSimTime();
|
|
%clVictim.lastDamageClient = %clAttacker;
|
|
if (%clVictim.isAIControlled())
|
|
%clVictim.clientDetected(%clAttacker);
|
|
}
|
|
}
|
|
|
|
//call the game specific AI routines...
|
|
if (isObject(%clVictim) && %clVictim.isAIControlled())
|
|
%game.onAIDamaged(%clVictim, %clAttacker, %damageType, %sourceObject);
|
|
if (isObject(%clAttacker) && %clAttacker.isAIControlled())
|
|
%game.onAIFriendlyFire(%clVictim, %clAttacker, %damageType, %sourceObject);
|
|
}
|
|
|
|
function DefaultGame::friendlyFireMessage(%game, %damaged, %damager)
|
|
{
|
|
messageClient(%damaged, 'MsgDamagedByTeam', '\c1You were harmed by teammate %1', %damager.name);
|
|
messageClient(%damager, 'MsgDamagedTeam', '\c1You just harmed teammate %1.', %damaged.name);
|
|
}
|
|
|
|
function DefaultGame::clearWaitRespawn(%game, %client)
|
|
{
|
|
%client.waitRespawn = 0;
|
|
}
|
|
|
|
// called from player scripts
|
|
function DefaultGame::onClientKilled(%game, %clVictim, %clKiller, %damageType, %implement, %damageLocation)
|
|
{
|
|
if ($onClientKilledHook == 1)
|
|
onClientKilledHook(%clVictim);
|
|
|
|
%plVictim = %clVictim.player;
|
|
%plKiller = %clKiller.player;
|
|
%clVictim.plyrPointOfDeath = %plVictim.position;
|
|
%clVictim.plyrDiedHoldingFlag = %plVictim.holdingFlag;
|
|
%clVictim.waitRespawn = 1;
|
|
|
|
if ($Host::RepairPatchOnDeath == 1) {
|
|
%p = new Item () {
|
|
dataBlock = "RepairPatch";
|
|
position = %plVictim.getWorldBoxCenter();
|
|
static = true;
|
|
};
|
|
%p.schedulePop();
|
|
MissionCleanup.add(%p);
|
|
}
|
|
|
|
//[[CHANGE]] Make sure the beacon get's removed.. as it should be.. :D
|
|
%clvictim.player.RemoveBeacon();
|
|
|
|
cancel( %plVictim.reCloak );
|
|
cancel(%clVictim.respawnTimer);
|
|
%clVictim.respawnTimer = %game.schedule(($Host::PlayerRespawnTimeout * 1000), "forceObserver", %clVictim, "spawnTimeout" );
|
|
|
|
// reset the alarm for out of bounds
|
|
if(%clVictim.outOfBounds)
|
|
messageClient(%clVictim, 'EnterMissionArea', "");
|
|
|
|
%respawnDelay = 2;
|
|
|
|
|
|
%game.schedule(%respawnDelay*1000, "clearWaitRespawn", %clVictim);
|
|
// if victim had an undetonated satchel charge pack, get rid of it
|
|
if(%plVictim.thrownChargeId != 0)
|
|
if(!%plVictim.thrownChargeId.kaboom)
|
|
%plVictim.thrownChargeId.delete();
|
|
|
|
if(%plVictim.lastVehicle !$= "")
|
|
{
|
|
schedule(15000, %plVictim.lastVehicle,"vehicleAbandonTimeOut", %plVictim.lastVehicle);
|
|
%plVictim.lastVehicle.lastPilot = "";
|
|
}
|
|
|
|
// unmount pilot or remove sight from bomber
|
|
if(%plVictim.isMounted())
|
|
{
|
|
if(%plVictim.vehicleTurret)
|
|
%plVictim.vehicleTurret.getDataBlock().playerDismount(%plVictim.vehicleTurret);
|
|
else
|
|
{
|
|
%plVictim.getDataBlock().doDismount(%plVictim, true);
|
|
%plVictim.mountVehicle = false;
|
|
}
|
|
}
|
|
|
|
if(%plVictim.inStation)
|
|
commandToClient(%plVictim.client,'setStationKeys', false);
|
|
%clVictim.camera.mode = "playerDeath";
|
|
|
|
// reset who triggered this station and cancel outstanding armor switch thread
|
|
if(%plVictim.station)
|
|
{
|
|
%plVictim.station.triggeredBy = "";
|
|
%plVictim.station.getDataBlock().stationTriggered(%plVictim.station,0);
|
|
if(%plVictim.armorSwitchSchedule)
|
|
cancel(%plVictim.armorSwitchSchedule);
|
|
}
|
|
|
|
//Close huds if player dies...
|
|
messageClient(%clVictim, 'CloseHud', "", 'inventoryScreen');
|
|
messageClient(%clVictim, 'CloseHud', "", 'vehicleHud');
|
|
commandToClient(%clVictim, 'setHudMode', 'Standard', "", 0);
|
|
|
|
// $weaponslot from item.cs
|
|
%plVictim.setRepairRate(0);
|
|
%plVictim.setImageTrigger($WeaponSlot, false);
|
|
|
|
playDeathAnimation(%plVictim, %damageLocation, %damageType);
|
|
playDeathCry(%plVictim);
|
|
|
|
%victimName = %clVictim.name;
|
|
|
|
%game.displayDeathMessages(%clVictim, %clKiller, %damageType, %implement);
|
|
%game.updateKillScores(%clVictim, %clKiller, %damageType, %implement);
|
|
|
|
if ($Host::Prison::Enabled == true && %clKiller != %clVictim
|
|
&& ($Host::Prison::Kill == true || (%clKiller.team == %clVictim.team && $Host::Prison::TeamKill == true))
|
|
&& %clKiller.player // Make sure killer is a player
|
|
&& !%clKiller.isAIControlled() && !%clVictim.isAIControlled() // Don't jail for bot actions
|
|
&& !%clKiller.isAdmin && !%clKiller.isSuperAdmin) { // Don't jail admins/superadmins
|
|
%victimName = %clVictim.name;
|
|
if (%clKiller.team == %clVictim.team) // Avoid some repetitions
|
|
%victimName = "TEAMMATE " @ getTaggedString(%clVictim.name);
|
|
if ($Host::Prison::KillTime > 0) {
|
|
if ($Host::Prison::KillTime >= 60) {
|
|
if ($Host::Prison::KillTime > 60) {
|
|
%minutes = mFloor($Host::Prison::KillTime / 60);
|
|
messageClient(%clKiller,'msgClient','\c2You will do %2 minutes in jail for killing %1.',%victimName,%minutes);
|
|
messageAllExcept(%clKiller,-1,'msgClient','\c2%1 will do %3 minutes in jail for killing %2.',%clKiller.name,%victimName,%minutes);
|
|
}
|
|
else {
|
|
messageClient(%clKiller,'msgClient','\c2You will do 1 minute in jail for killing %1.',%victimName);
|
|
messageAllExcept(%clKiller,-1,'msgClient','\c2%1 will do 1 minute in jail for killing %2.',%clKiller.name,%victimName);
|
|
}
|
|
}
|
|
else {
|
|
messageClient(%clKiller,'msgClient','\c2You will do %2 seconds in jail for killing %1.',%victimName,$Host::Prison::KillTime);
|
|
messageAllExcept(%clKiller,-1,'msgClient','\c2%1 will do %3 seconds in jail for killing %2.',%clKiller.name,%victimName,$Host::Prison::KillTime);
|
|
}
|
|
}
|
|
else {
|
|
messageClient(%clKiller,'msgClient','\c2You were put in jail for killing %1.',%victimName);
|
|
messageAllExcept(%clKiller,-1,'msgClient','\c2%1 was put in jail for killing %2.',%clKiller.name,%victimName);
|
|
}
|
|
jailPlayer(%clKiller,false,$Host::Prison::KillTime);
|
|
}
|
|
|
|
// toss whatever is being carried, '$flagslot' from item.cs
|
|
// MES - had to move this to after death message display because of Rabbit game type
|
|
for(%index = 0 ; %index < 8; %index++)
|
|
{
|
|
%image = %plVictim.getMountedImage(%index);
|
|
if(%image)
|
|
{
|
|
if(%index == $FlagSlot)
|
|
%plVictim.throwObject(%plVictim.holdingFlag);
|
|
else
|
|
%plVictim.throw(%image.item);
|
|
}
|
|
}
|
|
|
|
// target manager update
|
|
setTargetDataBlock(%clVictim.target, 0);
|
|
setTargetSensorData(%clVictim.target, 0);
|
|
|
|
// clear the hud
|
|
%clVictim.SetWeaponsHudClearAll();
|
|
%clVictim.SetInventoryHudClearAll();
|
|
%clVictim.setAmmoHudCount(-1);
|
|
|
|
// clear out weapons, inventory and pack huds
|
|
messageClient(%clVictim, 'msgDeploySensorOff', ""); //make sure the deploy hud gets shut off
|
|
messageClient(%clVictim, 'msgPackIconOff', ""); // clear the pack icon
|
|
|
|
//clear the deployable HUD
|
|
%plVictim.client.deployPack = false;
|
|
cancel(%plVictim.deployCheckThread);
|
|
deactivateDeploySensor(%plVictim);
|
|
|
|
//if the killer was an AI...
|
|
if (isObject(%clKiller) && %clKiller.isAIControlled())
|
|
%game.onAIKilledClient(%clVictim, %clKiller, %damageType, %implement);
|
|
|
|
|
|
// reset control object on this player: also sets 'playgui' as content
|
|
serverCmdResetControlObject(%clVictim);
|
|
|
|
// set control object to the camera
|
|
%clVictim.player = 0;
|
|
%transform = %plVictim.getTransform();
|
|
|
|
//note, AI's don't have a camera...
|
|
if (isObject(%clVictim.camera))
|
|
{
|
|
%clVictim.camera.setTransform(%transform);
|
|
%clVictim.camera.setOrbitMode(%plVictim, %plVictim.getTransform(), 0.5, 4.5, 4.5);
|
|
%clVictim.setControlObject(%clVictim.camera);
|
|
}
|
|
|
|
//hook in the AI specific code for when a client dies
|
|
if (%clVictim.isAIControlled())
|
|
{
|
|
aiReleaseHumanControl(%clVictim.controlByHuman, %clVictim);
|
|
%game.onAIKilled(%clVictim, %clKiller, %damageType, %implement);
|
|
}
|
|
else
|
|
aiReleaseHumanControl(%clVictim, %clVictim.controlAI);
|
|
|
|
//used to track corpses so the AI can get ammo, etc...
|
|
AICorpseAdded(%plVictim);
|
|
|
|
//if the death was a suicide, prevent respawning for 5 seconds...
|
|
%clVictim.lastDeathSuicide = false;
|
|
if (%damageType == $DamageType::Suicide)
|
|
{
|
|
// %clVictim.lastDeathSuicide = true;
|
|
// %clVictim.suicideRespawnTime = getSimTime() + 5000;
|
|
}
|
|
}
|
|
|
|
function DefaultGame::forceObserver( %game, %client, %reason )
|
|
{
|
|
//make sure we have a valid client...
|
|
if (%client <= 0)
|
|
return;
|
|
|
|
// first kill this player
|
|
if(%client.player)
|
|
%client.player.scriptKill(0);
|
|
|
|
if( %client.respawnTimer )
|
|
cancel(%client.respawnTimer);
|
|
|
|
%client.respawnTimer = "";
|
|
|
|
// remove them from the team rank array
|
|
%game.removeFromTeamRankArray(%client);
|
|
|
|
// place them in observer mode
|
|
%client.lastObserverSpawn = -1;
|
|
%client.observerStartTime = getSimTime();
|
|
%adminForce = 0;
|
|
|
|
switch$ ( %reason )
|
|
{
|
|
case "playerChoose":
|
|
%client.camera.getDataBlock().setMode( %client.camera, "observerFly" );
|
|
messageClient(%client, 'MsgClientJoinTeam', '\c2You have become an observer.', %client.name, %game.getTeamName(0), %client, 0 );
|
|
logEcho(%client.nameBase@" (cl "@%client@") entered observer mode");
|
|
%client.lastTeam = %client.team;
|
|
|
|
case "AdminForce":
|
|
%client.camera.getDataBlock().setMode( %client.camera, "observerFly" );
|
|
messageClient(%client, 'MsgClientJoinTeam', '\c2You have been forced into observer mode by the admin.', %client.name, %game.getTeamName(0), %client, 0 );
|
|
logEcho(%client.nameBase@" (cl "@%client@") was forced into observer mode by admin");
|
|
%client.lastTeam = %client.team;
|
|
%adminForce = 1;
|
|
|
|
if($Host::TournamentMode)
|
|
{
|
|
if(!$matchStarted)
|
|
{
|
|
if(%client.camera.Mode $= "pickingTeam")
|
|
{
|
|
commandToClient( %client, 'processPickTeam');
|
|
clearBottomPrint( %client );
|
|
}
|
|
else
|
|
{
|
|
clearCenterPrint(%client);
|
|
%client.notReady = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
case "spawnTimeout":
|
|
%client.camera.getDataBlock().setMode( %client.camera, "observerTimeout" );
|
|
messageClient(%client, 'MsgClientJoinTeam', '\c2You have been placed in observer mode due to delay in respawning.', %client.name, %game.getTeamName(0), %client, 0 );
|
|
logEcho(%client.nameBase@" (cl "@%client@") was placed in observer mode due to spawn delay");
|
|
// save the team the player was on - only if this was a delay in respawning
|
|
%client.lastTeam = %client.team;
|
|
}
|
|
|
|
// switch client to team 0 (observer)
|
|
%client.team = 0;
|
|
%client.player.team = 0;
|
|
setTargetSensorGroup( %client.target, %client.team );
|
|
%client.setSensorGroup( %client.team );
|
|
|
|
// set their control to the obs. cam
|
|
%client.setControlObject( %client.camera );
|
|
commandToClient(%client, 'setHudMode', 'Observer');
|
|
|
|
// display the hud
|
|
//displayObserverHud(%client, 0);
|
|
updateObserverFlyHud(%client);
|
|
|
|
|
|
// message everyone about this event
|
|
if( !%adminForce )
|
|
messageAllExcept(%client, -1, 'MsgClientJoinTeam', '\c2%1 has become an observer.', %client.name, %game.getTeamName(0), %client, 0 );
|
|
else
|
|
messageAllExcept(%client, -1, 'MsgClientJoinTeam', '\c2The admin has forced %1 to become an observer.', %client.name, %game.getTeamName(0), %client, 0 );
|
|
|
|
updateCanListenState( %client );
|
|
|
|
// call the onEvent for this game type
|
|
%game.onClientEnterObserverMode(%client); //Bounty uses this to remove this client from others' hit lists
|
|
}
|
|
|
|
function DefaultGame::displayDeathMessages(%game, %clVictim, %clKiller, %damageType, %implement)
|
|
{
|
|
// ----------------------------------------------------------------------------------
|
|
// z0dd - ZOD, 6/18/02. From Panama Jack, send the damageTypeText as the last varible
|
|
// in each death message so client knows what weapon it was that killed them.
|
|
|
|
%victimGender = (%clVictim.sex $= "Male" ? 'him' : 'her');
|
|
%victimPoss = (%clVictim.sex $= "Male" ? 'his' : 'her');
|
|
%killerGender = (%clKiller.sex $= "Male" ? 'him' : 'her');
|
|
%killerPoss = (%clKiller.sex $= "Male" ? 'his' : 'her');
|
|
%victimName = %clVictim.name;
|
|
%killerName = %clKiller.name;
|
|
//error("DamageType = " @ %damageType @ ", implement = " @ %implement @ ", implement class = " @ %implement.getClassName() @ ", is controlled = " @ %implement.getControllingClient());
|
|
|
|
if(%damageType == $DamageType::Explosion)
|
|
{
|
|
messageAll('msgExplosionKill', $DeathMessageExplosion[mFloor(getRandom() * $DeathMessageExplosionCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by a nearby explosion.");
|
|
}
|
|
else if(%damageType == $DamageType::Suicide) //player presses cntrl-k
|
|
{
|
|
messageAll('msgSuicide', $DeathMessageSuicide[mFloor(getRandom() * $DeathMessageSuicideCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") committed suicide (CTRL-K)");
|
|
}
|
|
else if(%damageType == $DamageType::VehicleSpawn)
|
|
{
|
|
messageAll('msgVehicleSpawnKill', $DeathMessageVehPad[mFloor(getRandom() * $DeathMessageVehPadCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by vehicle spawn");
|
|
}
|
|
else if(%damageType == $DamageType::ForceFieldPowerup)
|
|
{
|
|
messageAll('msgVehicleSpawnKill', $DeathMessageFFPowerup[mFloor(getRandom() * $DeathMessageFFPowerupCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by Force Field Powerup");
|
|
}
|
|
else if(%damageType == $DamageType::Crash)
|
|
{
|
|
messageAll('msgVehicleCrash', $DeathMessageVehicleCrash[%damageType, mFloor(getRandom() * $DeathMessageVehicleCrashCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") crashes a vehicle.");
|
|
}
|
|
else if(%damageType == $DamageType::Impact) // run down by vehicle
|
|
{
|
|
if( ( %controller = %implement.getControllingClient() ) > 0)
|
|
{
|
|
%killerGender = (%controller.sex $= "Male" ? 'him' : 'her');
|
|
%killerPoss = (%controller.sex $= "Male" ? 'his' : 'her');
|
|
%killerName = %controller.name;
|
|
messageAll('msgVehicleKill', $DeathMessageVehicle[mFloor(getRandom() * $DeathMessageVehicleCount)], %victimName, %victimGender, %victimPoss, %killerName ,%killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by a vehicle controlled by "@%controller);
|
|
}
|
|
else
|
|
{
|
|
messageAll('msgVehicleKill', $DeathMessageVehicleUnmanned[mFloor(getRandom() * $DeathMessageVehicleUnmannedCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by a vehicle (unmanned)");
|
|
}
|
|
}
|
|
else if (isObject(%implement) && (%implement.getClassName() $= "Turret" || %implement.getClassName() $= "VehicleTurret" || %implement.getClassName() $= "FlyingVehicle" )) //player killed by a turret
|
|
{
|
|
if (%implement.getControllingClient() != 0) //is turret being controlled?
|
|
{
|
|
%controller = %implement.getControllingClient();
|
|
%killerGender = (%controller.sex $= "Male" ? 'him' : 'her');
|
|
%killerPoss = (%controller.sex $= "Male" ? 'his' : 'her');
|
|
%killerName = %controller.name;
|
|
|
|
if (%controller == %clVictim)
|
|
messageAll('msgTurretSelfKill', $DeathMessageTurretSelfKill[mFloor(getRandom() * $DeathMessageTurretSelfKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
else if (%controller.team == %clVictim.team) //controller TK'd a friendly
|
|
messageAll('msgCTurretKill', $DeathMessageCTurretTeamKill[%damageType, mFloor(getRandom() * $DeathMessageCTurretTeamKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
else //controller killed an enemy
|
|
messageAll('msgCTurretKill', $DeathMessageCTurretKill[%damageType, mFloor(getRandom() * $DeathMessageCTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by a turret controlled by "@%controller);
|
|
}
|
|
// use the handle associated with the deployed object to verify valid owner
|
|
else if (isObject(%implement.getOwner()))
|
|
{
|
|
%owner = %implement.getOwner();
|
|
//error("Owner is " @ %owner @ " Handle is " @ %implement.ownerHandle);
|
|
//error("Turret is still owned");
|
|
//turret is uncontrolled, but is owned - treat the same as controlled.
|
|
%killerGender = (%owner.sex $= "Male" ? 'him' : 'her');
|
|
%killerPoss = (%owner.sex $= "Male" ? 'his' : 'her');
|
|
%killerName = %owner.name;
|
|
|
|
if (%owner.team == %clVictim.team) //player got in the way of a teammates deployed but uncontrolled turret.
|
|
messageAll('msgCTurretKill', $DeathMessageCTurretAccdtlKill[%damageType,mFloor(getRandom() * $DeathMessageCTurretAccdtlKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
else //deployed, uncontrolled turret killed an enemy
|
|
messageAll('msgCTurretKill', $DeathMessageCTurretKill[%damageType,mFloor(getRandom() * $DeathMessageCTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") was killed by turret (automated)");
|
|
}
|
|
else //turret is not a placed (owned) turret (or owner is no longer on it's team), and is not being controlled
|
|
{
|
|
messageAll('msgTurretKill', $DeathMessageTurretKill[%damageType,mFloor(getRandom() * $DeathMessageTurretKillCount)],%victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by turret");
|
|
}
|
|
}
|
|
else if((%clKiller == %clVictim) || (%damageType == $DamageType::Ground)) //player killed himself or fell to death
|
|
{
|
|
messageAll('msgSelfKill', $DeathMessageSelfKill[%damageType,mFloor(getRandom() * $DeathMessageSelfKillCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed self ("@getTaggedString($DamageTypeText[%damageType])@")");
|
|
}
|
|
|
|
else if (%damageType == $DamageType::OutOfBounds) //killer died due to Out-of-Bounds damage
|
|
{
|
|
messageAll('msgOOBKill', $DeathMessageOOB[mFloor(getRandom() * $DeathMessageOOBCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by out-of-bounds damage");
|
|
}
|
|
|
|
else if (%damageType == $DamageType::NexusCamping) //Victim died from camping near the nexus...
|
|
{
|
|
messageAll('msgCampKill', $DeathMessageCamping[mFloor(getRandom() * $DeathMessageCampingCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed for nexus camping");
|
|
}
|
|
|
|
else if(%clKiller.team == %clVictim.team) //was a TK
|
|
{
|
|
messageAll('msgTeamKill', $DeathMessageTeamKill[%damageType, mFloor(getRandom() * $DeathMessageTeamKillCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") teamkilled by "@%clKiller.nameBase@" (pl "@%clKiller.player@"/cl "@%clKiller@")");
|
|
}
|
|
|
|
else if (%damageType == $DamageType::Lava) //player died by falling in lava
|
|
{
|
|
messageAll('msgLavaKill', $DeathMessageLava[mFloor(getRandom() * $DeathMessageLavaCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by lava");
|
|
}
|
|
else if ( %damageType == $DamageType::Lightning ) // player was struck by lightning
|
|
{
|
|
messageAll('msgLightningKill', $DeathMessageLightning[mFloor(getRandom() * $DeathMessageLightningCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by lightning");
|
|
}
|
|
else if ( %damageType == $DamageType::Meteor ) // player was struck by meteor
|
|
{
|
|
messageAll('msgMeteorKill', $DeathMessageMeteor[mFloor(getRandom() * $DeathMessageMeteorCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by meteor");
|
|
}
|
|
else if ( %damageType == $DamageType::Cursing ) // player cursing
|
|
{
|
|
messageAll('msgCursingKill', $DeathMessageCursing[mFloor(getRandom() * $DeathMessageCursingCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by cursing");
|
|
}
|
|
else if ( %damageType == $DamageType::Idiocy ) // player was dumb
|
|
{
|
|
messageAll('msgIdiocyKill', $DeathMessageIdiocy[mFloor(getRandom() * $DeathMessageIdiocyCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by idiocy");
|
|
}
|
|
else if ( %damageType == $DamageType::KillerFog ) // player fell into killer fog
|
|
{
|
|
messageAll('msgKillerFogKill', $DeathMessageKillerFog[mFloor(getRandom() * $DeathMessageKillerFogCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by killer fog");
|
|
}
|
|
else if ( %damageType == $DamageType::Mine && !isObject(%clKiller) )
|
|
{
|
|
error("Mine kill w/o source");
|
|
messageAll('MsgRogueMineKill', $DeathMessageRogueMine[%damageType, mFloor(getRandom() * $DeathMessageRogueMineCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
}
|
|
else //was a legitimate enemy kill
|
|
{
|
|
if(%damageType == 6 && (%clVictim.headShot))
|
|
{
|
|
// laser headshot just occurred
|
|
messageAll('MsgHeadshotKill', $DeathMessageHeadshot[%damageType, mFloor(getRandom() * $DeathMessageHeadshotCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
|
|
}
|
|
else
|
|
messageAll('MsgLegitKill', $DeathMessage[%damageType, mFloor(getRandom() * $DeathMessageCount)], %victimName, %victimGender, %victimPoss, %killerName, %killerGender, %killerPoss, %damageType, $DamageTypeText[%damageType]);
|
|
logEcho(%clVictim.nameBase@" (pl "@%clVictim.player@"/cl "@%clVictim@") killed by "@%clKiller.nameBase@" (pl "@%clKiller.player@"/cl "@%clKiller@") using "@getTaggedString($DamageTypeText[%damageType]));
|
|
}
|
|
}
|
|
|
|
function DefaultGame::assignClientTeam(%game, %client, %respawn )
|
|
{
|
|
//error("DefaultGame::assignClientTeam");
|
|
// this function is overwritten in non-team mission types (e.g. DM)
|
|
// so these lines won't do anything
|
|
//if(!%game.numTeams)
|
|
//{
|
|
// setTargetSkin(%client.target, %client.skin);
|
|
// return;
|
|
//}
|
|
|
|
// camera is responsible for creating a player
|
|
// - counts the number of players per team
|
|
// - puts this player on the least player count team
|
|
// - sets the client's skin to the servers default
|
|
|
|
%numPlayers = ClientGroup.getCount();
|
|
for(%i = 0; %i <= %game.numTeams; %i++)
|
|
%numTeamPlayers[%i] = 0;
|
|
|
|
for(%i = 0; %i < %numPlayers; %i = %i + 1)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if(%cl != %client)
|
|
%numTeamPlayers[%cl.team]++;
|
|
}
|
|
%leastPlayers = %numTeamPlayers[1];
|
|
%leastTeam = 1;
|
|
for(%i = 2; %i <= %game.numTeams; %i++)
|
|
{
|
|
if( (%numTeamPlayers[%i] < %leastPlayers) ||
|
|
( (%numTeamPlayers[%i] == %leastPlayers) &&
|
|
($teamScore[%i] < $teamScore[%leastTeam] ) ))
|
|
{
|
|
%leastTeam = %i;
|
|
%leastPlayers = %numTeamPlayers[%i];
|
|
}
|
|
}
|
|
|
|
%client.team = %leastTeam;
|
|
%client.lastTeam = %team;
|
|
|
|
// Assign the team skin:
|
|
if ( %client.isAIControlled() )
|
|
{
|
|
if ( %leastTeam & 1 )
|
|
{
|
|
%client.skin = addTaggedString( "basebot" );
|
|
setTargetSkin( %client.target, 'basebot' );
|
|
}
|
|
else
|
|
{
|
|
%client.skin = addTaggedString( "basebbot" );
|
|
setTargetSkin( %client.target, 'basebbot' );
|
|
}
|
|
}
|
|
else
|
|
setTargetSkin( %client.target, %game.getTeamSkin(%client.team) );
|
|
//setTargetSkin( %client.target, %client.skin );
|
|
|
|
// might as well standardize the messages
|
|
//messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1%1 joined %2.', %client.name, $teamName[%leastTeam], %client, %leastTeam );
|
|
//messageClient( %client, 'MsgClientJoinTeam', '\c1You joined the %2 team.', $client.name, $teamName[%client.team], %client, %client.team );
|
|
messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1%1 joined %2.', %client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
messageClient( %client, 'MsgClientJoinTeam', '\c1You joined the %2 team.', %client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
|
|
updateCanListenState( %client );
|
|
|
|
logEcho(%client.nameBase@" (cl "@%client@") joined team "@%client.team);
|
|
}
|
|
|
|
function DefaultGame::getTeamSkin(%game, %team)
|
|
{
|
|
//error("DefaultGame::getTeamSkin");
|
|
%skin = $teamSkin[%team];
|
|
//error("%skin = " SPC getTaggedString(%skin));
|
|
return %skin;
|
|
}
|
|
|
|
function DefaultGame::getTeamName(%game, %team)
|
|
{
|
|
//error("DefaultGame::getTeamName");
|
|
%name = $teamName[%team];
|
|
//error("name = " SPC getTaggedString(%name));
|
|
return %name;
|
|
}
|
|
|
|
function DefaultGame::clientJoinTeam( %game, %client, %team, %respawn )
|
|
{
|
|
// for multi-team games played with a single team
|
|
if (Game.numTeams == 1) {
|
|
%game.assignClientTeam( %client );
|
|
// Spawn the player:
|
|
%game.spawnPlayer( %client, %respawn );
|
|
return;
|
|
}
|
|
|
|
//error("DefaultGame::clientJoinTeam");
|
|
if ( %team < 1 || %team > %game.numTeams )
|
|
return;
|
|
|
|
if( %respawn $= "" )
|
|
%respawn = 1;
|
|
|
|
%client.team = %team;
|
|
%client.lastTeam = %team;
|
|
setTargetSkin( %client.target, %game.getTeamSkin(%team) );
|
|
setTargetSensorGroup( %client.target, %team );
|
|
%client.setSensorGroup( %team );
|
|
|
|
// Spawn the player:
|
|
%game.spawnPlayer( %client, %respawn );
|
|
|
|
messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1%1 joined %2.', %client.name, %game.getTeamName(%team), %client, %team );
|
|
messageClient( %client, 'MsgClientJoinTeam', '\c1You joined the %2 team.', $client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
|
|
updateCanListenState( %client );
|
|
|
|
logEcho(%client.nameBase@" (cl "@%client@") joined team "@%client.team);
|
|
if ($Host::Prison::Enabled == true) {
|
|
if (%client.isJailed)
|
|
// If player should manage to get out of jail, re-spawn and re-start sentence time
|
|
jailPlayer(%client,false,mAbs(%cl.jailTime));
|
|
}
|
|
}
|
|
|
|
function DefaultGame::AIHasJoined(%game, %client)
|
|
{
|
|
//defined to prevent console spam
|
|
}
|
|
|
|
function DefaultGame::AIChangeTeam(%game, %client, %newTeam)
|
|
{
|
|
//make sure we're trying to drop an AI
|
|
if (!isObject(%client) || !%client.isAIControlled())
|
|
return;
|
|
|
|
//clear the ai from any objectives, etc...
|
|
AIUnassignClient(%client);
|
|
%client.stop();
|
|
%client.clearTasks();
|
|
%client.clearStep();
|
|
%client.lastDamageClient = -1;
|
|
%client.lastDamageTurret = -1;
|
|
%client.shouldEngage = -1;
|
|
%client.setEngageTarget(-1);
|
|
%client.setTargetObject(-1);
|
|
%client.pilotVehicle = false;
|
|
%client.defaultTasksAdded = false;
|
|
|
|
//kill the player, which should cause the Game object to perform whatever cleanup is required.
|
|
if (isObject(%client.player))
|
|
%client.player.scriptKill(0);
|
|
|
|
//clean up the team rank array
|
|
%game.removeFromTeamRankArray(%client);
|
|
|
|
//assign the new team
|
|
%client.team = %newTeam;
|
|
if (%newTeam < 0)
|
|
Game.assignClientTeam(%client);
|
|
else
|
|
{
|
|
if ( %client.team & 1 )
|
|
{
|
|
%client.skin = addTaggedString( "basebot" );
|
|
setTargetSkin( %client.target, 'basebot' );
|
|
}
|
|
else
|
|
{
|
|
%client.skin = addTaggedString( "basebbot" );
|
|
setTargetSkin( %client.target, 'basebbot' );
|
|
}
|
|
}
|
|
|
|
messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1bot %1 has switched to team %2.', %client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
}
|
|
|
|
function DefaultGame::clientChangeTeam(%game, %client, %team, %fromObs)
|
|
{
|
|
//error("DefaultGame::clientChangeTeam");
|
|
//first, remove the client from the team rank array
|
|
//the player will be added to the new team array as soon as he respawns...
|
|
%game.removeFromTeamRankArray(%client);
|
|
|
|
%pl = %client.player;
|
|
if(isObject(%pl))
|
|
{
|
|
if(%pl.isMounted())
|
|
%pl.getDataBlock().doDismount(%pl);
|
|
%pl.scriptKill(0);
|
|
}
|
|
|
|
// reset the client's targets and tasks only
|
|
clientResetTargets(%client, true);
|
|
|
|
// give this client a new handle to disassociate ownership of deployed objects
|
|
if( %team $= "" && (%team > 0 && %team <= %game.numTeams))
|
|
{
|
|
if( %client.team == 1 )
|
|
%client.team = 2;
|
|
else
|
|
%client.team = 1;
|
|
}
|
|
else
|
|
%client.team = %team;
|
|
|
|
// Shouldn't be needed - serverCmds are proofed (hopefully)
|
|
// As it is, it just prevents admins from changing non-admins to a non-valid team
|
|
// if (!(%client.isAdmin || %client.isSuperAdmin)) {
|
|
// if (%team > %game.numTeams || %team $= "")
|
|
// %team = 1;
|
|
// }
|
|
|
|
// Set the client's skin:
|
|
if (!%client.isAIControlled())
|
|
setTargetSkin( %client.target, %game.getTeamSkin(%client.team) );
|
|
setTargetSensorGroup( %client.target, %client.team );
|
|
%client.setSensorGroup( %client.team );
|
|
|
|
// Spawn the player:
|
|
%client.lastSpawnPoint = %game.pickPlayerSpawn( %client );
|
|
|
|
%game.createPlayer( %client, %client.lastSpawnPoint, $MatchStarted );
|
|
|
|
if($MatchStarted)
|
|
%client.setControlObject(%client.player);
|
|
else
|
|
{
|
|
%client.camera.getDataBlock().setMode(%client.camera, "pre-game", %client.player);
|
|
%client.setControlObject(%client.camera);
|
|
}
|
|
|
|
// call the onEvent for this game type
|
|
%game.onClientEnterObserverMode(%client); //Bounty uses this to remove this client from others' hit lists
|
|
|
|
if(%fromObs $= "" || !%fromObs)
|
|
{
|
|
messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1%1 switched to team %2.', %client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
messageClient( %client, 'MsgClientJoinTeam', '\c1You switched to team %2.', $client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
}
|
|
else
|
|
{
|
|
messageAllExcept( %client, -1, 'MsgClientJoinTeam', '\c1%1 joined team %2.', %client.name, %game.getTeamName(%client.team), %client, %team );
|
|
messageClient( %client, 'MsgClientJoinTeam', '\c1You joined team %2.', $client.name, %game.getTeamName(%client.team), %client, %client.team );
|
|
}
|
|
|
|
updateCanListenState( %client );
|
|
|
|
// MES - switch objective hud lines when client switches teams
|
|
messageClient(%client, 'MsgCheckTeamLines', "", %client.team);
|
|
logEcho(%client.nameBase@" (cl "@%client@") switched to team "@%client.team);
|
|
}
|
|
|
|
// missioncleanup and missiongroup are checked prior to entering game code
|
|
function DefaultGame::missionLoadDone(%game)
|
|
{
|
|
// walks through the mission group and sets the power stuff up
|
|
// - groups get initialized with power count 0 then iterated to
|
|
// increment powercount if an object within is powered
|
|
// - powers objects up/down
|
|
//MissionGroup.objectiveInit();
|
|
MissionGroup.clearPower();
|
|
MissionGroup.powerInit(0);
|
|
|
|
%game.initGameVars(); //set up scoring variables and other game specific globals
|
|
|
|
// make team0 visible/friendly to all
|
|
setSensorGroupAlwaysVisMask(0, 0xffffffff);
|
|
setSensorGroupFriendlyMask(0, 0xffffffff);
|
|
|
|
// update colors:
|
|
// - enemy teams are red
|
|
// - same team is green
|
|
// - team 0 is white
|
|
for(%i = 0; %i < 32; %i++)
|
|
{
|
|
%team = (1 << %i);
|
|
setSensorGroupColor(%i, %team, "0 255 0 255");
|
|
setSensorGroupColor(%i, ~%team, "255 0 0 255");
|
|
setSensorGroupColor(%i, 1, "255 255 255 255");
|
|
|
|
// setup the team targets (alwyas friendly and visible to same team)
|
|
setTargetAlwaysVisMask(%i, %team);
|
|
setTargetFriendlyMask(%i, %team);
|
|
}
|
|
|
|
//set up the teams
|
|
%game.setUpTeams();
|
|
|
|
//clear out the team rank array...
|
|
for (%i = 0; %i < 32; %i++)
|
|
$TeamRank[%i, count] = "";
|
|
|
|
// objectiveInit has to take place after setupTeams -- objective HUD relies on flags
|
|
// having their team set
|
|
MissionGroup.objectiveInit();
|
|
|
|
//initialize the AI system
|
|
%game.aiInit();
|
|
|
|
//need to reset the teams if we switch from say, CTF to Bounty...
|
|
// assign the bots team
|
|
if ($currentMissionType !$= $previousMissionType)
|
|
{
|
|
$previousMissionType = $currentMissionType;
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if (%cl.isAIControlled())
|
|
%game.assignClientTeam(%cl);
|
|
}
|
|
}
|
|
|
|
//Save off respawn or Siege Team switch information...
|
|
if(%game.class !$= "SiegeGame")
|
|
MissionGroup.setupPositionMarkers(true);
|
|
echo("Default game mission load done.");
|
|
}
|
|
|
|
function DefaultGame::onClientLeaveGame(%game, %client)
|
|
{
|
|
// if there is a player attached to this client, kill it
|
|
if( isObject(%client.player))
|
|
%client.player.scriptKill(0);
|
|
|
|
//cancel a scheduled call...
|
|
cancel(%client.respawnTimer);
|
|
%client.respawnTimer = "";
|
|
|
|
//remove them from the team rank arrays
|
|
%game.removeFromTeamRankArray(%client);
|
|
logEcho(%client.nameBase@" (cl "@%client@") dropped");
|
|
}
|
|
|
|
function DefaultGame::clientMissionDropReady(%game, %client)
|
|
{
|
|
//synchronize the clock HUD
|
|
messageClient(%client, 'MsgSystemClock', "", 0, 0);
|
|
|
|
%game.sendClientTeamList( %client );
|
|
%game.setupClientHuds( %client );
|
|
|
|
if($CurrentMissionType $= "SinglePlayer")
|
|
{
|
|
//CommandToClient( %client, 'setPlayContent');
|
|
return;
|
|
}
|
|
|
|
%observer = false;
|
|
if( !$Host::TournamentMode )
|
|
{
|
|
if( %client.camera.mode $= "observerFly" || %client.camera.mode $= "justJoined")
|
|
{
|
|
%observer = true;
|
|
%client.observerStartTime = getSimTime();
|
|
commandToClient(%client, 'setHudMode', 'Observer');
|
|
%client.setControlObject( %client.camera );
|
|
//displayObserverHud( %client, 0 );
|
|
updateObserverFlyHud(%client);
|
|
}
|
|
|
|
if( !%observer )
|
|
{
|
|
if(!$MatchStarted && !$CountdownStarted) // server has not started anything yet
|
|
{
|
|
%client.setControlObject( %client.camera );
|
|
commandToClient(%client, 'setHudMode', 'Observer');
|
|
}
|
|
else if(!$MatchStarted && $CountdownStarted) // server has started the countdown
|
|
{
|
|
commandToClient(%client, 'setHudMode', 'Observer');
|
|
%client.setControlObject( %client.camera );
|
|
}
|
|
else
|
|
{
|
|
commandToClient(%client, 'setHudMode', 'Standard'); // the game has already started
|
|
%client.setControlObject( %client.player );
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// set all players into obs mode. setting the control object will handle further procedures...
|
|
%client.camera.getDataBlock().setMode( %client.camera, "ObserverFly" );
|
|
commandToClient(%client, 'setHudMode', 'Observer');
|
|
%client.setControlObject( %client.camera );
|
|
messageAll( 'MsgClientJoinTeam', "",%client.name, $teamName[0], %client, 0 );
|
|
%client.team = 0;
|
|
|
|
if( !$MatchStarted && !$CountdownStarted)
|
|
{
|
|
if($TeamDamage)
|
|
%damMess = "ENABLED";
|
|
else
|
|
%damMess = "DISABLED";
|
|
|
|
if(%game.numTeams > 1)
|
|
BottomPrint(%client, "Server is Running in Tournament Mode.\nPick a Team\nTeam Damage is " @ %damMess, 0, 3 );
|
|
}
|
|
else
|
|
{
|
|
BottomPrint( %client, "\nServer is Running in Tournament Mode", 0, 3 );
|
|
}
|
|
}
|
|
|
|
//make sure the objective HUD indicates your team on top and in green...
|
|
if (%client.team > 0)
|
|
messageClient(%client, 'MsgCheckTeamLines', "", %client.team);
|
|
|
|
// were ready to go.
|
|
%client.matchStartReady = true;
|
|
echo("Client" SPC %client SPC "is ready.");
|
|
|
|
if ( isDemo() )
|
|
{
|
|
if ( %client.demoJustJoined )
|
|
{
|
|
%client.demoJustJoined = false;
|
|
centerPrint( %client, "Welcome to the Tribes 2 Demo." NL "You have been assigned the name \"" @ %client.nameBase @ "\"." NL "Press FIRE to join the game.", 0, 3 );
|
|
}
|
|
}
|
|
}
|
|
|
|
function DefaultGame::sendClientTeamList(%game, %client)
|
|
{
|
|
// Send the client the current team list:
|
|
%teamCount = %game.numTeams;
|
|
for ( %i = 0; %i < %teamCount; %i++ )
|
|
{
|
|
if ( %i > 0 )
|
|
%teamList = %teamList @ "\n";
|
|
|
|
%teamList = %teamList @ detag( getTaggedString( %game.getTeamName(%i + 1) ) );
|
|
}
|
|
messageClient( %client, 'MsgTeamList', "", %teamCount, %teamList );
|
|
}
|
|
|
|
function DefaultGame::setupClientHuds(%game, %client)
|
|
{
|
|
// tell the client to setup the huds...
|
|
for(%i =0; %i<$WeaponsHudCount; %i++)
|
|
%client.setWeaponsHudBitmap(%i, $WeaponsHudData[%i, itemDataName], $WeaponsHudData[%i, bitmapName]);
|
|
for(%i =0; %i<$InventoryHudCount; %i++)
|
|
{
|
|
if ( $InventoryHudData[%i, slot] != 0 )
|
|
%client.setInventoryHudBitmap($InventoryHudData[%i, slot], $InventoryHudData[%i, itemDataName], $InventoryHudData[%i, bitmapName]);
|
|
}
|
|
%client.setInventoryHudBitmap( 0, "", "gui/hud_handgren" );
|
|
|
|
%client.setWeaponsHudBackGroundBmp("gui/hud_new_panel");
|
|
%client.setWeaponsHudHighLightBmp("gui/hud_new_weaponselect");
|
|
%client.setWeaponsHudInfiniteAmmoBmp("gui/hud_infinity");
|
|
%client.setInventoryHudBackGroundBmp("gui/hud_new_panel");
|
|
|
|
// tell the client if we are protecting statics (so no health bar will be displayed)
|
|
// We have deployable station inventories that can be destroyed, and thus we need the health bars
|
|
// commandToClient(%client, 'protectingStaticObjects', %game.allowsProtectedStatics());
|
|
commandToClient(%client, 'setPowerAudioProfiles', sPowerUp.getId(), sPowerDown.getId());
|
|
}
|
|
|
|
function DefaultGame::testDrop( %game, %client )
|
|
{
|
|
%game.clientJoinTeam( %client, 1, false );
|
|
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
|
|
%client.setControlObject( %client.camera );
|
|
CommandToClient( %client, 'setPlayContent' );
|
|
}
|
|
|
|
function DefaultGame::onClientEnterObserverMode( %game, %client )
|
|
{
|
|
// Default game doesn't care...
|
|
}
|
|
|
|
// from 'item.cs'
|
|
function DefaultGame::playerTouchFlag(%game, %player, %flag)
|
|
{
|
|
messageAll('MsgPlayerTouchFlag', 'Player %1 touched flag %2', %player, %flag);
|
|
}
|
|
|
|
// from 'item.cs'
|
|
function DefaultGame::playerDroppedFlag(%game, %player, %flag)
|
|
{
|
|
messageAll('MsgPlayerDroppedFlag', 'Player %1 dropped flag %2', %player, %flag);
|
|
}
|
|
|
|
// from 'staticShape.cs'
|
|
function DefaultGame::flagStandCollision(%game, %dataBlock, %obj, %colObj)
|
|
{
|
|
// for retreiveGame
|
|
}
|
|
|
|
function DefaultGame::notifyMineDeployed(%game, %mine)
|
|
{
|
|
//do nothign in the default game...
|
|
}
|
|
|
|
// from 'staticshape.cs'
|
|
function DefaultGame::findProjector(%game, %flipflop)
|
|
{
|
|
// search the flipflop's folder for a holo projector
|
|
// if one exists, associate it with the flipflop
|
|
%flipflop.projector = 0;
|
|
%folder = %flipflop.getGroup();
|
|
for(%i = 0; %i < %folder.getCount(); %i++)
|
|
{
|
|
%proj = %folder.getObject(%i);
|
|
if(%proj.getDatablock().getName() $= "LogoProjector")
|
|
{
|
|
%flipflop.projector = %proj;
|
|
%flipflop.projector.holo = 0;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//******************************************************************************
|
|
//* DefaultGame Trigger - Functions *
|
|
//******************************************************************************
|
|
|
|
/// -Trigger- //////////////////////////////////////////////////////////////////
|
|
//Function -- onEnterTrigger (%game, %name, %data, %obj, %colObj)
|
|
// %game = Current game type object
|
|
// %name = Trigger name - defined when trigger is created
|
|
// %data = Trigger Data Block
|
|
// %obj = Trigger Object
|
|
// %colObj = Object that collided with the trigger
|
|
//Decription -- Called when trigger has been triggered
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// from 'trigger.cs'
|
|
function DefaultGame::onEnterTrigger(%game, %triggerName, %data, %obj, %colobj)
|
|
{
|
|
//Do Nothing
|
|
}
|
|
|
|
/// -Trigger- //////////////////////////////////////////////////////////////////
|
|
//Function -- onLeaveTrigger (%game, %name, %data, %obj, %colObj)
|
|
// %game = Current game type object
|
|
// %name = Trigger name - defined when trigger is created
|
|
// %data = Trigger Data Block
|
|
// %obj = Trigger Object
|
|
// %colObj = Object that collided with the trigger
|
|
//Decription -- Called when trigger has been untriggered
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// from 'trigger.cs'
|
|
function DefaultGame::onLeaveTrigger(%game, %triggerName, %data, %obj, %colobj)
|
|
{
|
|
//Do Nothing
|
|
}
|
|
|
|
/// -Trigger- //////////////////////////////////////////////////////////////////
|
|
//Function -- onTickTrigger(%game, %name, %data, %obj)
|
|
// %game = Current game type object
|
|
// %name = Trigger name - defined when trigger is created
|
|
// %data = Trigger Data Block
|
|
// %obj = Trigger Object
|
|
//Decription -- Called every tick if triggered
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
// from 'trigger.cs'
|
|
function DefaultGame::onTickTrigger(%game, %triggerName, %data, %obj)
|
|
{
|
|
//Do Nothing
|
|
}
|
|
|
|
|
|
function DefaultGame::setUpTeams(%game)
|
|
{
|
|
%group = nameToID("MissionGroup/Teams");
|
|
if(%group == -1)
|
|
return;
|
|
|
|
// create a team0 if it does not exist
|
|
%team = nameToID("MissionGroup/Teams/team0");
|
|
if(%team == -1)
|
|
{
|
|
%team = new SimGroup("team0");
|
|
%group.add(%team);
|
|
}
|
|
|
|
// 'team0' is not counted as a team here
|
|
%game.numTeams = 0;
|
|
while(%team != -1)
|
|
{
|
|
// create drop set and add all spawnsphere objects into it
|
|
%dropSet = new SimSet("TeamDrops" @ %game.numTeams);
|
|
MissionCleanup.add(%dropSet);
|
|
|
|
%spawns = nameToID("MissionGroup/Teams/team" @ %game.numTeams @ "/SpawnSpheres");
|
|
if(%spawns != -1)
|
|
{
|
|
%count = %spawns.getCount();
|
|
for(%i = 0; %i < %count; %i++)
|
|
%dropSet.add(%spawns.getObject(%i));
|
|
}
|
|
|
|
// set the 'team' field for all the objects in this team
|
|
%team.setTeam(%game.numTeams);
|
|
|
|
clearVehicleCount(%team+1);
|
|
// get next group
|
|
%team = nameToID("MissionGroup/Teams/team" @ %game.numTeams + 1);
|
|
if (%team != -1)
|
|
%game.numTeams++;
|
|
}
|
|
|
|
// set the number of sensor groups (including team0) that are processed
|
|
setSensorGroupCount(%game.numTeams + 1);
|
|
}
|
|
|
|
function SimGroup::setTeam(%this, %team)
|
|
{
|
|
for (%i = 0; %i < %this.getCount(); %i++)
|
|
{
|
|
%obj = %this.getObject(%i);
|
|
switch$ (%obj.getClassName())
|
|
{
|
|
case SpawnSphere :
|
|
if($MatchStarted)
|
|
{
|
|
// find out what team the spawnsphere used to belong to
|
|
%found = false;
|
|
for(%l = 1; %l <= Game.numTeams; %l++)
|
|
{
|
|
%drops = nameToId("MissionCleanup/TeamDrops" @ %l);
|
|
for(%j = 0; %j < %drops.getCount(); %j++)
|
|
{
|
|
%current = %drops.getObject(%j);
|
|
if(%current == %obj)
|
|
%found = %l;
|
|
}
|
|
}
|
|
if(%team != %found)
|
|
Game.claimSpawn(%obj, %team, %found);
|
|
else
|
|
error("spawn "@%obj@" is already on team "@%team@"!");
|
|
}
|
|
else
|
|
Game.claimSpawn(%obj, %team, "");
|
|
case SimGroup : %obj.setTeam(%team);
|
|
default : %obj.team = %team;
|
|
}
|
|
|
|
if(%obj.getType() & $TypeMasks::GameBaseObjectType)
|
|
{
|
|
// eeck.. please go away when scripts get cleaned...
|
|
// -----------------------------------------------------------------------------
|
|
// z0dd - ZOD, 5/8/02. Part of re-write of Vehicle
|
|
// station creation. Do not need this code anymore.
|
|
//if(%obj.getDataBlock().getName() $= "StationVehiclePad")
|
|
//{
|
|
// %team = %obj.team;
|
|
// %obj = %obj.station;
|
|
// %obj.team = %team;
|
|
//%obj.teleporter.team = %team;
|
|
//}
|
|
%target = %obj.getTarget();
|
|
if(%target != -1)
|
|
setTargetSensorGroup(%target, %team);
|
|
}
|
|
}
|
|
}
|
|
|
|
function DefaultGame::claimSpawn(%game, %obj, %newTeam, %oldTeam)
|
|
{
|
|
if(%newTeam == %oldTeam)
|
|
return;
|
|
|
|
%newSpawnGroup = nameToId("MissionCleanup/TeamDrops" @ %newTeam);
|
|
if(%oldTeam !$= "")
|
|
{
|
|
%oldSpawnGroup = nameToId("MissionCleanup/TeamDrops" @ %oldTeam);
|
|
%oldSpawnGroup.remove(%obj);
|
|
}
|
|
%newSpawnGroup.add(%obj);
|
|
}
|
|
|
|
// recursive function to assign teams to all mission objects
|
|
|
|
function SimGroup::swapTeams(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.groupSwapTeams(%this);
|
|
}
|
|
|
|
function ShapeBase::swapTeams(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.objectSwapTeams(%this);
|
|
}
|
|
|
|
function GameBase::swapTeams(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.objectSwapTeams(%this);
|
|
}
|
|
|
|
function TSStatic::swapTeams(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing
|
|
}
|
|
|
|
function InteriorInstance::swapTeams(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing -- interiors don't switch teams
|
|
}
|
|
|
|
function SimGroup::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.groupSwapVehiclePads(%this);
|
|
}
|
|
|
|
function ShapeBase::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.objectSwapVehiclePads(%this);
|
|
}
|
|
|
|
function GameBase::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing -- only searching for vehicle pads
|
|
}
|
|
|
|
function InteriorInstance::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing -- only searching for vehicle pads
|
|
}
|
|
|
|
function SimSet::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing -- only searching for vehicle pads
|
|
}
|
|
|
|
function PhysicalZone::swapVehiclePads(%this)
|
|
{
|
|
// used in Siege only
|
|
// do nothing -- only searching for vehicle pads
|
|
}
|
|
|
|
function SimGroup::objectRestore(%this)
|
|
{
|
|
// used in Siege only
|
|
Game.groupObjectRestore(%this);
|
|
}
|
|
|
|
function ShapeBase::objectRestore(%object)
|
|
{
|
|
// only used for Siege
|
|
Game.shapeObjectRestore(%object);
|
|
}
|
|
|
|
function Turret::objectRestore(%object)
|
|
{
|
|
// only used for Siege
|
|
Game.shapeObjectRestore(%object);
|
|
}
|
|
|
|
function AIObjective::objectRestore(%object)
|
|
{
|
|
// only used for Siege
|
|
// don't do anything for AI Objectives
|
|
}
|
|
|
|
function DefaultGame::checkObjectives(%game)
|
|
{
|
|
//any special objectives that can be met by gametype
|
|
//none for default game
|
|
}
|
|
|
|
//---------------------------------------------------
|
|
|
|
function DefaultGame::checkTimeLimit(%game, %forced)
|
|
{
|
|
// Don't add extra checks:
|
|
if ( %forced )
|
|
cancel( %game.timeCheck );
|
|
|
|
// if there is no time limit, check back in a minute to see if it's been set
|
|
if(($Host::TimeLimit $= "") || $Host::TimeLimit == 0)
|
|
{
|
|
%game.timeCheck = %game.schedule(20000, "checkTimeLimit");
|
|
return;
|
|
}
|
|
|
|
%curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) + $missionStartTime - getSimTime();
|
|
|
|
if (%curTimeLeftMS <= 0)
|
|
{
|
|
// time's up, put down your pencils
|
|
%game.timeLimitReached();
|
|
}
|
|
else
|
|
{
|
|
if(%curTimeLeftMS >= 20000)
|
|
%game.timeCheck = %game.schedule(20000, "checkTimeLimit");
|
|
else
|
|
%game.timeCheck = %game.schedule(%curTimeLeftMS + 1, "checkTimeLimit");
|
|
|
|
//now synchronize everyone's clock
|
|
messageAll('MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS);
|
|
}
|
|
}
|
|
|
|
function listplayers()
|
|
{
|
|
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
%status = "";
|
|
if(%cl.isAiControlled())
|
|
%status = "Bot ";
|
|
if(%cl.isSmurf)
|
|
%status = "Alias ";
|
|
if(%cl.isAdmin)
|
|
%status = %status @ "Admin ";
|
|
if(%cl.isSuperAdmin)
|
|
%status = %status @ "SuperAdmin ";
|
|
if(%status $= "")
|
|
%status = "<normal>";
|
|
echo("client: " @ %cl @ " player: " @ %cl.player @ " name: " @ %cl.nameBase @ " team: " @ %cl.team @ " status: " @ %status);
|
|
}
|
|
}
|
|
|
|
function DefaultGame::clearTeamRankArray(%game, %team)
|
|
{
|
|
%count = $TeamRank[%team, count];
|
|
for (%i = 0; %i < %count; %i++)
|
|
$TeamRank[%team, %i] = "";
|
|
$TeamRank[%team, count] = 0;
|
|
}
|
|
|
|
function DefaultGame::populateTeamRankArray(%game, %client)
|
|
{
|
|
//this function should be called *after* the client has been added to a team...
|
|
if (%client <= 0 || %client.team <= 0)
|
|
return;
|
|
|
|
//find the team
|
|
if (%game.numTeams == 1)
|
|
%team = 0;
|
|
else
|
|
%team = %client.team;
|
|
|
|
//find the number of teammates already ranked...
|
|
%count = $TeamRank[%team, count];
|
|
if (%count $= "")
|
|
{
|
|
$TeamRank[%team, count] = 0;
|
|
%count = 0;
|
|
}
|
|
|
|
//make sure we're not already in the array
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
if ($TeamRank[%team, %i] == %client)
|
|
return;
|
|
}
|
|
|
|
//add the client in at the bottom of the list, and increment the count
|
|
$TeamRank[%team, %count] = %client;
|
|
$TeamRank[%team, count] = $TeamRank[%team, count] + 1;
|
|
|
|
//now recalculate the team rank for this player
|
|
%game.recalcTeamRanks(%client);
|
|
}
|
|
|
|
function DefaultGame::removeFromTeamRankArray(%game, %client)
|
|
{
|
|
//note, this should be called *before* the client actually switches teams or drops...
|
|
if (%client <= 0 || %client.team <= 0)
|
|
return;
|
|
|
|
//find the correct team
|
|
if (%game.numTeams == 1)
|
|
%team = 0;
|
|
else
|
|
%team = %client.team;
|
|
|
|
//now search throught the team rank array, looking for this client
|
|
%count = $TeamRank[%team, count];
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
if ($TeamRank[%team, %i] == %client)
|
|
{
|
|
//we've found the client in the array, now loop through, and move everyone else up a rank
|
|
for (%j = %i + 1; %j < %count; %j++)
|
|
{
|
|
%cl = $TeamRank[%team, %j];
|
|
$TeamRank[%team, %j - 1] = %cl;
|
|
messageClient(%cl, 'MsgYourRankIs', "", %j);
|
|
}
|
|
$TeamRank[%team, %count - 1] = "";
|
|
|
|
//now decrement the team rank array count, and break
|
|
$TeamRank[%team, count] = $TeamRank[%team, count] - 1;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function DefaultGame::recalcTeamRanks(%game, %client)
|
|
{
|
|
if (%client <= 0 || %client.team <= 0)
|
|
return;
|
|
|
|
// this is a little confusing -- someone's actual numerical rank is always
|
|
// one number higher than his index in the $TeamRank array
|
|
// (e.g. person ranked 1st has index of 0)
|
|
|
|
// TINMAN: I'm going to remove the %client.teamRank field - the index in the
|
|
// $TeamRank array already contains their rank - safer to search the array than
|
|
// to maintiain the information in a separate variable...
|
|
|
|
//find the team, the client in the team array
|
|
if (%game.numTeams == 1)
|
|
%team = 0;
|
|
else
|
|
%team = %client.team;
|
|
|
|
%count = $TeamRank[%team, count];
|
|
%index = -1;
|
|
for (%i = 0; %i < %count; %i++)
|
|
{
|
|
if ($TeamRank[%team, %i] == %client)
|
|
{
|
|
%index = %i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
//if they weren't found in the array, return
|
|
if (%index < 0)
|
|
return;
|
|
|
|
//make sure far down the array as they should be...
|
|
%tempIndex = %index;
|
|
%swapped = false;
|
|
while (true)
|
|
{
|
|
if (%tempIndex <= 0)
|
|
break;
|
|
|
|
%tempIndex--;
|
|
%tempClient = $TeamRank[%team, %tempIndex];
|
|
|
|
//see if we should swap the two
|
|
if (%client.score > %tempClient.score)
|
|
{
|
|
%swapped = true;
|
|
%index = %tempIndex;
|
|
$TeamRank[%team, %tempIndex] = %client;
|
|
$TeamRank[%team, %tempIndex + 1] = %tempClient;
|
|
messageClient(%tempClient, 'MsgYourRankIs', "", %tempIndex + 2);
|
|
}
|
|
}
|
|
|
|
//if we've swapped up at least once, we obviously won't need to swap down as well...
|
|
if (%swapped)
|
|
{
|
|
messageClient(%client, 'MsgYourRankIs', "", %index + 1);
|
|
return;
|
|
}
|
|
|
|
//since we didnt' swap up, see if we need to swap down...
|
|
%tempIndex = %index;
|
|
%swapped = false;
|
|
while (true)
|
|
{
|
|
if (%tempIndex >= %count - 1)
|
|
break;
|
|
|
|
%tempIndex++;
|
|
%tempClient = $TeamRank[%team, %tempIndex];
|
|
|
|
//see if we should swap the two
|
|
if (%client.score < %tempClient.score)
|
|
{
|
|
%swapped = true;
|
|
%index = %tempIndex;
|
|
$TeamRank[%team, %tempIndex] = %client;
|
|
$TeamRank[%team, %tempIndex - 1] = %tempClient;
|
|
messageClient(%tempClient, 'MsgYourRankIs', "", %tempIndex);
|
|
}
|
|
}
|
|
|
|
//send the message (regardless of whether a swap happened or not)
|
|
messageClient(%client, 'MsgYourRankIs', "", %index + 1);
|
|
}
|
|
|
|
function DefaultGame::recalcScore(%game, %cl)
|
|
{
|
|
%game.recalcTeamRanks(%cl);
|
|
}
|
|
|
|
function DefaultGame::testKill(%game, %victimID, %killerID)
|
|
{
|
|
return ((%killerID !=0) && (%victimID.team != %killerID.team));
|
|
}
|
|
|
|
function DefaultGame::testSuicide(%game, %victimID, %killerID, %damageType)
|
|
{
|
|
return ((%victimID == %killerID) || (%damageType == $DamageType::Ground) || (%damageType == $DamageType::Suicide));
|
|
}
|
|
|
|
function DefaultGame::testTeamKill(%game, %victimID, %killerID)
|
|
{
|
|
return (%killerID.team == %victimID.team);
|
|
}
|
|
|
|
function DefaultGame::testTurretKill(%game, %implement)
|
|
{
|
|
if(%implement == 0)
|
|
return false;
|
|
else
|
|
return (%implement.getClassName() $= "Turret");
|
|
}
|
|
|
|
// function DefaultGame::awardScoreFlagCap(%game, %cl)
|
|
// {
|
|
// %cl.flagCaps++;
|
|
// $TeamScore[%cl.team] += %game.SCORE_PER_TEAM_FLAG_CAP;
|
|
// messageAll('MsgCTFTeamScore', "", %cl.team, $TeamScore[%cl.team]);
|
|
//
|
|
// if (%game.SCORE_PER_PLYR_FLAG_CAP > 1)
|
|
// %plural = "s";
|
|
// else
|
|
// %plural = "";
|
|
//
|
|
// if (%game.SCORE_PER_PLYR_FLAG_CAP != 0)
|
|
// messageClient(%cl, 'scoreFlaCapMsg', 'You received %1 point%2 for capturing the flag.', %game.SCORE_PER_PLYR_FLAG_CAP, %plural);
|
|
// %game.recalcScore(%cl);
|
|
// }
|
|
|
|
|
|
function DefaultGame::testOOBDeath(%game, %damageType)
|
|
{
|
|
return (%damageType == $DamageType::OutOfBounds);
|
|
}
|
|
|
|
function DefaultGame::awardScoreTurretKill(%game, %victimID, %implement)
|
|
{
|
|
if ((%killer = %implement.getControllingClient()) != 0) //award whoever might be controlling the turret
|
|
{
|
|
if (%killer == %victimID)
|
|
%game.awardScoreSuicide(%victimID);
|
|
else if (%killer.team == %victimID.team) //player controlling a turret killed a teammate
|
|
{
|
|
%killer.teamKills++;
|
|
%game.awardScoreTurretTeamKill(%victimID, %killer);
|
|
%game.awardScoreDeath(%victimID);
|
|
}
|
|
else
|
|
{
|
|
%killer.turretKills++;
|
|
%game.recalcScore(%killer);
|
|
%game.awardScoreDeath(%victimID);
|
|
}
|
|
}
|
|
else if ((%killer = %implement.getOwner()) != 0) //if it isn't controlled, award score to whoever deployed it
|
|
{
|
|
if (%killer.team == %victimID.team)
|
|
{
|
|
%game.awardScoreDeath(%victimID);
|
|
}
|
|
else
|
|
{
|
|
%killer.turretKills++;
|
|
%game.recalcScore(%killer);
|
|
%game.awardScoreDeath(%victimID);
|
|
}
|
|
}
|
|
//default is, no one was controlling it, no one owned it. No score given.
|
|
}
|
|
|
|
function DefaultGame::awardScoreDeath(%game, %victimID)
|
|
{
|
|
%victimID.deaths++;
|
|
if ( %game.SCORE_PER_DEATH != 0 )
|
|
{
|
|
// %plural = (abs(%game.SCORE_PER_DEATH) != 1 ? "s" : "");
|
|
// messageClient(%victimID, 'MsgScoreDeath', '\c0You have been penalized %1 point%2 for dying.', abs(%game.SCORE_PER_DEATH), %plural);
|
|
%game.recalcScore(%victimID);
|
|
}
|
|
}
|
|
|
|
function DefaultGame::awardScoreKill(%game, %killerID)
|
|
{
|
|
%killerID.kills++;
|
|
%game.recalcScore(%killerID);
|
|
}
|
|
|
|
function DefaultGame::awardScoreSuicide(%game, %victimID)
|
|
{
|
|
%victimID.suicides++;
|
|
// if (%game.SCORE_PER_SUICIDE != 0)
|
|
// messageClient(%victimID, 'MsgScoreSuicide', '\c0You have been penalized for killing yourself.');
|
|
%game.recalcScore(%victimID);
|
|
}
|
|
|
|
function DefaultGame::awardScoreTeamkill(%game, %victimID, %killerID)
|
|
{
|
|
%killerID.teamKills++;
|
|
if (%game.SCORE_PER_TEAMKILL != 0)
|
|
messageClient(%killerID, 'MsgScoreTeamkill', '\c0You have been penalized for killing teammate %1.', %victimID.name);
|
|
%game.recalcScore(%killerID);
|
|
}
|
|
|
|
function DefaultGame::awardScoreTurretTeamKill(%game, %victimID, %killerID)
|
|
{
|
|
%killerID.teamKills++;
|
|
if (%game.SCORE_PER_TEAMKILL != 0)
|
|
messageClient(%killerID, 'MsgScoreTeamkill', '\c0You have been penalized for killing your teammate %1, with a turret.', %victimID.name);
|
|
%game.recalcScore(%killerID);
|
|
}
|
|
|
|
|
|
function DefaultGame::objectRepaired(%game, %obj, %objName)
|
|
{
|
|
%item = %obj.getDataBlock().getName();
|
|
//echo("Item repaired is a " @ %item);
|
|
switch$ (%item)
|
|
{
|
|
case generatorLarge :
|
|
%game.genOnRepaired(%obj, %objName);
|
|
case stationInventory :
|
|
%game.stationOnRepaired(%obj, %objName);
|
|
case sensorMediumPulse :
|
|
%game.sensorOnRepaired(%obj, %objName);
|
|
case sensorLargePulse :
|
|
%game.sensorOnRepaired(%obj, %objName);
|
|
case turretBaseLarge :
|
|
%game.turretOnRepaired(%obj, %objName);
|
|
case stationVehicle : %game.vStationOnRepaired(%obj, %objName);
|
|
default: //unused by current gametypes. Add more checks here if desired
|
|
}
|
|
}
|
|
|
|
function DefaultGame::allowsProtectedStatics(%game)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// jff: why is game object doing this?
|
|
//Return a simple string with no extras
|
|
function DefaultGame::cleanWord(%game, %this)
|
|
{
|
|
%length = strlen(%this);
|
|
for(%i = 0; %i < %length; %i++)
|
|
{
|
|
%char = getSubStr(%this, %i, 1);
|
|
if(%char $= "_")
|
|
{
|
|
%next = getSubStr(%this, (%i+1), 1);
|
|
if(%next $= "_")
|
|
{
|
|
%char = "'"; //apostrophe (2 chars)
|
|
%i++;
|
|
}
|
|
else
|
|
%char = " "; //space
|
|
}
|
|
%clean = (%clean @ %char);
|
|
}
|
|
}
|
|
|
|
function DefaultGame::stationOnEnterTrigger(%game, %data, %obj, %colObj)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function DefaultGame::WeaponOnUse(%game, %data, %obj)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function DefaultGame::HandInvOnUse(%game, %data, %obj)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function DefaultGame::WeaponOnInventory(%game, %this, %obj, %amount)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function DefaultGame::ObserverOnTrigger(%game, %data, %obj, %trigger, %state)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
// jff: why is the game being notified that a weapon is being thrown? hot potato gametype?
|
|
function DefaultGame::ShapeThrowWeapon(%game, %this)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
function DefaultGame::leaveMissionArea(%game, %playerData, %player)
|
|
{
|
|
if(%player.getState() $= "Dead")
|
|
return;
|
|
|
|
%player.client.outOfBounds = true;
|
|
messageClient(%player.client, 'LeaveMissionArea', '\c1You left the mission area.~wfx/misc/warning_beep.wav');
|
|
}
|
|
|
|
function DefaultGame::enterMissionArea(%game, %playerData, %player)
|
|
{
|
|
if(%player.getState() $= "Dead")
|
|
return;
|
|
|
|
%player.client.outOfBounds = false;
|
|
messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area.');
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// AI stubs:
|
|
//------------------------------------------------------------------------------
|
|
|
|
function DefaultGame::onAIDamaged(%game, %clVictim, %clAttacker, %damageType, %sourceObject)
|
|
{
|
|
}
|
|
|
|
function DefaultGame::onAIFriendlyFire(%game, %clVictim, %clAttacker, %damageType, %sourceObject)
|
|
{
|
|
}
|
|
|
|
function DefaultGame::onAIKilled(%game, %clVictim, %clKiller, %damageType, %implement)
|
|
{
|
|
//unassign the client from any objectives
|
|
AIUnassignClient(%clVictim);
|
|
|
|
//break the link, if this ai is controlled
|
|
aiReleaseHumanControl(%clVictim.controlByHuman, %clVictim);
|
|
|
|
//and schedule the respawn
|
|
%clVictim.respawnThread = schedule(5000, %clVictim, "onAIRespawn", %clVictim);
|
|
}
|
|
|
|
function DefaultGame::onAIKilledClient(%game, %clVictim, %clAttacker, %damageType, %implement)
|
|
{
|
|
%clAttacker.setVictim(%clVictim, %clVictim.player);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Voting stuff:
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::sendGamePlayerPopupMenu( %game, %client, %targetClient, %key )
|
|
{
|
|
if( !%targetClient.matchStartReady )
|
|
return;
|
|
|
|
%isAdmin = ( %client.isAdmin || %client.isSuperAdmin );
|
|
|
|
%isTargetSelf = ( %client == %targetClient );
|
|
%isTargetAdmin = ( %targetClient.isAdmin || %targetClient.isSuperAdmin );
|
|
%isTargetBot = %targetClient.isAIControlled();
|
|
%isTargetObserver = ( %targetClient.team == 0 );
|
|
%outrankTarget = false;
|
|
if ( %client.isSuperAdmin )
|
|
%outrankTarget = !%targetClient.isSuperAdmin;
|
|
else if ( %client.isAdmin )
|
|
%outrankTarget = !%targetClient.isAdmin;
|
|
|
|
if( %client.isSuperAdmin && %targetClient.guid != 0 && !isDemo() )
|
|
{
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "addAdmin", "", 'Add to Server Admin List', 10);
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "addSuperAdmin", "", 'Add to Server SuperAdmin List', 11);
|
|
}
|
|
|
|
//mute options
|
|
if ( !%isTargetSelf )
|
|
{
|
|
if ( %client.muted[%targetClient] )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "MutePlayer", "", 'Unmute Text Chat', 1);
|
|
else
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "MutePlayer", "", 'Mute Text Chat', 1);
|
|
|
|
if ( !%isTargetBot && %client.canListenTo( %targetClient ) )
|
|
{
|
|
if ( %client.getListenState( %targetClient ) )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ListenPlayer", "", 'Disable Voice Com', 9 );
|
|
else
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ListenPlayer", "", 'Enable Voice Com', 9 );
|
|
}
|
|
}
|
|
|
|
if( !%client.canVote && !%isAdmin )
|
|
return;
|
|
|
|
// regular vote options on players
|
|
if ( %game.scheduleVote $= "" && !%isAdmin && !%isTargetAdmin )
|
|
{
|
|
if ( $Host::allowAdminPlayerVotes && !%isTargetBot && !isDemo() )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "AdminPlayer", "", 'Vote to Make Admin', 2 );
|
|
|
|
if ( !%isTargetSelf )
|
|
{
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "KickPlayer", "", 'Vote to Kick', 3 );
|
|
}
|
|
}
|
|
|
|
|
|
// Admin only options on players:
|
|
else if ( %isAdmin && !isDemo() )
|
|
{
|
|
if ( !%isTargetBot && !%isTargetAdmin )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "AdminPlayer", "", 'Make Admin', 2 );
|
|
|
|
if ( !%isTargetSelf && %outrankTarget )
|
|
{
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "KickPlayer", "", 'Kick', 3 );
|
|
|
|
if ( !%isTargetBot )
|
|
{
|
|
if( %client.isSuperAdmin )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "BanPlayer", "", 'Ban', 4 );
|
|
|
|
if ( !%isTargetObserver )
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ToObserver", "", 'Force observer', 5 );
|
|
}
|
|
}
|
|
|
|
|
|
if ( %isTargetSelf || %outrankTarget )
|
|
{
|
|
if ( %game.numTeams > 1 )
|
|
{
|
|
if ( %isTargetObserver )
|
|
{
|
|
%action = %isTargetSelf ? "Join " : "Change to ";
|
|
%str1 = %action @ getTaggedString( %game.getTeamName(1) );
|
|
%str2 = %action @ getTaggedString( %game.getTeamName(2) );
|
|
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str1, 6 );
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str2, 7 );
|
|
}
|
|
else
|
|
{
|
|
%changeTo = %targetClient.team == 1 ? 2 : 1;
|
|
%str = "Switch to " @ getTaggedString( %game.getTeamName(%changeTo) );
|
|
%caseId = 5 + %changeTo;
|
|
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "ChangeTeam", "", %str, %caseId );
|
|
}
|
|
}
|
|
else if ( %isTargetObserver )
|
|
{
|
|
%str = %isTargetSelf ? 'Join the Game' : 'Add to Game';
|
|
messageClient( %client, 'MsgPlayerPopupItem', "", %key, "JoinGame", "", %str, 8 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::sendGameVoteMenu( %game, %client, %key )
|
|
{
|
|
%isAdmin = (%client.isAdmin || %client.isSuperAdmin);
|
|
%isSuperAdmin = (%client.isSuperAdmin);
|
|
%multipleTeams = %game.numTeams > 1;
|
|
|
|
// jailed players do not need menus, unless they are admins
|
|
// Note that this does not block gametype-specific menus
|
|
if (%client.isJailed && !%isAdmin)
|
|
return;
|
|
|
|
// no one is going anywhere until this thing starts
|
|
if($MatchStarted)
|
|
{
|
|
// Client options:
|
|
if ( %client.team != 0 )
|
|
{
|
|
if ( %multipleTeams )
|
|
if( !$Host::TournamentMode )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Change your Team' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'MakeObserver', "", 'Become an Observer' );
|
|
}
|
|
else
|
|
{
|
|
if(!%multipleTeams && !$Host::TournamentMode)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'JoinGame', "", 'Join the Game' );
|
|
}
|
|
|
|
//%totalSlots = $Host::maxPlayers - ($HostGamePlayerCount + $HostGameBotCount);
|
|
// if( $HostGameBotCount > 0 && %totalSlots > 0 && %isAdmin)
|
|
//messageClient( %client, 'MsgVoteItem', "", %key, 'Addbot', "", 'Add a Bot' );
|
|
}
|
|
|
|
if( !%client.canVote && !%isAdmin )
|
|
return;
|
|
|
|
if (isDemo())
|
|
return;
|
|
|
|
if ( %game.scheduleVote $= "" )
|
|
{
|
|
if(!%isAdmin)
|
|
{
|
|
// Actual vote options:
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Vote to Change the Mission' );
|
|
|
|
if( $Host::TournamentMode )
|
|
{
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Vote Free For All Mode' );
|
|
|
|
if(!$MatchStarted && !$CountdownStarted)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Vote to Start the Match' );
|
|
}
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Vote Tournament Mode' );
|
|
|
|
if ( %multipleTeams )
|
|
{
|
|
if(!$MatchStarted && !$Host::TournamentMode)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Change your Team' );
|
|
}
|
|
|
|
if ( $teamDamage )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Vote to Disable Team Damage' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Vote to Enable Team Damage' );
|
|
|
|
if ( $Host::Purebuild == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePurebuild', 'disable pure building', '[\c1pure\c0] Vote to Disable Pure Building' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePurebuild', 'enable pure building', '[\c1pure\c0] Vote to Enable Pure Building' );
|
|
if ( $Host::ExpertMode == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteExpertMode', 'disable expert mode', '[\c1pure\c0] Vote to Disable Expert Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteExpertMode', 'enable expert mode', '[\c1pure\c0] Vote to Enable Expert Mode' );
|
|
}
|
|
else
|
|
{
|
|
// Actual vote options:
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteChangeMission', 'change the mission to', 'Change the Mission' );
|
|
|
|
if( $Host::TournamentMode )
|
|
{
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteFFAMode', 'Change server to Free For All.', 'Free For All Mode' );
|
|
|
|
if(!$MatchStarted && !$CountdownStarted)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMatchStart', 'Start Match', 'Start Match' );
|
|
}
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTournamentMode', 'Change server to Tournament.', 'Tournament Mode' );
|
|
|
|
if ( %multipleTeams )
|
|
{
|
|
if(!$MatchStarted)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'ChooseTeam', "", 'Choose Team' );
|
|
}
|
|
|
|
if ( $teamDamage )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'disable team damage', 'Disable Team Damage' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteTeamDamage', 'enable team damage', 'Enable Team Damage' );
|
|
|
|
if ( $Host::Purebuild == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePurebuild', 'disable pure building', '[\c1pure\c0] Disable Pure Building' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePurebuild', 'enable pure building', '[\c1pure\c0] Enable Pure Building' );
|
|
}
|
|
}
|
|
|
|
// Admin only options (plus some votable options :P) :
|
|
if ( %isAdmin ) {
|
|
if ( $Host::Cascade == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteCascadeMode', 'disable cascade mode', '[\c1pure\c0] Disable Cascade Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteCascadeMode', 'enable cascade mode', '[\c1pure\c0] Enable Cascade Mode' );
|
|
if ( $Host::ExpertMode == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteExpertMode', 'disable expert mode', '[\c1pure\c0] Disable Expert Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteExpertMode', 'enable expert mode', '[\c1pure\c0] Enable Expert Mode' );
|
|
if ( $Host::Vehicles == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteVehicles', 'disable vehicles', '[\c1pure\c0] Disable Vehicles' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteVehicles', 'enable vehicles', '[\c1pure\c0] Enable Vehicles' );
|
|
if ( $Host::InvincibleArmors == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteInvincibleArmors', 'disable invincible armors', '[\c1pure\c0] Disable Invincible Armors' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteInvincibleArmors', 'enable invincible armors', '[\c1pure\c0] Enable Invincible Armors' );
|
|
if ( $Host::InvincibleDeployables == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteInvincibleDeployables', 'disable invincible deployables', '[\c1pure\c0] Disable Invincible Deployables' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteInvincibleDeployables', 'enable invincible deployables', '[\c1pure\c0] Enable Invincible Deployables' );
|
|
if ( $Host::AllowUnderground == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteUndergroundMode', 'disable underground mode', '[\c1pure\c0] Disable Underground Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteUndergroundMode', 'enable underground mode', '[\c1pure\c0] Enable Underground Mode' );
|
|
if ( $Host::Hazard::Enabled == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteHazardMode', 'disable hazard mode', '[\c1hazard\c0] Disable Hazard Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteHazardMode', 'enable hazard mode', '[\c1hazard\c0] Enable Hazard Mode' );
|
|
if ($MTC_Loaded == 1) {
|
|
if ( $Host::MTC::Enabled == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMTCMode', 'disable MTC mode', '[\c1mtc\c0] Disable MTC Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteMTCMode', 'enable MTC mode', '[\c1mtc\c0] Enable MTC Mode' );
|
|
}
|
|
if ( $Host::SatchelChargeEnabled == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteSatchelCharge', 'disable satchel charges', '[\c1security\c0] Disable Satchel Charges' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteSatchelCharge', 'enable satchel charges', '[\c1security\c0] Enable Satchel Charges' );
|
|
if ( $Host::OnlyOwnerDeconstruct == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerDeconstruct', 'disable only owner deconstruct', '[\c1security\c0] Disable Only Owner Deconstruct' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerDeconstruct', 'enable only owner deconstruct', '[\c1security\c0] Enable Only Owner Deconstruct' );
|
|
if ( $Host::OnlyOwnerCascade == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerCascade', 'disable only owner cascade', '[\c1security\c0] Disable Only Owner Cascade' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerCascade', 'enable only owner cascade', '[\c1security\c0] Enable Only Owner Cascade' );
|
|
if ( $Host::OnlyOwnerRotate == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerRotate', 'disable only owner rotate', '[\c1security\c0] Disable Only Owner Rotate' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerRotate', 'enable only owner rotate', '[\c1security\c0] Enable Only Owner Rotate' );
|
|
if ( $Host::OnlyOwnerCubicReplace == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerCubicReplace', 'disable only owner cubic-replace', '[\c1security\c0] Disable Only Owner Cubic-Replace' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteOnlyOwnerCubicReplace', 'enable only owner cubic-replace', '[\c1security\c0] Enable Only Owner Cubic-Replace' );
|
|
if ( $Host::Prison::Enabled == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrison', 'disable prison', '[\c1prison\c0] Disable Prison' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrison', 'enable prison', '[\c1prison\c0] Enable Prison' );
|
|
if ( $Host::Prison::Enabled == 1 ) {
|
|
if ( $Host::Prison::Kill == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonKilling', 'disable jailing killers', '[\c1prison\c0] Disable Jailing of Killers' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonKilling', 'enable jailing killers', '[\c1prison\c0] Enable Jailing of Killers' );
|
|
if ( $Host::Prison::TeamKill == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonTeamKilling', 'disable jailing team killers', '[\c1prison\c0] Disable Jailing of Team Killers' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonTeamKilling', 'enable jailing team killers', '[\c1prison\c0] Enable Jailing of Team Killers' );
|
|
if ( $Host::Prison::DeploySpam == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonDeploySpam', 'disable jailing deploy spammers', '[\c1prison\c0] Disable Jailing of Deploy Spammers');
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VotePrisonDeploySpam', 'enable jailing deploy spammers', '[\c1prison\c0] Enable Jailing of Deploy Spammers' );
|
|
}
|
|
if ($Host::Nerf::Enabled == 1)
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfWeapons', 'disable nerf weapons', '[\c1nerf\c0] Disable Nerf Weapons' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfWeapons', 'enable nerf weapons', '[\c1nerf\c0] Enable Nerf Weapons' );
|
|
if ($Host::Nerf::Enabled == 1) {
|
|
if ( $Host::Nerf::DanceAnim == 1 && $Host::Nerf::DeathAnim == 0 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfDance', 'disable nerf dance mode', '[\c1nerf\c0] Disable Nerf Dance Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfDance', 'enable nerf dance mode', '[\c1nerf\c0] Enable Nerf Dance Mode' );
|
|
if ( $Host::Nerf::DeathAnim == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfDeath', 'disable nerf death mode', '[\c1nerf\c0] Disable Nerf Death Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfDeath', 'enable nerf death mode', '[\c1nerf\c0] Enable Nerf Death Mode' );
|
|
if ($Host::Prison::Enabled == 1) {
|
|
if ( $Host::Nerf::Prison == 1 )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfPrison', 'disable nerf prison mode', '[\c1nerf\c0] Disable Nerf Prison Mode' );
|
|
else
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteNerfPrison', 'enable nerf prison mode', '[\c1nerf\c0] Enable Nerf Prison Mode' );
|
|
}
|
|
}
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteGlobalPowerCheck', 'evaluate power for all deployables', '[\c1power\c0] Evaluate Power for All Deployables' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRemoveDupDeployables', 'remove all duplicate deployables', '[\c4spam\c0] Remove All Duplicate Deployables' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRemoveNonPoweredDeployables', 'remove all deployables without power', '[\c4spam\c0] Remove All Deployables Without Power' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRemoveOrphanedDeployables', 'remove all orphaned deployables', '[\c4spam\c0] Remove All Orphaned Deployables' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteRemoveDeployables', 'remove all deployables in mission', '[\c4spam\c0] Remove All Deployables In Mission' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteChangeTimeLimit', 'change the time limit', 'Change the Time Limit' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 'VoteResetServer', 'reset server defaults', 'Reset the Server' );
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::sendGameTeamList( %game, %client, %key )
|
|
{
|
|
%teamCount = %game.numTeams;
|
|
if ( %teamCount < 2 )
|
|
{
|
|
warn( "Team menu requested for one-team game!" );
|
|
return;
|
|
}
|
|
|
|
for ( %team = 1; %team - 1 < %teamCount; %team++ )
|
|
messageClient( %client, 'MsgVoteItem', "", %key, %team, "", detag( getTaggedString( %game.getTeamName(%team) ) ) );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::sendTimeLimitList( %game, %client, %key )
|
|
{
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 10, "", '10 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 15, "", '15 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 20, "", '20 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 25, "", '25 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 30, "", '30 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 45, "", '45 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 60, "", '60 minutes' );
|
|
messageClient( %client, 'MsgVoteItem', "", %key, 10080, "", 'No time limit' );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// all global votes here
|
|
// this function was created to remove the call to "eval", which is non-functional in PURE servers...
|
|
function DefaultGame::evalVote(%game, %typeName, %admin, %arg1, %arg2, %arg3, %arg4)
|
|
{
|
|
switch$ (%typeName)
|
|
{
|
|
case "voteChangeMission":
|
|
%game.voteChangeMission(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteTeamDamage":
|
|
%game.voteTeamDamage(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteTournamentMode":
|
|
%game.voteTournamentMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteMatchStart":
|
|
%game.voteMatchStart(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteFFAMode":
|
|
%game.voteFFAMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteChangeTimeLimit":
|
|
%game.voteChangeTimeLimit(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteResetServer":
|
|
%game.voteResetServer(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteKickPlayer":
|
|
%game.voteKickPlayer(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteAdminPlayer":
|
|
%game.voteAdminPlayer(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteGreedMode":
|
|
%game.voteGreedMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteHoardMode":
|
|
%game.voteHoardMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "votePurebuild":
|
|
%game.votePurebuild(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteCascadeMode":
|
|
%game.voteCascadeMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteExpertMode":
|
|
%game.voteExpertMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "VoteVehicles":
|
|
%game.VoteVehicles(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteInvincibleArmors":
|
|
%game.voteInvincibleArmors(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteInvincibleDeployables":
|
|
%game.voteInvincibleDeployables(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteUndergroundMode":
|
|
%game.voteUndergroundMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteHazardMode":
|
|
%game.voteHazardMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteMTCMode":
|
|
%game.voteMTCMode(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteSatchelCharge":
|
|
%game.voteSatchelCharge(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteOnlyOwnerDeconstruct":
|
|
%game.voteOnlyOwnerDeconstruct(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteOnlyOwnerCascade":
|
|
%game.voteOnlyOwnerCascade(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteOnlyOwnerRotate":
|
|
%game.voteOnlyOwnerRotate(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteOnlyOwnerCubicReplace":
|
|
%game.voteOnlyOwnerCubicReplace(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "votePrison":
|
|
%game.votePrison(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "votePrisonKilling":
|
|
%game.VotePrisonKilling(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "votePrisonTeamKilling":
|
|
%game.VotePrisonTeamKilling(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "votePrisonDeploySpam":
|
|
%game.VotePrisonDeploySpam(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteNerfWeapons":
|
|
%game.voteNerfWeapons(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteNerfDance":
|
|
%game.voteNerfDance(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteNerfDeath":
|
|
%game.voteNerfDeath(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteNerfPrison":
|
|
%game.voteNerfPrison(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteGlobalPowerCheck":
|
|
%game.voteGlobalPowerCheck(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteRemoveDupDeployables":
|
|
%game.voteRemoveDupDeployables(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "VoteRemoveNonPoweredDeployables":
|
|
%game.VoteRemoveNonPoweredDeployables(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "VoteRemoveOrphanedDeployables":
|
|
%game.VoteRemoveOrphanedDeployables(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
case "voteRemoveDeployables":
|
|
%game.voteRemoveDeployables(%admin, %arg1, %arg2, %arg3, %arg4);
|
|
}
|
|
}
|
|
|
|
function DefaultGame::voteChangeMission(%game, %admin, %missionDisplayName, %typeDisplayName, %missionId, %missionTypeId)
|
|
{
|
|
if (%admin) {
|
|
if (%missionTypeId $= "LoadBuildingFile") {
|
|
%file = stripChars(%missionDisplayName,":\\/");
|
|
if (getSubStr(%file,0,1) $= "_") {
|
|
%dir = $SaveBuilding::AutoSaveFolder;
|
|
%file = getSubStr(%file,1,strLen(%file)-1);
|
|
}
|
|
else
|
|
%dir = "Buildings/Admin/";
|
|
if (%file $= "")
|
|
return;
|
|
else {
|
|
if (strStr(%file,"..") != -1)
|
|
return;
|
|
}
|
|
%file = %dir @ %file;
|
|
if (isFile(%file) && getSubStr(%file,strLen(%file)-3,3) $= ".cs") {
|
|
// Message is sent first, so clients know what happened in case server crashes
|
|
messageAll('MsgAdminForce', '\c2The Admin has loaded a building file.');
|
|
compile(%file);
|
|
exec(%file);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
%mission = $HostMissionFile[%missionId];
|
|
if ( %mission $= "" )
|
|
{
|
|
error( "Invalid mission index passed to DefaultGame::voteChangeMission!" );
|
|
return;
|
|
}
|
|
|
|
%missionType = $HostTypeName[%missionTypeId];
|
|
if ( %missionType $= "" )
|
|
{
|
|
error( "Invalid mission type id passed to DefaultGame::voteChangeMission!" );
|
|
return;
|
|
}
|
|
|
|
if(%admin)
|
|
{
|
|
messageAll('MsgAdminChangeMission', '\c2The Admin has changed the mission to %1 (%2).', %missionDisplayName, %typeDisplayName );
|
|
logEcho("mission changed to "@%missionDisplayName@"/"@%typeDisplayName@" (admin)");
|
|
%game.gameOver();
|
|
loadMission( %mission, %missionType, false );
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The mission was changed to %1 (%2) by vote.', %missionDisplayName, %typeDisplayName );
|
|
logEcho("mission changed to "@%missionDisplayName@"/"@%typeDisplayName@" (vote)");
|
|
%game.gameOver();
|
|
loadMission( %mission, %missionType, false );
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Change mission vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteTeamDamage(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($teamDamage)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled team damage.');
|
|
$Host::TeamDamageOn = $TeamDamage = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled team damage.');
|
|
$Host::TeamDamageOn = $TeamDamage = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($teamDamage)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Team damage was disabled by vote.');
|
|
$Host::TeamDamageOn = $TeamDamage = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Team damage was enabled by vote.');
|
|
$Host::TeamDamageOn = $TeamDamage = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($teamDamage)
|
|
messageAll('MsgVoteFailed', '\c2Disable team damage vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable team damage vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("team damage "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::votePurebuild(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Purebuild == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled pure building.');
|
|
purebuildOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled pure building.');
|
|
purebuildOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Purebuild == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Pure building was disabled by vote.');
|
|
purebuildOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Pure building was enabled by vote.');
|
|
purebuildOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Purebuild == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable pure building vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable pure building vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("purebuild "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteCascadeMode(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Cascade == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Cascade mode.');
|
|
$Host::Cascade = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Cascade mode.');
|
|
$Host::Cascade = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Cascade == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Cascade mode was disabled by vote.');
|
|
$Host::Cascade = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Cascade mode was enabled by vote.');
|
|
$Host::Cascade = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Cascade == 1 && $Host::Cascade == 0)
|
|
messageAll('MsgVoteFailed', '\c2Disable Cascade mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Cascade mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("cascade mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteExpertMode(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::ExpertMode == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Expert mode.');
|
|
expertModeOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Expert mode.');
|
|
expertModeOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::ExpertMode == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Expert mode was disabled by vote.');
|
|
expertModeOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Expert mode was enabled by vote.');
|
|
expertModeOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::ExpertMode == 1 && $Host::ExpertMode == 0)
|
|
messageAll('MsgVoteFailed', '\c2Disable Expert mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Expert mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("expert mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteVehicles(%game, %admin) {
|
|
if (!(Game.pureVehTime < getSimTime()))
|
|
return;
|
|
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin) {
|
|
if($Host::Vehicles == 1) {
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled vehicles.');
|
|
disableVehicles();
|
|
Game.pureVehTime = getSimTime() + 5000;
|
|
%setto = "disabled";
|
|
}
|
|
else {
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled vehicles.');
|
|
enableVehicles();
|
|
Game.pureVehTime = getSimTime() + 5000;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
if($Host::Vehicles == 1) {
|
|
messageAll('MsgVotePassed', '\c2Vehicles were disabled by vote.');
|
|
disableVehicles();
|
|
Game.pureVehTime = getSimTime() + 5000;
|
|
%setto = "disabled";
|
|
}
|
|
else {
|
|
messageAll('MsgVotePassed', '\c2Vehicles were enabled by vote.');
|
|
enableVehicles();
|
|
Game.pureVehTime = getSimTime() + 5000;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else {
|
|
if($Host::Vehicles == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable vehicles vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable vehicles vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("pure vehicles "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteSatchelCharge(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::SatchelChargeEnabled == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled satchel charges.');
|
|
$Host::SatchelChargeEnabled = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled satchel charges.');
|
|
$Host::SatchelChargeEnabled = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::SatchelChargeEnabled == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Satchel charges was disabled by vote.');
|
|
$Host::SatchelChargeEnabled = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Satchel charges was enabled by vote.');
|
|
$Host::SatchelChargeEnabled = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::SatchelChargeEnabled == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable satchel charges vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable satchel charges vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("satchel charges "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteOnlyOwnerDeconstruct(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::OnlyOwnerDeconstruct == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled only owner deconstruct mode.');
|
|
$Host::OnlyOwnerDeconstruct = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled only owner deconstruct mode.');
|
|
$Host::OnlyOwnerDeconstruct = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::OnlyOwnerDeconstruct == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner deconstruct mode was disabled by vote.');
|
|
$Host::OnlyOwnerDeconstruct = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner deconstruct mode was enabled by vote.');
|
|
$Host::OnlyOwnerDeconstruct = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::OnlyOwnerDeconstruct == 1)
|
|
messageAll('MsgVoteFailed', '\c2Only owner deconstruct vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Only owner deconstruct vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("only owner deconstruct "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteOnlyOwnerCascade(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::OnlyOwnerCascade == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled only owner cascade mode.');
|
|
$Host::OnlyOwnerCascade = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled only owner cascade mode.');
|
|
$Host::OnlyOwnerCascade = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::OnlyOwnerCascade == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner cascade mode was disabled by vote.');
|
|
$Host::OnlyOwnerCascade = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner cascade mode was enabled by vote.');
|
|
$Host::OnlyOwnerCascade = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::OnlyOwnerCascade == 1)
|
|
messageAll('MsgVoteFailed', '\c2Only owner cascade vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Only owner cascade vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("only owner cascade "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteOnlyOwnerRotate(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::OnlyOwnerRotate == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled only owner rotate mode.');
|
|
$Host::OnlyOwnerRotate = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled only owner rotate mode.');
|
|
$Host::OnlyOwnerRotate = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::OnlyOwnerRotate == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner rotate mode was disabled by vote.');
|
|
$Host::OnlyOwnerRotate = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner rotate mode was enabled by vote.');
|
|
$Host::OnlyOwnerRotate = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::OnlyOwnerRotate == 1)
|
|
messageAll('MsgVoteFailed', '\c2Only owner rotate vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Only owner rotate vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("only owner rotate "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteOnlyOwnerCubicReplace(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::OnlyOwnerCubicReplace == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled only owner cubic-replace mode.');
|
|
$Host::OnlyOwnerCubicReplace = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled only owner cubic-replace mode.');
|
|
$Host::OnlyOwnerCubicReplace = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::OnlyOwnerCubicReplace == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner cubic-replace mode was disabled by vote.');
|
|
$Host::OnlyOwnerCubicReplace = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Only owner cubic-replace mode was enabled by vote.');
|
|
$Host::OnlyOwnerCubicReplace = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::OnlyOwnerCubicReplace == 1)
|
|
messageAll('MsgVoteFailed', '\c2Only owner cubic-replace vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Only owner cubic-replace vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("only owner cubic-replace "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteGlobalPowerCheck( %game, %admin, %client ) {
|
|
%cause = "";
|
|
if (%admin) {
|
|
messageAll( 'MsgAdminForce', '\c2The Admin has evaluated power for all deployables in the mission.' );
|
|
globalPowerCheck();
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
messageAll('MsgVotePassed', '\c2Evaluating power for all deployables in the mission by vote.' );
|
|
globalPowerCheck();
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to evaluate power for all deployables in the mission did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("evaluate power for all deployables "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteRemoveDupDeployables( %game, %admin, %client ) {
|
|
if (!(Game.removeDepTime < getSimTime()))
|
|
return;
|
|
%cause = "";
|
|
if (%admin) {
|
|
messageAll( 'MsgAdminForce', '\c2The Admin removed all duplicate deployables in the mission.' );
|
|
Game.removeDepTime = getSimTime() + delDupPieces(0,0,true) + 1000;
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
messageAll('MsgVotePassed', '\c2Removing all duplicate deployables in the mission by vote.' );
|
|
delDupPieces(0,0,true);
|
|
Game.removeDepTime = getSimTime() + delDupPieces(0,0,true) + 1000;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to remove all duplicate deployables in the mission did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("remove all duplicate deployables "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteRemoveNonPoweredDeployables( %game, %admin, %client ) {
|
|
if (!(Game.removeDepTime < getSimTime()))
|
|
return;
|
|
%cause = "";
|
|
if (%admin) {
|
|
messageAll( 'MsgAdminForce', '\c2The Admin removed all deployables in the mission without power.' );
|
|
Game.removeDepTime = getSimTime() + delNonPoweredPieces(true) + 1000;
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
messageAll('MsgVotePassed', '\c2Removing all deployables in the mission without power by vote.' );
|
|
delNonPoweredPieces(true);
|
|
Game.removeDepTime = getSimTime() + delNonPoweredPieces(true) + 1000;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to remove all deployables in the mission without power did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("remove all deployables without power "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteRemoveOrphanedDeployables( %game, %admin, %client ) {
|
|
if (!(Game.removeDepTime < getSimTime()))
|
|
return;
|
|
%cause = "";
|
|
if (%admin) {
|
|
messageAll( 'MsgAdminForce', '\c2The Admin removed all orphaned deployables in the mission.' );
|
|
Game.removeDepTime = getSimTime() + delOrphanedPieces(true) + 1000;
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
messageAll('MsgVotePassed', '\c2Removing all orphaned deployables in the mission by vote.' );
|
|
delOrphanedPieces(true);
|
|
Game.removeDepTime = getSimTime() + delOrphanedPieces(true) + 1000;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to remove all orphaned deployables in the mission did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("remove all orphaned deployables "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteRemoveDeployables( %game, %admin, %client ) {
|
|
if (!(Game.removeDepTime < getSimTime()))
|
|
return;
|
|
%cause = "";
|
|
if (%admin) {
|
|
messageAll( 'MsgAdminForce', '\c2The Admin removed all deployables in the mission.' );
|
|
Game.removeDepTime = getSimTime() + unpureDeployables() + 1000;
|
|
%cause = "(admin)";
|
|
}
|
|
else {
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100)) {
|
|
messageAll('MsgVotePassed', '\c2Removing all deployables in the mission by vote.' );
|
|
unpureDeployables();
|
|
Game.removeDepTime = getSimTime() + unpureDeployables() + 1000;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to remove all deployables in the mission did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("remove all deployables "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteInvincibleArmors(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::InvincibleArmors == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled invincible armors.');
|
|
$Host::InvincibleArmors = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled invincible armors.');
|
|
$Host::InvincibleArmors = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::InvincibleArmors == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Invincible armors was disabled by vote.');
|
|
$Host::InvincibleArmors = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Invincible armors was enabled by vote.');
|
|
$Host::InvincibleArmors = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::InvincibleArmors == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable invincible armors vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable invincible armors vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("invincible armors "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VoteInvincibleDeployables(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::InvincibleDeployables == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled invincible deployables.');
|
|
$Host::InvincibleDeployables = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled invincible deployables.');
|
|
$Host::InvincibleDeployables = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::InvincibleDeployables == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Invincible deployables was disabled by vote.');
|
|
$Host::InvincibleDeployables = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Invincible deployables was enabled by vote.');
|
|
$Host::InvincibleDeployables = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::InvincibleDeployables == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable invincible deployables vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable invincible deployables vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("invincible deployables "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteUndergroundMode(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::AllowUnderground == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Underground mode.');
|
|
$Host::AllowUnderground = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Underground mode.');
|
|
$Host::AllowUnderground = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::AllowUnderground == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Underground mode was disabled by vote.');
|
|
$Host::AllowUnderground = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Underground mode was enabled by vote.');
|
|
$Host::AllowUnderground = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::AllowUnderground == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable Underground mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Underground mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("underground mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteHazardMode(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Hazard::Enabled == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Hazard mode.');
|
|
hazardOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Hazard mode.');
|
|
hazardOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Hazard::Enabled == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Hazard mode was disabled by vote.');
|
|
hazardOff();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Hazard mode was enabled by vote.');
|
|
hazardOn();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Hazard::Enabled == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable Hazard mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Hazard mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("hazard mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteMTCMode(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::MTC::Enabled == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled MTC mode.');
|
|
stopMTC();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled MTC mode.');
|
|
startMTC();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::MTC::Enabled == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2MTC mode was disabled by vote.');
|
|
stopMTC();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2MTC mode was enabled by vote.');
|
|
startMTC();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::MTC::Enabled == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable MTC mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable MTC mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("MTC mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::votePrison(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Prison::Enabled == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled the prison.');
|
|
prisonDisable();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled the prison.');
|
|
prisonEnable();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Prison::Enabled == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The prison was disabled by vote.');
|
|
prisonDisable();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The prison was enabled by vote.');
|
|
prisonEnable();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Prison::Enabled == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable prison vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable prison vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("prison "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VotePrisonKilling(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Prison::Kill == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled jailing of killers.');
|
|
$Host::Prison::Kill = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled jailing of killers.');
|
|
$Host::Prison::Kill = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Prison::Kill == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of killers was disabled by vote.');
|
|
$Host::Prison::Kill = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of killers was enabled by vote.');
|
|
$Host::Prison::Kill = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Prison::Kill == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable jailing of killers vote not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable jailing of killers vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("prison killing "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VotePrisonTeamKilling(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Prison::TeamKill == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled jailing of team killers.');
|
|
$Host::Prison::TeamKill = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled jailing of team killers.');
|
|
$Host::Prison::TeamKill = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Prison::TeamKill == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of team killers was disabled by vote.');
|
|
$Host::Prison::TeamKill = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of team killers was enabled by vote.');
|
|
$Host::Prison::TeamKill = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Prison::TeamKill == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable jailing of team killers vote not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable jailing of team killers vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("prison team killers "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::VotePrisonDeploySpam(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Prison::DeploySpam == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled jailing of deploy spammers.');
|
|
$Host::Prison::DeploySpam = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled jailing of deploy spammers.');
|
|
$Host::Prison::DeploySpam = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Prison::DeploySpam == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of deploy spammers was disabled by vote.');
|
|
$Host::Prison::DeploySpam = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Jailing of deploy spammers was enabled by vote.');
|
|
$Host::Prison::DeploySpam = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Prison::DeploySpam == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable jailing of deploy spammers vote not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable jailing of deploy spammers vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("prison deploy spammers "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteNerfWeapons(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Nerf::Enabled == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled nerf weapons.');
|
|
nerfDisable();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled nerf weapons.');
|
|
nerfEnable();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Nerf::Enabled == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf weapons were disabled by vote.');
|
|
nerfDisable();
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf weapons were enabled by vote.');
|
|
nerfEnable();
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Nerf::Enabled == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable nerf weapons vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable nerf weapons vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("nerf weapons "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteNerfDance(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Nerf::DanceAnim == 1 && $Host::Nerf::DeathAnim == 0)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Nerf Dance mode.');
|
|
$Host::Nerf::DanceAnim = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Nerf Dance mode.');
|
|
$Host::Nerf::DanceAnim = 1;
|
|
$Host::Nerf::DeathAnim = 0;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Nerf::DanceAnim == 1 && $Host::Nerf::DeathAnim == 0)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Dance mode was disabled by vote.');
|
|
$Host::Nerf::DanceAnim = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Dance mode was enabled by vote.');
|
|
$Host::Nerf::DanceAnim = 1;
|
|
$Host::Nerf::DeathAnim = 0;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Nerf::DanceAnim == 1 && $Host::Nerf::DeathAnim == 0)
|
|
messageAll('MsgVoteFailed', '\c2Disable Nerf Dance mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Nerf Dance mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("nerf dance mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteNerfDeath(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Nerf::DeathAnim == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Nerf Death mode.');
|
|
$Host::Nerf::DeathAnim = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Nerf Death mode.');
|
|
$Host::Nerf::DanceAnim = 0;
|
|
$Host::Nerf::DeathAnim = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Nerf::DeathAnim == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Death mode was disabled by vote.');
|
|
$Host::Nerf::DeathAnim = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Death mode was enabled by vote.');
|
|
$Host::Nerf::DeathAnim = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Nerf::DeathAnim == 1 && $Host::Nerf::DeathAnim == 0)
|
|
messageAll('MsgVoteFailed', '\c2Disable Nerf Death mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Nerf Death mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("nerf death mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteNerfPrison(%game, %admin)
|
|
{
|
|
%setto = "";
|
|
%cause = "";
|
|
if(%admin)
|
|
{
|
|
if($Host::Nerf::Prison == 1)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has disabled Nerf Prison mode.');
|
|
$Host::Nerf::Prison = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has enabled Nerf Prison mode.');
|
|
$Host::Nerf::Prison = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
if($Host::Nerf::Prison == 1)
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Prison mode was disabled by vote.');
|
|
$Host::Nerf::Prison = 0;
|
|
%setto = "disabled";
|
|
}
|
|
else
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Nerf Prison mode was enabled by vote.');
|
|
$Host::Nerf::Prison = 1;
|
|
%setto = "enabled";
|
|
}
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
if($Host::Nerf::Prison == 1)
|
|
messageAll('MsgVoteFailed', '\c2Disable Nerf Prison mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Enable Nerf Prison mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
if(%setto !$= "")
|
|
logEcho("nerf prison mode "@%setto SPC %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteTournamentMode( %game, %admin, %missionDisplayName, %typeDisplayName, %missionId, %missionTypeId )
|
|
{
|
|
%mission = $HostMissionFile[%missionId];
|
|
if ( %mission $= "" )
|
|
{
|
|
error( "Invalid mission index passed to DefaultGame::voteTournamentMode!" );
|
|
return;
|
|
}
|
|
|
|
%missionType = $HostTypeName[%missionTypeId];
|
|
if ( %missionType $= "" )
|
|
{
|
|
error( "Invalid mission type id passed to DefaultGame::voteTournamentMode!" );
|
|
return;
|
|
}
|
|
|
|
%cause = "";
|
|
if (%admin)
|
|
{
|
|
messageAll( 'MsgAdminForce', '\c2The Admin has switched the server to Tournament mode (%1).', %missionDisplayName );
|
|
setModeTournament( %mission, %missionType );
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Server switched to Tournament mode by vote (%1): %2 percent.', %missionDisplayName, mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
setModeTournament( %mission, %missionType );
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Tournament mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("tournament mode set "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteMatchStart( %game, %admin)
|
|
{
|
|
%cause = "";
|
|
%ready = forceTourneyMatchStart();
|
|
if(%admin)
|
|
{
|
|
if(!%ready)
|
|
{
|
|
messageClient( %client, 'msgClient', '\c2No players are ready yet.');
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
messageAll('msgMissionStart', '\c2The admin has forced the match to start.');
|
|
%cause = "(admin)";
|
|
startTourneyCountdown();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(!%ready)
|
|
{
|
|
messageAll( 'msgClient', '\c2Vote passed to start match, but no players are ready yet.');
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The match has been started by vote: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
startTourneyCountdown();
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Start Match vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
}
|
|
|
|
if(%cause !$= "")
|
|
logEcho("start match "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteFFAMode( %game, %admin, %client )
|
|
{
|
|
%cause = "";
|
|
%name = getTaggedString(%client.name);
|
|
|
|
if (%admin)
|
|
{
|
|
messageAll('MsgAdminForce', '\c2The Admin has switched the server to Free For All mode.', %client);
|
|
setModeFFA($CurrentMission, $CurrentMissionType);
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2Server switched to Free For All mode by vote.', %client);
|
|
setModeFFA($CurrentMission, $CurrentMissionType);
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Free For All mode vote did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("free for all set "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteChangeTimeLimit( %game, %admin, %newLimit )
|
|
{
|
|
if( %newLimit == 999 )
|
|
%display = "unlimited";
|
|
else
|
|
%display = %newLimit;
|
|
|
|
%cause = "";
|
|
if ( %admin )
|
|
{
|
|
messageAll( 'MsgAdminForce', '\c2The Admin changed the mission time limit to %1 minutes.', %display );
|
|
$Host::TimeLimit = %newLimit;
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The mission time limit was set to %1 minutes by vote.', %display);
|
|
$Host::TimeLimit = %newLimit;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to change the mission time limit did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
|
|
//if the time limit was actually changed...
|
|
if(%cause !$= "")
|
|
{
|
|
logEcho("time limit set to "@%display SPC %cause);
|
|
|
|
//if the match has been started, reset the end of match countdown
|
|
if ($matchStarted)
|
|
{
|
|
//schedule the end of match countdown
|
|
%elapsedTimeMS = getSimTime() - $missionStartTime;
|
|
%curTimeLeftMS = ($Host::TimeLimit * 60 * 1000) - %elapsedTimeMS;
|
|
error("time limit="@$Host::TimeLimit@", elapsed="@(%elapsedTimeMS / 60000)@", curtimeleftms="@%curTimeLeftMS);
|
|
CancelEndCountdown();
|
|
EndCountdown(%curTimeLeftMS);
|
|
cancel(%game.timeSync);
|
|
%game.checkTimeLimit(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteResetServer( %game, %admin, %client )
|
|
{
|
|
%cause = "";
|
|
if ( %admin )
|
|
{
|
|
messageAll( 'AdminResetServer', '\c2The Admin has reset the server.' );
|
|
resetServerDefaults();
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgVotePassed', '\c2The Server has been reset by vote.' );
|
|
resetServerDefaults();
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2The vote to reset Server to defaults did not pass: %1 percent.', mFloor(%game.totalVotesFor/(ClientGroup.getCount() - $HostGameBotCount) * 100));
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho("server reset "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// all team based votes here
|
|
function DefaultGame::voteKickPlayer(%game, %admin, %client)
|
|
{
|
|
%cause = "";
|
|
|
|
if(%admin)
|
|
{
|
|
kick(%client, %admin, %client.guid );
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%team = %client.team;
|
|
%totalVotes = %game.votesFor[%game.kickTeam] + %game.votesAgainst[%game.kickTeam];
|
|
if(%totalVotes > 0 && (%game.votesFor[%game.kickTeam] / %totalVotes) > ($Host::VotePasspercent / 100))
|
|
{
|
|
kick(%client, %admin, %game.kickGuid);
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
{
|
|
for ( %idx = 0; %idx < ClientGroup.getCount(); %idx++ )
|
|
{
|
|
%cl = ClientGroup.getObject( %idx );
|
|
|
|
if (%cl.team == %game.kickTeam && !%cl.isAIControlled())
|
|
messageClient( %cl, 'MsgVoteFailed', '\c2Kick player vote did not pass' );
|
|
}
|
|
}
|
|
}
|
|
|
|
%game.kickTeam = "";
|
|
%game.kickGuid = "";
|
|
%game.kickClientName = "";
|
|
|
|
if(%cause !$= "")
|
|
logEcho(%name@" (cl " @ %game.kickClient @ ") kicked " @ %cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::banPlayer(%game, %admin, %client)
|
|
{
|
|
%cause = "";
|
|
%name = %client.nameBase;
|
|
if( %admin )
|
|
{
|
|
ban( %client, %admin );
|
|
%cause = "(admin)";
|
|
}
|
|
|
|
if(%cause !$= "")
|
|
logEcho(%name@" (cl "@%client@") banned "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::voteAdminPlayer(%game, %admin, %client)
|
|
{
|
|
%cause = "";
|
|
|
|
if (%admin)
|
|
{
|
|
messageAll('MsgAdminAdminPlayer', '\c2The Admin made %2 an admin.', %client, %client.name);
|
|
%client.isAdmin = 1;
|
|
%cause = "(admin)";
|
|
}
|
|
else
|
|
{
|
|
%totalVotes = %game.totalVotesFor + %game.totalVotesAgainst;
|
|
if(%totalVotes > 0 && (%game.totalVotesFor / (ClientGroup.getCount() - $HostGameBotCount)) > ($Host::VotePasspercent / 100))
|
|
{
|
|
messageAll('MsgAdminPlayer', '\c2%2 was made an admin by vote.', %client, %client.name);
|
|
%client.isAdmin = 1;
|
|
%cause = "(vote)";
|
|
}
|
|
else
|
|
messageAll('MsgVoteFailed', '\c2Vote to make %1 an admin did not pass.', %client.name);
|
|
}
|
|
if(%cause !$= "")
|
|
logEcho(%client.nameBase@" (cl "@%client@") made admin "@%cause);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::processGameLink(%game, %client, %arg1, %arg2, %arg3, %arg4, %arg5)
|
|
{
|
|
//the default behavior when clicking on a game link is to start observing that client
|
|
%targetClient = %arg1;
|
|
if ((%client.team == 0) && isObject(%targetClient) && (%targetClient.team != 0))
|
|
{
|
|
%prevObsClient = %client.observeClient;
|
|
|
|
// update the observer list for this client
|
|
observerFollowUpdate( %client, %targetClient, %prevObsClient !$= "" );
|
|
|
|
serverCmdObserveClient(%client, %targetClient);
|
|
displayObserverHud(%client, %targetClient);
|
|
|
|
if (%targetClient != %prevObsClient)
|
|
{
|
|
messageClient(%targetClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
|
messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
|
}
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
$ScoreHudMaxVisible = 19;
|
|
function DefaultGame::updateScoreHud(%game, %client, %tag)
|
|
{
|
|
if (Game.numTeams > 1)
|
|
{
|
|
// Send header:
|
|
messageClient( %client, 'SetScoreHudHeader', "", '<tab:15,315>\t%1<rmargin:260><just:right>%2<rmargin:560><just:left>\t%3<just:right>%4',
|
|
%game.getTeamName(1), $TeamScore[1], %game.getTeamName(2), $TeamScore[2] );
|
|
|
|
// Send subheader:
|
|
messageClient( %client, 'SetScoreHudSubheader', "", '<tab:15,315>\tPLAYERS (%1)<rmargin:260><just:right>SCORE<rmargin:560><just:left>\tPLAYERS (%2)<just:right>SCORE',
|
|
$TeamRank[1, count], $TeamRank[2, count] );
|
|
|
|
%index = 0;
|
|
while ( true )
|
|
{
|
|
if ( %index >= $TeamRank[1, count]+2 && %index >= $TeamRank[2, count]+2 )
|
|
break;
|
|
|
|
//get the team1 client info
|
|
%team1Client = "";
|
|
%team1ClientScore = "";
|
|
%col1Style = "";
|
|
if ( %index < $TeamRank[1, count] )
|
|
{
|
|
%team1Client = $TeamRank[1, %index];
|
|
%team1ClientScore = %team1Client.score $= "" ? 0 : %team1Client.score;
|
|
%col1Style = %team1Client == %client ? "<color:dcdcdc>" : "";
|
|
%team1playersTotalScore += %team1Client.score;
|
|
}
|
|
else if( %index == $teamRank[1, count] && $teamRank[1, count] != 0 && !isDemo() && %game.class $= "CTFGame")
|
|
{
|
|
%team1ClientScore = "--------------";
|
|
}
|
|
else if( %index == $teamRank[1, count]+1 && $teamRank[1, count] != 0 && !isDemo() && %game.class $= "CTFGame")
|
|
{
|
|
%team1ClientScore = %team1playersTotalScore != 0 ? %team1playersTotalScore : 0;
|
|
}
|
|
//get the team2 client info
|
|
%team2Client = "";
|
|
%team2ClientScore = "";
|
|
%col2Style = "";
|
|
if ( %index < $TeamRank[2, count] )
|
|
{
|
|
%team2Client = $TeamRank[2, %index];
|
|
%team2ClientScore = %team2Client.score $= "" ? 0 : %team2Client.score;
|
|
%col2Style = %team2Client == %client ? "<color:dcdcdc>" : "";
|
|
%team2playersTotalScore += %team2Client.score;
|
|
}
|
|
else if( %index == $teamRank[2, count] && $teamRank[2, count] != 0 && !isDemo() && %game.class $= "CTFGame")
|
|
{
|
|
%team2ClientScore = "--------------";
|
|
}
|
|
else if( %index == $teamRank[2, count]+1 && $teamRank[2, count] != 0 && !isDemo() && %game.class $= "CTFGame")
|
|
{
|
|
%team2ClientScore = %team2playersTotalScore != 0 ? %team2playersTotalScore : 0;
|
|
}
|
|
|
|
//if the client is not an observer, send the message
|
|
if (%client.team != 0)
|
|
{
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20,320>\t<spush>%5<clip:200>%1</clip><rmargin:260><just:right>%2<spop><rmargin:560><just:left>\t%6<clip:200>%3</clip><just:right>%4',
|
|
%team1Client.name, %team1ClientScore, %team2Client.name, %team2ClientScore, %col1Style, %col2Style );
|
|
}
|
|
//else for observers, create an anchor around the player name so they can be observed
|
|
else
|
|
{
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20,320>\t<spush>%5<clip:200><a:gamelink\t%7>%1</a></clip><rmargin:260><just:right>%2<spop><rmargin:560><just:left>\t%6<clip:200><a:gamelink\t%8>%3</a></clip><just:right>%4',
|
|
%team1Client.name, %team1ClientScore, %team2Client.name, %team2ClientScore, %col1Style, %col2Style, %team1Client, %team2Client );
|
|
}
|
|
|
|
%index++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//tricky stuff here... use two columns if we have more than 15 clients...
|
|
%numClients = $TeamRank[0, count];
|
|
if ( %numClients > $ScoreHudMaxVisible )
|
|
%numColumns = 2;
|
|
|
|
// Clear header:
|
|
messageClient( %client, 'SetScoreHudHeader', "", "" );
|
|
|
|
// Send header:
|
|
if (%numColumns == 2)
|
|
messageClient(%client, 'SetScoreHudSubheader', "", '<tab:15,315>\tPLAYER<rmargin:270><just:right>SCORE<rmargin:570><just:left>\tPLAYER<just:right>SCORE');
|
|
else
|
|
messageClient(%client, 'SetScoreHudSubheader', "", '<tab:15>\tPLAYER<rmargin:270><just:right>SCORE');
|
|
|
|
%countMax = %numClients;
|
|
if ( %countMax > ( 2 * $ScoreHudMaxVisible ) )
|
|
{
|
|
if ( %countMax & 1 )
|
|
%countMax++;
|
|
%countMax = %countMax / 2;
|
|
}
|
|
else if ( %countMax > $ScoreHudMaxVisible )
|
|
%countMax = $ScoreHudMaxVisible;
|
|
|
|
for ( %index = 0; %index < %countMax; %index++ )
|
|
{
|
|
//get the client info
|
|
%col1Client = $TeamRank[0, %index];
|
|
%col1ClientScore = %col1Client.score $= "" ? 0 : %col1Client.score;
|
|
%col1Style = %col1Client == %client ? "<color:dcdcdc>" : "";
|
|
|
|
//see if we have two columns
|
|
if ( %numColumns == 2 )
|
|
{
|
|
%col2Client = "";
|
|
%col2ClientScore = "";
|
|
%col2Style = "";
|
|
|
|
//get the column 2 client info
|
|
%col2Index = %index + %countMax;
|
|
if ( %col2Index < %numClients )
|
|
{
|
|
%col2Client = $TeamRank[0, %col2Index];
|
|
%col2ClientScore = %col2Client.score $= "" ? 0 : %col2Client.score;
|
|
%col2Style = %col2Client == %client ? "<color:dcdcdc>" : "";
|
|
}
|
|
}
|
|
|
|
//if the client is not an observer, send the message
|
|
if (%client.team != 0)
|
|
{
|
|
if ( %numColumns == 2 )
|
|
messageClient(%client, 'SetLineHud', "", %tag, %index, '<tab:25,325>\t<spush>%5<clip:195>%1</clip><rmargin:260><just:right>%2<spop><rmargin:560><just:left>\t%6<clip:195>%3</clip><just:right>%4',
|
|
%col1Client.name, %col1ClientScore, %col2Client.name, %col2ClientScore, %col1Style, %col2Style );
|
|
else
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:25>\t%3<clip:195>%1</clip><rmargin:260><just:right>%2',
|
|
%col1Client.name, %col1ClientScore, %col1Style );
|
|
}
|
|
//else for observers, create an anchor around the player name so they can be observed
|
|
else
|
|
{
|
|
if ( %numColumns == 2 )
|
|
messageClient(%client, 'SetLineHud', "", %tag, %index, '<tab:25,325>\t<spush>%5<clip:195><a:gamelink\t%7>%1</a></clip><rmargin:260><just:right>%2<spop><rmargin:560><just:left>\t%6<clip:195><a:gamelink\t%8>%3</a></clip><just:right>%4',
|
|
%col1Client.name, %col1ClientScore, %col2Client.name, %col2ClientScore, %col1Style, %col2Style, %col1Client, %col2Client );
|
|
else
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:25>\t%3<clip:195><a:gamelink\t%4>%1</a></clip><rmargin:260><just:right>%2',
|
|
%col1Client.name, %col1ClientScore, %col1Style, %col1Client );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// Tack on the list of observers:
|
|
%observerCount = 0;
|
|
for (%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
if (%cl.team == 0)
|
|
%observerCount++;
|
|
}
|
|
|
|
if (%observerCount > 0)
|
|
{
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, "");
|
|
%index++;
|
|
messageClient(%client, 'SetLineHud', "", %tag, %index, '<tab:10, 310><spush><font:Univers Condensed:22>\tOBSERVERS (%1)<rmargin:260><just:right>TIME<spop>', %observerCount);
|
|
%index++;
|
|
for (%i = 0; %i < ClientGroup.getCount(); %i++)
|
|
{
|
|
%cl = ClientGroup.getObject(%i);
|
|
//if this is an observer
|
|
if (%cl.team == 0)
|
|
{
|
|
%obsTime = getSimTime() - %cl.observerStartTime;
|
|
%obsTimeStr = %game.formatTime(%obsTime, false);
|
|
messageClient( %client, 'SetLineHud', "", %tag, %index, '<tab:20, 310>\t<clip:150>%1</clip><rmargin:260><just:right>%2',
|
|
%cl.name, %obsTimeStr );
|
|
%index++;
|
|
}
|
|
}
|
|
}
|
|
|
|
//clear the rest of Hud so we don't get old lines hanging around...
|
|
messageClient( %client, 'ClearHud', "", %tag, %index );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function UpdateClientTimes(%time)
|
|
{
|
|
%secondsLeft = %time / 1000;
|
|
messageAll('MsgSystemClock', "", (%secondsLeft / 60), %time);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function notifyMatchStart(%time)
|
|
{
|
|
%seconds = mFloor(%time / 1000);
|
|
if (%seconds > 2)
|
|
MessageAll('MsgMissionStart', '\c2Match starts in %1 seconds.~wfx/misc/hunters_%1.wav', %seconds);
|
|
else if (%seconds == 2)
|
|
MessageAll('MsgMissionStart', '\c2Match starts in 2 seconds.~wvoice/announcer/ann.match_begins.wav');
|
|
else if (%seconds == 1)
|
|
MessageAll('MsgMissionStart', '\c2Match starts in 1 second.');
|
|
UpdateClientTimes(%time);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function notifyMatchEnd(%time)
|
|
{
|
|
%seconds = mFloor(%time / 1000);
|
|
if (%seconds > 1)
|
|
MessageAll('MsgMissionEnd', '\c2Match ends in %1 seconds.~wfx/misc/hunters_%1.wav', %seconds);
|
|
else if (%seconds == 1)
|
|
MessageAll('MsgMissionEnd', '\c2Match ends in 1 second.~wfx/misc/hunters_1.wav');
|
|
UpdateClientTimes(%time);
|
|
}
|
|
|
|
function DefaultGame::formatTime(%game, %tStr, %includeHundredths)
|
|
{
|
|
%timeInSeconds = %tStr / 1000;
|
|
%mins = mFloor(%timeInSeconds / 60);
|
|
if(%mins < 1)
|
|
%timeString = "00:";
|
|
else if(%mins < 10)
|
|
%timeString = "0" @ %mins @ ":";
|
|
else
|
|
%timeString = %mins @ ":";
|
|
|
|
%timeInSeconds -= (%mins * 60);
|
|
%secs = mFloor(%timeInSeconds);
|
|
if(%secs < 1)
|
|
%timeString = %timeString @ "00";
|
|
else if(%secs < 10)
|
|
%timeString = %timeString @ "0" @ %secs;
|
|
else
|
|
%timeString = %timeString @ %secs;
|
|
|
|
if (%includeHundredths)
|
|
{
|
|
%timeString = %timeString @ ".";
|
|
%timeInSeconds -= %secs;
|
|
%hSecs = mFloor(%timeInSeconds * 100); // will be between 0 and 999
|
|
if(%hSecs < 1)
|
|
%timeString = %timeString @ "00";
|
|
else if(%hSecs < 10)
|
|
%timeString = %timeString @ "0" @ %hSecs;
|
|
else
|
|
%timeString = %timeString @ %hSecs;
|
|
}
|
|
|
|
return %timeString;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
//AI FUNCTIONS
|
|
function DefaultGame::AIChooseGameObjective(%game, %client)
|
|
{
|
|
AIChooseObjective(%client);
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::getServerStatusString(%game)
|
|
{
|
|
%status = %game.numTeams;
|
|
for ( %team = 1; %team - 1 < %game.numTeams; %team++ )
|
|
{
|
|
%score = isObject( $teamScore[%team] ) ? $teamScore[%team] : 0;
|
|
%teamStr = getTaggedString( %game.getTeamName(%team) ) TAB %score;
|
|
%status = %status NL %teamStr;
|
|
}
|
|
|
|
%status = %status NL ClientGroup.getCount();
|
|
for ( %i = 0; %i < ClientGroup.getCount(); %i++ )
|
|
{
|
|
%cl = ClientGroup.getObject( %i );
|
|
%score = %cl.score $= "" ? 0 : %cl.score;
|
|
%playerStr = getTaggedString( %cl.name ) TAB getTaggedString( %game.getTeamName(%cl.team) ) TAB %score;
|
|
%status = %status NL %playerStr;
|
|
}
|
|
return( %status );
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::OptionsDlgSleep( %game )
|
|
{
|
|
// ignore in the default game...
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
function DefaultGame::endMission( %game )
|
|
{
|
|
}
|