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