T2-BoL/scripts/PracticeCTFGame.cs
Robert MacGregor 9a05e8d86c Initial commit.
2012-07-27 17:22:05 -04:00

3101 lines
116 KiB
C#

// DisplayName = Capture the Flag (Practice)
//--- GAME RULES BEGIN ---
//Prevent enemy from capturing your flag
//Score one point for grabbing the enemy's flag
//To capture, your flag must be at its stand
//Score 100 points each time enemy flag is captured
//--- GAME RULES END ---
//exec the AI scripts
exec("scripts/aiPracticeCtf.cs");
$InvBanList[PracticeCTF, "MiningTool"] = 1;
//-- tracking ---
function PracticeCTFGame::initGameVars(%game)
{
// z0dd - ZOD: Zero out Practice mode options
$TeamDeployableMin[TurretIndoorDeployable] = 4;
$TeamDeployableMin[TurretOutdoorDeployable] = 4;
// z0dd - ZOD: We need only zero these when server comes up for first time.
if(!$pctfLoaded)
{
$PracticeCtf::SpawnFavs = 0;
$PracticeCtf::SpawnOnly = 0;
$PracticeCtf::AutoFlagReturn = 0;
$PracticeCtf::NoScoreLimit = 0;
$PracticeCtf::ProtectStatics = 0;
$PracticeCtf::UnlimAmmo = 0;
$pctfLoaded = 1;
}
%game.SCORE_PER_SUICIDE = 0; // z0dd - ZOD, 8/19/02. No penalty for suicide! Was -10
%game.SCORE_PER_TEAMKILL = -10;
%game.SCORE_PER_DEATH = 0;
%game.SCORE_PER_TK_DESTROY = -10; // z0dd - ZOD, 10/03/02. Penalty for TKing equiptment.
%game.SCORE_PER_KILL = 10;
%game.SCORE_PER_PLYR_FLAG_CAP = 30;
%game.SCORE_PER_PLYR_FLAG_TOUCH = 20;
%game.SCORE_PER_TEAM_FLAG_CAP = 100;
%game.SCORE_PER_TEAM_FLAG_TOUCH = 1;
%game.SCORE_PER_ESCORT_ASSIST = 5;
%game.SCORE_PER_HEADSHOT = 1;
%game.SCORE_PER_REARSHOT = 1; // z0dd - ZOD, 8/25/02. Rear Lance hits
%game.SCORE_PER_TURRET_KILL = 10; // controlled
%game.SCORE_PER_TURRET_KILL_AUTO = 3; // uncontrolled
%game.SCORE_PER_FLAG_DEFEND = 5;
%game.SCORE_PER_CARRIER_KILL = 5;
%game.SCORE_PER_FLAG_RETURN = 10;
%game.SCORE_PER_STALEMATE_RETURN = 15;
%game.SCORE_PER_GEN_DEFEND = 5;
%game.SCORE_PER_DESTROY_GEN = 10;
%game.SCORE_PER_DESTROY_SENSOR = 4;
%game.SCORE_PER_DESTROY_TURRET = 5;
%game.SCORE_PER_DESTROY_ISTATION = 2;
%game.SCORE_PER_DESTROY_VSTATION = 5;
%game.SCORE_PER_DESTROY_MPBTSTATION = 5; // z0dd - ZOD, 4/24/02. MPB Teleporter
%game.SCORE_PER_DESTROY_SOLAR = 5;
%game.SCORE_PER_DESTROY_SENTRY = 4;
%game.SCORE_PER_DESTROY_DEP_SENSOR = 1;
%game.SCORE_PER_DESTROY_DEP_INV = 2;
%game.SCORE_PER_DESTROY_DEP_TUR = 3;
%game.SCORE_PER_DESTROY_SHRIKE = 5;
%game.SCORE_PER_DESTROY_BOMBER = 8;
%game.SCORE_PER_DESTROY_TRANSPORT = 5;
%game.SCORE_PER_DESTROY_WILDCAT = 5;
%game.SCORE_PER_DESTROY_TANK = 8;
%game.SCORE_PER_DESTROY_MPB = 12;
%game.SCORE_PER_PASSENGER = 2;
%game.SCORE_PER_REPAIR_GEN = 8;
%game.SCORE_PER_REPAIR_SENSOR = 1;
%game.SCORE_PER_REPAIR_TURRET = 4;
%game.SCORE_PER_REPAIR_ISTATION = 2;
%game.SCORE_PER_REPAIR_VSTATION = 4;
%game.SCORE_PER_REPAIR_MPBTSTATION = 4; // z0dd - ZOD, 4/24/02. MPB Teleporter
%game.SCORE_PER_REPAIR_SOLAR = 4;
%game.SCORE_PER_REPAIR_SENTRY = 2;
%game.SCORE_PER_REPAIR_DEP_TUR = 3;
%game.SCORE_PER_REPAIR_DEP_INV = 2;
%game.FLAG_RETURN_DELAY = 45 * 1000; //45 seconds
%game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000; //after damaging enemy flag carrier
%game.RADIUS_GEN_DEFENSE = 20; //meters
%game.RADIUS_FLAG_DEFENSE = 20; //meters
%game.TOUCH_DELAY_MS = 20000; //20 secs
%game.fadeTimeMS = 2000;
%game.notifyMineDist = 7.5;
%game.stalemate = false;
%game.stalemateObjsVisible = false;
%game.stalemateTimeMS = 60000;
%game.stalemateFreqMS = 15000;
%game.stalemateDurationMS = 6000;
}
package PracticeCTFGame
{
/////////////////////////////////////////////////////////////////////////////////////////
// Practice Mode overloads //////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function ShapeBase::cleanNonType(%this, %type)
{
// z0dd - ZOD: If the map is multi mission type, need to make sure the CTF flags stay put
if(%type $= PracticeCTF)
{
for(%h = 0; (%typeList = getWord(%this.missionTypesList, %h)) !$= ""; %h++)
if(%typeList $= CTF)
return;
}
Parent::cleanNonType(%this, %type);
}
//function ShapeBase::maxInventory(%this,%data)
//{
// z0dd - ZOD, 6/04/02: Allow virtually unlimited ammo in practice mode
// if(($PracticeCtf::UnlimAmmo == 1) && (%data.getName() !$= "RepairKit" && $CurrentMissionType $= Practice))
// return 999;
// else
// return %this.getDatablock().max[%data.getName()];
//}
function Player::maxInventory(%this, %data)
{
// z0dd - ZOD, 6/17/02: Allow virtually unlimited ammo in practice mode
if(($PracticeCtf::UnlimAmmo == 1) && (%data.getName() !$= "RepairKit" && Game.class $= "PracticeCTFGame"))
{
return 999;
}
else
{
%max = ShapeBase::maxInventory(%this,%data);
if (%this.getInventory(AmmoPack))
%max += AmmoPack.max[%data.getName()];
return %max;
}
}
function StaticShapeData::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType)
{
// z0dd - ZOD, 5/04/02. Check to see if damage should be applied to all static team assets.
if($PracticeCtf::ProtectStatics == 1 && %targetObject.getDataBlock().getClassName() !$= "TurretData" && !%targetObject.getDataBlock().deployedObject)
return;
else
parent::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType);
}
function Observer::onTrigger(%data,%obj,%trigger,%state)
{
if (%state == 0 || %trigger >= 4)
return;
%client = %obj.getControllingClient();
if (%client == 0)
return;
// z0dd - ZOD: Check for client projectile observation
switch$ (%obj.mode)
{
case "observerFollow":
if(%obj.projectile !$= "")
{
if(%trigger == 3)
{
clearBottomPrint(%client);
%client.camera.setFlyMode();
%client.setControlObject(%client.player);
%obj.projectile = ""; // Clear the projectile
}
else
return;
}
else
Parent::onTrigger(%data,%obj,%trigger,%state);
case "observerFly":
if(%obj.projectile !$= "")
{
if(%trigger == 3)
{
clearBottomPrint(%client);
%client.setControlObject(%client.player);
%obj.projectile = ""; // Clear the projectile
}
else
return;
}
else
Parent::onTrigger(%data,%obj,%trigger,%state);
default:
Parent::onTrigger(%data,%obj,%trigger,%state);
}
}
function Observer::setMode(%data, %obj, %mode, %targetObj)
{
if(%mode $= "")
return;
%client = %obj.getControllingClient();
// z0dd - ZOD: Check for client projectile observation
switch$ (%mode)
{
case "observerFollow":
if(%obj.projectile !$= "")
{
bottomPrint(%targetObj.sourceObject.client, "Observing Projectile.\nPress your jet key to resume to player control.", 0, 2);
%transform = %targetObj.initialPosition;
%obj.setOrbitMode(%targetObj, %transform, 0.2, 12.0, 4.5);
}
else
Parent::setMode(%data, %obj, %mode, %targetObj);
case "observerFly":
if(%obj.projectile !$= "")
{
%obj.setTransform(%obj.getTransform());
%obj.setFlyMode();
bottomPrint(%client, "Free Fly Mode.\nPress your jet key to resume player control.", 0, 2);
}
else
Parent::setMode(%data, %obj, %mode, %targetObj);
default:
Parent::setMode(%data, %obj, %mode, %targetObj);
}
%obj.mode = %mode;
}
function MortarImage::onFire(%data, %obj, %slot)
{
// ---------------------------------------------------------------------------
// z0dd - ZOD, 10/14/02. Anti rapid fire mortar/missile fix.
if (%obj.cantFire !$= "")
{
return 0;
}
%wpnName = %data.getName();
%obj.cantFire = 1;
%preventTime = %data.stateTimeoutValue[4];
%obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj);
// ---------------------------------------------------------------------------
// z0dd - ZOD: Check for client projectile observation
%data.lightStart = getSimTime();
if(%obj.client.mortarObs)
%data.projectile = ObsMortarShot;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
};
MissionCleanup.add(%p);
if(%obj.client)
%obj.client.projectile = %p;
%obj.decInventory(%data.ammo,1);
AIGrenadeThrown(%p);
if(%obj.client.mortarObs)
{
%obj.client.camera.projectile = %p;
%obj.client.camera.getDataBlock().setMode(%obj.client.camera, "observerFollow", %p);
%obj.client.setControlObject(%obj.client.camera);
}
return %p;
}
function AssaultMortarTurretBarrel::onFire(%data, %obj, %slot)
{
// z0dd - ZOD: Check for client projectile observation
%client = %obj.getControllingClient();
if(%client)
%obj.client = %client;
%data.lightStart = getSimTime();
%useEnergyObj = %obj.getObjectMount();
if(!%useEnergyObj)
%useEnergyObj = %obj;
%energy = %useEnergyObj.getEnergyLevel();
%vehicle = %useEnergyObj;
if( %useEnergyObj.turretObject.getCapacitorLevel() < %data.minEnergy )
return;
if(%client.mortarObs)
%data.projectile = ObsAssaultMortar;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
vehicleObject = %vehicle;
};
MissionCleanup.add(%p);
if(%client)
%client.projectile = %p;
%vehicle.turretObject.setCapacitorLevel( %vehicle.turretObject.getCapacitorLevel() - %data.fireEnergy );
AIGrenadeThrown(%p);
if(%client.mortarObs)
{
%client.camera.projectile = %p;
%client.camera.getDataBlock().setMode(%client.camera, "observerFollow", %p);
%client.setControlObject(%client.camera);
}
// Stop the onFire from looping
%obj.setImageTrigger(4, false);
return %p;
}
function AssaultPlasmaTurretBarrel::onFire(%data, %obj, %slot)
{
// Function used to kill console spam because of client
// client value added to AssaultMortarTurretBarrel::onFire
%obj.client = "";
parent::onFire(%data, %obj, %slot);
}
function MissileLauncherImage::onFire(%data,%obj,%slot)
{
// ---------------------------------------------------------------------------
// z0dd - ZOD, 10/14/02. Anti rapid fire mortar/missile fix.
if (%obj.cantFire !$= "")
{
return 0;
}
%wpnName = %data.getName();
%obj.cantFire = 1;
%preventTime = %data.stateTimeoutValue[4];
%obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj);
// ---------------------------------------------------------------------------
// z0dd - ZOD: Check for client projectile observation
%data.lightStart = getSimTime();
if(%obj.client.missileObs)
%data.projectile = ObsShoulderMissile;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
};
MissionCleanup.add(%p);
MissileSet.add(%p);
if(%obj.client)
%obj.client.projectile = %p;
%obj.decInventory(%data.ammo,1);
if(%obj.client.missileObs)
{
%obj.client.camera.projectile = %p;
%obj.client.camera.getDataBlock().setMode(%obj.client.camera, "observerFollow", %p);
%obj.client.setControlObject(%obj.client.camera);
}
%target = %obj.getLockedTarget();
if(%target)
%p.setObjectTarget(%target);
else if(%obj.isLocked())
%p.setPositionTarget(%obj.getLockedPosition());
else
%p.setNoTarget();
}
function MissileLauncherImage::onWetFire(%data, %obj, %slot)
{
// z0dd - ZOD: Check for client projectile observation
%data.lightStart = getSimTime();
if(%obj.client.missileObs)
%data.projectile = ObsShoulderMissile;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
};
MissionCleanup.add(%p);
MissileSet.add(%p);
if(%obj.client)
%obj.client.projectile = %p;
%obj.decInventory(%data.ammo,1);
if(%obj.client.missileObs)
{
%obj.client.camera.projectile = %p;
%obj.client.camera.getDataBlock().setMode(%obj.client.camera, "observerFollow", %p);
%obj.client.setControlObject(%obj.client.camera);
}
%p.setObjectTarget(0);
}
function GrenadeLauncherImage::onFire(%data, %obj, %slot)
{
// z0dd - ZOD: Check for client projectile observation
%data.lightStart = getSimTime();
if( %obj.station $= "" && %obj.isCloaked() )
{
if( %obj.respawnCloakThread !$= "" )
{
Cancel(%obj.respawnCloakThread);
%obj.setCloaked( false );
%obj.respawnCloakThread = "";
}
else
{
if( %obj.getEnergyLevel() > 20 )
{
%obj.setCloaked( false );
%obj.reCloak = %obj.schedule( 500, "setCloaked", true );
}
}
}
if( %obj.client > 0 )
{
%obj.setInvincibleMode(0 ,0.00);
%obj.setInvincible( false );
}
if(%obj.client.grenadeObs)
%data.projectile = ObsGrenade;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
};
MissionCleanup.add(%p);
if(%obj.client)
%obj.client.projectile = %p;
%obj.decInventory(%data.ammo,1);
AIGrenadeThrown(%p);
if(%obj.client.grenadeObs)
{
%obj.client.camera.projectile = %p;
%obj.client.camera.getDataBlock().setMode(%obj.client.camera, "observerFollow", %p);
%obj.client.setControlObject(%obj.client.camera);
}
return %p;
}
function DiscImage::onFire(%data, %obj, %slot)
{
// z0dd - ZOD: Check for client projectile observation
%data.lightStart = getSimTime();
if( %obj.station $= "" && %obj.isCloaked() )
{
if( %obj.respawnCloakThread !$= "" )
{
Cancel(%obj.respawnCloakThread);
%obj.setCloaked( false );
%obj.respawnCloakThread = "";
}
else
{
if( %obj.getEnergyLevel() > 20 )
{
%obj.setCloaked( false );
%obj.reCloak = %obj.schedule( 500, "setCloaked", true );
}
}
}
if( %obj.client > 0 )
{
%obj.setInvincibleMode(0 ,0.00);
%obj.setInvincible( false );
}
if(%obj.client.discObs)
%data.projectile = ObsDiscProjectile;
%p = new (%data.projectileType)() {
dataBlock = %data.projectile;
initialDirection = %obj.getMuzzleVector(%slot);
initialPosition = %obj.getMuzzlePoint(%slot);
sourceObject = %obj;
sourceSlot = %slot;
};
MissionCleanup.add(%p);
if(%obj.client)
%obj.client.projectile = %p;
%obj.decInventory(%data.ammo,1);
if(%obj.client.discObs)
{
%obj.client.camera.projectile = %p;
%obj.client.camera.getDataBlock().setMode(%obj.client.camera, "observerFollow", %p);
%obj.client.setControlObject(%obj.client.camera);
}
return %p;
}
function ProjectileData::onExplode(%data, %proj, %pos, %mod)
{
// z0dd - ZOD: If client is observing this projectile, let client camera free fly
if(%proj.sourceObject.client !$="" && isObject(%proj.sourceObject))
{
%client = %proj.sourceObject.client;
%camera = %proj.sourceObject.client.getControlObject();
if(%camera == %client.camera && %proj == %camera.projectile)
{
clearBottomPrint(%client);
%client.camera.getDataBlock().setMode(%client.camera, "observerFly");
}
}
Parent::onExplode(%data, %proj, %pos, %mod);
}
function Beacon::onUse(%data, %obj)
{
if(%obj.client.transMode)
deployTransferPad(%data, %obj);
else
Parent::onUse(%data, %obj);
}
function StationInventory::stationReady(%data, %obj)
{
//Display the Inventory Station GUI here
%obj.notReady = 1;
%obj.inUse = "Down";
%obj.schedule(500,"playThread",$ActivateThread,"activate1");
%player = %obj.triggeredBy;
%energy = %player.getEnergyLevel();
%max = %player.getDatablock().maxEnergy; // z0dd - ZOD, 4/20/02. Inv energy bug fix
%player.setCloaked(true);
%player.schedule(500, "setCloaked", false);
if (!%player.client.isAIControlled())
{
if($PracticeCtf::SpawnOnly) // z0dd - ZOD: Test for spawn only
getAmmoStationLovin(%player.client);
else
buyFavorites(%player.client);
}
%player.setEnergyLevel(mFloor(%player.getDatablock().maxEnergy * %energy / %max)); // z0dd - ZOD, 4/20/02. Inv energy bug fix
%data.schedule( 500, "beginPersonalInvEffect", %obj );
}
function MobileInvStation::stationReady(%data, %obj)
{
//Display the Inventory Station GUI here
%obj.notReady = 1;
%obj.inUse = "Down";
%obj.schedule(200,"playThread",$ActivateThread,"activate1");
%obj.getObjectMount().playThread($ActivateThread,"Activate");
%player = %obj.triggeredBy;
%energy = %player.getEnergyLevel();
%player.setCloaked(true);
%player.schedule(900, "setCloaked", false);
if (!%player.client.isAIControlled())
{
if($PracticeCtf::SpawnOnly) // z0dd - ZOD: Test for spawn only
getAmmoStationLovin(%player.client);
else
buyFavorites(%player.client);
}
%player.setEnergyLevel(%energy);
}
function DeployedStationInventory::stationReady(%data, %obj)
{
%obj.notReady = 1;
%player = %obj.triggeredBy;
%obj.playThread($ActivateThread,"activate1");
if (!%player.client.isAIControlled())
{
if($PracticeCtf::SpawnOnly) // z0dd - ZOD: Test for spawn only
getAmmoStationLovin(%player.client);
else
buyDeployableFavorites(%player.client);
}
}
function Flag::onEnterLiquid(%data, %obj, %coverage, %type)
{
if(%type > 3) // 1-3 are water, 4+ is lava and quicksand(?)
{
//error("flag("@%obj@") is in liquid type" SPC %type);
if($PracticeCtf::AutoFlagReturn) // z0dd - ZOD: Test automatic flag returns
Game.flagReturn(%obj);
else
Game.schedule(3000, flagReturn, %obj);
}
}
/////////////////////////////////////////////////////////////////////////////////////////
function ShapeBaseData::onDestroyed(%data, %obj)
{
%scorer = %obj.lastDamagedBy;
if(!isObject(%scorer))
return;
if( (%scorer.getType() & $TypeMasks::GameBaseObjectType) && %scorer.getDataBlock().catagory $= "Vehicles" )
{
// z0dd - ZOD, 6/18/02. %name was never defined.
%name = %scorer.getDatablock().getName();
if(%name $= "BomberFlyer" || %name $= "AssaultVehicle")
%gunnerNode = 1;
else
%gunnerNode = 0;
if(%scorer.getMountNodeObject(%gunnerNode))
{
%destroyer = %scorer.getMountNodeObject(%gunnerNode).client;
%scorer = %destroyer;
%damagingTeam = %scorer.team;
}
}
else if(%scorer.getClassName() $= "Turret")
{
if(%scorer.getControllingClient())
{
//manned turret
%destroyer = %scorer.getControllingClient();
%scorer = %destroyer;
%damagingTeam = %scorer.team;
}
else
{
return; //unmanned turret
}
}
if(!%damagingTeam)
%damagingTeam = %scorer.team;
// z0dd - ZOD, 10/03/02. Total re-write from here down.
if(%damagingTeam == %obj.team)
{
if(!%obj.getDataBlock().deployedObject)
{
teamDestroyMessage(%scorer, 'msgTkDes', '\c5Teammate %1 destroyed your team\'s %2!', %scorer.name, Game.cleanWord(%obj.getDataBlock().targetTypeTag));
Game.awardScoreTkDestroy(%scorer);
}
return;
}
%objType = %obj.getDataBlock().getName();
switch$ ( %objType )
{
case "GeneratorLarge":
teamDestroyMessage(%scorer, 'msgGenDestroyed', '\c5%1 destroyed a %2 Generator!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreGenDestroy(%scorer);
case "SolarPanel":
teamDestroyMessage(%scorer, 'msgSolarDestroyed', '\c5%1 destroyed a %2 Solar Panel!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreSolarDestroy(%scorer);
game.shareScore(%score, %score);
case "SensorLargePulse":
teamDestroyMessage(%scorer, 'msgSensorDestroyed', '\c5%1 destroyed a %2 Sensor!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreSensorDestroy(%scorer);
case "SensorMediumPulse":
teamDestroyMessage(%scorer, 'msgSensorDestroyed', '\c5%1 destroyed a %2 Sensor!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreSensorDestroy(%scorer);
case "DeployedMotionSensor":
teamDestroyMessage(%scorer, 'msgDepSenDestroyed', '\c5%1 destroyed a Deployable Sensor!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepSensorDestroy(%scorer);
case "DeployedPulseSensor":
teamDestroyMessage(%scorer, 'msgDepSenDestroyed', '\c5%1 destroyed a Deployable Sensor!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepSensorDestroy(%scorer);
case "StationInventory":
teamDestroyMessage(%scorer, 'msgInvDestroyed', '\c5%1 destroyed a %2 Inventory Station!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreInvDestroy(%scorer);
case "StationAmmo":
teamDestroyMessage(%scorer, 'msgInvDestroyed', '\c5%1 destroyed a %2 Ammo Station!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreInvDestroy(%scorer);
case "StationVehicle":
teamDestroyMessage(%scorer, 'msgVehStationDestroyed', '\c5%1 destroyed a Vehicle Station!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreVehicleStationDestroy(%scorer);
case "MPBTeleporter": // z0dd - ZOD, 4/24/02. MPB teleporter
teamDestroyMessage(%scorer, 'msgTeleporterDestroyed', '\c5%1 destroyed a MPB Teleport Station!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreMPBTeleporterDestroy(%scorer);
case "DeployedStationInventory":
teamDestroyMessage(%scorer, 'msgDepInvDestroyed', '\c5%1 destroyed a Deployable Inventory!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepStationDestroy(%scorer);
case "TurretBaseLarge":
teamDestroyMessage(%scorer, 'msgTurDestroyed', '\c5%1 destroyed a %2 Turret!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreTurretDestroy(%scorer);
case "SentryTurret":
teamDestroyMessage(%scorer, 'msgSentryDestroyed', '\c5%1 destroyed a %2 Sentry Turret!', %scorer.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreSentryDestroy(%scorer);
case "TurretDeployedFloorIndoor":
teamDestroyMessage(%scorer, 'msgDepTurDestroyed', '\c5%1 destroyed a Spider Clamp Turret!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepTurretDestroy(%scorer);
case "TurretDeployedWallIndoor":
teamDestroyMessage(%scorer, 'msgDepTurDestroyed', '\c5%1 destroyed a Spider Clamp Turret!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepTurretDestroy(%scorer);
case "TurretDeployedCeilingIndoor":
teamDestroyMessage(%scorer, 'msgDepTurDestroyed', '\c5%1 destroyed a Spider Clamp Turret!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepTurretDestroy(%scorer);
case "TurretDeployedOutdoor":
teamDestroyMessage(%scorer, 'msgDepTurDestroyed', '\c5%1 destroyed a Landspike Turret!', %scorer.name); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
%score = game.awardScoreDepTurretDestroy(%scorer);
default:
return;
}
if(!%obj.soiledByEnemyRepair)
{
game.shareScore(%scorer, %score);
}
}
function ShapeBaseData::onDisabled(%data, %obj)
{
%obj.wasDisabled = true;
Parent::onDisabled(%data, %obj);
}
function RepairGunImage::onRepair(%this, %obj, %slot)
{
Parent::onRepair(%this, %obj, %slot);
%target = %obj.repairing;
if(%target && %target.team != %obj.team)
{
//error("Enemy stuff("@%obj@") is being repaired (by "@%target@")");
%target.soiledByEnemyRepair = true;
}
}
function Flag::objectiveInit(%data, %flag)
{
if (!%flag.isTeamSkinned)
{
%pos = %flag.getTransform();
%group = %flag.getGroup();
}
%flag.originalPosition = %flag.getTransform();
$flagPos[%flag.team] = %flag.originalPosition;
%flag.isHome = true;
%flag.carrier = "";
%flag.grabber = "";
setTargetSkin(%flag.getTarget(), PracticeCTFGame::getTeamSkin(PracticeCTFGame, %flag.team));
setTargetSensorGroup(%flag.getTarget(), %flag.team);
setTargetAlwaysVisMask(%flag.getTarget(), 0x7);
setTargetRenderMask(%flag.getTarget(), getTargetRenderMask(%flag.getTarget()) | 0x2);
%flag.scopeWhenSensorVisible(true);
$flagStatus[%flag.team] = "<At Base>";
//Point the flag and stand at each other
%group = %flag.getGroup();
%count = %group.getCount();
%flag.stand = "";
for(%i = 0; %i < %count; %i++)
{
%this = %group.getObject(%i);
//---------------------------------------------------------------------------------------------------------------------------
// z0dd - ZOD: Added TSStatic, console spam fix
if(%this.getClassName() !$= "InteriorInstance" && %this.getClassName() !$= "SimGroup" && %this.getClassName() !$= "TSStatic")
{
if(%this.getDataBlock().getName() $= "ExteriorFlagStand")
{
%flag.stand = %this;
%this.flag = %flag;
}
}
}
// set the nametag on the target
setTargetName(%flag.getTarget(), PracticeCTFGame::getTeamName(PracticeCTFGame, %flag.team));
// create a marker on this guy
%flag.waypoint = new MissionMarker() {
position = %flag.getTransform();
dataBlock = "FlagMarker";
};
MissionCleanup.add(%flag.waypoint);
// create a target for this (there is no MissionMarker::onAdd script call)
%target = createTarget(%flag.waypoint, PracticeCTFGame::getTeamName( PracticeCTFGame, %flag.team), "", "", 'Base', %flag.team, 0);
setTargetAlwaysVisMask(%target, 0xffffffff);
//store the flag in an array
$TeamFlag[%flag.team] = %flag;
// --------------------------------------------------------
// z0dd - ZOD, 5/26/02. Don't let flag hover over defenders
%flag.static = true;
// -------------------------------------------------------------------------------------------
// z0dd - ZOD, 10/03/02. Use triggers for flags that are at home, hack for flag collision bug.
%flag.trigger = new Trigger()
{
dataBlock = flagTrigger;
polyhedron = "-0.6 0.6 0.1 1.2 0.0 0.0 0.0 -1.2 0.0 0.0 0.0 2.5";
position = %flag.position;
rotation = %flag.rotation;
};
MissionCleanup.add(%flag.trigger);
%flag.trigger.flag = %flag;
// -------------------------------------------------------------------------------------------
}
};
//--------------------------------------------------------------------------
function PracticeCTFGame::getTeamSkin(%game, %team)
{
CTFGame::getTeamSkin(%game, %team);
}
function PracticeCTFGame::getTeamName(%game, %team)
{
CTFGame::getTeamName(%game, %team);
}
//--------------------------------------------------------------------------
function PracticeCTFGame::missionLoadDone(%game)
{
//default version sets up teams - must be called first...
DefaultGame::missionLoadDone(%game);
for(%i = 1; %i < (%game.numTeams + 1); %i++)
$teamScore[%i] = 0;
// remove
MissionGroup.clearFlagWaypoints();
//reset some globals, just in case...
$dontScoreTimer[1] = false;
$dontScoreTimer[2] = false;
echo( "starting camp thread..." );
%game.campThread_1 = schedule( 1000, 0, "checkVehicleCamping", 1 );
%game.campThread_2 = schedule( 1000, 0, "checkVehicleCamping", 2 );
// z0dd - ZOD: Need to save off turret barrels for practice mode reset
// Function allready exists in siege no need to duplicate.
SiegeGame::checkTurretBases();
}
function PracticeCTFGame::playerTouchFlag(%game, %player, %flag)
{
%client = %player.client;
if ((%flag.carrier $= "") && (%player.getState() !$= "Dead"))
{
//flag isn't held and has been touched by a live player
if (%client.team == %flag.team)
%game.playerTouchOwnFlag(%player, %flag);
else
%game.playerTouchEnemyFlag(%player, %flag);
// SquirrelOfDeath, 10/02/02. moved searchSchedule cancel from here to playerTouchEnemyFlag.
}
// toggle visibility of the flag
setTargetRenderMask(%flag.waypoint.getTarget(), %flag.isHome ? 0 : 1);
}
function PracticeCTFGame::playerTouchOwnFlag(%game, %player, %flag)
{
if(%flag.isHome)
{
if (%player.holdingFlag !$= "")
%game.flagCap(%player);
}
else
%game.flagReturn(%flag, %player);
//call the AI function
%game.AIplayerTouchOwnFlag(%player, %flag);
}
function PracticeCTFGame::playerTouchEnemyFlag(%game, %player, %flag)
{
// ---------------------------------------------------------------
// z0dd, ZOD - 9/27/02. Player must wait to grab after throwing it
if((%player.flagTossWait !$= "") && %player.flagTossWait)
return;
// ---------------------------------------------------------------
cancel(%flag.searchSchedule); // z0dd - ZOD, 9/28/02. Hack for flag collision bug. SquirrelOfDeath, 10/02/02: Moved from PlayerTouchFlag
cancel(%game.updateFlagThread[%flag]); // z0dd - ZOD, 8/4/02. Cancel this flag's thread to KineticPoet's flag updater
%game.flagHeldTime[%flag] = getSimTime(); // z0dd - ZOD, 8/15/02. Store time player grabbed flag.
%client = %player.client;
%player.holdingFlag = %flag; //%player has this flag
%flag.carrier = %player; //this %flag is carried by %player
%player.mountImage(FlagImage, $FlagSlot, true, %game.getTeamSkin(%flag.team));
%game.playerGotFlagTarget(%player);
//only cancel the return timer if the player is in bounds...
if (!%client.outOfBounds)
{
cancel($FlagReturnTimer[%flag]);
$FlagReturnTimer[%flag] = "";
}
//if this flag was "at home", see if both flags have now been taken
if (%flag.isHome)
{
// tiebreaker score
game.awardScoreFlagTouch( %client, %flag );
%startStalemate = false;
if ($TeamFlag[1] == %flag)
%startStalemate = !$TeamFlag[2].isHome;
else
%startStalemate = !$TeamFlag[1].isHome;
if (%startStalemate)
%game.stalemateSchedule = %game.schedule(%game.stalemateTimeMS, beginStalemate);
}
%flag.hide(true);
%flag.startFade(0, 0, false);
%flag.isHome = false;
if(%flag.stand)
%flag.stand.getDataBlock().onFlagTaken(%flag.stand);//animate, if exterior stand
$flagStatus[%flag.team] = %client.nameBase;
%teamName = %game.getTeamName(%flag.team);
messageTeamExcept(%client, 'MsgCTFFlagTaken', '\c2Teammate %1 took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase);
messageTeam(%flag.team, 'MsgCTFFlagTaken', '\c2Your flag has been taken by %1!~wfx/misc/flag_taken.wav',%client.name, 0, %flag.team, %client.nameBase);
messageTeam(0, 'MsgCTFFlagTaken', '\c2%1 took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase);
messageClient(%client, 'MsgCTFFlagTaken', '\c2You took the %2 flag.~wfx/misc/flag_snatch.wav', %client.name, %teamName, %flag.team, %client.nameBase);
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") took team "@%flag.team@" flag");
//call the AI function
%game.AIplayerTouchEnemyFlag(%player, %flag);
//if the player is out of bounds, then in 3 seconds, it should be thrown back towards the in bounds area...
if (%client.outOfBounds)
%game.schedule(3000, "boundaryLoseFlag", %player);
}
function PracticeCTFGame::playerGotFlagTarget(%game, %player)
{
%player.scopeWhenSensorVisible(true);
%target = %player.getTarget();
setTargetRenderMask(%target, getTargetRenderMask(%target) | 0x2);
if(%game.stalemateObjsVisible)
setTargetAlwaysVisMask(%target, 0x7);
}
function PracticeCTFGame::playerLostFlagTarget(%game, %player)
{
%player.scopeWhenSensorVisible(false);
%target = %player.getTarget();
setTargetRenderMask(%target, getTargetRenderMask(%target) & ~0x2);
// clear his always vis target mask
setTargetAlwaysVisMask(%target, (1 << getTargetSensorGroup(%target)));
}
//----------------------------------------------------------------------------------------
// z0dd - ZOD, 8/4/02: KineticPoet's flag updater code
function PracticeCTFGame::updateFlagTransform(%game, %flag)
{
%flag.setTransform(%flag.getTransform());
%game.updateFlagThread[%flag] = %game.schedule(100, "updateFlagTransform", %flag);
}
//----------------------------------------------------------------------------------------
function PracticeCTFGame::playerDroppedFlag(%game, %player)
{
%client = %player.client;
%flag = %player.holdingFlag;
%game.updateFlagTransform(%flag); // z0dd - ZOD, 8/4/02, Call to KineticPoet's flag updater
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
%game.playerLostFlagTarget(%player);
%player.holdingFlag = ""; //player isn't holding a flag anymore
%flag.carrier = ""; //flag isn't held anymore
$flagStatus[%flag.team] = "<In the Field>";
%player.unMountImage($FlagSlot);
%flag.hide(false); //Does the throwItem function handle this?
%teamName = %game.getTeamName(%flag.team);
messageTeamExcept(%client, 'MsgCTFFlagDropped', '\c2Teammate %1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
messageTeam(%flag.team, 'MsgCTFFlagDropped', '\c2Your flag has been dropped by %1! (Held: %4)~wfx/misc/flag_drop.wav', %client.name, 0, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
messageTeam(0, 'MsgCTFFlagDropped', '\c2%1 dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
if(!%player.client.outOfBounds)
messageClient(%client, 'MsgCTFFlagDropped', '\c2You dropped the %2 flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, %teamName, %flag.team, %held); // z0dd - ZOD, 8/15/02. How long flag was held
// Yogi, 8/18/02. 3rd param changed 0 -> %client.name
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") dropped team "@%flag.team@" flag"@" (Held: "@%held@")");
// z0dd - ZOD: Check for auto flag returns
if($PracticeCtf::AutoFlagReturn)
{
%game.flagReturnFade(%flag);
}
else
{
//don't duplicate the schedule if there's already one in progress...
if($FlagReturnTimer[%flag] <= 0)
$FlagReturnTimer[%flag] = %game.schedule(%game.FLAG_RETURN_DELAY - %game.fadeTimeMS, "flagReturnFade", %flag);
}
//call the AI function
%game.AIplayerDroppedFlag(%player, %flag);
}
function PracticeCTFGame::flagCap(%game, %player)
{
%client = %player.client;
%flag = %player.holdingFlag;
%flag.carrier = "";
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
%game.playerLostFlagTarget(%player);
//award points to player and team
%teamName = %game.getTeamName(%flag.team);
messageTeamExcept(%client, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
messageTeam(%flag.team, 'MsgCTFFlagCapped', '\c2Your flag was captured by %1. (Held: %5)~wfx/misc/flag_lost.wav', %client.name, 0, %flag.team, %client.team, %held);
messageTeam(0, 'MsgCTFFlagCapped', '\c2%1 captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held);
messageClient(%client, 'MsgCTFFlagCapped', '\c2You captured the %2 flag! (Held: %5)~wfx/misc/flag_capture.wav', %client.name, %teamName, %flag.team, %client.team, %held); // z0dd - ZOD, 8/19/02. Yogi. 3rd param changed from 0 to %client.name
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") capped team "@%client.team@" flag"@" (Held: "@%held@")");
%player.holdingFlag = ""; //no longer holding it.
%player.unMountImage($FlagSlot);
%game.awardScoreFlagCap(%client, %flag);
%game.flagReset(%flag);
//call the AI function
%game.AIflagCap(%player, %flag);
//if this cap didn't end the game, play the announcer...
if ($missionRunning)
{
if (%game.getTeamName(%client.team) $= 'Inferno')
messageAll("", '~wvoice/announcer/ann.infscores.wav');
else if (%game.getTeamName(%client.team) $= 'Storm')
messageAll("", '~wvoice/announcer/ann.stoscores.wav');
else if (%game.getTeamName(%client.team) $= 'Phoenix')
messageAll("", '~wvoice/announcer/ann.pxscore.wav');
else if (%game.getTeamName(%client.team) $= 'Blood Eagle')
messageAll("", '~wvoice/announcer/ann.bescore.wav');
else if (%game.getTeamName(%client.team) $= 'Diamond Sword')
messageAll("", '~wvoice/announcer/ann.dsscore.wav');
else if (%game.getTeamName(%client.team) $= 'Starwolf')
messageAll("", '~wvoice/announcer/ann.swscore.wav');
}
}
function PracticeCTFGame::flagReturnFade(%game, %flag)
{
$FlagReturnTimer[%flag] = %game.schedule(%game.fadeTimeMS, "flagReturn", %flag);
%flag.startFade(%game.fadeTimeMS, 0, true);
}
function PracticeCTFGame::flagReturn(%game, %flag, %player)
{
// z0dd - ZOD: Bug fix related to practice mode
if($FlagReturnTimer[%flag] !$= "")
{
cancel($FlagReturnTimer[%flag]);
$FlagReturnTimer[%flag] = "";
}
if(%flag.team == 1)
%otherTeam = 2;
else
%otherTeam = 1;
%teamName = %game.getTeamName(%flag.team);
if (%player !$= "")
{
//a player returned it
%client = %player.client;
messageTeamExcept(%client, 'MsgCTFFlagReturned', '\c2Teammate %1 returned your flag to base.~wfx/misc/flag_return.wav', %client.name, 0, %flag.team);
messageTeam(%otherTeam, 'MsgCTFFlagReturned', '\c2Enemy %1 returned the %2 flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team);
messageTeam(0, 'MsgCTFFlagReturned', '\c2%1 returned the %2 flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team);
messageClient(%client, 'MsgCTFFlagReturned', '\c2You returned your flag.~wfx/misc/flag_return.wav', %client.name, %teamName, %flag.team); // z0dd - ZOD, 8/19/02. Yogi. 3rd param changed from 0 to %client.name
logEcho(%client.nameBase@" (pl "@%player@"/cl "@%client@") returned team "@%flag.team@" flag");
// find out what type of return it is
// stalemate return?
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if(%game.stalemate)
{
//error("Stalemate return!!!");
%game.awardScoreStalemateReturn(%player.client);
}
else // regular return
{
%enemyFlagDist = vectorDist($flagPos[%flag.team], $flagPos[%otherTeam]);
%dist = vectorDist(%flag.position, %flag.originalPosition);
%rawRatio = %dist/%enemyFlagDist;
%ratio = %rawRatio < 1 ? %rawRatio : 1;
%percentage = mFloor( (%ratio) * 10 ) * 10;
%game.awardScoreFlagReturn(%player.client, %percentage);
}
// ---------------------------------------------------
}
else
{
//returned due to timer
messageTeam(%otherTeam, 'MsgCTFFlagReturned', '\c2The %2 flag was returned to base.~wfx/misc/flag_return.wav', 0, %teamName, %flag.team); //because it was dropped for too long
messageTeam(%flag.team, 'MsgCTFFlagReturned', '\c2Your flag was returned.~wfx/misc/flag_return.wav', 0, 0, %flag.team);
messageTeam(0, 'MsgCTFFlagReturned', '\c2The %2 flag was returned to base.~wfx/misc/flag_return.wav', 0, %teamName, %flag.team);
logEcho("team "@%flag.team@" flag returned (timeout)");
}
%game.flagReset(%flag);
}
function PracticeCTFGame::showStalemateTargets(%game)
{
cancel(%game.stalemateSchedule);
//show the targets
for (%i = 1; %i <= 2; %i++)
{
%flag = $TeamFlag[%i];
//find the object to scope/waypoint....
//render the target hud icon for slot 1 (a centermass flag)
//if we just set him as always sensor vis, it'll work fine.
if (isObject(%flag.carrier))
setTargetAlwaysVisMask(%flag.carrier.getTarget(), 0x7);
}
//schedule the targets to hide
%game.stalemateObjsVisible = true;
%game.stalemateSchedule = %game.schedule(%game.stalemateDurationMS, hideStalemateTargets);
}
function PracticeCTFGame::hideStalemateTargets(%game)
{
cancel(%game.stalemateSchedule);
//hide the targets
for (%i = 1; %i <= 2; %i++)
{
%flag = $TeamFlag[%i];
if (isObject(%flag.carrier))
{
%target = %flag.carrier.getTarget();
setTargetAlwaysVisMask(%target, (1 << getTargetSensorGroup(%target)));
}
}
//schedule the targets to show again
%game.stalemateObjsVisible = false;
%game.stalemateSchedule = %game.schedule(%game.stalemateFreqMS, showStalemateTargets);
}
function PracticeCTFGame::beginStalemate(%game)
{
%game.stalemate = true;
%game.showStalemateTargets();
}
function PracticeCTFGame::endStalemate(%game)
{
%game.stalemate = false;
%game.hideStalemateTargets();
cancel(%game.stalemateSchedule);
}
function PracticeCTFGame::flagReset(%game, %flag)
{
cancel(%game.updateFlagThread[%flag]); // z0dd - ZOD, 8/4/02. Cancel this flag's thread to KineticPoet's flag updater
//any time a flag is reset, kill the stalemate schedule
%game.endStalemate();
//make sure if there's a player carrying it (probably one out of bounds...), it is stripped first
if (isObject(%flag.carrier))
{
//hide the target hud icon for slot 2 (a centermass flag - visible only as part of a teams sensor network)
%game.playerLostFlagTarget(%flag.carrier);
%flag.carrier.holdingFlag = ""; //no longer holding it.
%flag.carrier.unMountImage($FlagSlot);
}
//fades, restore default position, home, velocity, general status, etc.
%flag.setVelocity("0 0 0");
%flag.setTransform(%flag.originalPosition);
%flag.isHome = true;
%flag.carrier = "";
%flag.grabber = "";
$flagStatus[%flag.team] = "<At Base>";
%flag.hide(false);
if(%flag.stand)
%flag.stand.getDataBlock().onFlagReturn(%flag.stand);//animate, if exterior stand
//fade the flag in...
%flag.startFade(%game.fadeTimeMS, 0, false);
// dont render base target
setTargetRenderMask(%flag.waypoint.getTarget(), 0);
//call the AI function
%game.AIflagReset(%flag);
// --------------------------------------------------------
// z0dd - ZOD, 5/26/02. Don't let flag hover over defenders
%flag.static = true;
// --------------------------------------------------------------------------
// z0dd - ZOD, 9/28/02. Hack for flag collision bug.
if(%flag.searchSchedule !$="")
{
cancel(%flag.searchSchedule);
}
// --------------------------------------------------------------------------
}
function PracticeCTFGame::timeLimitReached(%game)
{
logEcho("game over (timelimit)");
%game.gameOver();
cycleMissions();
}
function PracticeCTFGame::scoreLimitReached(%game)
{
logEcho("game over (scorelimit)");
%game.gameOver();
cycleMissions();
}
function PracticeCTFGame::notifyMineDeployed(%game, %mine)
{
//see if the mine is within 5 meters of the flag stand...
%mineTeam = %mine.sourceObject.team;
%homeFlag = $TeamFlag[%mineTeam];
if (isObject(%homeFlag))
{
%dist = VectorDist(%homeFlag.originalPosition, %mine.position);
if (%dist <= %game.notifyMineDist)
{
messageTeam(%mineTeam, 'MsgCTFFlagMined', "The flag has been mined.~wvoice/announcer/flag_minedFem.wav" );
}
}
}
function PracticeCTFGame::gameOver(%game)
{
// z0dd - ZOD, 9/28/02. Hack for flag collision bug.
for(%f = 1; %f <= %game.numTeams; %f++)
{
cancel($TeamFlag[%f].searchSchedule);
}
// -------------------------------------------
// z0dd - ZOD, 9/28/02. Cancel camp schedules.
if( Game.campThread_1 !$= "" )
cancel(Game.campThread_1);
if( Game.campThread_2 !$= "" )
cancel(Game.campThread_2);
// -------------------------------------------
//call the default
DefaultGame::gameOver(%game);
//send the winner message
%winner = "";
if ($teamScore[1] > $teamScore[2])
%winner = %game.getTeamName(1);
else if ($teamScore[2] > $teamScore[1])
%winner = %game.getTeamName(2);
if (%winner $= 'Storm')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.stowins.wav" );
else if (%winner $= 'Inferno')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.infwins.wav" );
else if (%winner $= 'Starwolf')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.swwin.wav" );
else if (%winner $= 'Blood Eagle')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.bewin.wav" );
else if (%winner $= 'Diamond Sword')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.dswin.wav" );
else if (%winner $= 'Phoenix')
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.pxwin.wav" );
else
messageAll('MsgGameOver', "Match has ended.~wvoice/announcer/ann.gameover.wav" );
messageAll('MsgClearObjHud', "");
for(%i = 0; %i < ClientGroup.getCount(); %i ++)
{
%client = ClientGroup.getObject(%i);
%game.resetScore(%client);
}
for(%j = 1; %j <= %game.numTeams; %j++)
$TeamScore[%j] = 0;
}
function PracticeCTFGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc)
{
if(%clVictim.headshot && %damageType == $DamageType::Laser && %clVictim.team != %clAttacker.team)
{
%clAttacker.scoreHeadshot++;
if (%game.SCORE_PER_HEADSHOT != 0)
{
messageClient(%clAttacker, 'msgHeadshot', '\c0You received a %1 point bonus for a successful headshot.', %game.SCORE_PER_HEADSHOT);
messageTeamExcept(%clAttacker, 'msgHeadshot', '\c5%1 hit a sniper rifle headshot.', %clAttacker.name); // z0dd - ZOD, 8/15/02. Tell team
}
%game.recalcScore(%clAttacker);
}
// -----------------------------------------------
// z0dd - ZOD, 8/25/02. Rear Lance hits
if(%clVictim.rearshot && %damageType == $DamageType::ShockLance && %clVictim.team != %clAttacker.team)
{
%clAttacker.scoreRearshot++;
if (%game.SCORE_PER_REARSHOT != 0)
{
messageClient(%clAttacker, 'msgRearshot', '\c0You received a %1 point bonus for a successful rearshot.', %game.SCORE_PER_REARSHOT);
messageTeamExcept(%clAttacker, 'msgRearshot', '\c5%1 hit a shocklance rearshot.', %clAttacker.name);
}
%game.recalcScore(%clAttacker);
}
// -----------------------------------------------
//the DefaultGame will set some vars
DefaultGame::onClientDamaged(%game, %clVictim, %clAttacker, %damageType, %implement, %damageLoc);
//if victim is carrying a flag and is not on the attackers team, mark the attacker as a threat for x seconds(for scoring purposes)
if ((%clVictim.holdingFlag !$= "") && (%clVictim.team != %clAttacker.team))
{
%clAttacker.dmgdFlagCarrier = true;
cancel(%clAttacker.threatTimer); //restart timer
%clAttacker.threatTimer = schedule(%game.TIME_CONSIDERED_FLAGCARRIER_THREAT, %clAttacker.dmgdFlagCarrier = false);
}
}
////////////////////////////////////////////////////////////////////////////////////////
function PracticeCTFGame::clientMissionDropReady(%game, %client)
{
messageClient(%client, 'MsgClientReady',"", %game.class);
%game.resetScore(%client);
for(%i = 1; %i <= %game.numTeams; %i++)
{
$Teams[%i].score = 0;
messageClient(%client, 'MsgCTFAddTeam', "", %i, %game.getTeamName(%i), $flagStatus[%i], $TeamScore[%i]);
}
//%game.populateTeamRankArray(%client);
//messageClient(%client, 'MsgYourRankIs', "", -1);
messageClient(%client, 'MsgMissionDropInfo', '\c0You are in mission %1 (%2).', $MissionDisplayName, $MissionTypeDisplayName, $ServerName );
DefaultGame::clientMissionDropReady(%game, %client);
}
function PracticeCTFGame::assignClientTeam(%game, %client, %respawn)
{
DefaultGame::assignClientTeam(%game, %client, %respawn);
// if player's team is not on top of objective hud, switch lines
messageClient(%client, 'MsgCheckTeamLines', "", %client.team);
}
function PracticeCTFGame::recalcScore(%game, %cl)
{
%killValue = %cl.kills * %game.SCORE_PER_KILL;
%deathValue = %cl.deaths * %game.SCORE_PER_DEATH;
if (%killValue - %deathValue == 0)
%killPoints = 0;
else
%killPoints = (%killValue * %killValue) / (%killValue - %deathValue);
%cl.offenseScore = %killPoints +
%cl.suicides * %game.SCORE_PER_SUICIDE +
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
%cl.teamKills * %game.SCORE_PER_TEAMKILL +
%cl.tkDestroys * %game.SCORE_PER_TK_DESTROY + // z0dd - ZOD, 10/03/02. Penalty for tking equiptment.
%cl.scoreHeadshot * %game.SCORE_PER_HEADSHOT +
%cl.scoreRearshot * %game.SCORE_PER_REARSHOT + // z0dd - ZOD, 8/25/02. Added Lance rear shot messages
%cl.flagCaps * %game.SCORE_PER_PLYR_FLAG_CAP +
%cl.flagGrabs * %game.SCORE_PER_PLYR_FLAG_TOUCH +
%cl.genDestroys * %game.SCORE_PER_DESTROY_GEN +
%cl.sensorDestroys * %game.SCORE_PER_DESTROY_SENSOR +
%cl.turretDestroys * %game.SCORE_PER_DESTROY_TURRET +
%cl.iStationDestroys * %game.SCORE_PER_DESTROY_ISTATION +
%cl.vstationDestroys * %game.SCORE_PER_DESTROY_VSTATION +
%cl.mpbtstationDestroys * %game.SCORE_PER_DESTROY_MPBTSTATION + // z0dd - ZOD 3/30/02. MPB Teleporter
%cl.solarDestroys * %game.SCORE_PER_DESTROY_SOLAR +
%cl.sentryDestroys * %game.SCORE_PER_DESTROY_SENTRY +
%cl.depSensorDestroys * %game.SCORE_PER_DESTROY_DEP_SENSOR +
%cl.depTurretDestroys * %game.SCORE_PER_DESTROY_DEP_TUR +
%cl.depStationDestroys * %game.SCORE_PER_DESTROY_DEP_INV +
%cl.vehicleScore + %cl.vehicleBonus;
%cl.defenseScore = %cl.genDefends * %game.SCORE_PER_GEN_DEFEND +
%cl.flagDefends * %game.SCORE_PER_FLAG_DEFEND +
%cl.carrierKills * %game.SCORE_PER_CARRIER_KILL +
%cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST +
%cl.turretKills * %game.SCORE_PER_TURRET_KILL_AUTO +
%cl.mannedturretKills * %game.SCORE_PER_TURRET_KILL +
%cl.genRepairs * %game.SCORE_PER_REPAIR_GEN +
%cl.SensorRepairs * %game.SCORE_PER_REPAIR_SENSOR +
%cl.TurretRepairs * %game.SCORE_PER_REPAIR_TURRET +
%cl.StationRepairs * %game.SCORE_PER_REPAIR_ISTATION +
%cl.VStationRepairs * %game.SCORE_PER_REPAIR_VSTATION +
%cl.mpbtstationRepairs * %game.SCORE_PER_REPAIR_MPBTSTATION + // z0dd - ZOD 3/30/02. MPB Teleporter
%cl.solarRepairs * %game.SCORE_PER_REPAIR_SOLAR +
%cl.sentryRepairs * %game.SCORE_PER_REPAIR_SENTRY +
%cl.depInvRepairs * %game.SCORE_PER_REPAIR_DEP_INV +
%cl.depTurretRepairs * %game.SCORE_PER_REPAIR_DEP_TUR +
%cl.returnPts;
%cl.score = mFloor(%cl.offenseScore + %cl.defenseScore);
%game.recalcTeamRanks(%cl);
}
function PracticeCTFGame::updateKillScores(%game, %clVictim, %clKiller, %damageType, %implement)
{
// is this a vehicle kill rather than a player kill
// console error message suppression
if( isObject( %implement ) )
{
if( %implement.getDataBlock().getName() $= "AssaultPlasmaTurret" || %implement.getDataBlock().getName() $= "BomberTurret" ) // gunner
%clKiller = %implement.vehicleMounted.getMountNodeObject(1).client;
else if(%implement.getDataBlock().catagory $= "Vehicles") // pilot
%clKiller = %implement.getMountNodeObject(0).client;
}
if(%game.testTurretKill(%implement)) //check for turretkill before awarded a non client points for a kill
%game.awardScoreTurretKill(%clVictim, %implement);
else if (%game.testKill(%clVictim, %clKiller)) //verify victim was an enemy
{
%value = %game.awardScoreKill(%clKiller);
%game.shareScore(%clKiller, %value);
%game.awardScoreDeath(%clVictim);
if (%game.testGenDefend(%clVictim, %clKiller))
%game.awardScoreGenDefend(%clKiller);
if(%game.testCarrierKill(%clVictim, %clKiller))
%game.awardScoreCarrierKill(%clKiller);
else
{
if (%game.testFlagDefend(%clVictim, %clKiller))
%game.awardScoreFlagDefend(%clKiller);
}
if (%game.testEscortAssist(%clVictim, %clKiller))
%game.awardScoreEscortAssist(%clKiller);
}
else
{
if (%game.testSuicide(%clVictim, %clKiller, %damageType)) //otherwise test for suicide
{
%game.awardScoreSuicide(%clVictim);
}
else
{
if (%game.testTeamKill(%clVictim, %clKiller)) //otherwise test for a teamkill
%game.awardScoreTeamKill(%clVictim, %clKiller);
}
}
}
function PracticeCTFGame::testFlagDefend(%game, %victimID, %killerID)
{
InitContainerRadiusSearch(%victimID.plyrPointOfDeath, %game.RADIUS_FLAG_DEFENSE, $TypeMasks::ItemObjectType);
%objID = containerSearchNext();
while(%objID != 0)
{
%objType = %objID.getDataBlock().getName();
if ((%objType $= "Flag") && (%objID.team == %killerID.team))
return true; //found the(a) killer's flag near the victim's point of death
else
%objID = containerSearchNext();
}
return false; //didn't find a qualifying flag within required radius of victims point of death
}
function PracticeCTFGame::testGenDefend(%game, %victimID, %killerID)
{
InitContainerRadiusSearch(%victimID.plyrPointOfDeath, %game.RADIUS_GEN_DEFENSE, $TypeMasks::StaticShapeObjectType);
%objID = containerSearchNext();
while(%objID != 0)
{
%objType = %objID.getDataBlock().ClassName;
if ((%objType $= "generator") && (%objID.team == %killerID.team))
return true; //found a killer's generator within required radius of victim's death
else
%objID = containerSearchNext();
}
return false; //didn't find a qualifying gen within required radius of victim's point of death
}
function PracticeCTFGame::testCarrierKill(%game, %victimID, %killerID)
{
%flag = %victimID.plyrDiedHoldingFlag;
return ((%flag !$= "") && (%flag.team == %killerID.team));
}
function PracticeCTFGame::testEscortAssist(%game, %victimID, %killerID)
{
return (%victimID.dmgdFlagCarrier);
}
function PracticeCTFGame::testValidRepair(%game, %obj)
{
if(!%obj.wasDisabled)
{
//error(%obj SPC "was never disabled");
return false;
}
else if(%obj.lastDamagedByTeam == %obj.team)
{
//error(%obj SPC "was last damaged by a friendly");
return false;
}
else if(%obj.team != %obj.repairedBy.team)
{
//error(%obj SPC "was repaired by an enemy");
return false;
}
else
{
if(%obj.soiledByEnemyRepair)
%obj.soiledByEnemyRepair = false;
return true;
}
}
function PracticeCTFGame::awardScoreFlagCap(%game, %cl, %flag)
{
%cl.flagCaps++;
$TeamScore[%cl.team] += %game.SCORE_PER_TEAM_FLAG_CAP;
messageAll('MsgTeamScoreIs', "", %cl.team, $TeamScore[%cl.team]);
%flag.grabber.flagGrabs++;
if (%game.SCORE_PER_TEAM_FLAG_CAP > 0)
{
%plural = (%game.SCORE_PER_PLYR_FLAG_CAP != 1 ? 's' : "");
%plural2 = (%game.SCORE_PER_PLYR_FLAG_TOUCH != 1 ? 's' : "");
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if(%cl == %flag.grabber)
{
messageClient(%cl, 'msgCTFFriendCap', '\c0You receive %1 point%2 for stealing and capturing the enemy flag!', %game.SCORE_PER_PLYR_FLAG_CAP+%game.SCORE_PER_PLYR_FLAG_TOUCH, %plural);
messageTeam(%flag.team, 'msgCTFEnemyCap', '\c0Enemy %1 received %2 point%3 for capturing your flag!', %cl.name, %game.SCORE_PER_PLYR_FLAG_CAP+%game.SCORE_PER_PLYR_FLAG_TOUCH, %plural);
//messageTeamExcept(%cl, 'msgCTFFriendCap', '\c0Teammate %1 receives %2 point%3 for capturing the enemy flag!', %cl.name, %game.SCORE_PER_PLYR_FLAG_CAP+%game.SCORE_PER_PLYR_FLAG_TOUCH, %plural); // z0dd - ZOD, 8/15/02. Message is pointless
}
else
{
if(isObject(%flag.grabber)) // is the grabber still here?
{
messageClient(%cl, 'msgCTFFriendCap', '\c0You receive %1 point%2 for capturing the enemy flag! %3 gets %4 point%5 for the steal assist.', %game.SCORE_PER_PLYR_FLAG_CAP, %plural, %flag.grabber.name, %game.SCORE_PER_PLYR_FLAG_TOUCH, %plural2);
messageClient(%flag.grabber, 'msgCTFFriendCap', '\c0You receive %1 point%2 for stealing a flag that was subsequently capped by %3.', %game.SCORE_PER_PLYR_FLAG_TOUCH, %plural2, %cl.name);
}
else
messageClient(%cl, 'msgCTFFriendCap', '\c0You receive %1 point%2 for capturing the enemy flag!', %game.SCORE_PER_PLYR_FLAG_CAP, %plural);
//messageTeamExcept(%cl, 'msgCTFFriendCap', '\c0Teammate %1 receives %2 point%3 for capturing the enemy flag!', %cl.name, %game.SCORE_PER_PLYR_FLAG_CAP, %plural); // z0dd - ZOD, 8/15/02. Message is pointless
//messageTeam(%flag.team, 'msgCTFEnemyCap', '\c0Enemy %1 received %2 point%3 for capturing your flag!', %cl.name, %game.SCORE_PER_PLYR_FLAG_CAP, %plural); // z0dd - ZOD, 8/15/02. Message is pointless
}
// ---------------------------------------------------
}
%game.recalcScore(%cl);
if(isObject(%flag.grabber))
%game.recalcScore(%flag.grabber);
%game.checkScoreLimit(%cl.team);
}
function PracticeCTFGame::awardScoreFlagTouch(%game, %cl, %flag)
{
%flag.grabber = %cl;
%team = %cl.team;
if( $DontScoreTimer[%team] )
return;
$dontScoreTimer[%team] = true;
//tinman - needed to remove all game calls to "eval" for the PURE server...
%game.schedule(%game.TOUCH_DELAY_MS, resetDontScoreTimer, %team);
//schedule(%game.TOUCH_DELAY_MS, 0, eval, "$dontScoreTimer["@%team@"] = false;");
schedule(%game.TOUCH_DELAY_MS, 0, eval, "$dontScoreTimer["@%team@"] = false;");
$TeamScore[%team] += %game.SCORE_PER_TEAM_FLAG_TOUCH;
messageAll('MsgTeamScoreIs', "", %team, $TeamScore[%team]);
if (%game.SCORE_PER_TEAM_FLAG_TOUCH > 0)
{
%plural = (%game.SCORE_PER_TEAM_FLAG_TOUCH != 1 ? 's' : "");
messageTeam(%team, 'msgCTFFriendFlagTouch', '\c0Your team receives %1 point%2 for grabbing the enemy flag!', %game.SCORE_PER_TEAM_FLAG_TOUCH, %plural);
messageTeam(%flag.team, 'msgCTFEnemyFlagTouch', '\c0Enemy %1 receives %2 point%3 for grabbing your flag!', %cl.name, %game.SCORE_PER_TEAM_FLAG_TOUCH, %plural);
}
%game.recalcScore(%cl);
%game.checkScoreLimit(%team);
}
function PracticeCTFGame::resetDontScoreTimer(%game, %team)
{
$dontScoreTimer[%team] = false;
}
function PracticeCTFGame::checkScoreLimit(%game, %team)
{
// z0dd - ZOD, 5/12/02. Check for no score limit
if(!$PracticeCtf::NoScoreLimit)
{
%scoreLimit = MissionGroup.CTF_scoreLimit * %game.SCORE_PER_TEAM_FLAG_CAP;
// default of 5 if scoreLimit not defined
if(%scoreLimit $= "")
%scoreLimit = 5 * %game.SCORE_PER_TEAM_FLAG_CAP;
if($TeamScore[%team] >= %scoreLimit)
%game.scoreLimitReached();
}
else
%scoreLimit = %scoreLimit = 999;
}
function PracticeCTFGame::awardScoreFlagReturn(%game, %cl, %perc)
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if (%game.SCORE_PER_FLAG_RETURN != 0)
{
%pts = mfloor( %game.SCORE_PER_FLAG_RETURN * (%perc/100) );
if(%perc == 100)
messageClient(%cl, 'scoreFlaRetMsg', 'Flag return - exceeded capping distance - %1 point bonus.', %pts, %perc);
else if(%perc == 0)
messageClient(%cl, 'scoreFlaRetMsg', 'You gently place the flag back on the stand.', %pts, %perc);
else
messageClient(%cl, 'scoreFlaRetMsg', '\c0Flag return from %2%% of capping distance - %1 point bonus.', %pts, %perc);
%cl.returnPts += %pts;
}
%game.recalcScore(%cl);
return %game.SCORE_PER_FLAG_RETURN;
// ---------------------------------------------------
}
function PracticeCTFGame::awardScoreStalemateReturn(%game, %cl)
{
if (%game.SCORE_PER_STALEMATE_RETURN != 0)
{
messageClient(%cl, 'scoreStaleRetMsg', '\c0You received a %1 point bonus for a stalemate-breaking, flag return.', %game.SCORE_PER_STALEMATE_RETURN);
%cl.returnPts += %game.SCORE_PER_STALEMATE_RETURN;
}
%game.recalcScore(%cl);
return %game.SCORE_PER_STALEMATE_RETURN;
}
// Asset Destruction scoring
function PracticeCTFGame::awardScoreGenDestroy(%game,%cl)
{
%cl.genDestroys++;
if (%game.SCORE_PER_DESTROY_GEN != 0)
{
messageClient(%cl, 'msgGenDes', '\c0You received a %1 point bonus for destroying an enemy generator.', %game.SCORE_PER_DESTROY_GEN);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_GEN;
}
function PracticeCTFGame::awardScoreSensorDestroy(%game,%cl)
{
%cl.sensorDestroys++;
if (%game.SCORE_PER_DESTROY_SENSOR != 0)
{
messageClient(%cl, 'msgSensorDes', '\c0You received a %1 point bonus for destroying an enemy sensor.', %game.SCORE_PER_DESTROY_SENSOR);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_SENSOR;
}
function PracticeCTFGame::awardScoreTurretDestroy(%game,%cl)
{
%cl.turretDestroys++;
if (%game.SCORE_PER_DESTROY_TURRET != 0)
{
messageClient(%cl, 'msgTurretDes', '\c0You received a %1 point bonus for destroying an enemy turret.', %game.SCORE_PER_DESTROY_TURRET);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_TURRET;
}
function PracticeCTFGame::awardScoreInvDestroy(%game,%cl)
{
%cl.IStationDestroys++;
if (%game.SCORE_PER_DESTROY_ISTATION != 0)
{
messageClient(%cl, 'msgInvDes', '\c0You received a %1 point bonus for destroying an enemy inventory station.', %game.SCORE_PER_DESTROY_ISTATION);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_ISTATION;
}
function PracticeCTFGame::awardScoreVehicleStationDestroy(%game,%cl)
{
%cl.VStationDestroys++;
if (%game.SCORE_PER_DESTROY_VSTATION != 0)
{
messageClient(%cl, 'msgVSDes', '\c0You received a %1 point bonus for destroying an enemy vehicle station.', %game.SCORE_PER_DESTROY_VSTATION);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_VSTATION;
}
// ---------------------------------------------------------
// z0dd - ZOD 3/30/02. MBP Teleporter
function PracticeCTFGame::awardScoreMPBTeleporterDestroy(%game,%cl)
{
%cl.mpbtstationDestroys++;
if (%game.SCORE_PER_DESTROY_MPBTSTATION != 0)
{
messageClient(%cl, 'msgMPBTeleDes', '\c0You received a %1 point bonus for destroying an enemy MPB teleport station.', %game.SCORE_PER_DESTROY_MPBTSTATION);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_MPBTSTATION;
}
// ---------------------------------------------------------
function PracticeCTFGame::awardScoreSolarDestroy(%game,%cl)
{
%cl.SolarDestroys++;
if (%game.SCORE_PER_DESTROY_SOLAR != 0)
{
messageClient(%cl, 'msgSolarDes', '\c0You received a %1 point bonus for destroying an enemy solar panel.', %game.SCORE_PER_DESTROY_SOLAR);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_SOLAR;
}
function PracticeCTFGame::awardScoreSentryDestroy(%game,%cl)
{
%cl.sentryDestroys++;
if (%game.SCORE_PER_DESTROY_SENTRY != 0)
{
messageClient(%cl, 'msgSentryDes', '\c0You received a %1 point bonus for destroying an enemy sentry turret.', %game.SCORE_PER_DESTROY_SENTRY);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_SENTRY;
}
function PracticeCTFGame::awardScoreDepSensorDestroy(%game,%cl)
{
%cl.depSensorDestroys++;
if (%game.SCORE_PER_DESTROY_DEP_SENSOR != 0)
{
messageClient(%cl, 'msgDepSensorDes', '\c0You received a %1 point bonus for destroying an enemy deployable sensor.', %game.SCORE_PER_DESTROY_DEP_SENSOR); // z0dd - ZOD, 8/15/02. Added "sensor"
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_DEP_SENSOR;
}
function PracticeCTFGame::awardScoreDepTurretDestroy(%game,%cl)
{
%cl.depTurretDestroys++;
if (%game.SCORE_PER_DESTROY_DEP_TUR != 0)
{
messageClient(%cl, 'msgDepTurDes', '\c0You received a %1 point bonus for destroying an enemy deployed turret.', %game.SCORE_PER_DESTROY_DEP_TUR);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_DEP_TUR;
}
function PracticeCTFGame::awardScoreDepStationDestroy(%game,%cl)
{
%cl.depStationDestroys++;
if (%game.SCORE_PER_DESTROY_DEP_INV != 0)
{
messageClient(%cl, 'msgDepInvDes', '\c0You received a %1 point bonus for destroying an enemy deployed station.', %game.SCORE_PER_DESTROY_DEP_INV);
//messageTeamExcept(%cl, 'msgGenDes', '\c0Teammate %1 received a %2 point bonus for destroying an enemy generator.', %cl.name, %game.SCORE_PER_GEN_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_DESTROY_DEP_INV;
}
// ---------------------------------------------------------
// z0dd - ZOD, 10/03/02. Penalty for TKing equiptment.
function PracticeCTFGame::awardScoreTkDestroy(%game, %cl)
{
%cl.tkDestroys++;
if (%game.SCORE_PER_TK_DESTROY != 0)
{
messageClient(%cl, 'msgTkDes', '\c0You have been penalized %1 points for destroying your teams equiptment.', %game.SCORE_PER_TK_DESTROY);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_TK_DESTROY;
}
// ---------------------------------------------------------
function PracticeCTFGame::awardScoreGenDefend(%game, %killerID)
{
%killerID.genDefends++;
if (%game.SCORE_PER_GEN_DEFEND != 0)
{
messageClient(%killerID, 'msgGenDef', '\c0You received a %1 point bonus for defending a generator.', %game.SCORE_PER_GEN_DEFEND);
messageTeamExcept(%killerID, 'msgGenDef', '\c2%1 defended our generator from an attack.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
//messageTeamExcept(%killerID, 'msgGenDef', '\c0Teammate %1 received a %2 point bonus for defending a generator.', %killerID.name, %game.SCORE_PER_GEN_DEFEND);
}
%game.recalcScore(%cl);
return %game.SCORE_PER_GEN_DEFEND;
}
function PracticeCTFGame::awardScoreCarrierKill(%game, %killerID)
{
%killerID.carrierKills++;
if (%game.SCORE_PER_CARRIER_KILL != 0)
{
messageClient(%killerID, 'msgCarKill', '\c0You received a %1 point bonus for stopping the enemy flag carrier!', %game.SCORE_PER_CARRIER_KILL);
messageTeamExcept(%killerID, 'msgCarKill', '\c2%1 stopped the enemy flag carrier.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
//messageTeamExcept(%killerID, 'msgCarKill', '\c0Teammate %1 received a %2 point bonus for stopping the enemy flag carrier!', %killerID.name, %game.SCORE_PER_CARRIER_KILL);
}
%game.recalcScore(%killerID);
return %game.SCORE_PER_CARRIER_KILL;
}
function PracticeCTFGame::awardScoreFlagDefend(%game, %killerID)
{
%killerID.flagDefends++;
if (%game.SCORE_PER_FLAG_DEFEND != 0)
{
messageClient(%killerID, 'msgFlagDef', '\c0You received a %1 point bonus for defending your flag!', %game.SCORE_PER_FLAG_DEFEND);
messageTeamExcept(%killerID, 'msgFlagDef', '\c2%1 defended our flag.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
//messageTeamExcept(%killerID, 'msgFlagDef', '\c0Teammate %1 received a %2 point bonus for defending your flag!', %killerID.name, %game.SCORE_PER_FLAG_DEFEND);
}
%game.recalcScore(%killerID);
return %game.SCORE_PER_FLAG_DEFEND;
}
function PracticeCTFGame::awardScoreEscortAssist(%game, %killerID)
{
%killerID.escortAssists++;
if (%game.SCORE_PER_ESCORT_ASSIST != 0)
{
messageClient(%killerID, 'msgEscAsst', '\c0You received a %1 point bonus for protecting the flag carrier!', %game.SCORE_PER_ESCORT_ASSIST);
messageTeamExcept(%killerID, 'msgEscAsst', '\c2%1 protected our flag carrier.', %killerID.name); // z0dd - ZOD, 8/15/02. Tell team
//messageTeamExcept(%killerID, 'msgEscAsst', '\c0Teammate %1 received a %2 point bonus for protecting the flag carrier!', %killerID.name, %game.SCORE_PER_ESCORT_ASSIST);
}
%game.recalcScore(%killerID);
return %game.SCORE_PER_ESCORT_ASSIST;
}
function PracticeCTFGame::resetScore(%game, %client)
{
%client.offenseScore = 0;
%client.kills = 0;
%client.deaths = 0;
%client.suicides = 0;
%client.escortAssists = 0;
%client.teamKills = 0;
%client.tkDestroys = 0; // z0dd - ZOD, 10/03/02. Penalty for tking equiptment.
%client.flagCaps = 0;
%client.flagGrabs = 0;
%client.genDestroys = 0;
%client.sensorDestroys = 0;
%client.turretDestroys = 0;
%client.iStationDestroys = 0;
%client.vstationDestroys = 0;
%client.mpbtstationDestroys = 0; // z0dd - ZOD 3/30/02. MPB Teleporter
%client.solarDestroys = 0;
%client.sentryDestroys = 0;
%client.depSensorDestroys = 0;
%client.depTurretDestroys = 0;
%client.depStationDestroys = 0;
%client.vehicleScore = 0;
%client.vehicleBonus = 0;
%client.flagDefends = 0;
%client.defenseScore = 0;
%client.genDefends = 0;
%client.carrierKills = 0;
%client.escortAssists = 0;
%client.turretKills = 0;
%client.mannedTurretKills = 0;
%client.flagReturns = 0;
%client.genRepairs = 0;
%client.SensorRepairs = 0;
%client.TurretRepairs = 0;
%client.StationRepairs = 0;
%client.VStationRepairs = 0;
%client.mpbtstationRepairs = 0; // z0dd - ZOD 3/30/02. MPB Teleporter
%client.solarRepairs = 0;
%client.sentryRepairs = 0;
%client.depInvRepairs = 0;
%client.depTurretRepairs = 0;
%client.returnPts = 0;
%client.score = 0;
// z0dd - ZOD: Reset practice mode varibles
for(%i=0; %i < $Host::ClassicMaxTelepads; %i++)
{
%client.spawnPad[%i] = "";
}
%client.transMode = "";
%client.transPad = 1;
%client.camera.projectile = "";
%client.mortarObs = "";
%client.missileObs = "";
%client.grenadeObs = "";
%client.discObs = "";
}
function PracticeCTFGame::objectRepaired(%game, %obj, %objName)
{
%item = %obj.getDataBlock().getName();
switch$ (%item)
{
case generatorLarge :
%game.genOnRepaired(%obj, %objName);
case sensorMediumPulse :
%game.sensorOnRepaired(%obj, %objName);
case sensorLargePulse :
%game.sensorOnRepaired(%obj, %objName);
case stationInventory :
%game.stationOnRepaired(%obj, %objName);
case turretBaseLarge :
%game.turretOnRepaired(%obj, %objName);
case stationVehicle :
%game.vStationOnRepaired(%obj, %objName);
case MPBTeleporter : // z0dd - ZOD 3/30/02. MPB Teleporter
%game.mpbTStationOnRepaired(%obj, %objName);
case solarPanel :
%game.solarPanelOnRepaired(%obj, %objName);
case sentryTurret :
%game.sentryTurretOnRepaired(%obj, %objName);
case TurretDeployedWallIndoor:
%game.depTurretOnRepaired(%obj, %objName);
case TurretDeployedFloorIndoor:
%game.depTurretOnRepaired(%obj, %objName);
case TurretDeployedCeilingIndoor:
%game.depTurretOnRepaired(%obj, %objName);
case TurretDeployedOutdoor:
%game.depTurretOnRepaired(%obj, %objName);
}
%obj.wasDisabled = false;
}
function PracticeCTFGame::genOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgGenRepaired', '\c0%1 repaired the %2 Generator!', %repairman.name, %obj.nameTag);
%game.awardScoreGenRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::stationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgStationRepaired', '\c0%1 repaired the %2 Inventory Station!', %repairman.name, %obj.nameTag);
%game.awardScoreStationRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::sensorOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgSensorRepaired', '\c0%1 repaired the %2 Pulse Sensor!', %repairman.name, %obj.nameTag);
%game.awardScoreSensorRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::turretOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgTurretRepaired', '\c0%1 repaired the %2 Turret!', %repairman.name, %obj.nameTag);
%game.awardScoreTurretRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::vStationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgvstationRepaired', '\c0%1 repaired the Vehicle Station!', %repairman.name);
%game.awardScoreVStationRepair(%obj.repairedBy);
}
}
// z0dd - ZOD 3/17/02. Score for repairing MPB Teleporter station.
function PracticeCTFGame::mpbTStationOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgTeleporterRepaired', '\c0%1 repaired the MPB Teleporter Station!', %repairman.name);
%game.awardScoreMpbTStationRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::solarPanelOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgsolarRepaired', '\c0%1 repaired the %2 Solar Panel!', %repairman.name, %obj.nameTag);
%game.awardScoreSolarRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::sentryTurretOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgsentryTurretRepaired', '\c0%1 repaired the %2 Sentry Turret!', %repairman.name, %obj.nameTag);
%game.awardScoreSentryRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::depTurretOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgdepTurretRepaired', '\c4%1 repaired a %2 Deployable Turret!', %repairman.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Added this line
%game.awardScoreDepTurretRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::depInvOnRepaired(%game, %obj, %objName)
{
if (%game.testValidRepair(%obj))
{
%repairman = %obj.repairedBy;
teamRepairMessage(%repairman, 'msgdepInvRepaired', '\c4%1 repaired a %2 Deployable Inventory!', %repairman.name, %obj.nameTag); // z0dd - ZOD, 8/20/02. Added this line
%game.awardScoreDepInvRepair(%obj.repairedBy);
}
}
function PracticeCTFGame::awardScoreGenRepair(%game, %cl)
{
%cl.genRepairs++;
if (%game.SCORE_PER_REPAIR_GEN != 0)
{
messageClient(%cl, 'msgGenRep', '\c0You received a %1 point bonus for repairing a generator.', %game.SCORE_PER_REPAIR_GEN);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreStationRepair(%game, %cl)
{
%cl.stationRepairs++;
if (%game.SCORE_PER_REPAIR_ISTATION != 0)
{
messageClient(%cl, 'msgIStationRep', '\c0You received a %1 point bonus for repairing a inventory station.', %game.SCORE_PER_REPAIR_ISTATION);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreSensorRepair(%game, %cl)
{
%cl.sensorRepairs++;
if (%game.SCORE_PER_REPAIR_SENSOR != 0)
{
messageClient(%cl, 'msgSensorRep', '\c0You received a %1 point bonus for repairing a sensor.', %game.SCORE_PER_REPAIR_SENSOR);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreTurretRepair(%game, %cl)
{
%cl.TurretRepairs++;
if (%game.SCORE_PER_REPAIR_TURRET != 0)
{
messageClient(%cl, 'msgTurretRep', '\c0You received a %1 point bonus for repairing a base turret.', %game.SCORE_PER_REPAIR_TURRET);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreVStationRepair(%game, %cl)
{
%cl.VStationRepairs++;
if (%game.SCORE_PER_REPAIR_VSTATION != 0)
{
messageClient(%cl, 'msgVStationRep', '\c0You received a %1 point bonus for repairing a vehicle station.', %game.SCORE_PER_REPAIR_VSTATION);
}
%game.recalcScore(%cl);
}
// z0dd - ZOD 3/17/02. Score for repairing MPB Teleporter station.
function PracticeCTFGame::awardScoreMpbTStationRepair(%game, %cl)
{
%cl.mpbtstationRepairs++;
if (%game.SCORE_PER_REPAIR_MPBTSTATION != 0)
{
messageClient(%cl, 'msgVStationRep', '\c0You received a %1 point bonus for repairing a mpb teleporter station.', %game.SCORE_PER_REPAIR_TSTATION);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreSolarRepair(%game, %cl)
{
%cl.solarRepairs++;
if (%game.SCORE_PER_REPAIR_SOLAR != 0)
{
messageClient(%cl, 'msgsolarRep', '\c0You received a %1 point bonus for repairing a solar panel.', %game.SCORE_PER_REPAIR_SOLAR);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreSentryRepair(%game, %cl)
{
%cl.sentryRepairs++;
if (%game.SCORE_PER_REPAIR_SENTRY != 0)
{
messageClient(%cl, 'msgSentryRep', '\c0You received a %1 point bonus for repairing a sentry turret.', %game.SCORE_PER_REPAIR_SENTRY);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreDepTurretRepair(%game, %cl)
{
%cl.depTurretRepairs++;
if (%game.SCORE_PER_REPAIR_DEP_TUR != 0)
{
messageClient(%cl, 'msgDepTurretRep', '\c0You received a %1 point bonus for repairing a deployed turret.', %game.SCORE_PER_REPAIR_DEP_TUR);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::awardScoreDepInvRepair(%game, %cl)
{
%cl.depInvRepairs++;
if (%game.SCORE_PER_REPAIR_DEP_INV != 0)
{
messageClient(%cl, 'msgDepInvRep', '\c0You received a %1 point bonus for repairing a deployed station.', %game.SCORE_PER_REPAIR_DEP_INV);
}
%game.recalcScore(%cl);
}
function PracticeCTFGame::enterMissionArea(%game, %playerData, %player)
{
if(%player.getState() $= "Dead")
return;
%player.client.outOfBounds = false;
messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area.');
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") entered mission area");
//the instant a player leaves the mission boundary, the flag is dropped, and the return is scheduled...
if (%player.holdingFlag > 0)
{
cancel($FlagReturnTimer[%player.holdingFlag]);
$FlagReturnTimer[%player.holdingFlag] = "";
}
}
function PracticeCTFGame::leaveMissionArea(%game, %playerData, %player)
{
if(%player.getState() $= "Dead")
return;
// maybe we'll do this just in case
%player.client.outOfBounds = true;
// if the player is holding a flag, strip it and throw it back into the mission area
// otherwise, just print a message
if(%player.holdingFlag > 0)
%game.boundaryLoseFlag(%player);
else
messageClient(%player.client, 'MsgLeaveMissionArea', '\c1You have left the mission area.~wfx/misc/warning_beep.wav');
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") left mission area");
}
function PracticeCTFGame::boundaryLoseFlag(%game, %player)
{
// this is called when a player goes out of the mission area while holding
// the enemy flag. - make sure the player is still out of bounds
if (!%player.client.outOfBounds || !isObject(%player.holdingFlag))
return;
// ------------------------------------------------------------------------------
// z0dd - ZOD - SquirrelOfDeath, 9/27/02. Delay on grabbing flag after tossing it
%player.flagTossWait = true;
%player.schedule(1000, resetFlagTossWait);
// -------------------------------------------------------------------------------
%client = %player.client;
%flag = %player.holdingFlag;
%flag.setVelocity("0 0 0");
%flag.setTransform(%player.getWorldBoxCenter());
%flag.setCollisionTimeout(%player);
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false); // z0dd - ZOD, 8/15/02. How long did player hold flag?
%game.playerDroppedFlag(%player);
// now for the tricky part -- throwing the flag back into the mission area
// let's try throwing it back towards its "home"
%home = %flag.originalPosition;
%vecx = firstWord(%home) - firstWord(%player.getWorldBoxCenter());
%vecy = getWord(%home, 1) - getWord(%player.getWorldBoxCenter(), 1);
%vecz = getWord(%home, 2) - getWord(%player.getWorldBoxCenter(), 2);
%vec = %vecx SPC %vecy SPC %vecz;
// normalize the vector, scale it, and add an extra "upwards" component
%vecNorm = VectorNormalize(%vec);
%vec = VectorScale(%vecNorm, 1500);
%vec = vectorAdd(%vec, "0 0 500");
// z0dd - ZOD, 6/09/02. Remove anti-hover so flag can be thrown properly
%flag.static = false;
// z0dd - ZOD, 10/02/02. Hack for flag collision bug.
%flag.searchSchedule = %game.schedule(10, "startFlagCollisionSearch", %flag);
// apply the impulse to the flag object
%flag.applyImpulse(%player.getWorldBoxCenter(), %vec);
//don't forget to send the message
//messageClient(%player.client, 'MsgCTFFlagDropped', '\c1You have left the mission area and lost the flag.~wfx/misc/flag_drop.wav', 0, 0, %player.holdingFlag.team);
// z0dd - ZOD 3/30/02. Above message was sending the wrong varible to objective hud.
messageClient(%player.client, 'MsgCTFFlagDropped', '\c1You have left the mission area and lost the flag. (Held: %4)~wfx/misc/flag_drop.wav', %client.name, 0, %flag.team, %held); // z0dd - ZOD, 8/19/02. yogi. 3rd param changed from 0 to %client.name
logEcho(%player.client.nameBase@" (pl "@%player@"/cl "@%player.client@") lost flag (out of bounds)"@" (Held: "@%held@")");
}
function PracticeCTFGame::dropFlag(%game, %player)
{
if(%player.holdingFlag > 0)
{
if (!%player.client.outOfBounds)
%player.throwObject(%player.holdingFlag);
else
%game.boundaryLoseFlag(%player);
}
}
function PracticeCTFGame::applyConcussion(%game, %player)
{
%game.dropFlag( %player );
}
function PracticeCTFGame::vehicleDestroyed(%game, %vehicle, %destroyer)
{
//vehicle name
%data = %vehicle.getDataBlock();
//%vehicleType = getTaggedString(%data.targetNameTag) SPC getTaggedString(%data.targetTypeTag);
%vehicleType = getTaggedString(%data.targetTypeTag);
if(%vehicleType !$= "MPB")
%vehicleType = strlwr(%vehicleType);
%enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1;
%scorer = 0;
%multiplier = 1;
%passengers = 0;
for(%i = 0; %i < %data.numMountPoints; %i++)
if(%vehicle.getMountNodeObject(%i))
%passengers++;
//what destroyed this vehicle
if(%destroyer.client)
{
//it was a player, or his mine, satchel, whatever...
%destroyer = %destroyer.client;
%scorer = %destroyer;
// determine if the object used was a mine
if(%vehicle.lastDamageType == $DamageType::Mine)
%multiplier = 2;
}
else if(%destroyer.getClassName() $= "Turret")
{
if(%destroyer.getControllingClient())
{
//manned turret
%destroyer = %destroyer.getControllingClient();
%scorer = %destroyer;
}
else
{
%destroyerName = "A turret";
%multiplier = 0;
}
}
else if(%destroyer.getDataBlock().catagory $= "Vehicles")
{
// Vehicle vs vehicle kill!
if(%name $= "BomberFlyer" || %name $= "AssaultVehicle")
%gunnerNode = 1;
else
%gunnerNode = 0;
if(%destroyer.getMountNodeObject(%gunnerNode))
{
%destroyer = %destroyer.getMountNodeObject(%gunnerNode).client;
%scorer = %destroyer;
}
%multiplier = 3;
}
else // Is there anything else we care about?
return;
if(%destroyerName $= "")
%destroyerName = %destroyer.name;
if(%vehicle.team == %destroyer.team) // team kill
{
%pref = (%vehicleType $= "Assault Tank") ? "an" : "a";
messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref);
}
else // legit kill
{
//messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. not needed with new messenger on line below
teamDestroyMessage(%destroyer, 'msgVehDestroyed', '\c5%1 destroyed an enemy %2!', %destroyerName, %vehicleType); // z0dd - ZOD, 8/20/02. Send teammates a destroy message
messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType);
//messageClient(%destroyer, 'msgVehicleDestroy', '\c0You destroyed an enemy %1.', %vehicleType);
if(%scorer)
{
%value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers);
%game.shareScore(%value);
}
}
}
function PracticeCTFGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers)
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
if(%vehicleType $= "Grav Cycle")
%base = %game.SCORE_PER_DESTROY_WILDCAT;
else if(%vehicleType $= "Assault Tank")
%base = %game.SCORE_PER_DESTROY_TANK;
else if(%vehicleType $= "MPB")
%base = %game.SCORE_PER_DESTROY_MPB;
else if(%vehicleType $= "Turbograv")
%base = %game.SCORE_PER_DESTROY_SHRIKE;
else if(%vehicleType $= "Bomber")
%base = %game.SCORE_PER_DESTROY_BOMBER;
else if(%vehicleType $= "Heavy Transport")
%base = %game.SCORE_PER_DESTROY_TRANSPORT;
%total = ( %base * %mult ) + ( %passengers * %game.SCORE_PER_PASSENGER );
%client.vehicleScore += %total;
messageClient(%client, 'msgVehicleScore', '\c0You received a %1 point bonus for destroying an enemy %2.', %total, %vehicleType);
%game.recalcScore(%client);
return %total;
}
function PracticeCTFGame::shareScore(%game, %client, %amount)
{
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
//error("share score of"SPC %amount SPC "from client:" SPC %client);
// all of the player in the bomber and tank share the points
// gained from any of the others
%vehicle = %client.vehicleMounted;
if(!%vehicle)
return 0;
%vehicleType = getTaggedString(%vehicle.getDataBlock().targetTypeTag);
if(%vehicleType $= "Bomber" || %vehicleType $= "Assault Tank")
{
for(%i = 0; %i < %vehicle.getDataBlock().numMountPoints; %i++)
{
%occupant = %vehicle.getMountNodeObject(%i);
if(%occupant)
{
%occCl = %occupant.client;
if(%occCl != %client && %occCl.team == %client.team)
{
// the vehicle has a valid teammate at this node
// share the score with them
%occCl.vehicleBonus += %amount;
%game.recalcScore(%occCl);
}
}
}
}
}
function PracticeCTFGame::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.mannedturretKills++;
%game.recalcScore(%killer);
%game.awardScoreDeath(%victimID);
}
}
else if ((%killer = %implement.owner) != 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 PracticeCTFGame::testKill(%game, %victimID, %killerID)
{
return ((%killerID !=0) && (%victimID.team != %killerID.team));
}
function PracticeCTFGame::awardScoreKill(%game, %killerID)
{
%killerID.kills++;
%game.recalcScore(%killerID);
return %game.SCORE_PER_KILL;
}
/////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: Practice Mode functions //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function PracticeCTFGame::onClientLeaveGame(%game, %client)
{
// Clear out this clients transfer pads
for( %i = 0; %i < $Host::ClassicMaxTelepads; %i++ )
{
if(isObject(%client.spawnPad[%i]))
%client.spawnPad[%i].setDamageState(Destroyed);
}
// Call the default
DefaultGame::onClientLeaveGame(%game, %client);
}
function PracticeCTFGame::clientChangeTeam(%game, %client, %team, %fromObs)
{
// Clear out this clients transfer pads
for( %i = 0; %i < $Host::ClassicMaxTelepads; %i++ ) {
if(isObject(%client.spawnPad[%i]))
%client.spawnPad[%i].setDamageState(Destroyed);
}
// Call the default
DefaultGame::clientChangeTeam(%game, %client, %team, %fromObs);
}
function PracticeCTFGame::equip(%game, %player)
{
for(%i =0; %i<$InventoryHudCount; %i++)
%player.client.setInventoryHudItem($InventoryHudData[%i, itemDataName], 0, 1);
%player.client.clearBackpackIcon();
if(!%player.client.isAIControlled() && $PracticeCtf::SpawnFavs && !$PracticeCtf::SpawnOnly)
{
buyFavorites(%player.client);
%player.setEnergyLevel(%player.getDataBlock().maxEnergy);
%player.selectWeaponSlot( 0 );
}
else
{
%player.setInventory(Blaster,1);
%player.setInventory(Disc,1);
%player.setInventory(DiscAmmo, 999);
%player.setInventory(Chaingun, 1);
%player.setInventory(ChaingunAmmo, 999);
%player.setInventory(RepairKit,1);
%player.setInventory(Grenade, 30);
%player.setInventory(Beacon, 20);
%player.setInventory(TargetingLaser, 1);
%player.weaponCount = 3;
%player.use("Blaster");
}
}
/////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: Map Reset functions///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function PracticeCTFGame::resetMission(%game)
{
Cancel( %game.timeCheck );
CancelCountdown();
CancelEndCountdown();
//setup the second half...
// MES -- per MarkF, scheduling for 0 seconds will prevent player deletion-related crashes
%game.schedule(0, "refreshAll");
}
function PracticeCTFGame::refreshAll(%game)
{
//stop the game and the bots
$MatchStarted = false;
$CountdownStarted = false;
AISystemEnabled(false);
// Let everyone know what is going on
bottomPrintAll("\nYou are in observation mode while mission is resetting.\n", $Host::warmupTime, 3);
// Return all flags that aren't home
for(%f = 1; %f <= %game.numTeams; %f++)
{
if(!$TeamFlag[%f].isHome)
{
%game.flagReturn($TeamFlag[%f]);
}
}
//reset stations and vehicles that players were using
// Function exists in Siege, use it, no need to duplicate
SiegeGame::resetPlayers(%game);
// zero out the counts for deployable items (found in defaultGame.cs)
%game.clearDeployableMaxes();
// Clean up deployables triggers
cleanTriggers(nameToID("MissionCleanup/Deployables"));
// clean up the MissionCleanup group - note, this includes deleting all the player objects
%clean = nameToID("MissionCleanup");
%clean.schedule(800, "housekeeping");
//%clean.housekeeping(); // Function exists in Siege no need to duplicate
// Vehicle objects placed in original position
// This apprently switches the vehicles team as well, not a good idea.
//resetNonStaticObjPositions();
// Restore static objects to their original condition
// Function exists in defaultGame.cs, in turn calls PracticeCTFGame::groupObjectRestore
%group = nameToID("MissionGroup/Teams");
%group.objectRestore();
%count = ClientGroup.getCount();
echo("-----------count=" @ %count);
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
if( !%client.isAIControlled() )
{
Game.forceObserver( %client, "playerChoose" );
// old code. wasn't working correctly for some reason
// Put everybody in observer mode:
//%client.camera.getDataBlock().setMode( %client.camera, "observerStaticNoNext" );
//%client.setControlObject( %client.camera );
// This sets certain keybinds, usefull, lets keep it?
//commandToClient( %client, 'setHudMode', 'Standard' );
//commandToClient( %client, 'ControlObjectReset' );
//clientResetTargets(%client, true);
//%client.notReady = true;
}
}
%game.schedule( $Host::warmupTime * 1000, "resetOver" );
}
function PracticeCTFGame::groupObjectRestore(%game, %this)
{
for(%i = 0; %i < %this.getCount(); %i++)
%this.getObject(%i).objectRestore();
}
function PracticeCTFGame::shapeObjectRestore(%game, %object)
{
if(%object.getDamageLevel())
{
%object.setDamageLevel(0.0);
%object.setDamageState(Enabled);
}
if(%object.getDatablock().getName() $= "TurretBaseLarge")
{
// check to see if the turret base still has the same type of barrel it had
// at the beginning of the mission
if(%object.getMountedImage(0))
{
if(%object.getMountedImage(0).getName() !$= %object.originalBarrel)
{
// pop the "new" barrel
%object.unmountImage(0);
// mount the original barrel
%object.mountImage(%object.initialBarrel, 0, false);
}
}
}
}
function PracticeCTFGame::resetOver( %game )
{
// Reset the team scores
for(%j = 1; %j <= %game.numTeams; %j++)
$TeamScore[%j] = 0;
// drop all players into mission
%game.dropPlayers();
//setup the AI for the second half
%game.aiHalfTime();
// start the mission again (release players)
%game.startupCountDown( $Host::warmupTime );
}
function PracticeCTFGame::dropPlayers( %game )
{
%count = ClientGroup.getCount();
for(%cl = 0; %cl < %count; %cl++)
{
%client = ClientGroup.getObject(%cl);
// Reset client score
%game.resetScore(%client);
// Resend the scores and flag status
for(%i = 1; %i <= %game.numTeams; %i++)
messageClient(%client, 'MsgCTFAddTeam', "", %i, %game.getTeamName(%i), $flagStatus[%i], $TeamScore[%i]);
if( !%client.isAIControlled() )
{
// keep observers in observer mode
if(%client.team == 0)
%client.camera.getDataBlock().setMode(%client.camera, "justJoined");
else
{
%game.spawnPlayer( %client, false );
%client.camera.getDataBlock().setMode( %client.camera, "pre-game", %client.player );
%client.setControlObject( %client.camera );
//%client.notReady = false;
}
}
}
}
function PracticeCTFGame::startupCountDown(%game, %time)
{
%game.startupCountDown = true;
$MatchStarted = false;
%timeMS = %time * 1000;
%game.schedule(%timeMS, "startMap");
notifyMatchStart(%timeMS);
if(%timeMS > 30000)
schedule(%timeMS - 30000, 0, "notifyMatchStart", 30000);
if(%timeMS > 20000)
schedule(%timeMS - 20000, 0, "notifyMatchStart", 20000);
if(%timeMS > 10000)
schedule(%timeMS - 10000, 0, "notifyMatchStart", 10000);
if(%timeMS > 5000)
schedule(%timeMS - 5000, 0, "notifyMatchStart", 5000);
if(%timeMS > 4000)
schedule(%timeMS - 4000, 0, "notifyMatchStart", 4000);
if(%timeMS > 3000)
schedule(%timeMS - 3000, 0, "notifyMatchStart", 3000);
if(%timeMS > 2000)
schedule(%timeMS - 2000, 0, "notifyMatchStart", 2000);
if(%timeMS > 1000)
schedule(%timeMS - 1000, 0, "notifyMatchStart", 1000);
}
function PracticeCTFGame::startMap(%game)
{
$MatchStarted = true;
$CountdownStarted = true;
%game.startupCountDown = false;
MessageAll('MsgMissionStart', "\c2Match started");
// reset the timelimit
%curTimeLeftMS = $Host::TimeLimit * 60 * 1000;
$missionStartTime = getSimTime();
%game.timeCheck = %game.schedule(20000, "checkTimeLimit");
//schedule the end of match countdown
EndCountdown($Host::TimeLimit * 60 * 1000);
// set all clients control to their player
%count = ClientGroup.getCount();
for( %i = 0; %i < %count; %i++ )
{
%cl = ClientGroup.getObject(%i);
// Send clients the new clock
messageClient(%cl, 'MsgSystemClock', "", $Host::TimeLimit, %curTimeLeftMS);
if (!isObject(%cl.player))
commandToClient(%cl, 'setHudMode', 'Observer');
else
{
%cl.observerMode = "";
%cl.setControlObject( %cl.player );
commandToClient(%cl, 'setHudMode', 'Standard');
%client.notReady = false;
}
}
//now synchronize everyone's clock
updateClientTimes(%curTimeLeftMS);
//start the bots up again...
AISystemEnabled(true);
}
/////////////////////////////////////////////////////////////////////////////////////////
// z0dd - ZOD: Hud related Practice functions ///////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
function PracticeCTFGame::initPracticeHud(%game, %client, %val)
{
commandToClient(%client, 'initializePracHud', "PracticeCTF");
commandToClient(%client, 'practiceHudHead', "CTF Practice Config", "Server Settings", "Player Settings", "Projectile Observation", "Telepad Options", "Spawn Vehicle at Pad");
// Send admins full set of options. Edit, this was causing problems when client requires update.
//if(%client.isAdmin)
//{
commandToClient(%client, 'practiceHudPopulate', "Minimum Turrets", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16");
commandToClient(%client, 'practiceHudPopulate', "Return Flag", getTaggedString(Game.getTeamName(1)), getTaggedString(Game.getTeamName(2)));
//if(%client.isSuperAdmin)
//{
commandToClient(%client, 'practiceHudPopulate', "Save Deployables", $MissionDisplayName @ " File 1", $MissionDisplayName @ " File 2", $MissionDisplayName @ " File 3", $MissionDisplayName @ " File 4", $MissionDisplayName @ " File 5", $MissionDisplayName @ " File 6");
commandToClient(%client, 'practiceHudPopulate', "Load Deployables", $MissionDisplayName @ " File 1", $MissionDisplayName @ " File 2", $MissionDisplayName @ " File 3", $MissionDisplayName @ " File 4", $MissionDisplayName @ " File 5", $MissionDisplayName @ " File 6");
//}
//}
commandToClient(%client, 'practiceHudDone');
}
function PracticeCTFGame::sendPracHudUpdate(%game, %client, %msg)
{
%serverOptMask = 0;
if ($PracticeCtf::UnlimAmmo == 1) %serverOptMask += 1;
if ($PracticeCtf::AutoFlagReturn == 1) %serverOptMask += 2;
if ($PracticeCtf::SpawnFavs == 1) %serverOptMask += 4;
if ($PracticeCtf::SpawnOnly == 1) %serverOptMask += 8;
if ($PracticeCtf::NoScoreLimit == 1) %serverOptMask += 16;
if ($PracticeCtf::ProtectStatics == 1) %serverOptMask += 32;
%clientOptMask = 0;
if (%client.discObs == 1) %clientOptMask += 1;
if (%client.grenadeObs == 1) %clientOptMask += 2;
if (%client.mortarObs == 1) %clientOptMask += 4;
if (%client.missileObs == 1) %clientOptMask += 8;
if (%client.transMode == 0) %clientOptMask += 16;
if (%client.transMode == 1) %clientOptMask += 32;
messageClient(%client, 'UpdatePracHud', %msg, %serverOptMask, %clientOptMask, %client.isAdmin + %client.isSuperAdmin);
}
function PracticeCTFGame::practiceBtnCmd(%game, %client, %btn, %val)
{
// dont let non admins change practice mode server settings
if((mFloor(%btn/10) == 1) && (!%client.isAdmin) && (!%client.isSuperAdmin))
{
messageClient(%client, 'MsgPracMode', '\c2Only admins can change that Server Setting.~wfx/misc/misc.error.wav');
return;
}
if(!$MatchStarted)
{
messageClient( %client, 'MsgPracMode', '\c2You must wait for the match to start before using practice commands.~wfx/misc/misc.error.wav');
return;
}
%name = %client.nameBase;
%snd = "~wfx/misc/warning_beep.wav";
switch$ (%btn)
{
// GUI CONTROLS
// SERVER BUTTONS
case 10:
$PracticeCtf::UnlimAmmo = !$PracticeCtf::UnlimAmmo;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: 999 AMMO turned \c3" @ ($PracticeCtf::UnlimAmmo ? "ON" : "OFF") @ %snd);
case 11:
$PracticeCtf::AutoFlagReturn = !$PracticeCtf::AutoFlagReturn;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: AUTO-RETURN FLAGS turned \c3" @ ($PracticeCtf::AutoFlagReturn ? "ON" : "OFF") @ %snd);
case 12:
$PracticeCtf::SpawnFavs = !$PracticeCtf::SpawnFavs;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: SPAWN IN FAVORITE turned \c3" @ ($PracticeCtf::SpawnFavs ? "ON" : "OFF") @ %snd);
case 13:
$PracticeCtf::SpawnOnly = !$PracticeCtf::SpawnOnly;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: SPAWN ONLY turned \c3" @ ($PracticeCtf::SpawnOnly ? "ON" : "OFF") @ %snd);
case 14:
$PracticeCtf::NoScoreLimit = !$PracticeCtf::NoScoreLimit;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: NO SCORE LIMIT turned \c3" @ ($PracticeCtf::NoScoreLimit ? "ON" : "OFF") @ %snd);
for ( %team = 1; %team <= %game.numTeams; %team++ )
%game.checkScoreLimit(%team);
case 15:
$PracticeCtf::ProtectStatics = !$PracticeCtf::ProtectStatics;
sendAllPracHudUpdate(%game, "\c3" @ %name @ "\c2: PROTECT ASSESTS turned \c3" @ ($PracticeCtf::ProtectStatics ? "ON" : "OFF") @ %snd);
case 16:
messageAll( 'MsgPracMode', '\c3%1\c2: Resetting map.%2', %client.name, %snd);
%game.resetMission();
// TELEPORT OPTIONS
case 20:
%client.transMode = 0; // beacon
//messageClient( %client, 'MsgPracMode', '\c2Beacon deploy mode: \c3Beacon\c2.%1', %snd);
case 21:
%client.transMode = 1; // telepad
//messageClient( %client, 'MsgPracMode', '\c2Beacon deploy mode: \c3Transfer Pad\c2.%1', %snd);
case 22:
selectPad(%client);
case 23:
destroyPad(%client, 0);
case 24:
teleportToPad(%client);
// SPAWN VEHICLES
case 30:
spawnVehAtPad(%client, "ScoutVehicle");
case 31:
spawnVehAtPad(%client, "AssaultVehicle");
case 32:
spawnVehAtPad(%client, "MobileBaseVehicle");
case 33:
spawnVehAtPad(%client, "ScoutFlyer");
case 34:
spawnVehAtPad(%client, "BomberFlyer");
case 35:
spawnVehAtPad(%client, "HAPCFlyer");
// PROJECTILE OBSERVATION
case 40:
%client.discObs = %val;
case 41:
%client.grenadeObs = %val;
case 42:
%client.mortarObs = %val;
case 43:
%client.missileObs = %val;
default:
messageClient( %client, 'MsgError', '\c2Unknown values.%1', %snd);
}
}
// Menu Submit handler
function PracticeCTFGame::updatePracticeHudSet(%game, %client, %opt, %val)
{
// dont let non admins change practice mode server settings
if((%opt < 3) && ((!%client.isAdmin) || (!%client.isSuperAdmin)))
{
messageClient(%client, 'MsgError', '\c2Only admins can change that Server Setting.~wfx/misc/misc.error.wav');
return;
}
else if((!%client.isSuperAdmin)) // dont let non SuperAdmins change SuperAdmin only practice mode server settings
{
messageClient(%client, 'MsgError', '\c2Only SuperAdmins can change that Server Setting.~wfx/misc/misc.error.wav');
return;
}
if(!$MatchStarted)
{
messageClient( %client, 'MsgError', '\c2You must wait for the match to start before using practice commands.~wfx/misc/misc.error.wav');
return;
}
%snd = '~wfx/misc/warning_beep.wav';
%adj = %val == 1 ? 1 : 0; // Convert index to only 1 or 0 to help keep function smaller
%detail = (%adj ? "On" : "Off");
%name = %client.name;
switch$ ( %opt )
{
case 1:
%min = %val+3;
$TeamDeployableMin[TurretIndoorDeployable] = %min;
$TeamDeployableMin[TurretOutdoorDeployable] = %min;
%detail = %min;
messageAll( 'MsgPracMode', '\c3%5\c2: \"Minimum Turrets\" set to: \c3%4\c2.%1', %snd, %val, %adj, %detail, %name, $CurrentMission );
case 2:
if(!$TeamFlag[%val].isHome)
{
%game.flagReturn($TeamFlag[%val]);
messageAll( 'MsgPracMode', '\c3%5\c2: returned the flag.%1', %snd, %val, %adj, %detail, %name, $CurrentMission );
}
else
messageClient( %client, 'MsgPracMode', '\c2Unknown values.', %snd, %val, %adj, %detail, %name, $CurrentMission );
case 3:
messageClient( %client, 'MsgPracMode', '\c2Attempting to save deployables to file: %6 %2.', %snd, %val, %adj, %detail, %name, $CurrentMission );
%game.saveDeployables(%client, %val);
case 4:
messageClient( %client, 'MsgPracMode', '\c2Attempting to load deployables from file: %6 %2.', %snd, %val, %adj, %detail, %name, $CurrentMission );
%game.loadDeployables(%client, %val);
default:
messageClient( %client, 'MsgError', '\c2Unknown values.', %snd, %val, %adj, %detail, %name, $CurrentMission );
}
}
// default to 0
$DeployablesCount = 0;
function PracticeCTFGame::loadDeployables(%game, %client, %val)
{
if(%client.isSuperAdmin)
{
%filename = "prefs/" @ "DepSav" @ $CurrentMission @ %val @ ".cs";
if(!isFile(%filename))
{
messageClient(%client, 'MsgPracMode', '\c2File %6 %2 does not exist!', 0, %val, 0, 0, 0, $CurrentMission );
return;
}
else
{
%group = nameToID("MissionCleanup/Deployables");
%count = %group.getCount();
for(%i = 0; %i < %count; %i++)
{
%obj = %group.getObject(%i);
%obj.setDamageState(Destroyed);
}
%file = new FileObject();
if(%file.openForRead(%filename))
{
exec(%filename);
for(%i = 0; %i < $DeployablesCount; %i++)
{
%class = $DeployableClassName[%i];
if(%class $= "TurretData")
%className = "Turret";
else
%className = "StaticShape";
%deplObj = new (%className)() {
dataBlock = $DeployableDataBlockName[%i];
};
%deplObj.setTransform($DeployableTrans[%i]);
if(%deplObj.getDatablock().rechargeRate)
%deplObj.setRechargeRate(%deplObj.getDatablock().rechargeRate);
%deplObj.team = $DeployableTeam[%i];
%deplObj.owner = 0;
if(%deplObj.getTarget() != -1)
setTargetSensorGroup(%deplObj.getTarget(), $DeployableTeam[%i]);
addToDeployGroup(%deplObj);
AIDeployObject(0, %deplObj);
$TeamDeployedCount[$DeployableTeam[%i], $DeployableItem[%i]]++;
%deplObj.deploy();
}
}
%file.delete();
messageClient(%client, 'MsgPracMode', '\c2Load file %6 %2 completed.', 0, %val, 0, 0, 0, $CurrentMission );
}
}
else
messageClient(%client, 'MsgError', '\c2Only SuperAdmins can use this setting.~wfx/misc/misc.error.wav');
}
function PracticeCTFGame::saveDeployables(%game, %client, %val)
{
if(%client.isSuperAdmin)
{
%filename = "prefs/" @ "DepSav" @ $CurrentMission @ %val @ ".cs";
// Check to see if theres anything to write first
%group = nameToID("MissionCleanup/Deployables");
if (%group > 0)
%depCount = %group.getCount();
else
return;
if(isFile(%filename))
deleteFile(%filename);
%file = new fileObject();
%file.openForWrite(%filename);
%count = 0;
for(%i = 0; %i < %depCount; %i++)
{
%deplObj = %group.getObject(%i);
if(isObject(%deplObj))
{
%name = %deplObj.getDataBlock().getName();
if(%name $= "DeployedStationInventory")
%item = "InventoryDeployable";
else if(%name $= "DeployedMotionSensor")
%item = "MotionSensorDeployable";
else if(%name $= "DeployedPulseSensor")
%item = "PulseSensorDeployable";
else if(%name $= "TurretDeployedOutdoor")
%item = "TurretOutdoorDeployable";
else if(%name $= "TurretDeployedFloorIndoor" || %name $= "TurretDeployedWallIndoor" || %name $= "TurretDeployedCeilingIndoor")
%item = "TurretIndoorDeployable";
else if(%name $= "TurretDeployedCamera")
%item = "DeployedCamera";
else
%item = "";
%file.writeLine("$DeployableDataBlockName[" @ %count @"] = " @ %name @ ";");
%file.writeLine("$DeployableClassName[" @ %count @"] = " @ %deplObj.getDataBlock().getClassName() @ ";");
%file.writeLine("$DeployableItem[" @ %count @"] = " @ %item @ ";");
%file.writeLine("$DeployableTrans[" @ %count @"] = " @ "\"" @ %deplObj.getTransform() @ "\"" @ ";");
%file.writeLine("$DeployableTeam[" @ %count @"] = " @ %deplObj.team @ ";");
%count++;
}
}
%file.writeLine("$DeployablesCount = " @ %count @ ";");
%file.close();
%file.delete();
messageClient(%client, 'MsgPracMode', '\c2Save file %6 %2 completed.', 0, %val, 0, 0, 0, $CurrentMission );
}
else
messageClient(%client, 'MsgError', '\c2Only SuperAdmins can use this setting.~wfx/misc/misc.error.wav');
}
// z0dd - ZOD, 10/02/02. Hack for flag collision bug.
function CTFGame::startFlagCollisionSearch(%game, %flag)
{
%flag.searchSchedule = %game.schedule(10, "startFlagCollisionSearch", %flag); // SquirrelOfDeath, 10/02/02. Moved from after the while loop
%pos = %flag.getWorldBoxCenter();
InitContainerRadiusSearch( %pos, 1.0, $TypeMasks::VehicleObjectType | $TypeMasks::CorpseObjectType | $TypeMasks::PlayerObjectType );
while((%found = containerSearchNext()) != 0)
{
%flag.getDataBlock().onCollision(%flag, %found);
// SquirrelOfDeath, 10/02/02. Removed break to catch all players possibly intersecting with flag
}
}