2015-08-30 06:30:29 +00:00
// 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. \n Press 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. \n Press 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 ( " \n You 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
}
}