// DisplayName = CombatCon //--- GAME RULES BEGIN --- // Make a base or use map bases. // Defend your base. // Destroy the enemy base. // Team killing and suicide penalties. //--- GAME RULES END --- // CombatCon Game //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Notes are all done by Blnukem. These are to help you know what's what when // editing this gametype. (The notes are not completed, so don't edit anything) //------------------------------------------------------------------------------ // NOTICE: // This rather huge file will be cleaned and remade in a later version of ACCM. // So for all you file moderators out there, have fun tweaking this gametype. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Now to get rid of the overpowered weapons. $InvBanList[CombatCon, "M4"] = 1; $InvBanList[CombatCon, "RailGun"] = 1; $InvBanList[CombatCon, "NapalmMortar"] = 1; $InvBanList[CombatCon, "Flamer"] = 1; $InvBanList[CombatCon, "FlamerAmmoPack"] = 1; $InvBanList[CombatCon, "ELFBarrelPack"] = 1; //------------------------------------------------------------------------------ // Easy huh? Also as another reminder, the weapons above were removed by popular // demand of the ACCM users and the Devs. The weapons are just too ovepowered // for PVP style gameplay. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Lets begin the Gametype code... Shall we? //------------------------------------------------------------------------------ // NOTICE: // Any notes below this point were not done by Blnukem. So it's advised you // don't try editing anything below this point. Or you'll mess the Gametype up. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ function CombatConGame::initGameVars(%game) { if(isDemo()) { %game.SCORE_PER_SUICIDE = -10; %game.SCORE_PER_TEAMKILL = -10; %game.SCORE_PER_DEATH = 0; %game.SCORE_PER_KILL = 10; %game.SCORE_PER_GEN_DESTROY = 8; %game.SCORE_PER_TURRET_KILL = 5; %game.SCORE_PER_GEN_DEFEND = 5; %game.SCORE_PER_GEN_REPAIR = 2; %game.RADIUS_GEN_DEFENSE = 20; //meters %game.fadeTimeMS = 2000; %game.notifyMineDist = 7.5; %game.stalemate = false; %game.stalemateObjsVisible = false; %game.stalemateTimeMS = 60000; %game.stalemateFreqMS = 15000; %game.stalemateDurationMS = 6000; } if( !isDemo() ) { %game.SCORE_PER_SUICIDE = -10; %game.SCORE_PER_TEAMKILL = -10; %game.SCORE_PER_DEATH = 0; %game.SCORE_PER_KILL = 10; %game.SCORE_PER_HEADSHOT = 2; %game.SCORE_PER_TURRET_KILL = 10; %game.SCORE_PER_TURRET_KILL_AUTO = 0; %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_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_STRIKEFIGHTER = 5; %game.SCORE_PER_DESTROY_HELICOPTER = 5; %game.SCORE_PER_DESTROY_AWACS = 7; %game.SCORE_PER_DESTROY_BOMBER = 7; %game.SCORE_PER_DESTROY_GUNSHIP = 10; %game.SCORE_PER_DESTROY_HEAVYHELICOPTER = 10; %game.SCORE_PER_DESTROY_TRANSPORT = 10; %game.SCORE_PER_DESTROY_WILDCAT = 2; %game.SCORE_PER_DESTROY_TANK = 5; %game.SCORE_PER_DESTROY_HEAVYTANK = 5; %game.SCORE_PER_DESTROY_CGTANK = 5; %game.SCORE_PER_DESTROY_FFTRANSPORT = 5; %game.SCORE_PER_DESTROY_ARTILLERY = 10; %game.SCORE_PER_DESTROY_MPB = 10; %game.SCORE_PER_DESTROY_TRANSBOAT = 4; %game.SCORE_PER_DESTROY_SUB = 10; %game.SCORE_PER_DESTROY_BOAT = 15; %game.SCORE_PER_PASSENGER = 3; %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_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; %game.TIME_CONSIDERED_FLAGCARRIER_THREAT = 3 * 1000; %game.RADIUS_GEN_DEFENSE = 20; %game.RADIUS_FLAG_DEFENSE = 20; %game.TOUCH_DELAY_MS = 20000; %game.fadeTimeMS = 2000; %game.notifyMineDist = 7.5; %game.stalemate = false; %game.stalemateObjsVisible = false; %game.stalemateTimeMS = 60000; %game.stalemateFreqMS = 15000; %game.stalemateDurationMS = 6000; } } package CombatConGame { //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // Now Seriously... STOP EDITING!!! //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ 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; if(%damagingTeam == %obj.team) { //error("team objects dont score"); return; } if(%obj.soiledByEnemyRepair) { //error(%obj SPC "was once repiared by an enemy. No destruction points."); return; } %objType = %obj.getDataBlock().getName(); if(%objType $= "GeneratorLarge") { %score = game.awardScoreGenDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "SensorLargePulse" || %objType $= "SensorMediumPulse") { %score = game.awardScoreSensorDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "TurretBaseLarge") { %score = game.awardScoreTurretDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "StationInventory") { %score = game.awardScoreInvDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "StationVehicle") { %score = game.awardScoreVehicleStationDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "SolarPanel") { %score = game.awardScoreSolarDestroy(%scorer); game.shareScore(%score, %score); } else if(%objType $= "SentryTurret") { %score = game.awardScoreSentryDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "DeployedMotionSensor" || %objType $= "DeployedPulseSensor") { %score = game.awardScoreDepSensorDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "TurretDeployedWallIndoor" || %objType $= "TurretDeployedFloorIndoor" || %objType $= "TurretDeployedCeilingIndoor" || %objType $= "TurretDeployedOutdoor") { %score = game.awardScoreDepTurretDestroy(%scorer); game.shareScore(%scorer, %score); } else if(%objType $= "DeployedStationInventory") { %score = game.awardScoreDepStationDestroy(%scorer); 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 CombatConGame::timeLimitReached(%game) { logEcho("game over (timelimit)"); %game.gameOver(); cycleMissions(); } function CombatConGame::scoreLimitReached(%game) { logEcho("game over (scorelimit)"); %game.gameOver(); cycleMissions(); } function CombatConGame::gameOver(%game) { //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 CombatConGame::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); } %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 CombatConGame::clientMissionDropReady(%game, %client) { messageClient(%client, 'MsgClientReady',"", %game.class); %game.resetScore(%client); for(%i = 1; %i <= %game.numTeams; %i++) { $Teams[%i].score = 0; messageClient(%client, 'MsgCombatConAddTeam', "", %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 CombatConGame::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 CombatConGame::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); if(!isDemo()) { %cl.offenseScore = %killPoints + %cl.suicides * %game.SCORE_PER_SUICIDE + %cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST + %cl.teamKills * %game.SCORE_PER_TEAMKILL + %cl.scoreHeadshot * %game.SCORE_PER_HEADSHOT + %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.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.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; } if( isDemo() ) { %cl.offenseScore = %killPoints + %cl.flagDefends * %game.SCORE_PER_FLAG_DEFEND + %cl.suicides * %game.SCORE_PER_SUICIDE + //-1 %cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST + // 1 %cl.teamKills * %game.SCORE_PER_TEAMKILL + // -1 %cl.flagCaps * %game.SCORE_PER_PLYR_FLAG_CAP + // 3 %cl.genDestroys * %game.SCORE_PER_GEN_DESTROY; // 2 %cl.defenseScore = %cl.genDefends * %game.SCORE_PER_GEN_DEFEND + // 1 %cl.carrierKills * %game.SCORE_PER_CARRIER_KILL + // 1 %cl.escortAssists * %game.SCORE_PER_ESCORT_ASSIST + // 1 %cl.turretKills * %game.SCORE_PER_TURRET_KILL + // 1 %cl.flagReturns * %game.SCORE_PER_FLAG_RETURN + // 1 %cl.genRepairs * %game.SCORE_PER_GEN_REPAIR; // 1 } %cl.score = mFloor(%cl.offenseScore + %cl.defenseScore + (%cl.zkills * $zombie::killpoints)); %game.recalcTeamRanks(%cl); } function CombatConGame::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 CombatConGame::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 CombatConGame::testCarrierKill(%game, %victimID, %killerID) { %flag = %victimID.plyrDiedHoldingFlag; return ((%flag !$= "") && (%flag.team == %killerID.team)); } function CombatConGame::testEscortAssist(%game, %victimID, %killerID) { return (%victimID.dmgdFlagCarrier); } function CombatConGame::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 CombatConGame::resetDontScoreTimer(%game, %team) { $dontScoreTimer[%team] = false; } // Asset Destruction scoring function CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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; } function CombatConGame::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 CombatConGame::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 CombatConGame::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.', %game.SCORE_PER_DESTROY_DEP_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 CombatConGame::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 CombatConGame::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; } function CombatConGame::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', '\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 CombatConGame::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', '\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 CombatConGame::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', '\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 CombatConGame::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', '\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 CombatConGame::resetScore(%game, %client) { %client.offenseScore = 0; %client.kills = 0; %client.deaths = 0; %client.suicides = 0; %client.escortAssists = 0; %client.teamKills = 0; %client.flagCaps = 0; %client.flagGrabs = 0; %client.genDestroys = 0; %client.sensorDestroys = 0; %client.turretDestroys = 0; %client.iStationDestroys = 0; %client.vstationDestroys = 0; %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.solarRepairs =0; %client.sentryRepairs =0; %client.depInvRepairs =0; %client.depTurretRepairs=0; %client.returnPts = 0; %client.score = 0; } function CombatConGame::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 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 CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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); } } function CombatConGame::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 CombatConGame::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 CombatConGame::depTurretOnRepaired(%game, %obj, %objName) { if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; %game.awardScoreDepTurretRepair(%obj.repairedBy); } } function CombatConGame::depInvOnRepaired(%game, %obj, %objName) { if (%game.testValidRepair(%obj)) { %repairman = %obj.repairedBy; %game.awardScoreDepInvRepair(%obj.repairedBy); } } function CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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); } function CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::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 CombatConGame::enterMissionArea(%game, %playerData, %player) { %player.client.outOfBounds = false; messageClient(%player.client, 'EnterMissionArea', '\c1You are back in the mission area. ~wvoice/Announcer/ANN.ib.wav'); cancel(%player.alertThread); } function CombatConGame::leaveMissionArea(%game, %playerData, %player) { if(%player.getState() $= "Dead") return; %player.client.outOfBounds = true; messageClient(%player.client, 'LeaveMissionArea', '\c1You have left the mission area. Return or be killed. ~wvoice/Announcer/ANN.oob.wav'); %player.alertThread = %game.schedule(10, "DMAlertPlayer", 3, %player); } function CombatConGame::DMAlertPlayer(%game, %count, %player) { if(%count > 1) %player.alertThread = %game.schedule(1000, "DMAlertPlayer", %count - 1, %player); else %player.alertThread = %game.schedule(5000, "MissionAreaDamage", %player); } function CombatConGame::MissionAreaDamage(%game, %player) { if(%player.getState() !$= "Dead") { %player.setDamageFlash(1.5); %prevHurt = %player.getDamageLevel(); %player.scriptkill($DamageType::OutOfBounds); %player.alertThread = %game.schedule(1000, "MissionAreaDamage", %player); } } function CombatConGame::vehicleDestroyed(%game, %vehicle, %destroyer){ %data = %vehicle.getDataBlock(); %vehicleType = getTaggedString(%data.targetTypeTag); if(%vehicleType !$= "MPB") %vehicleType = strlwr(%vehicleType); %enemyTeam = ( %destroyer.team == 1 ) ? 2 : 1; %scorer = 0; %multiplier = 3; %shouldshare = 0; %passengers = 0; for(%i = 0; %i < %data.numMountPoints; %i++) if(%vehicle.getMountNodeObject(%i)) %passengers++; if(%destroyer.client){ %destroyer = %destroyer.client; %scorer = %destroyer; if(%vehicle.lastDamageType == $DamageType::Mine) %multiplier = 1; } else if(%destroyer.getClassName() $= "Turret"){ if(%destroyer.getControllingClient()){ %destroyer = %destroyer.getControllingClient(); %scorer = %destroyer; if(%destroyer.vehicleMounted){ if(%destroyer.vehicleMounted.getMountNodeObject(0)){ %driver = %destroyer.vehicleMounted.getMountNodeObject(0); %sharer = %driver.client; %shouldshare = 1; } %multiplier = 2; } } else{ %destroyerName = "A turret"; %multiplier = 0; } } else if(%destroyer.getDataBlock().catagory $= "Vehicles"){ if(%destroyer.getMountNodeObject(0)){ %destroyer = %destroyer.getMountNodeObject(0).client; %scorer = %destroyer; } %multiplier = 2; } else return; if(%destroyerName $= "") %destroyerName = %destroyer.name; if(%vehicle.team == %destroyer.team){ %pref = (%vehicleType $= "Assault Tank") ? "an" : "a"; messageAll( 'msgVehicleTeamDestroy', '\c0%1 TEAMKILLED %3 %2!', %destroyerName, %vehicleType, %pref); } else if (%destroyerName !$= "") { messageTeamExcept(%destroyer, 'msgVehicleDestroy', '\c0%1 destroyed an enemy %2.', %destroyerName, %vehicleType); messageTeam(%enemyTeam, 'msgVehicleDestroy', '\c0%1 destroyed your team\'s %2.', %destroyerName, %vehicleType); if(%scorer){ %value = %game.awardScoreVehicleDestroyed(%scorer, %vehicleType, %multiplier, %passengers); if(%shouldshare == 1) %game.awardScoreVehicleDestroyed(%sharer, %vehicleType, (%multiplier / 2), %passengers); %game.shareScore(%value); } } } function CombatConGame::awardScoreVehicleDestroyed(%game, %client, %vehicleType, %mult, %passengers) { if(isDemo()) return 0; if(%vehicleType $= "Interceptor") %base = %game.SCORE_PER_DESTROY_SHRIKE; else if(%vehicleType $= "Fighter") %base = %game.SCORE_PER_DESTROY_STRIKEFIGHTER; else if(%vehicleType $= "Assault Chopper") %base = %game.SCORE_PER_DESTROY_HELICOPTER; else if(%vehicleType $= "AWACS") %base = %game.SCORE_PER_DESTROY_AWACS; else if(%vehicleType $= "Bomber") %base = %game.SCORE_PER_DESTROY_BOMBER; else if(%vehicleType $= "Gunship") %base = %game.SCORE_PER_DESTROY_GUNSHIP; else if(%vehicleType $= "Transport Chopper") %base = %game.SCORE_PER_DESTROY_HEAVYHELICOPTER; else if(%vehicleType $= "Heavy Transport") %base = %game.SCORE_PER_DESTROY_TRANSPORT; else if(%vehicleType $= "Grav Cycle") %base = %game.SCORE_PER_DESTROY_WILDCAT; else if(%vehicleType $= "Light Tank") %base = %game.SCORE_PER_DESTROY_TANK; else if(%vehicleType $= "Assault Tank") %base = %game.SCORE_PER_DESTROY_HEAVYTANK; else if(%vehicleType $= "chaingun tank") %base = %game.SCORE_PER_DESTROY_CGTANK; else if(%vehicleType $= "APC") %base = %game.SCORE_PER_DESTROY_FFTRANSPORT; else if(%vehicleType $= "Heavy Artillery") %base = %game.SCORE_PER_DESTROY_ARTILLERY; else if(%vehicleType $= "MPB") %base = %game.SCORE_PER_DESTROY_MPB; else if(%vehicleType $= "Boat") %base = %game.SCORE_PER_DESTROY_TRANSBOAT; else if(%vehicleType $= "Submarine") %base = %game.SCORE_PER_DESTROY_SUB; else if(%vehicleType $= "GunBoat") %base = %game.SCORE_PER_DESTROY_BOAT; %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 CombatConGame::shareScore(%game, %client, %amount) { if(isDemo()) return 0; //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 CombatConGame::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 CombatConGame::testKill(%game, %victimID, %killerID) { return ((%killerID !=0) && (%victimID.team != %killerID.team)); } function CombatConGame::awardScoreKill(%game, %killerID) { %killerID.kills++; %game.recalcScore(%killerID); return %game.SCORE_PER_KILL; } };