1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\challenges_shared;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\demo_shared;
5 #using scripts\shared\gameobjects_shared;
6 #using scripts\shared\hostmigration_shared;
7 #using scripts\shared\hud_util_shared;
8 #using scripts\shared\math_shared;
9 #using scripts\shared\medals_shared;
10 #using scripts\shared\popups_shared;
11 #using scripts\shared\scoreevents_shared;
12 #using scripts\shared\sound_shared;
13 #using scripts\shared\util_shared;
15 #insert scripts\shared\shared.gsh;
16 #insert scripts\shared\version.gsh;
18 #using scripts\mp\gametypes\_battlechatter;
19 #using scripts\mp\gametypes\_globallogic;
20 #using scripts\mp\gametypes\_globallogic_audio;
21 #using scripts\mp\gametypes\_globallogic_score;
22 #using scripts\mp\gametypes\_globallogic_utils;
23 #using scripts\mp\gametypes\_hostmigration;
24 #using scripts\mp\gametypes\_spawning;
25 #using scripts\mp\gametypes\_spawnlogic;
27 #using scripts\mp\_challenges;
28 #using scripts\mp\_util;
30 #define RANDOM_ZONE_LOCATIONS_OFF 0
31 #define RANDOM_ZONE_LOCATIONS_ON 1
32 #define RANDOM_ZONE_LOCATIONS_AFTER_FIRST 2
34 #define OBJECTIVE_FLAG_NORMAL 0
35 #define OBJECTIVE_FLAG_TARGET 1
40 #precache( "string", "OBJECTIVES_KOTH" );
41 #precache( "string", "OBJECTIVES_KOTH_SCORE" );
42 #precache( "string", "MP_WAITING_FOR_HQ" );
43 #precache( "string", "MP_KOTH_CAPTURED_BY" );
44 #precache( "string", "MP_KOTH_CAPTURED_BY_ENEMY" );
45 #precache( "string", "MP_KOTH_MOVING_IN" );
46 #precache( "string", "MP_CAPTURING_OBJECTIVE" );
47 #precache( "string", "MP_KOTH_CONTESTED_BY_ENEMY" );
48 #precache( "string", "MP_KOTH_AVAILABLE_IN" );
49 #precache( "string", "MP_CONTROL_KOTH" );
50 #precache( "string", "MP_CAPTURE_KOTH" );
51 #precache( "string", "MP_DEFEND_KOTH" );
52 #precache( "string", "MP_KOTH_AVAILABLE_IN" );
53 #precache( "string", "MP_HQ_DESPAWN_IN" );
54 #precache( "string", "MP_HQ_REINFORCEMENTS_IN" );
55 #precache( "string", "MP_CAPTURING_HQ" );
56 #precache( "string", "MP_DESTROYING_HQ" );
57 #precache( "fx", "ui/fx_koth_marker_blue" );
58 #precache( "fx", "ui/fx_koth_marker_orng" );
59 #precache( "fx", "ui/fx_koth_marker_neutral" );
60 #precache( "fx", "ui/fx_koth_marker_contested" );
61 #precache( "fx", "ui/fx_koth_marker_blue_window" );
62 #precache( "fx", "ui/fx_koth_marker_orng_window" );
63 #precache( "fx", "ui/fx_koth_marker_neutral_window" );
64 #precache( "fx", "ui/fx_koth_marker_contested_window" );
65 #precache( "objective", "hardpoint" );
79 level.teamBased =
true;
80 level.doPrematch =
true;
81 level.overrideTeamScore =
true;
82 level.scoreRoundWinBased =
true;
83 level.kothStartTime = 0;
93 level.zoneAutoMoveTime = GetGametypeSetting(
"autoDestroyTime" );
94 level.zoneSpawnTime = GetGametypeSetting(
"objectiveSpawnTime" );
95 level.kothMode = GetGametypeSetting(
"kothMode" );
96 level.captureTime = GetGametypeSetting(
"captureTime" );
97 level.destroyTime = GetGametypeSetting(
"destroyTime" );
98 level.delayPlayer = GetGametypeSetting(
"delayPlayer" );
99 level.randomZoneSpawn = GetGametypeSetting(
"randomObjectiveLocations" );
100 level.scorePerPlayer = GetGametypeSetting(
"scorePerPlayer" );
101 level.timePausesWhenInZone = GetGametypeSetting(
"timePausesWhenInZone" );
103 level.iconoffset = (0,0,32);
111 game[
"objective_gained_sound"] =
"mpl_flagcapture_sting_friend";
112 game[
"objective_lost_sound"] =
"mpl_flagcapture_sting_enemy";
113 game[
"objective_contested_sound"] =
"mpl_flagreturn_sting";
115 level.lastDialogTime = 0;
116 level.zoneSpawnQueue = [];
119 if ( !SessionModeIsSystemlink() && !SessionModeIsOnlineGame() && IsSplitScreen() )
129 trigs = getentarray(
"radiotrigger",
"targetname");
130 foreach( trig
in trigs )
140 foreach( team
in level.teams )
142 if ( defenderTeam == team )
144 game[
"strings"][
"objective_hint_" + team] = defendMessage;
148 game[
"strings"][
"objective_hint_" + team] = attackMessage;
155 foreach( team
in level.teams )
157 game[
"strings"][
"objective_hint_" + team] = message;
163 self.lowerMessageOverride = undefined;
165 if ( !isdefined( level.zone.gameobject ) )
169 if (
self.pers[
"team"] == zoneOwningTeam )
171 if ( !isdefined( level.zoneMoveTime ) )
174 timeRemaining = (level.zoneMoveTime - gettime()) / 1000;
176 if (!level.playerObjectiveHeldRespawnDelay )
179 if ( level.playerObjectiveHeldRespawnDelay >= level.zoneAutoMoveTime )
180 self.lowerMessageOverride = &
"MP_WAITING_FOR_HQ";
182 if ( level.delayPlayer )
184 return min( level.spawnDelay, timeRemaining );
188 return ceil(timeRemaining);
195 if ( !isdefined( game[
"switchedsides"] ) )
196 game[
"switchedsides"] =
false;
198 if ( game[
"switchedsides"] )
200 oldAttackers = game[
"attackers"];
201 oldDefenders = game[
"defenders"];
202 game[
"attackers"] = oldDefenders;
203 game[
"defenders"] = oldAttackers;
209 foreach( team
in level.teams )
213 if ( level.splitscreen )
223 level.kothTotalSecondsInZone = 0;
225 level.objectiveHintPrepareZone = &
"MP_CONTROL_KOTH";
226 level.objectiveHintCaptureZone = &
"MP_CAPTURE_KOTH";
227 level.objectiveHintDefendHQ = &
"MP_DEFEND_KOTH";
229 if ( level.zoneSpawnTime )
234 setClientNameMode(
"auto_change");
240 level.spawnMins = ( 0, 0, 0 );
241 level.spawnMaxs = ( 0, 0, 0 );
242 foreach( team
in level.teams )
252 level.spawn_start = [];
254 foreach( team
in level.teams )
260 setMapCenter( level.mapCenter );
263 setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
266 if ( !level.spawn_all.size )
269 println(
"^1No mp_tdm_spawn spawnpoints in level!");
285 if ( level.timePausesWhenInZone )
288 level.timerPaused =
true;
294 if ( level.timePausesWhenInZone )
297 level.timerPaused =
false;
303 level.playerCaptureLPM = GetGametypeSetting(
"maxPlayerEventsPerMinute" );
304 level.timePausesWhenInZone = GetGametypeSetting(
"timePausesWhenInZone" );
319 if ( isdefined( level.zone ) )
321 /#print(
"zone spawned: ("+level.zone.trigOrigin[0]+
","+level.zone.trigOrigin[1]+
","+level.zone.trigOrigin[2]+
")");#/
326 level.zone.gameobject.trigger AllowTacticalInsertion(
false );
333 level.zone.gameobject.trigger AllowTacticalInsertion(
true );
345 if ( isdefined( level.zone ) )
347 /#print(
"zone spawned: ("+level.zone.trigOrigin[0]+
","+level.zone.trigOrigin[1]+
","+level.zone.trigOrigin[2]+
")");#/
352 level.zone.gameobject.trigger AllowTacticalInsertion(
false );
360 foreach( team
in level.teams )
362 numTouching +=
self.numTouching[team];
374 index =
self.script_index;
383 level endon(
"game_ended");
384 level endon(
"zone_moved");
385 level.kothStartTime = gettime();
402 level.zone.gameobject.onEndUse =&
onEndUse;
409 if ( msg ==
"zone_destroyed" )
414 foreach( team
in level.teams )
421 level.zone.gameobject.onUse = undefined;
426 level waittill(
"zone_destroyed", destroy_team );
428 if ( !level.kothMode || level.zoneDestroyedByTimer )
433 if ( isdefined( destroy_team ) )
446 level endon(
"game_ended");
448 level.zoneRevealTime = -100000;
450 zoneSpawningInStr = &
"MP_KOTH_AVAILABLE_IN";
451 if ( level.kothMode )
453 zoneDestroyedInFriendlyStr = &
"MP_HQ_DESPAWN_IN";
454 zoneDestroyedInEnemyStr = &
"MP_KOTH_MOVING_IN";
458 zoneDestroyedInFriendlyStr = &
"MP_HQ_REINFORCEMENTS_IN";
459 zoneDestroyedInEnemyStr = &
"MP_HQ_DESPAWN_IN";
464 while ( level.inPrematchPeriod )
471 SetBombTimer(
"A", 0 );
472 setMatchFlag(
"bomb_timer_a", 0 );
486 level.zoneRevealTime = gettime();
488 if ( level.zoneSpawnTime )
494 setMatchFlag(
"bomb_timer_a", 1 );
495 SetBombTimer(
"A",
int( gettime() + 1000 + level.zoneSpawnTime * 1000 ) );
497 wait level.zoneSpawnTime;
503 setMatchFlag(
"bomb_timer_a", 0 );
512 Objective_OnEntity( level.zone.gameobject.objectiveID, level.zone.objectiveAnchor );
514 level.zone.gameobject.captureCount = 0;
516 if ( level.zoneAutoMoveTime )
519 setMatchFlag(
"bomb_timer_a", 1 );
520 SetBombTimer(
"A",
int( gettime() + 1000 + level.zoneAutoMoveTime * 1000 ) );
524 level.zoneDestroyedByTimer =
false;
531 if ( level.zone.gameobject.captureCount == 1 )
535 touchKeys = GetArrayKeys( level.zone.gameobject.touchList[ownerTeam] );
536 for ( i = 0 ; i < touchKeys.size ; i++ )
537 touchList[touchKeys[i]] = level.zone.gameobject.touchList[ownerTeam][touchKeys[i]];
544 level.zone.gameobject.lastCaptureTeam = undefined;
552 level notify(
"zone_reset");
554 setMatchFlag(
"bomb_timer_a", 0 );
568 level waittill(
"game_ended");
569 setMatchFlag(
"bomb_timer_a", 0 );
575 players = level.players;
576 for ( i = 0; i < players.size; i++ )
579 if ( !isdefined( player ) )
582 if ( player.pers[
"team"] == team )
584 player notify(
"force_spawn" );
598 else if ( ownerTeam ==
"neutral" )
604 if ( ownerTeam ==
"allies" )
615 if ( ownerTeam ==
"neutral" )
628 player notify(
"event_ended" );
634 capture_team = player.pers[
"team"];
635 captureTime = getTime();
637 /#print(
"zone captured" );#/
641 string = &
"MP_KOTH_CAPTURED_BY";
643 level.zone.gameobject.isContested =
false;
644 level.useStartSpawns =
false;
646 if ( !isdefined(
self.lastCaptureTeam ) ||
self.lastCaptureTeam != capture_team )
650 touchKeys = GetArrayKeys(
self.touchList[capture_team] );
651 for ( i = 0 ; i < touchKeys.size ; i++ )
652 touchList[touchKeys[i]] =
self.touchList[capture_team][touchKeys[i]];
653 thread
give_capture_credit( touchList,
string, captureTime, capture_team,
self.lastCaptureTeam );
656 level.kothCapTeam = capture_team;
659 if ( !level.kothMode )
662 foreach( team
in level.teams )
664 if ( team == capture_team )
666 if ( !isdefined(
self.lastCaptureTeam ) || (
self.lastCaptureTeam != team ) )
669 for ( index = 0; index < level.players.size; index++ )
671 player = level.players[index];
673 if ( player.pers[
"team"] == team )
675 if ( player.lastKilltime + 500 > getTime() )
686 if ( !isdefined(
self.lastCaptureTeam ) )
690 else if (
self.lastCaptureTeam == team )
700 self.lastCaptureTeam = capture_team;
706 player RecordGameEvent(
"hardpoint_captured" );
708 level notify(
"zone_captured" );
709 level notify(
"zone_captured" + capture_team );
710 player notify(
"event_ended" );
722 players = getArrayKeys( touchList );
723 for ( i = 0; i < players.size; i++ )
725 player = touchList[players[i]].player;
732 if ( level.kothStartTime + 3000 > captureTime && level.kothCapTeam == capture_team )
738 player RecordGameEvent(
"capture");
742 if( isdefined(player.pers[
"captures"]) )
744 player.pers[
"captures"]++;
745 player.captures = player.pers[
"captures"];
748 if ( level.kothStartTime + 500 > captureTime )
754 player AddPlayerStatWithGameType(
"CAPTURES", 1 );
767 players = getArrayKeys( touchList );
768 for ( i = 0; i < players.size; i++ )
770 player = touchList[players[i]].player;
782 destroyed_team = player.pers[
"team"];
784 /#print(
"zone destroyed" );#/
786 player RecordGameEvent(
"destroy");
787 player AddPlayerStatWithGameType(
"DESTRUCTIONS", 1 );
789 if( isdefined(player.pers[
"destructions"]) )
791 player.pers[
"destructions"]++;
792 player.destructions = player.pers[
"destructions"];
795 destroyTeamMessage = &
"MP_HQ_DESTROYED_BY";
796 otherTeamMessage = &
"MP_HQ_DESTROYED_BY_ENEMY";
798 if ( level.kothMode )
800 destroyTeamMessage = &
"MP_KOTH_CAPTURED_BY";
801 otherTeamMessage = &
"MP_KOTH_CAPTURED_BY_ENEMY";
806 foreach( team
in level.teams )
808 if ( team == destroyed_team )
818 level notify(
"zone_destroyed", destroyed_team );
820 if ( level.kothMode )
823 player notify(
"event_ended" );
828 level notify(
"zone_destroyed" );
829 level.kothCapTeam =
"neutral";
830 level.zone.gameobject.wasLeftUnoccupied =
true;
831 level.zone.gameobject.isContested =
false;
833 level.zone.gameobject RecordGameEventNonPlayer(
"hardpoint_empty" );
843 self.wasContested =
true;
844 self.isContested =
true;
848 self RecordGameEventNonPlayer(
"hardpoint_contested" );
852 foreach( team
in level.teams )
854 if ( team == zoneOwningTeam )
866 self.isContested =
false;
874 self RecordGameEventNonPlayer(
"hardpoint_uncontested" );
879 level endon(
"game_ended" );
880 level endon(
"zone_reset" );
882 level.zoneMoveTime = gettime() + time * 1000;
883 level.zoneDestroyedByTimer =
false;
887 if ( !isdefined( level.zone.gameobject.wasContested ) || level.zone.gameobject.wasContested ==
false )
889 if ( !isdefined( level.zone.gameobject.wasLeftUnoccupied ) || level.zone.gameobject.wasLeftUnoccupied ==
false )
896 level.zoneDestroyedByTimer =
true;
898 level.zone.gameobject RecordGameEventNonPlayer(
"hardpoint_moved" );
900 level notify(
"zone_moved" );
906 level endon(
"game_ended" );
907 level endon(
"zone_destroyed" );
908 level endon(
"zone_reset" );
909 level endon(
"zone_moved" );
911 level notify(
"awardCapturePointsRunning");
912 level endon(
"awardCapturePointsRunning");
917 while ( !level.gameEnded )
923 if ( !level.zone.gameobject.isContested )
925 if ( level.scorePerPlayer )
927 score = level.zone.gameobject.numTouching[team];
931 level.kothTotalSecondsInZone++;
933 foreach( player
in level.aliveplayers[team] )
935 if ( !IsDefined( player.touchTriggers[
self.entNum] ) )
938 if( isdefined(player.pers[
"objtime"]) )
940 player.pers[
"objtime"]++;
941 player.objtime = player.pers[
"objtime"];
943 player AddPlayerStatWithGameType(
"OBJECTIVE_TIME", 1 );
951 self.lowerMessageOverride = undefined;
956 script_index_a = zone_a.script_index;
957 script_index_b = zone_b.script_index;
959 if( !isdefined(script_index_a) && !isdefined(script_index_b) )
964 if( !isdefined(script_index_a) && isdefined(script_index_b) )
967 println(
"KOTH: Missing script_index on zone at " + zone_a.origin );
972 if( isdefined(script_index_a) && !isdefined(script_index_b) )
975 println(
"KOTH: Missing script_index on zone at " + zone_b.origin );
980 if( script_index_a > script_index_b )
991 zones = getentarray(
"koth_zone_center",
"targetname" );
993 if( !isdefined( zones ) )
1003 for( i = 0 ; i < n-1 ; i++ )
1008 zones[i] = zones[i+1];
1030 trigs = getentarray(
"koth_zone_trigger",
"targetname");
1031 for ( i = 0; i < zones.size; i++ )
1036 zone.trig = undefined;
1037 for ( j = 0; j < trigs.size; j++ )
1039 if ( zone istouching( trigs[j] ) )
1041 if ( isdefined( zone.trig ) )
1043 maperrors[maperrors.size] =
"Zone at " + zone.origin +
" is touching more than one \"zonetrigger\" trigger";
1047 zone.trig = trigs[j];
1052 if ( !isdefined( zone.trig ) )
1056 maperrors[maperrors.size] =
"Zone at " + zone.origin +
" is not inside any \"zonetrigger\" trigger";
1067 zone.trigorigin = zone.trig.origin;
1069 zone.objectiveAnchor =
Spawn(
"script_model", zone.origin );
1074 if ( isdefined( zone.target ) )
1076 otherVisuals = getEntArray( zone.target,
"targetname" );
1077 for ( j = 0; j < otherVisuals.size; j++ )
1079 visuals[visuals.size] = otherVisuals[j];
1083 objective_name = istring(
"hardpoint");
1089 zone.trig.useObj = zone.gameObject;
1090 zone.trig.remote_control_player_can_trigger =
true;
1095 if (maperrors.size > 0)
1098 println(
"^1------------ Map Errors ------------");
1099 for(i = 0; i < maperrors.size; i++)
1100 println(maperrors[i]);
1101 println(
"^1------------------------------------");
1103 println(
"Map errors. See above");
1110 level.zones = zones;
1112 level.prevzone = undefined;
1113 level.prevzone2 = undefined;
1122 if ( !isdefined( level.levelkothDisable ) )
1125 foreach( nullZone
in level.levelkothDisable )
1127 mindist = 10000000000;
1128 foundZone = undefined;
1130 foreach( zone
in level.zones )
1132 distance = DistanceSquared( nullZone.origin, zone.origin );
1134 if ( distance < mindist )
1141 if ( isdefined( foundZone ) )
1143 if ( !isdefined( foundZone.gameObject.exclusions ) )
1145 foundZone.gameObject.exclusions = [];
1147 foundZone.gameObject.exclusions[ foundZone.gameObject.exclusions.size ] = nullZone;
1155 spawns = level.spawn_all;
1157 for ( i = 0; i < spawns.size; i++ )
1159 spawns[i].distsq = distanceSquared( spawns[i].origin,
self.origin );
1163 for ( i = 1; i < spawns.size; i++ )
1165 thespawn = spawns[i];
1166 for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- )
1167 spawns[j + 1] = spawns[j];
1168 spawns[j + 1] = thespawn;
1176 thirdSize = spawns.size / 3;
1177 for ( i = 0; i <= thirdSize; i++ )
1179 first[ first.size ] = spawns[i];
1181 for ( ; i < spawns.size; i++ )
1183 outer[ outer.size ] = spawns[i];
1184 if ( i <= (thirdSize*2) )
1185 second[ second.size ] = spawns[i];
1187 third[ third.size ] = spawns[i];
1190 self.gameObject.nearSpawns = first;
1191 self.gameObject.midSpawns = second;
1192 self.gameObject.farSpawns = third;
1193 self.gameObject.outerSpawns = outer;
1198 zone = level.zones[ 0 ];
1201 level.prevzone2 = level.prevzone;
1202 level.prevzone = zone;
1203 level.prevZoneIndex = 0;
1207 ArrayRemoveValue( level.zoneSpawnQueue, zone );
1214 nextZoneIndex = (level.prevZoneIndex + 1) % level.zones.size;
1215 zone = level.zones[ nextZoneIndex ];
1216 level.prevzone2 = level.prevzone;
1217 level.prevzone = zone;
1218 level.prevZoneIndex = nextZoneIndex;
1225 level.prevZoneIndex = randomint( level.zones.size);
1226 zone = level.zones[ level.prevZoneIndex ];
1227 level.prevzone2 = level.prevzone;
1228 level.prevzone = zone;
1235 level.zoneSpawnQueue = [];
1237 spawnQueue = ArrayCopy(level.zones);
1238 total_left = spawnQueue.size;
1240 while( total_left > 0 )
1242 index = randomint( total_left );
1245 for( zone = 0; zone < level.zones.size; zone++ )
1247 if ( !isdefined(spawnQueue[zone]) )
1250 if ( valid_zones == index )
1253 if ( level.zoneSpawnQueue.size == 0 && isdefined( level.zone ) && level.zone == spawnQueue[zone] )
1256 level.zoneSpawnQueue[level.zoneSpawnQueue.size] = spawnQueue[zone];
1257 spawnQueue[zone] = undefined;
1271 if ( level.zoneSpawnQueue.size == 0 )
1274 assert( level.zoneSpawnQueue.size > 0 );
1276 next_zone = level.zoneSpawnQueue[0];
1277 ArrayRemoveIndex( level.zoneSpawnQueue, 0 );
1286 foreach( team
in level.teams )
1288 if ( num[team] > 0 )
1301 foreach( team, position
in avgpos )
1303 distances[team] = Distance(origin, avgpos[team]);
1304 avg_distance += distances[team];
1307 avg_distance = avg_distance / distances.size;
1309 foreach( team, dist
in distances )
1311 err = (distances[team] - avg_distance);
1312 total_error += err * err;
1324 foreach( team
in level.teams )
1326 avgpos[team] = (0,0,0);
1330 for ( i = 0; i < level.players.size; i++ )
1332 player = level.players[i];
1333 if ( isalive( player ) )
1335 avgpos[ player.pers[
"team"] ] += player.origin;
1336 num[ player.pers[
"team"] ]++;
1342 zone = level.zones[ randomint( level.zones.size) ];
1343 while ( isdefined( level.prevzone ) && zone == level.prevzone )
1344 zone = level.zones[ randomint( level.zones.size) ];
1346 level.prevzone2 = level.prevzone;
1347 level.prevzone = zone;
1352 foreach( team
in level.teams )
1354 if ( num[team] == 0 )
1356 avgpos[team] = undefined;
1360 avgpos[team] = avgpos[team] / num[team];
1364 bestzone = undefined;
1365 lowestcost = undefined;
1366 for ( i = 0; i < level.zones.size; i++ )
1368 zone = level.zones[i];
1373 if ( isdefined( level.prevzone ) && zone == level.prevzone )
1377 if ( isdefined( level.prevzone2 ) && zone == level.prevzone2 )
1379 if ( level.zones.size > 2 )
1385 if ( !isdefined( lowestcost ) || cost < lowestcost )
1391 assert( isdefined( bestzone ) );
1393 level.prevzone2 = level.prevzone;
1394 level.prevzone = bestzone;
1401 game[
"switchedsides"] = !game[
"switchedsides"];
1405 function onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
1407 if ( !isPlayer( attacker ) || (level.captureTime && !
self.touchTriggers.size && !attacker.touchTriggers.size) || attacker.pers[
"team"] ==
self.pers[
"team"] )
1411 scoreEventProcessed =
false;
1413 ownerTeam = undefined;
1415 if ( level.captureTime == 0 )
1417 if ( !isdefined( level.zone ) )
1420 ownerTeam = level.zone.gameObject.ownerTeam ;
1422 if ( !isdefined( ownerTeam ) || ownerTeam ==
"neutral" )
1426 if (
self.touchTriggers.size || ( level.captureTime == 0 &&
self IsTouching( level.zone.trig ) ) )
1428 if ( level.captureTime > 0 )
1430 triggerIds = getArrayKeys(
self.touchTriggers );
1431 ownerTeam =
self.touchTriggers[triggerIds[0]].useObj.ownerTeam;
1434 if ( ownerTeam !=
"neutral" )
1436 attacker.lastKilltime = getTime();
1437 team = attacker.pers[
"team"];
1438 if ( team == ownerTeam )
1449 self RecordKillModifier(
"defending");
1450 scoreEventProcessed =
true;
1456 if( isdefined(attacker.pers[
"defends"]) )
1458 attacker.pers[
"defends"]++;
1459 attacker.defends = attacker.pers[
"defends"];
1465 attacker RecordGameEvent(
"defending");
1470 self RecordKillModifier(
"assaulting");
1471 scoreEventProcessed =
true;
1476 if ( attacker.touchTriggers.size || ( level.captureTime == 0 && attacker IsTouching( level.zone.trig ) ) )
1478 if ( level.captureTime > 0 )
1480 triggerIds = getArrayKeys( attacker.touchTriggers );
1481 ownerTeam = attacker.touchTriggers[triggerIds[0]].useObj.ownerTeam;
1484 if ( ownerTeam !=
"neutral" )
1486 team =
self.pers[
"team"];
1487 if ( team == ownerTeam )
1491 if( isdefined(attacker.pers[
"defends"]) )
1493 attacker.pers[
"defends"]++;
1494 attacker.defends = attacker.pers[
"defends"];
1500 attacker RecordGameEvent(
"defending");
1502 if ( scoreEventProcessed ==
false )
1507 self RecordKillModifier(
"assaulting");
1518 if ( scoreEventProcessed ==
false )
1522 self RecordKillModifier(
"defending");
1528 if ( medalGiven ==
true )
1530 if (
IS_TRUE( level.zone.gameobject.isContested ) )
1539 level endon( zone_captured_team );
1540 level endon(
"zone_destroyed" );
1541 level endon(
"zone_captured" );
1542 level endon(
"death" );
1545 level notify(
"abortKillWhileContesting" );
1550 self notify(
"killWhileContesting" );
1551 self endon(
"killWhileContesting" );
1552 self endon(
"disconnect" );
1554 killTime = getTime();
1555 playerteam =
self.pers[
"team"];
1556 if ( !isdefined (
self.clearEnemyCount ) )
1558 self.clearEnemyCount = 0;
1561 self.clearEnemyCount++;
1563 zone_captured_team =
"zone_captured" + playerteam;
1565 zoneReturn = level
util::waittill_any_return( zone_captured_team,
"zone_destroyed",
"zone_captured",
"death",
"abortKillWhileContesting" );
1567 if ( zoneReturn ==
"death" || playerteam !=
self.pers[
"team"] )
1569 self.clearEnemyCount = 0;
1573 if (
self.clearEnemyCount >= 2 && killTime + 200 > getTime() )
1577 self.clearEnemyCount = 0;
1582 for ( i = 0; i < level.zones.size; i++ )
1600 if ( !isdefined(
self.capsPerMinute ) )
1603 self.capsPerMinute = 0;
1608 if ( !isdefined ( lastOwnerTeam ) || lastOwnerTeam ==
"neutral" )
1616 if ( IsPlayer(
self ) && isdefined(
self.timePlayed[
"total"]) )
1617 minutesPassed =
self.timePlayed[
"total"] / 60;
1619 self.capsPerMinute = ( minutesPassed ?
self.numCaps / minutesPassed : 0 );
1620 if (
self.capsPerMinute >
self.numCaps )
1621 self.capsPerMinute =
self.numCaps;
1626 if ( !level.rankedMatch )
1629 if ( player.capsPerMinute > level.playerCaptureLPM )