1 #using scripts\shared\callbacks_shared;
2 #using scripts\shared\hostmigration_shared;
3 #using scripts\shared\hud_util_shared;
4 #using scripts\shared\killstreaks_shared;
5 #using scripts\shared\math_shared;
6 #using scripts\shared\objpoints_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\trigger_shared;
9 #using scripts\shared\tweakables_shared;
10 #using scripts\shared\util_shared;
11 #using scripts\shared\weapons_shared;
13 #insert scripts\shared\shared.gsh;
15 #define CARRY_ICON_X 130
16 #define CARRY_ICON_Y -60
18 #define MAX_OBJECTIVE_IDS 128
19 #define HIGHEST_OBJECTIVE_ID ( MAX_OBJECTIVE_IDS - 1 )
21 #namespace gameobjects;
27 level.numGametypeReservedObjectives = 0;
28 level.releasedObjectives = [];
37 level.vehiclesEnabled = GetGametypeSetting(
"vehiclesEnabled" );
38 level.vehiclesTimed = GetGametypeSetting(
"vehiclesTimed" );
39 level.objectivePingDelay = GetGametypeSetting(
"objectivePingTime" );
41 level.nonTeamBasedTeam =
"allies";
43 if ( !IsDefined( level.allowedGameObjects ) )
45 level.allowedGameObjects = [];
48 if (level.vehiclesEnabled)
50 level.allowedGameObjects[level.allowedGameObjects.size]=
"vehicle";
54 entities= GetEntArray();
55 for (entity_index= entities.size-1; entity_index>=0; entity_index--)
57 entity= entities[entity_index];
69 if ( !IsDefined( level.allowedGameObjects ) )
71 level.allowedGameObjects = [];
74 level.allowedGameObjects[level.allowedGameObjects.size] = gameobject;
79 level.allowedGameObjects = [];
88 if (isdefined(entity.script_gameobjectname) &&
89 entity.script_gameobjectname!=
"[all_modes]" )
93 gameobjectnames= strtok(entity.script_gameobjectname,
" ");
94 for (i= 0; i<allowed_game_modes.size && !allowed; i++)
96 for (j= 0; j<gameobjectnames.size && !allowed; j++)
98 allowed= (gameobjectnames[j]==allowed_game_modes[i]);
111 location_list = undefined;
115 if ( IsDefined( entity.script_noteworthy ) )
117 location_list = entity.script_noteworthy;
122 if ( IsDefined( entity.script_location ) )
124 location_list = entity.script_location;
127 if ( IsDefined( location_list ) )
129 if ( location_list ==
"[all_modes]" )
137 gameobjectlocations = StrTok( location_list,
" " );
139 for ( j = 0; j < gameobjectlocations.size; j++ )
141 if ( gameobjectlocations[ j ] == location )
158 vehicle_descriptors= GetEntArray(
"vehicle_descriptor",
"targetname");
159 script_vehicles= GetEntArray(
"script_vehicle",
"classname");
161 vehicles_to_remove= [];
163 for (descriptor_index= 0; descriptor_index<vehicle_descriptors.size; descriptor_index++)
165 descriptor= vehicle_descriptors[descriptor_index];
166 closest_distance_sq= 1000000000000.0;
167 closest_vehicle= undefined;
169 for (vehicle_index= 0; vehicle_index<script_vehicles.size; vehicle_index++)
171 vehicle= script_vehicles[vehicle_index];
172 dsquared= DistanceSquared(vehicle GetOrigin(), descriptor GetOrigin());
173 if (dsquared < closest_distance_sq)
175 closest_distance_sq= dsquared;
176 closest_vehicle= vehicle;
180 if (isdefined(closest_vehicle))
184 vehicles_to_remove[vehicles_to_remove.size]= closest_vehicle;
189 for (vehicle_index= 0; vehicle_index<vehicles_to_remove.size; vehicle_index++)
191 vehicles_to_remove[vehicle_index]
delete();
203 self endon(
"disconnect" );
204 level endon (
"game_ended" );
207 self.touchTriggers = [];
208 self.packObject = [];
210 self.carryObject = undefined;
211 self.claimTrigger = undefined;
212 self.canPickupObject =
true;
213 self.disabledWeapon = 0;
214 self.killedInUse = undefined;
220 level endon (
"game_ended" );
221 self endon(
"killOnDeathMonitor");
223 self waittill (
"death" );
231 level endon (
"game_ended" );
244 if ( isdefined(
self.carryObject ) )
249 if ( isdefined(
self.packObject ) &&
self.packObject.size > 0 )
251 foreach(item
in self.packObject)
268 carryObject = spawnStruct();
269 carryObject.type =
"carryObject";
270 carryObject.curOrigin = trigger.origin;
271 carryObject.entNum = trigger getEntityNumber();
272 carryObject.hitSound = hitSound;
274 if ( isSubStr( trigger.classname,
"use" ) )
276 carryObject.triggerType =
"use";
280 carryObject.triggerType =
"proximity";
284 trigger.baseOrigin = trigger.origin;
285 carryObject.trigger = trigger;
287 carryObject.useWeapon = undefined;
289 if ( !isdefined( offset ) )
294 carryObject.offset3d = offset;
296 carryObject.newStyle =
false;
298 if ( isdefined( objectiveName ) )
300 if( !SessionModeIsCampaignGame() )
302 carryObject.newStyle =
true;
311 for ( index = 0; index < visuals.size; index++ )
313 visuals[index].baseOrigin = visuals[index].origin;
314 visuals[index].baseAngles = visuals[index].angles;
316 carryObject.visuals = visuals;
321 carryObject.compassIcons = [];
322 carryObject.objID =[];
324 if ( !carryObject.newStyle )
326 foreach( team
in level.teams )
331 carryObject.objIDPingFriendly =
false;
332 carryObject.objIDPingEnemy =
false;
333 level.objIDStart += 2;
336 if ( !carryObject.newStyle )
338 if ( level.teamBased )
340 foreach ( team
in level.teams )
342 if( SessionModeIsCampaignGame() )
344 if( team ==
"allies" )
346 objective_add( carryObject.objID[team],
"active", carryObject.curOrigin, objectiveName );
350 objective_add( carryObject.objID[team],
"invisible", carryObject.curOrigin, objectiveName );
355 objective_add( carryObject.objID[team],
"invisible", carryObject.curOrigin, objectiveName );
358 objective_team( carryObject.objID[team], team );
359 carryObject.objPoints[team] =
objpoints::create(
"objpoint_" + team +
"_" + carryObject.entNum, carryObject.curOrigin + offset, team, undefined );
360 carryObject.objPoints[team].alpha = 0;
366 objective_add( carryObject.objID[level.nonTeamBasedTeam],
"invisible", carryObject.curOrigin, objectiveName );
367 carryObject.objPoints[level.nonTeamBasedTeam] =
objpoints::create(
"objpoint_"+ level.nonTeamBasedTeam +
"_" + carryObject.entNum, carryObject.curOrigin + offset,
"all", undefined );
368 carryObject.objPoints[level.nonTeamBasedTeam].alpha = 0;
375 if ( carryObject.newStyle )
377 objective_add( carryObject.objectiveID,
"invisible", carryObject.curOrigin, objectiveName );
381 carryObject.carrier = undefined;
384 carryObject.isResetting =
false;
385 carryObject.interactTeam =
"none";
386 carryObject.allowWeapons =
false;
387 carryObject.visibleCarrierModel = undefined;
388 carryObject.dropOffset = 0;
389 carryObject.disallowRemoteControl =
false;
392 carryObject.worldIcons = [];
393 carryObject.carrierVisible =
false;
394 carryObject.visibleTeam =
"none";
395 carryObject.worldIsWaypoint = [];
397 carryObject.worldIcons_disabled = [];
399 carryObject.carryIcon = undefined;
402 carryObject.setDropped = undefined;
403 carryObject.onDrop = undefined;
404 carryObject.onPickup = undefined;
405 carryObject.onReset = undefined;
408 if ( carryObject.triggerType ==
"use" )
414 carryObject.numTouching[
"neutral"] = 0;
415 carryObject.numTouching[
"none"] = 0;
416 carryObject.touchList[
"neutral"] = [];
417 carryObject.touchList[
"none"] = [];
419 foreach( team
in level.teams )
421 carryObject.numTouching[team] = 0;
422 carryObject.touchList[team] = [];
425 carryObject.curProgress = 0;
426 carryObject.useTime = 0;
427 carryObject.useRate = 0;
428 carryObject.claimTeam =
"none";
429 carryObject.claimPlayer = undefined;
430 carryObject.lastClaimTeam =
"none";
431 carryObject.lastClaimTime = 0;
432 carryObject.claimGracePeriod = 0;
433 carryObject.mustMaintainClaim =
false;
434 carryObject.canContestClaim =
false;
435 carryObject.decayProgress =
false;
437 carryObject.teamUseTimes = [];
438 carryObject.teamUseTexts = [];
463 level endon (
"game_ended" );
464 self.trigger endon(
"destroyed" );
468 self.trigger waittill (
"trigger", player );
470 if (
self.isResetting )
475 if ( !isAlive( player ) )
480 if ( isdefined(player.laststand) && player.laststand )
490 if ( !player.canPickupObject )
495 if ( player.throwingGrenade )
500 if ( isdefined(
self.carrier ) )
505 if ( player isInVehicle() )
515 if (
IS_TRUE( player.selectingLocation ) )
520 if ( player IsWeaponViewOnlyLinked() )
525 if( !player isTouching(
self.trigger ) )
543 level endon (
"game_ended" );
544 self.trigger endon(
"destroyed" );
548 self.trigger waittill (
"trigger", player );
550 if (
self.isResetting )
555 if ( !isAlive( player ) )
560 if ( isdefined(player.laststand) && player.laststand )
570 if ( !player.canPickupObject )
575 if ( player.throwingGrenade )
580 if ( isdefined(
self.carrier ) )
585 if ( player isInVehicle() )
595 if (
IS_TRUE( player.selectingLocation ) )
600 if ( player IsWeaponViewOnlyLinked() )
607 if( !player isTouching(
self.trigger ) )
626 level endon (
"game_ended" );
629 self endon(
"disconnect");
631 self.canPickupObject =
false;
635 if ( distanceSquared(
self.origin, origin ) > 64*64 )
643 self.canPickupObject =
true;
656 if ( !IsAlive( player ) )
661 if (
self.type ==
"carryObject" )
663 if(isdefined( player.carryObject ))
665 if (
IS_TRUE( player.carryObject.swappable ) )
671 if ( isdefined(
self.onPickupFailed ) )
673 self [[
self.onPickupFailed]]( player );
682 else if(
self.type ==
"packObject")
684 if(IsDefined(level.max_packObjects) && (level.max_packObjects <= player.packObject.size))
686 if ( isdefined(
self.onPickupFailed ) )
688 self [[
self.onPickupFailed]]( player );
702 self.trigger.origin += (0,0,10000);
704 self notify (
"pickup_object" );
707 self [[
self.onPickup]]( player );
718 origin =
self.origin;
719 grenades = getentarray(
"grenade",
"classname" );
720 radiusSq = radius * radius;
723 foreach( grenade
in grenades )
725 if( DistanceSquared( origin, grenade.origin ) < radiusSq )
727 if ( grenade islinkedto(
self ) )
731 linkedGrenades[linkedGrenades.size] = grenade;
738 foreach( grenade
in linkedGrenades )
740 grenade
launch( (RandomFloatRange( -5, 5 ),RandomFloatRange( -5, 5 ),5) );
746 foreach ( visual
in self.visuals )
755 level endon (
"game_ended" );
756 self.trigger endon(
"destroyed" );
763 objPingDelay = level.objectivePingDelay;
766 if ( isdefined(
self.carrier ) && level.teamBased )
768 self.curOrigin =
self.carrier.origin + (0,0,75);
770 foreach ( team
in level.teams )
775 if ( (
self.visibleTeam ==
"friendly" ||
self.visibleTeam ==
"any") &&
self.objIDPingFriendly )
777 foreach ( team
in level.teams )
781 if (
self.objPoints[team].isShown )
783 self.objPoints[team].alpha =
self.objPoints[team].baseAlpha;
784 self.objPoints[team] fadeOverTime( objPingDelay + 1.0 );
785 self.objPoints[team].alpha = 0;
787 objective_position(
self.objID[team],
self.curOrigin );
792 if ( (
self.visibleTeam ==
"enemy" ||
self.visibleTeam ==
"any") &&
self.objIDPingEnemy )
796 if (
self.objPoints[team].isShown )
798 self.objPoints[team].alpha =
self.objPoints[team].baseAlpha;
799 self.objPoints[team] fadeOverTime( objPingDelay + 1.0 );
800 self.objPoints[team].alpha = 0;
802 objective_position(
self.objID[team],
self.curOrigin );
809 else if( isdefined(
self.carrier ) )
811 self.curOrigin =
self.carrier.origin + (0,0,75);
813 objective_position(
self.objID[level.nonTeamBasedTeam],
self.curOrigin );
819 if ( level.teamBased )
821 foreach( team
in level.teams )
838 level endon (
"game_ended" );
839 self.trigger endon(
"destroyed" );
841 if ( !
self.newStyle )
846 objPingDelay = level.objectivePingDelay;
849 if ( isdefined(
self.carrier ) )
851 self.curOrigin =
self.carrier.origin;
852 objective_position(
self.objectiveID,
self.curOrigin );
857 objective_position(
self.objectiveID,
self.curOrigin );
874 assert( !isdefined(
self.carryObject ) );
876 self.carryObject = object;
879 if ( IsDefined(
object.carryWeapon) )
884 if ( isDefined(
object.carryWeaponThink) )
886 self thread [[
object.carryWeaponThink]]();
890 while(
self IsMeleeing() && count < 10 )
896 self GiveWeapon(
object.carryWeapon );
898 if(
self IsSwitchingWeapons() )
901 self SwitchToWeaponImmediate(
object.carryWeapon );
902 self setblockweaponpickup(
object.carryWeapon,
true );
903 self DisableWeaponCycling();
905 else if ( !
object.allowWeapons )
911 self.disallowVehicleUsage =
true;
913 if ( isdefined(
object.visibleCarrierModel ) )
918 if ( !
object.newStyle )
920 if ( isdefined(
object.carryIcon ) )
922 if (
self IsSplitscreen() )
925 self.carryIcon.x = -130;
926 self.carryIcon.y = -90;
927 self.carryIcon.horzAlign =
"right";
928 self.carryIcon.vertAlign =
"bottom";
934 if ( !
object.allowWeapons )
942 self.carryIcon.horzAlign =
"user_left";
943 self.carryIcon.vertAlign =
"user_bottom";
946 self.carryIcon.alpha = 0.75;
947 self.carryIcon.hidewhileremotecontrolling =
true;
948 self.carryIcon.hidewheninkillcam =
true;
955 foreach( visual
in self.visuals )
957 visual.origin = visual.baseOrigin;
958 visual.angles = visual.baseAngles;
959 visual DontInterpolate();
973 self.isResetting =
true;
976 prev_origin =
self.trigger.origin;
978 self notify (
"reset" );
980 self.trigger.origin =
self.trigger.baseOrigin;
982 self.curOrigin =
self.trigger.origin;
986 self [[
self.onReset]](prev_origin);
995 self.isResetting =
false;
1006 if ( isdefined(
self.carrier ) )
1011 if ( distancesquared(
self.trigger.origin,
self.trigger.baseOrigin) > 4 )
1029 self.isResetting =
true;
1031 foreach( visual
in self.visuals )
1033 visual.origin = origin;
1034 visual.angles = angles;
1035 visual DontInterpolate();
1038 self.trigger.origin = origin;
1040 self.curOrigin =
self.trigger.origin;
1048 self.isResetting =
false;
1053 self.dropOffset = height;
1065 if ( isdefined(
self.setDropped) )
1067 if ( [[
self.setDropped]]() )
1071 self.isResetting =
true;
1073 self notify (
"dropped" );
1075 startOrigin = (0,0,0);
1076 endOrigin = (0,0,0);
1078 if ( isdefined(
self.carrier ) &&
self.carrier.team !=
"spectator" )
1080 startOrigin =
self.carrier.origin + (0,0,20);
1081 endOrigin =
self.carrier.origin - (0,0,2000);
1082 body =
self.carrier.body;
1086 if( isdefined(
self.safeOrigin ) )
1088 startOrigin =
self.safeOrigin + (0,0,20);
1089 endOrigin =
self.safeOrigin - (0,0,20);
1093 startOrigin =
self.curorigin + (0,0,20);
1094 endOrigin =
self.curorigin - (0,0,20);
1100 trace = PhysicsTrace( startOrigin, endOrigin, ( -trace_size, -trace_size, -trace_size ), ( trace_size, trace_size, trace_size ),
self,
PHYSICS_TRACE_MASK_PLAYER );
1101 droppingPlayer =
self.carrier;
1105 if ( isdefined(
trace ) )
1108 tempAngle = randomfloat( 360 );
1110 dropOrigin =
trace[
"position"] + ( 0, 0,
self.dropOffset );
1111 if (
trace[
"fraction"] < 1 )
1113 forward = (cos( tempAngle ), sin( tempAngle ), 0);
1114 forward = vectornormalize( forward - VectorScale(
trace[
"normal"], vectordot( forward,
trace[
"normal"] ) ) );
1117 if(SessionModeIsMultiplayerGame())
1119 if ( isdefined(
trace[
"walkable"] ) )
1121 if (
trace[
"walkable"] ==
false )
1126 self.isResetting =
false;
1130 end_reflect = (forward * 1000) +
trace[
"position"];
1131 reflect_trace = PhysicsTrace(
trace[
"position"], end_reflect, ( -trace_size, -trace_size, -trace_size ), ( trace_size, trace_size, trace_size ),
self,
PHYSICS_TRACE_MASK_PLAYER );
1133 if ( isdefined( reflect_trace ) && (reflect_trace[
"normal"][2] < 0.0) )
1135 dropOrigin_reflect = reflect_trace[
"position"] + ( 0, 0,
self.dropOffset );
1141 self.isResetting =
false;
1149 dropAngles = vectortoangles( forward );
1153 dropAngles = (0,tempAngle,0);
1156 foreach( visual
in self.visuals )
1158 visual.origin = dropOrigin;
1159 visual.angles = dropAngles;
1160 visual DontInterpolate();
1163 self.trigger.origin = dropOrigin;
1165 self.curOrigin =
self.trigger.origin;
1172 self.trigger.origin =
self.trigger.baseOrigin;
1174 self.curOrigin =
self.trigger.baseOrigin;
1177 if ( IsDefined(
self.
onDrop ) )
1179 self [[
self.onDrop]]( droppingPlayer );
1184 self.isResetting =
false;
1196 self.carrier = carrier;
1197 Objective_SetPlayerUsing(
self.objectiveID, carrier );
1213 return(
self.carrier );
1219 if ( !isdefined(
self.carrier ) )
1225 Objective_ClearPlayerUsing(
self.objectiveID,
self.carrier );
1227 self.carrier = undefined;
1229 self notify(
"carrier_cleared");
1234 foreach( trigger
in triggers )
1236 if(
self isTouchingSwept( trigger, minZ, maxZ ) )
1258 elevators = GetEntArray(
"script_elevator",
"targetname" );
1260 foreach( elevator
in elevators )
1262 assert( isdefined( elevator.occupy_volume ) );
1264 if (
self.visuals[0] isTouchingSwept( elevator.occupy_volume, minZ, maxZ ) )
1274 self endon (
"pickup_object" );
1275 self endon (
"reset" );
1285 if ( isdefined(
self.pickupTimeoutOverride ) )
1287 self thread [[
self.pickupTimeoutOverride]]();
1289 else if ( isdefined(
self.autoResetTime ) )
1291 wait (
self.autoResetTime );
1293 if ( !isdefined(
self.carrier ) )
1310 if ( isdefined(
object.visibleCarrierModel ) )
1315 shouldEnableWeapon =
true;
1316 if( isDefined(
object.carryWeapon) && !IsDefined(
self.player_disconnected ) )
1318 shouldEnableWeapon =
false;
1322 if(
object.type ==
"carryObject")
1324 if ( isdefined(
self.carryIcon ) )
1329 self.carryObject = undefined;
1331 else if(
object.type ==
"packObject")
1333 if ( isdefined(
self.packIcon ) &&
self.packIcon.size > 0 )
1335 for( i = 0; i <
self.packIcon.size; i++ )
1337 if(IsDefined(
self.packIcon[i].script_string))
1339 if(
self.packIcon[i].script_string ==
object.packIcon)
1341 elem =
self.packIcon[i];
1342 ArrayRemoveValue(
self.packIcon, elem);
1352 ArrayRemoveValue(
self.packObject,
object);
1355 if ( !isAlive(
self ) || IsDefined(
self.player_disconnected ) )
1360 self notify (
"drop_object" );
1362 self.disallowVehicleUsage =
false;
1364 if (
object.triggerType ==
"proximity" )
1369 if ( isdefined(
object.visibleCarrierModel ) )
1374 if ( !
object.allowWeapons && shouldEnableWeapon )
1392 self endon(
"take_carry_weapon" );
1393 self waittill(
"death" );
1400 self notify(
"take_carry_weapon" );
1402 if (
self HasWeapon( weapon,
true ) )
1404 ballWeapon = GetWeapon(
"ball" );
1405 currWeapon =
self GetCurrentWeapon();
1406 if( ( weapon == ballWeapon ) && ( currWeapon === ballWeapon ) )
1408 self setblockweaponpickup( weapon,
false );
1409 self TakeWeapon( weapon );
1410 self EnableWeaponCycling();
1411 if( level.gameType ==
"ball" )
1412 self EnableOffhandWeapons();
1425 level endon (
"game_ended" );
1426 self endon (
"disconnect" );
1427 self endon (
"death" );
1428 self endon (
"drop_object" );
1432 while ( (isdefined(
object.carrier ) &&
object.carrier ==
self) && isAlive(
self ) )
1434 if (
self isOnGround() )
1436 trace = bulletTrace(
self.origin + (0,0,20),
self.origin - (0,0,20),
false, undefined );
1437 if (
trace[
"fraction"] < 1 )
1439 object.safeOrigin =
trace[
"position"];
1457 level endon (
"game_ended" );
1459 self endon (
"disconnect" );
1460 self endon (
"death" );
1461 self endon (
"drop_object" );
1465 while (
self attackButtonPressed() ||
self fragButtonPressed() ||
self secondaryOffhandButtonPressed() ||
self meleeButtonPressed() )
1470 while ( !
self attackButtonPressed() && !
self fragButtonPressed() && !
self secondaryOffhandButtonPressed() && !
self meleeButtonPressed() )
1475 if ( isdefined(
self.carryObject ) && !
self useButtonPressed() )
1491 function create_use_object( ownerTeam, trigger, visuals, offset, objectiveName, allowInitialHoldDelay =
false, allowWeaponCyclingDuringHold =
false )
1493 useObject =
Spawn(
"script_model", trigger.origin );
1494 useObject.type =
"useObject";
1495 useObject.curOrigin = trigger.origin;
1496 useObject.entNum = trigger getEntityNumber();
1497 useObject.keyObject = undefined;
1499 if ( isSubStr( trigger.classname,
"use" ) )
1501 useObject.triggerType =
"use";
1505 useObject.triggerType =
"proximity";
1509 useObject.trigger = trigger;
1510 useObject LinkTo( trigger );
1513 for ( index = 0; index < visuals.size; index++ )
1515 visuals[index].baseOrigin = visuals[index].origin;
1516 visuals[index].baseAngles = visuals[index].angles;
1518 useObject.visuals = visuals;
1522 if ( !isdefined( offset ) )
1527 useObject.offset3d = offset;
1529 useObject.newStyle =
false;
1531 if ( isdefined( objectiveName ) )
1533 useObject.newStyle =
true;
1537 objectiveName = &
"";
1543 useObject.compassIcons = [];
1544 useObject.objID = [];
1545 if ( !useObject.newStyle )
1547 foreach( team
in level.teams )
1552 if ( level.teamBased )
1554 foreach( team
in level.teams )
1556 if( SessionModeIsCampaignGame() )
1558 objective_add( useObject.objID[
"allies" ],
"active", useObject.curOrigin, objectiveName );
1563 objective_add( useObject.objID[team],
"invisible", useObject.curOrigin, objectiveName );
1566 objective_team( useObject.objID[team], team );
1571 objective_add( useObject.objID[level.nonTeamBasedTeam],
"invisible", useObject.curOrigin, objectiveName );
1579 if ( useObject.newStyle )
1581 if( SessionModeIsCampaignGame() )
1583 objective_add( useObject.objectiveID,
"invisible", useObject, objectiveName );
1584 useObject.keepWeapon =
true;
1588 objective_add( useObject.objectiveID,
"invisible", useObject.curOrigin + offset, objectiveName );
1592 if ( !useObject.newStyle )
1594 if ( level.teamBased )
1596 foreach( team
in level.teams )
1598 useObject.objPoints[team] =
objpoints::create(
"objpoint_" + team +
"_" + useObject.entNum, useObject.curOrigin + offset, team, undefined );
1599 useObject.objPoints[team].alpha = 0;
1604 useObject.objPoints[level.nonTeamBasedTeam] =
objpoints::create(
"objpoint_allies_" + useObject.entNum, useObject.curOrigin + offset,
"all", undefined );
1605 useObject.objPoints[level.nonTeamBasedTeam].alpha = 0;
1610 useObject.interactTeam =
"none";
1613 useObject.worldIcons = [];
1614 useObject.visibleTeam =
"none";
1615 useObject.worldIsWaypoint = [];
1617 useObject.worldIcons_disabled = [];
1620 useObject.onUse = undefined;
1621 useObject.onCantUse = undefined;
1623 useObject.useText =
"default";
1624 useObject.useTime = 10000;
1628 useObject.decayProgress =
false;
1630 if ( useObject.triggerType ==
"proximity" )
1632 useObject.numTouching[
"neutral"] = 0;
1633 useObject.numTouching[
"none"] = 0;
1634 useObject.touchList[
"neutral"] = [];
1635 useObject.touchList[
"none"] = [];
1637 foreach( team
in level.teams )
1639 useObject.numTouching[team] = 0;
1640 useObject.touchList[team] = [];
1643 useObject.teamUseTimes = [];
1644 useObject.teamUseTexts = [];
1646 useObject.useRate = 0;
1647 useObject.claimTeam =
"none";
1648 useObject.claimPlayer = undefined;
1649 useObject.lastClaimTeam =
"none";
1650 useObject.lastClaimTime = 0;
1651 useObject.claimGracePeriod = 1.0;
1652 useObject.mustMaintainClaim =
false;
1653 useObject.canContestClaim =
false;
1659 useObject.useRate = 1;
1676 if ( !isdefined(
object ) )
1678 self.keyObject = undefined;
1683 if ( !isdefined(
self.keyObject ) )
1685 self.keyObject = [];
1688 self.keyObject[
self.keyObject.size ] = object;
1701 if(!isdefined(
use.keyObject ) )
1706 for ( x = 0; x <
use.keyObject.size; x++ )
1708 if ( isdefined(
self.carryObject ) && (
self.carryObject ==
use.keyObject[ x ] ) )
1712 else if( isdefined(
self.packObject) )
1714 for ( i = 0; i <
self.packObject.size; i++ )
1716 if(
self.packObject[i] ==
use.keyObject[x] )
1737 self.trigger endon(
"destroyed" );
1739 if(
self.useTime > 0 && disableInitialHoldDelay )
1742 self.trigger UseTriggerIgnoreUseHoldTime();
1747 self.trigger waittill (
"trigger", player );
1749 if( level.gameEnded )
1754 if ( !isAlive( player ) )
1764 if ( IsDefined(
self.canInteractWithPlayer ) && ![[
self.canInteractWithPlayer]]( player ) )
1769 if ( !player isOnGround() || player IsWallRunning() )
1774 if ( player isInVehicle() )
1783 self [[
self.onCantUse]]( player );
1789 if (
self.useTime > 0 )
1793 if( isdefined(
self.classObj ) )
1795 [[
self.classObj]]->onBeginUse( player );
1799 self [[
self.onBeginUse]]( player );
1803 team = player.pers[
"team"];
1809 self [[
self.onEndUse]]( team, player,
result );
1818 if ( isdefined(
self.
onUse ) )
1820 if(
IS_TRUE(
self.onUse_thread ) )
1824 self thread use_object_OnUse( player );
1828 self use_object_OnUse( player );
1836 level endon(
"game_ended" );
1837 self.trigger endon(
"destroyed" );
1839 if( isdefined(
self.classObj ) )
1841 [[
self.classObj]]->onUse( player );
1845 self [[
self.onUse]]( player );
1852 assert(
self.claimTeam !=
"none" );
1853 team =
self.claimTeam;
1855 earliestPlayer =
self.claimPlayer;
1857 if (
self.touchList[team].size > 0 )
1860 earliestTime = undefined;
1861 players = getArrayKeys(
self.touchList[team] );
1862 for ( index = 0; index < players.size; index++ )
1864 touchdata =
self.touchList[team][players[index]];
1865 if ( !isdefined( earliestTime ) || touchdata.starttime < earliestTime )
1867 earliestPlayer = touchdata.player;
1868 earliestTime = touchdata.starttime;
1873 return earliestPlayer;
1886 level endon (
"game_ended" );
1887 self.trigger endon(
"destroyed" );
1893 if (
self.useTime &&
self.curProgress >=
self.useTime )
1901 self [[
self.onEndUse]](
self get_claim_team(), creditPlayer, isdefined( creditPlayer ) );
1904 if ( isdefined( creditPlayer ) && isdefined(
self.
onUse ) )
1906 self [[
self.onUse]]( creditPlayer );
1909 if ( !
self.mustMaintainClaim )
1912 self.claimPlayer = undefined;
1916 if (
self.claimTeam !=
"none" )
1922 self [[
self.onEndUse]](
self get_claim_team(),
self.claimPlayer, false );
1926 self.claimPlayer = undefined;
1931 if (
self.useTime &&
1934 if (
self.decayProgress && !
self.numTouching[
self.claimTeam] )
1936 if ( isdefined(
self.claimPlayer ) )
1940 self [[
self.onEndUse]](
self get_claim_team(),
self.claimPlayer, false );
1943 self.claimPlayer = undefined;
1947 if (
self.decayTime )
1949 decayScale =
self.useTime /
self.decayTime;
1952 self.curProgress -= (50 *
self.useRate * decayScale);
1953 if (
self.curProgress <= 0 )
1962 self [[
self.onUseUpdate]](
self get_claim_team(),
self.curProgress /
self.useTime, (50*
self.useRate*decayScale) /
self.useTime );
1965 if (
self.curProgress == 0 )
1970 else if ( !
self.numTouching[
self.claimTeam] )
1974 self [[
self.onEndUse]](
self get_claim_team(),
self.claimPlayer, false );
1978 self.claimPlayer = undefined;
1982 self.curProgress += (50 *
self.useRate);
1986 self [[
self.onUseUpdate]](
self get_claim_team(),
self.curProgress /
self.useTime, (50*
self.useRate) /
self.useTime );
1990 else if ( !
self.mustMaintainClaim )
1992 if ( isdefined(
self.
onUse ) )
1994 self [[
self.onUse]](
self.claimPlayer );
1998 if ( !
self.mustMaintainClaim )
2001 self.claimPlayer = undefined;
2004 else if ( !
self.numTouching[
self.claimTeam] )
2006 if ( isdefined(
self.onUnoccupied ) )
2008 self [[
self.onUnoccupied]]();
2012 self.claimPlayer = undefined;
2014 else if (
self.canContestClaim )
2020 if ( isdefined(
self.onContested ) )
2022 self [[
self.onContested]]();
2026 self.claimPlayer = undefined;
2034 if (
self.curProgress > 0 && getTime() -
self.lastClaimTime > (
self.claimGracePeriod * 1000 ) )
2043 if ( isdefined(
self.onUnoccupied ) )
2045 self [[
self.onUnoccupied]]();
2048 else if (
self.canContestClaim &&
self.lastClaimTeam !=
"none" &&
self.numTouching[
self.lastClaimTeam] )
2052 if ( numOther == 0 )
2054 if ( isdefined(
self.onUncontested ) )
2056 self [[
self.onUncontested]](
self.lastClaimTeam);
2078 if ( isdefined(
self.teamLock ) && isdefined( level.teams[team] ) )
2080 return self.teamLock[team];
2095 if ( isdefined(
self.carrier ) )
2100 if (
self.canContestClaim )
2104 if ( numOther != 0 )
2127 level endon (
"game_ended" );
2128 self.trigger endon(
"destroyed" );
2130 entityNumber =
self.entNum;
2132 DEFAULT(
self.trigger.remote_control_player_can_trigger,
false );
2136 self.trigger waittill (
"trigger", player );
2138 if( !IsPlayer( player ) )
2143 if ( player.using_map_vehicle ===
true )
2145 if ( !isdefined(
self.allow_map_vehicles ) ||
self.allow_map_vehicles ==
false )
2160 if ( player.spawntime == GetTime() )
2170 if (
self.trigger.remote_control_player_can_trigger ==
false )
2178 if (
IS_TRUE( player.selectingLocation ) )
2183 if ( player IsWeaponViewOnlyLinked() )
2193 if( IsDefined(
self.canUseObject) && ![[
self.canUseObject]](player) )
2203 self.claimPlayer = player;
2206 if ( isdefined(
self.teamUseTimes[relativeTeam] ) )
2208 self.useTime =
self.teamUseTimes[relativeTeam];
2212 if (
self.useTime && isdefined(
self.
onBeginUse ) )
2214 self [[
self.onBeginUse]](
self.claimPlayer );
2221 self [[
self.onCantUse]]( player );
2226 if ( isAlive( player ) && !isdefined( player.touchTriggers[entityNumber] ) )
2235 if ( !isdefined(
self.exclusions ) )
2240 foreach( exclusion
in self.exclusions )
2242 if ( exclusion istouching( player ) )
2253 self.curProgress = 0;
2257 if ( isdefined(
self.onUseClear ) )
2259 self [[
self.onUseClear]]( );
2273 assert( newTeam !=
self.claimTeam );
2275 if (
self.claimTeam ==
"none" && getTime() -
self.lastClaimTime > (
self.claimGracePeriod * 1000 ) )
2279 else if ( newTeam !=
"none" && newTeam !=
self.lastClaimTeam )
2284 self.lastClaimTeam =
self.claimTeam;
2285 self.lastClaimTime = getTime();
2286 self.claimTeam = newTeam;
2294 return self.claimTeam;
2299 if ( !isAlive(
self ) )
2304 if (
self.using_map_vehicle ===
true )
2306 if ( !isdefined(
object.allow_map_vehicles ) ||
object.allow_map_vehicles ==
false )
2311 if ( !isdefined(
object ) || !isdefined(
object.trigger ) || !isdefined(
object.trigger.remote_control_player_can_trigger ) ||
object.trigger.remote_control_player_can_trigger ==
false )
2313 if (
self isinvehicle() )
2338 if ( !isdefined(
object ) || !isdefined(
object.trigger ) )
2341 if( !
object.trigger IsTriggerEnabled() )
2344 if ( !
self isTouching(
object.trigger ) )
2361 team =
self.pers[
"team"];
2365 object.numTouching[team] =
object.numTouching[team] + score;
2367 if (
object.useTime )
2372 touchName =
"player" +
self.clientid;
2373 struct = spawnstruct();
2374 struct.player =
self;
2375 struct.starttime = gettime();
2376 object.touchList[team][touchName] =
struct;
2377 Objective_SetPlayerUsing(
object.objectiveID,
self );
2379 self.touchTriggers[
object.entNum] =
object.trigger;
2381 if ( isdefined(
object.onTouchUse ) )
2383 object [[
object.onTouchUse]]( self );
2388 if (
object.useTime )
2396 if ( isdefined(
self ) )
2398 if (
object.useTime )
2402 self.touchTriggers[
object.entNum] = undefined;
2403 Objective_ClearPlayerUsing(
object.objectiveID,
self );
2406 if ( level.gameEnded )
2411 object.touchList[team][touchName] = undefined;
2413 object.numTouching[team] =
object.numTouching[team] - score;
2416 if(
object.numTouching[team] < 1 )
2418 object.numTouching[team] = 0;
2421 if (
object.useTime )
2425 if (
object.numTouching[team] <= 0 && (
object.curProgress >=
object.useTime ) )
2427 object.curProgress =
object.useTime - 1;
2432 if ( isdefined(
self ) && isdefined(
object.onEndTouchUse ) )
2434 object [[
object.onEndTouchUse]]( self );
2450 if (
object.newStyle )
2455 if ( !forceRemove &&
object.decayProgress )
2459 if ( isdefined(
self.proxBar ) )
2464 if ( isdefined(
self.proxBarText ) )
2472 if ( !isdefined(
self.proxBar ) )
2475 self.proxBar.lastUseRate = -1;
2478 if (
self.pers[
"team"] ==
object.claimTeam )
2480 if (
self.proxBar.bar.color != ( 1, 1, 1 ) )
2482 self.proxBar.bar.color = ( 1, 1, 1 );
2483 self.proxBar.lastUseRate = -1;
2488 if (
self.proxBar.bar.color != ( 1, 0, 0 ) )
2490 self.proxBar.bar.color = ( 1, 0, 0 );
2491 self.proxBar.lastUseRate = -1;
2496 else if ( forceRemove || !
object can_interact_with(
self ) ||
self.pers[
"team"] !=
object.claimTeam )
2498 if ( isdefined(
self.proxBar ) )
2503 if ( isdefined(
self.proxBarText ) )
2510 if ( !isdefined(
self.proxBar ) )
2513 self.proxBar.lastUseRate = -1;
2514 self.proxBar.lastHostMigrationState =
false;
2517 if (
self.proxBar.hidden )
2520 self.proxBar.lastUseRate = -1;
2521 self.proxBar.lastHostMigrationState =
false;
2524 if ( !isdefined(
self.proxBarText ) )
2527 self.proxBarText setText(
object.useText );
2530 if (
self.proxBarText.hidden )
2533 self.proxBarText setText(
object.useText );
2536 if (
self.proxBar.lastUseRate !=
object.useRate ||
self.proxBar.lastHostMigrationState != isdefined( level.hostMigrationTimer ) )
2538 if(
object.curProgress >
object.useTime)
2540 object.curProgress =
object.useTime;
2543 if (
object.decayProgress &&
self.pers[
"team"] !=
object.claimTeam )
2545 if (
object.curProgress > 0 )
2547 progress =
object.curProgress /
object.useTime;
2548 rate = (1000 /
object.useTime) * (
object.useRate * -1 );
2549 if ( isdefined( level.hostMigrationTimer ) )
2558 progress =
object.curProgress /
object.useTime;
2559 rate = (1000 /
object.useTime) *
object.useRate;
2560 if ( isdefined( level.hostMigrationTimer ) )
2566 self.proxBar.lastHostMigrationState = isdefined( level.hostMigrationTimer );
2567 self.proxBar.lastUseRate =
object.useRate;
2574 foreach( team
in level.teams )
2576 if ( ignoreTeam == team )
2580 numTouching +=
self.numTouching[team];
2596 numClaimants =
self.numTouching[
self.claimTeam];
2603 if (
self.decayProgress )
2605 if ( numClaimants && !numOther )
2607 self.useRate = numClaimants;
2609 else if ( !numClaimants && numOther )
2611 self.useRate = numOther;
2613 else if ( !numClaimants && !numOther )
2620 if ( numClaimants && !numOther )
2622 self.useRate = numClaimants;
2628 self [[
self.onUpdateUseRate]]( );
2655 player notify (
"use_hold" );
2657 if ( !
IS_TRUE(
self.dontLinkPlayerToTrigger ) )
2659 if(!SessionModeIsMultiplayerGame())
2662 player PlayerLinkTo( gameobject_link);
2666 player playerLinkTo(
self.trigger );
2667 player PlayerLinkedOffsetEnable();
2671 player clientClaimTrigger(
self.trigger );
2672 player.claimTrigger =
self.trigger;
2674 useWeapon =
self.useWeapon;
2676 if ( isdefined( useWeapon ) )
2678 player giveWeapon( useWeapon );
2679 player setWeaponAmmoStock( useWeapon, 0 );
2680 player setWeaponAmmoClip( useWeapon, 0 );
2681 player switchToWeapon( useWeapon );
2683 else if (
self.keepWeapon !==
true )
2691 Objective_SetPlayerUsing(
self.objectiveID, player );
2694 if ( disableWeaponCyclingDuringHold )
2696 player DisableWeaponCycling();
2697 enableWeaponCyclingAfterHold =
true;
2704 if ( isdefined( player ) )
2706 if ( enableWeaponCyclingAfterHold ===
true )
2708 player EnableWeaponCycling();
2711 Objective_ClearPlayerUsing(
self.objectiveID, player );
2713 if ( isdefined( player.attachedUseModel ) )
2715 player detach( player.attachedUseModel,
"tag_inhand" );
2716 player.attachedUseModel = undefined;
2719 player notify(
"done_using" );
2721 if ( isdefined( useWeapon ) )
2726 player.claimTrigger = undefined;
2727 player clientReleaseTrigger(
self.trigger );
2729 if ( isdefined( useWeapon ) )
2733 else if (
self.keepWeapon !==
true )
2738 if ( !
IS_TRUE(
self.dontLinkPlayerToTrigger ) )
2743 if ( !isAlive( player ) )
2745 player.killedInUse =
true;
2748 if ( level.gameEnded )
2754 if(isdefined(gameobject_link))
2756 gameobject_link Delete();
2768 if ( isdefined( player ) && level.gameEnded )
2770 player FreezeControls(
true );
2776 self endon(
"use_hold" );
2777 self endon(
"death" );
2778 self endon(
"disconnect" );
2779 level endon(
"game_ended" );
2781 while (
self getCurrentWeapon() == useWeapon && !
self.throwingGrenade )
2784 self takeWeapon( useWeapon );
2791 if (!IsAlive(player))
2796 if ( isdefined( player.laststand ) && player.laststand )
2801 if (
self.curProgress >= useTime )
2806 if ( !(player useButtonPressed()) )
2811 if (player.throwingGrenade)
2821 if ( player isinvehicle() )
2831 if (
IS_TRUE( player.selectingLocation ) )
2836 if ( player IsWeaponViewOnlyLinked() )
2841 if ( !(player isTouching(
self.trigger ) ) )
2844 if( !isdefined( player.cursorHintEnt ) || player.cursorHintEnt !=
self )
2850 if ( !
self.useRate && !waitForWeapon )
2855 if (waitForWeapon && timedOut > maxWaitTime)
2860 if (
IS_TRUE(
self.interrupted ) )
2865 if( level.gameEnded )
2877 if ( isdefined(
self.curProgress ) )
2879 progress = float(
self.curProgress) /
self.useTime;
2886 Objective_SetProgress(
self.objectiveID,
math::clamp(progress,0,1) );
2892 self endon(
"disabled");
2894 useWeapon =
self.useWeapon;
2895 waitForWeapon =
true;
2898 useTime =
self.useTime;
2904 if ( !isdefined( useWeapon ) || player getCurrentWeapon() == useWeapon )
2906 self.curProgress += (50 *
self.useRate);
2909 waitForWeapon =
false;
2916 if ( SessionModeIsMultiplayerGame() )
2920 if (
self.curProgress >= useTime )
2931 if (
self.curProgress >= useTime )
2953 self endon(
"disconnect");
2955 if (
object.newStyle )
2960 if( isdefined(
self.useBar ) )
2967 self.useBarText setText(
object.useText );
2969 useTime =
object.useTime;
2972 lastHostMigrationState = isdefined( level.hostMigrationTimer );
2973 while ( isAlive(
self ) &&
object.inUse && !level.gameEnded )
2975 if ( lastRate !=
object.useRate || lastHostMigrationState != isdefined( level.hostMigrationTimer ) )
2977 if(
object.curProgress > useTime)
2979 object.curProgress = useTime;
2982 if (
object.decayProgress &&
self.pers[
"team"] !=
object.claimTeam )
2984 if (
object.curProgress > 0 )
2986 progress =
object.curProgress / useTime;
2987 rate = (1000 / useTime) * (
object.useRate * -1 );
2988 if ( isdefined( level.hostMigrationTimer ) )
2997 progress =
object.curProgress / useTime;
2998 rate = (1000 / useTime) *
object.useRate;
2999 if ( isdefined( level.hostMigrationTimer ) )
3006 if ( !
object.useRate )
3017 lastRate =
object.useRate;
3018 lastHostMigrationState = isdefined( level.hostMigrationTimer );
3036 if (
self.triggerType !=
"use" )
3041 if (
self.interactTeam ==
"none" )
3043 self.trigger TriggerEnable(
false );
3045 else if ( (
self.interactTeam ==
"any" ) || !level.teamBased )
3047 self.trigger TriggerEnable(
true );
3048 self.trigger setTeamForTrigger(
"none" );
3050 else if (
self.interactTeam ==
"friendly" )
3052 self.trigger TriggerEnable(
true );
3053 if ( isdefined( level.teams[
self.ownerTeam] ) )
3055 self.trigger setTeamForTrigger(
self.ownerTeam );
3059 self.trigger TriggerEnable(
false );
3062 else if (
self.interactTeam ==
"enemy" )
3064 self.trigger TriggerEnable(
true );
3065 self.trigger SetExcludeTeamForTrigger(
self.ownerTeam );
3071 if ( !
self.newStyle )
3076 objective_team(
self.objectiveID,
self.ownerTeam );
3078 if (
self.visibleTeam ==
"any" )
3080 objective_state(
self.objectiveID,
"active");
3081 objective_visibleteams(
self.objectiveID, level.spawnsystem.iSPAWN_TEAMMASK[
"all"] );
3083 else if (
self.visibleTeam ==
"friendly" )
3085 objective_state(
self.objectiveID,
"active");
3087 objective_visibleteams(
self.objectiveID, level.spawnsystem.iSPAWN_TEAMMASK[
self.ownerTeam] );
3089 else if (
self.visibleTeam ==
"enemy" )
3091 objective_state(
self.objectiveID,
"active");
3093 objective_visibleteams(
self.objectiveID, level.spawnsystem.iSPAWN_TEAMMASK[
"all"] & ~(level.spawnsystem.iSPAWN_TEAMMASK[
self.ownerTeam]) );
3097 objective_state(
self.objectiveID,
"invisible");
3098 objective_visibleteams(
self.objectiveID, 0 );
3101 if ( (
self.type ==
"carryObject") || (
self.type ==
"packObject"))
3103 if ( isAlive(
self.carrier ) )
3105 objective_onentity(
self.objectiveID,
self.carrier );
3107 else if ( IsDefined(
self.objectiveOnVisuals) &&
self.objectiveOnVisuals )
3109 objective_onentity(
self.objectiveID,
self.visuals[0] );
3113 objective_clearentity(
self.objectiveID );
3120 if (
self.visibleTeam ==
"any" )
3125 else if (
self.visibleTeam ==
"friendly" )
3130 else if (
self.visibleTeam ==
"enemy" )
3145 if (
self.newStyle )
3150 if ( !isdefined(
self.worldIcons[relativeTeam] ) )
3157 for ( index = 0; index < updateTeams.size; index++ )
3159 if ( !level.teamBased && updateTeams[index] != level.nonTeamBasedTeam )
3163 opName =
"objpoint_" + updateTeams[index] +
"_" +
self.entNum;
3166 objPoint notify(
"stop_flashing_thread" );
3171 objPoint setShader(
self.worldIcons[relativeTeam], level.objPointSize, level.objPointSize );
3172 objPoint fadeOverTime( 0.05 );
3173 objPoint.alpha = objPoint.baseAlpha;
3174 objPoint.isShown =
true;
3177 if ( isdefined(
self.worldIsWaypoint[relativeTeam]) )
3179 isWaypoint =
self.worldIsWaypoint[relativeTeam];
3182 if ( isdefined(
self.compassIcons[relativeTeam] ) )
3184 objPoint setWayPoint( isWaypoint,
self.worldIcons[relativeTeam] );
3188 objPoint setWayPoint( isWaypoint );
3191 if ( (
self.type ==
"carryObject") || (
self.type ==
"packObject"))
3195 objPoint SetTargetEnt(
self.carrier );
3199 objPoint ClearTargetEnt();
3205 objPoint fadeOverTime( 0.05 );
3207 objPoint.isShown =
false;
3208 objPoint ClearTargetEnt();
3216 if (
self.visibleTeam ==
"any" )
3221 else if (
self.visibleTeam ==
"friendly" )
3226 else if (
self.visibleTeam ==
"enemy" )
3241 if (
self.newStyle )
3248 for ( index = 0; index < updateTeams.size; index++ )
3250 showIconThisTeam = showIcon;
3253 showIconThisTeam =
true;
3256 if ( level.teamBased )
3258 objId =
self.objID[updateTeams[ index ]];
3262 objId =
self.objID[level.nonTeamBasedTeam];
3265 if ( !isdefined(
self.compassIcons[relativeTeam] ) || !showIconThisTeam )
3267 if( !SessionModeIsCampaignGame() )
3269 objective_state( objId,
"invisible" );
3275 objective_icon( objId,
self.compassIcons[relativeTeam] );
3277 if( !SessionModeIsCampaignGame() )
3279 objective_state( objId,
"active" );
3282 if ( (
self.type ==
"carryObject") || (
self.type ==
"packObject"))
3286 objective_onentity( objId,
self.carrier );
3290 if( !SessionModeIsCampaignGame() )
3292 objective_clearentity( objId );
3295 objective_position( objId,
self.curOrigin );
3303 if ( isdefined( e_player ) )
3305 Assert( IsPlayer( e_player ),
"Passed a non-player entity into gameobjects::hide_waypoint()" );
3307 Objective_SetInvisibleToPlayer(
self.objectiveid, e_player );
3311 Objective_SetInvisibleToAll(
self.objectiveid );
3317 if ( isdefined( e_player ) )
3319 Assert( IsPlayer( e_player ),
"Passed a non-player entity into gameobjects::hide_waypoint()" );
3321 Objective_SetVisibleToPlayer(
self.objectiveid, e_player );
3325 Objective_SetVisibleToAll(
self.objectiveid );
3331 if ( relativeTeam ==
"friendly" &&
self.objIDPingFriendly )
3335 else if ( relativeTeam ==
"enemy" &&
self.objIDPingEnemy )
3347 if ( level.teamBased )
3349 if ( relativeTeam ==
"friendly" )
3351 foreach( team
in level.teams )
3355 updateTeams[updateTeams.size] = team;
3359 else if ( relativeTeam ==
"enemy" )
3361 foreach( team
in level.teams )
3365 updateTeams[updateTeams.size] = team;
3372 if ( relativeTeam ==
"friendly" )
3374 updateTeams[updateTeams.size] = level.nonTeamBasedTeam;
3378 updateTeams[updateTeams.size] =
"axis";
3387 showCompass =
false;
3388 if ( !isdefined(
self.carrier ) )
3393 if (
self.carrier hasPerk(
"specialty_gpsjammer" ) ==
false )
3411 self endon(
"death");
3412 self endon(
"carrier_cleared");
3416 level waittill(
"radar_status_change");
3423 self.ownerTeam = team;
3425 if ( team !=
"any" )
3429 foreach( visual
in self.visuals )
3447 return self.ownerTeam;
3452 self.decayTime = int( time * 1000 );
3457 self.useTime = int( time * 1000 );
3462 self.useText = text;
3467 self.teamUseTimes[relativeTeam] = int( time * 1000 );
3472 self.teamUseTexts[relativeTeam] = text;
3477 self.trigger setHintString( text );
3487 self.interactTeam = relativeTeam;
3493 self.visibleTeam = relativeTeam;
3497 self.visibleTeam =
"none";
3507 for ( index = 0; index <
self.visuals.size; index++ )
3509 self.visuals[index] show();
3510 if (
self.visuals[index].classname ==
"script_brushmodel" ||
self.visuals[index].classname ==
"script_model" )
3518 for ( index = 0; index <
self.visuals.size; index++ )
3520 self.visuals[index] Ghost();
3521 if (
self.visuals[index].classname ==
"script_brushmodel" ||
self.visuals[index].classname ==
"script_model" )
3523 self.visuals[index] notify(
"changing_solidness");
3524 self.visuals[index] notsolid();
3532 self endon(
"death");
3533 self notify(
"changing_solidness");
3534 self endon(
"changing_solidness");
3538 for ( i = 0; i < level.players.size; i++ )
3540 if ( level.players[i] isTouching(
self ) )
3545 if ( i == level.players.size )
3556 self.carrierVisible = relativeTeam;
3561 self.useTeam = relativeTeam;
3566 self.compassIcons[relativeTeam] = shader;
3572 if( !IsDefined(shader) )
3574 self.worldIcons_disabled[relativeTeam] =
true;
3578 self.worldIcons_disabled[relativeTeam] =
false;
3581 self.worldIcons[relativeTeam] = shader;
3590 for ( index = 0; index < updateTeams.size; index++ )
3592 if ( !level.teamBased && updateTeams[index] != level.nonTeamBasedTeam )
3597 opName =
"objpoint_" + updateTeams[index] +
"_" +
self.entNum;
3600 if ( isdefined( objPoint ) )
3602 if ( isdefined( v_color ) )
3604 objPoint.color = v_color;
3607 if ( isdefined( alpha ) )
3609 objPoint.alpha = alpha;
3617 if (
self.newstyle )
3619 Objective_SetColor(
self.objectiveID, v_color[ 0 ], v_color[ 1 ], v_color[ 2 ], alpha );
3625 for ( index = 0; index < a_teams.size; index++ )
3627 if ( !level.teamBased && a_teams[ index ] != level.nonTeamBasedTeam )
3632 Objective_SetColor(
self.objID[ a_teams[ index ] ], v_color[ 0 ], v_color[ 1 ], v_color[ 2 ], alpha );
3639 if (
self.newstyle )
3641 if ( IsDefined(
self.objectiveID ) )
3643 Objective_OnEntity(
self.objectiveID, entity );
3650 foreach ( str_team
in a_teams )
3652 Objective_OnEntity(
self.objID[ str_team ], entity );
3659 a_objective_ids = [];
3664 ARRAY_ADD( a_objective_ids,
self.objectiveID );
3669 a_keys = GetArrayKeys(
self.objID );
3671 for ( i = 0; i < a_keys.size; i++ )
3673 if ( !IsDefined( str_team ) || ( str_team == a_keys[ i ] ) )
3675 ARRAY_ADD( a_objective_ids,
self.objID[ a_keys[ i ] ] );
3679 ARRAY_ADD( a_objective_ids,
self.objectiveID );
3682 return a_objective_ids;
3692 self endon(
"disabled" );
3693 self endon(
"destroyed_complete" );
3698 if( IsDefined(
self.worldIcons_disabled[
"friendly"]) && (
self.worldIcons_disabled[
"friendly"] ==
true) )
3706 for( i=0; i<level.players.size; i++ )
3708 n_dist = ( Distance( level.players[i].origin,
self.curorigin ) );
3709 if( n_dist < hide_distance )
3743 assert(IsPlayer(
self),
"player_looking_at must be called on a player.");
3745 if (!isdefined(dot))
3750 if (!isdefined(do_trace))
3757 delta_vec = AnglesToForward(VectorToAngles(origin - eye));
3758 view_vec = AnglesToForward(
self GetPlayerAngles());
3760 new_dot = VectorDot( delta_vec, view_vec );
3761 if ( new_dot >= dot )
3765 trace = BulletTrace( eye, origin,
false, ignore_ent );
3767 if(
trace[
"position" ] == origin )
3772 else if( IsDefined(ignore_trace_distance) )
3774 n_mag = Distance( origin, eye );
3775 n_dist = Distance(
trace[
"position" ], eye );
3776 n_delta = abs( n_dist - n_mag );
3777 if( n_delta <= ignore_trace_distance )
3796 if( (
self.visibleTeam ==
"any") || (
self.visibleTeam ==
"friendly") )
3798 hide_friendly =
true;
3802 hide_friendly =
false;
3804 if( (
self.visibleTeam ==
"any") || (
self.visibleTeam ==
"enemy") )
3814 self.hidden_compassIcon = [];
3815 self.hidden_worldIcon = [];
3816 if( hide_friendly ==
true )
3818 self.hidden_compassIcon[
"friendly"] =
self.compassIcons[
"friendly"];
3819 self.hidden_worldIcon[
"friendly"] =
self.worldIcons[
"friendly"];
3822 if( hide_enemy ==
true )
3824 self.hidden_compassIcon[
"enemy"] =
self.compassIcons[
"enemyy"];
3825 self.hidden_worldIcon[
"enemy"] =
self.worldIcons[
"enemy"];
3835 if( IsDefined(
self.hidden_compassIcon[team]) )
3839 if( IsDefined(
self.hidden_worldIcon[team]) )
3847 self.worldUseIcons[relativeTeam] = shader;
3852 self.worldIsWaypoint[relativeTeam] = waypoint;
3857 assert(
self.type ==
"carryObject",
"for packObjects use: set_pack_icon() instead.");
3859 self.carryIcon = shader;
3864 self.visibleCarrierModel = visibleModel;
3869 return self.visibleCarrierModel;
3874 if ( !isdefined( forceHide ) )
3881 foreach ( visual
in self.visuals )
3883 if ( b_connect_paths )
3885 visual ConnectPaths();
3888 if ( IsDefined( visual ) )
3895 self.trigger notify(
"destroyed" );
3899 self.trigger Delete();
3903 self.trigger TriggerEnable(
true );
3906 self notify(
"destroyed_complete" );
3911 self notify(
"disabled");
3913 if ( (
self.type ==
"carryObject") || (
self.type ==
"packObject") || ( isdefined( forceHide ) && forceHide ) )
3915 if ( isdefined(
self.carrier ) )
3920 for ( index = 0; index <
self.visuals.size; index++ )
3922 if( IsDefined(
self.visuals[index]) )
3924 self.visuals[index] Ghost();
3929 self.trigger TriggerEnable(
false );
3932 if( isdefined(
self.objectiveid ) )
3934 objective_clearentity(
self.objectiveID );
3940 if ( (
self.type ==
"carryObject") || (
self.type ==
"packObject") || ( isdefined( forceShow ) && forceShow ) )
3942 for ( index = 0; index <
self.visuals.size; index++ )
3944 self.visuals[index] show();
3948 self.trigger TriggerEnable(
true );
3951 if( isdefined(
self.objectiveid ) )
3953 objective_onentity(
self.objectiveID,
self );
3960 if(
self.ownerTeam ==
"any" )
3965 if ( team ==
self.ownerTeam )
3982 if ( !level.teamBased )
3987 if (
self.ownerTeam ==
"any" )
3992 if (
self.ownerTeam == team )
4003 if ( player.using_map_vehicle ===
true )
4005 if ( !isdefined(
self.allow_map_vehicles ) ||
self.allow_map_vehicles ==
false )
4009 team = player.pers[
"team"];
4010 switch(
self.interactTeam )
4019 if ( level.teamBased )
4021 if ( team ==
self.ownerTeam )
4032 if ( player ==
self.ownerTeam )
4043 if ( level.teamBased )
4045 if ( team !=
self.ownerTeam )
4049 else if ( isdefined(
self.decayProgress) &&
self.decayProgress &&
self.curProgress > 0 )
4060 if ( player !=
self.ownerTeam )
4071 assert( 0,
"invalid interactTeam" );
4088 if ( isdefined( level.teams[team] ) )
4098 switch( relativeTeam )
4136 if ( level.releasedObjectives.size > 0 )
4138 nextID = level.releasedObjectives[ level.releasedObjectives.size - 1 ];
4139 level.releasedObjectives[ level.releasedObjectives.size - 1 ] = undefined;
4143 nextID = level.numGametypeReservedObjectives;
4144 level.numGametypeReservedObjectives++;
4151 println(
"^3SCRIPT WARNING: Ran out of objective IDs");
4168 Assert( objID < level.numGametypeReservedObjectives );
4169 for ( i = 0; i < level.releasedObjectives.size; i++ )
4176 Assert( objID != level.releasedObjectives[i] );
4179 level.releasedObjectives[ level.releasedObjectives.size ] = objID;
4182 Objective_SetColor( objID, 1, 1, 1, 1 );
4185 Objective_State( objID,
"empty" );
4190 if ( IsDefined(
self.objID ) )
4192 a_keys = GetArrayKeys(
self.objID );
4194 for ( i = 0; i < a_keys.size; i++ )
4201 if ( IsDefined(
self.objectiveID ) )
4209 label =
self.trigger.script_label;
4210 if ( !isdefined( label ) )
4216 if ( label[0] !=
"_" )
4218 return (
"_" + label);
4226 self.mustMaintainClaim = enabled;
4231 self.canContestClaim = enabled;
4236 Objective_SetGamemodeFlags(
self.objectiveID, flags );
4241 return Objective_GetGamemodeFlags(
self.objectiveID );
4252 if(!IsDefined(level.max_packObjects))
4254 level.max_packObjects = 4;
4257 Assert( level.max_packObjects < 5,
"packObject system not currently designed to handle more than 4 objects" );
4259 packObject = spawnStruct();
4260 packObject.type =
"packObject";
4261 packObject.curOrigin = trigger.origin;
4262 packObject.entNum = trigger getEntityNumber();
4264 if ( isSubStr( trigger.classname,
"use" ) )
4266 packObject.triggerType =
"use";
4270 packObject.triggerType =
"proximity";
4274 trigger.baseOrigin = trigger.origin;
4275 packObject.trigger = trigger;
4277 packObject.useWeapon = undefined;
4279 if ( !isdefined( offset ) )
4284 packObject.offset3d = offset;
4286 packObject.newStyle =
false;
4287 if ( isdefined( objectiveName ) )
4289 if( !SessionModeIsCampaignGame() )
4291 packObject.newStyle =
true;
4296 objectiveName = &
"";
4300 for ( index = 0; index < visuals.size; index++ )
4302 visuals[index].baseOrigin = visuals[index].origin;
4303 visuals[index].baseAngles = visuals[index].angles;
4305 packObject.visuals = visuals;
4310 packObject.compassIcons = [];
4311 packObject.objID =[];
4313 if ( !packObject.newStyle )
4315 foreach( team
in level.teams )
4320 packObject.objIDPingFriendly =
false;
4321 packObject.objIDPingEnemy =
false;
4322 level.objIDStart += 2;
4325 if ( !packObject.newStyle )
4327 if ( level.teamBased )
4329 foreach ( team
in level.teams )
4331 objective_add( packObject.objID[team],
"invisible", packObject.curOrigin );
4332 objective_team( packObject.objID[team], team );
4333 packObject.objPoints[team] =
objpoints::create(
"objpoint_" + team +
"_" + packObject.entNum, packObject.curOrigin + offset, team, undefined );
4334 packObject.objPoints[team].alpha = 0;
4340 objective_add( packObject.objID[level.nonTeamBasedTeam],
"invisible", packObject.curOrigin );
4341 packObject.objPoints[level.nonTeamBasedTeam] =
objpoints::create(
"objpoint_"+ level.nonTeamBasedTeam +
"_" + packObject.entNum, packObject.curOrigin + offset,
"all", undefined );
4342 packObject.objPoints[level.nonTeamBasedTeam].alpha = 0;
4349 if ( packObject.newStyle )
4351 objective_add( packObject.objectiveID,
"invisible", packObject.curOrigin, objectiveName );
4355 packObject.carrier = undefined;
4358 packObject.isResetting =
false;
4359 packObject.interactTeam =
"none";
4360 packObject.allowWeapons =
true;
4361 packObject.visibleCarrierModel = undefined;
4362 packObject.dropOffset = 0;
4365 packObject.worldIcons = [];
4366 packObject.carrierVisible =
false;
4367 packObject.visibleTeam =
"none";
4368 packObject.worldIsWaypoint = [];
4370 packObject.worldIcons_disabled = [];
4372 packObject.packIcon = undefined;
4375 packObject.setDropped = undefined;
4376 packObject.onDrop = undefined;
4377 packObject.onPickup = undefined;
4378 packObject.onReset = undefined;
4381 if ( packObject.triggerType ==
"use" )
4387 packObject.numTouching[
"neutral"] = 0;
4388 packObject.numTouching[
"none"] = 0;
4389 packObject.touchList[
"neutral"] = [];
4390 packObject.touchList[
"none"] = [];
4392 foreach( team
in level.teams )
4394 packObject.numTouching[team] = 0;
4395 packObject.touchList[team] = [];
4398 packObject.curProgress = 0;
4399 packObject.useTime = 0;
4400 packObject.useRate = 0;
4401 packObject.claimTeam =
"none";
4402 packObject.claimPlayer = undefined;
4403 packObject.lastClaimTeam =
"none";
4404 packObject.lastClaimTime = 0;
4405 packObject.claimGracePeriod = 0;
4406 packObject.mustMaintainClaim =
false;
4407 packObject.canContestClaim =
false;
4408 packObject.decayProgress =
false;
4410 packObject.teamUseTimes = [];
4411 packObject.teamUseTexts = [];
4431 #define PACK_ICON_SPLIT_X -130
4432 #define PACK_ICON_X -40
4433 #define PACK_ICON_Y -110
4434 #define SPLIT_SIZE 25
4435 #define STANDARD_SIZE 35
4439 self.packObject[
self.packObject.size ] = object;
4442 if ( !
object.newStyle )
4444 if ( isdefined(
object.packIcon ))
4446 if (
self IsSplitscreen() )
4450 elem.horzAlign =
"right";
4451 elem.vertAlign =
"bottom";
4457 elem.horzAlign =
"user_right";
4458 elem.vertAlign =
"user_bottom";
4463 elem.hidewhileremotecontrolling =
true;
4464 elem.hidewheninkillcam =
true;
4465 elem.script_string =
object.packIcon;
4467 self.packIcon[
self.packIcon.size ] = elem;
4474 if(!IsDefined(index))
4479 if(
self IsSplitscreen() )
4490 int = base - (size * index);
4496 if(!IsDefined(
self.packIcon))
4501 if(
self.packIcon.size > 0)
4503 for( i = 0; i <
self.packIcon.size; i++ )
4512 assert(
self.type ==
"packObject",
"for carryObjects use: set_carry_icon() instead.");
4514 self.packIcon = shader;