Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 48.97 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5. main(allowed)
  6. {
  7. allowed[ allowed.size ] = "airdrop_pallet";
  8. entitytypes = getentarray();
  9. for(i = 0; i < entitytypes.size; i++)
  10. {
  11. if(isdefined(entitytypes[i].script_gameobjectname))
  12. {
  13. dodelete = true;
  14.  
  15. // allow a space-separated list of gameobjectnames
  16. gameobjectnames = strtok(entitytypes[i].script_gameobjectname, " ");
  17.  
  18. for(j = 0; j < allowed.size; j++)
  19. {
  20. for (k = 0; k < gameobjectnames.size; k++)
  21. {
  22. if(gameobjectnames[k] == allowed[j])
  23. {
  24. dodelete = false;
  25. break;
  26. }
  27. }
  28. if (!dodelete)
  29. break;
  30. }
  31.  
  32. if(dodelete)
  33. {
  34. //println("DELETED: ", entitytypes[i].classname);
  35. entitytypes[i] delete();
  36. }
  37. }
  38. }
  39. }
  40.  
  41.  
  42. init()
  43. {
  44. level.numGametypeReservedObjectives = 0;
  45.  
  46. precacheItem( "briefcase_bomb_mp" );
  47. precacheItem( "briefcase_bomb_defuse_mp" );
  48. precacheModel( "prop_suitcase_bomb" );
  49.  
  50. level.objIDStart = 0;
  51.  
  52. level thread onPlayerConnect();
  53. }
  54.  
  55. /*
  56. =============
  57. onPlayerConnect
  58.  
  59. =============
  60. */
  61. onPlayerConnect()
  62. {
  63. level endon ( "game_ended" );
  64.  
  65. for( ;; )
  66. {
  67. level waittill( "connected", player );
  68.  
  69. player thread onPlayerSpawned();
  70. player thread onDisconnect();
  71. }
  72. }
  73.  
  74.  
  75. /*
  76. =============
  77. onPlayerSpawned
  78.  
  79. =============
  80. */
  81. onPlayerSpawned()
  82. {
  83. self endon( "disconnect" );
  84. level endon ( "game_ended" );
  85.  
  86. for(;;)
  87. {
  88. self waittill( "spawned_player" );
  89.  
  90. self thread onDeath();
  91. self.touchTriggers = [];
  92. self.carryObject = undefined;
  93. self.claimTrigger = undefined;
  94. self.canPickupObject = true;
  95. self.killedInUse = undefined;
  96. }
  97. }
  98.  
  99.  
  100. /*
  101. =============
  102. onDeath
  103.  
  104. Drops any carried object when the player dies
  105. =============
  106. */
  107. onDeath()
  108. {
  109. level endon ( "game_ended" );
  110.  
  111. self waittill ( "death" );
  112.  
  113. if ( isDefined( self.carryObject ) )
  114. {
  115. assert( self.carryObject.carrier == self );
  116. self.carryObject thread setDropped();
  117. }
  118. }
  119.  
  120.  
  121. /*
  122. =============
  123. onDisconnect
  124.  
  125. Drops any carried object when the player disconnects
  126. =============
  127. */
  128. onDisconnect()
  129. {
  130. level endon ( "game_ended" );
  131.  
  132. self waittill ( "disconnect" );
  133.  
  134. if ( isDefined( self.carryObject ) )
  135. {
  136. assert( self.carryObject.carrier == self );
  137. self.carryObject thread setDropped();
  138. }
  139. }
  140.  
  141.  
  142. /*
  143. =============
  144. createCarryObject
  145.  
  146. Creates and returns a carry object
  147. =============
  148. */
  149. createCarryObject( ownerTeam, trigger, visuals, offset )
  150. {
  151. carryObject = spawnStruct();
  152. carryObject.type = "carryObject";
  153. carryObject.curOrigin = trigger.origin;
  154. carryObject.ownerTeam = ownerTeam;
  155. carryObject.entNum = trigger getEntityNumber();
  156.  
  157. if ( isSubStr( trigger.classname, "use" ) )
  158. carryObject.triggerType = "use";
  159. else
  160. carryObject.triggerType = "proximity";
  161.  
  162. // associated trigger
  163. trigger.baseOrigin = trigger.origin;
  164. carryObject.trigger = trigger;
  165.  
  166. carryObject.useWeapon = undefined;
  167.  
  168. if ( !isDefined( offset ) )
  169. offset = (0,0,0);
  170.  
  171. carryObject.offset3d = offset;
  172.  
  173. // associated visual objects
  174. for ( index = 0; index < visuals.size; index++ )
  175. {
  176. visuals[index].baseOrigin = visuals[index].origin;
  177. visuals[index].baseAngles = visuals[index].angles;
  178. }
  179. carryObject.visuals = visuals;
  180.  
  181. // compass objectives
  182. carryObject.compassIcons = [];
  183. carryObject.objIDAllies = getNextObjID();
  184. carryObject.objIDAxis = getNextObjID();
  185. carryObject.objIDPingFriendly = false;
  186. carryObject.objIDPingEnemy = false;
  187. level.objIDStart += 2;
  188.  
  189. objective_add( carryObject.objIDAllies, "invisible", carryObject.curOrigin );
  190. objective_add( carryObject.objIDAxis, "invisible", carryObject.curOrigin );
  191. objective_team( carryObject.objIDAllies, "allies" );
  192. objective_team( carryObject.objIDAxis, "axis" );
  193.  
  194. carryObject.objPoints["allies"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_allies_" + carryObject.entNum, carryObject.curOrigin + offset, "allies", undefined );
  195. carryObject.objPoints["axis"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_axis_" + carryObject.entNum, carryObject.curOrigin + offset, "axis", undefined );
  196.  
  197. carryObject.objPoints["allies"].alpha = 0;
  198. carryObject.objPoints["axis"].alpha = 0;
  199.  
  200. // carrying player
  201. carryObject.carrier = undefined;
  202.  
  203. // misc
  204. carryObject.isResetting = false;
  205. carryObject.interactTeam = "none"; // "none", "any", "friendly", "enemy";
  206. carryObject.allowWeapons = false;
  207.  
  208. // 3d world icons
  209. carryObject.worldIcons = [];
  210. carryObject.carrierVisible = false; // carryObject only
  211. carryObject.visibleTeam = "none"; // "none", "any", "friendly", "enemy";
  212.  
  213. carryObject.carryIcon = undefined;
  214.  
  215. // calbacks
  216. carryObject.onDrop = undefined;
  217. carryObject.onPickup = undefined;
  218. carryObject.onReset = undefined;
  219.  
  220. if ( carryObject.triggerType == "use" )
  221. {
  222. carryObject thread carryObjectUseThink();
  223. }
  224. else
  225. {
  226. carryObject.curProgress = 0;
  227.  
  228. carryObject.useTime = 0;
  229. carryObject.useRate = 0;
  230.  
  231. carryObject.teamUseTimes = [];
  232. carryObject.teamUseTexts = [];
  233.  
  234. carryObject.numTouching["neutral"] = 0;
  235. carryObject.numTouching["axis"] = 0;
  236. carryObject.numTouching["allies"] = 0;
  237. carryObject.numTouching["none"] = 0;
  238. carryObject.touchList["neutral"] = [];
  239. carryObject.touchList["axis"] = [];
  240. carryObject.touchList["allies"] = [];
  241. carryObject.touchList["none"] = [];
  242.  
  243. carryObject.claimTeam = "none";
  244. carryObject.claimPlayer = undefined;
  245. carryObject.lastClaimTeam = "none";
  246. carryObject.lastClaimTime = 0;
  247.  
  248. carryObject thread carryObjectProxThink();
  249. }
  250.  
  251. carryObject thread updateCarryObjectOrigin();
  252.  
  253. return carryObject;
  254. }
  255.  
  256.  
  257. /*
  258. =============
  259. carryObjectUseThink
  260.  
  261. Think function for "use" type carry objects
  262. =============
  263. */
  264. carryObjectUseThink()
  265. {
  266. level endon ( "game_ended" );
  267.  
  268. while ( true )
  269. {
  270. self.trigger waittill ( "trigger", player );
  271.  
  272. if ( self.isResetting )
  273. continue;
  274.  
  275. if ( !isReallyAlive( player ) )
  276. continue;
  277.  
  278. if ( !self canInteractWith( player.pers["team"] ) )
  279. continue;
  280.  
  281. if ( !player.canPickupObject )
  282. continue;
  283.  
  284. if ( isDefined( player.throwingGrenade ) )
  285. continue;
  286.  
  287. if ( isDefined( self.carrier ) )
  288. continue;
  289.  
  290. if ( player isUsingRemote() )
  291. continue;
  292.  
  293. self setPickedUp( player );
  294. }
  295. }
  296.  
  297.  
  298. /*
  299. =============
  300. carryObjectProxThink
  301.  
  302. Think function for "proximity" type carry objects
  303. =============
  304. */
  305. carryObjectProxThink()
  306. {
  307. //self thread carryObjectProxThinkInstant();
  308. self thread carryObjectProxThinkDelayed();
  309. }
  310.  
  311. carryObjectProxThinkInstant()
  312. {
  313. level endon ( "game_ended" );
  314.  
  315. while ( true )
  316. {
  317. self.trigger waittill ( "trigger", player );
  318.  
  319. if ( self.isResetting )
  320. continue;
  321.  
  322. if ( !isReallyAlive( player ) )
  323. continue;
  324.  
  325. if ( !self canInteractWith( player.pers["team"] ) )
  326. continue;
  327.  
  328. if ( !player.canPickupObject )
  329. continue;
  330.  
  331. if ( isDefined( player.throwingGrenade ) )
  332. continue;
  333.  
  334. if ( isDefined( self.carrier ) )
  335. continue;
  336.  
  337. self setPickedUp( player );
  338. }
  339. }
  340.  
  341. carryObjectProxThinkDelayed()
  342. {
  343. level endon ( "game_ended" );
  344.  
  345. self thread Proxtriggerthink();
  346.  
  347. while ( true )
  348. {
  349. if ( self.useTime && self.curProgress >= self.useTime )
  350. {
  351. self.curProgress = 0;
  352.  
  353. creditPlayer = getEarliestClaimPlayer();
  354.  
  355. if ( isDefined( self.onEndUse ) )
  356. self [[self.onEndUse]]( self getClaimTeam(), creditPlayer, isDefined( creditPlayer ) );
  357.  
  358. if ( isDefined( creditPlayer ) )
  359. self setPickedUp( creditPlayer );
  360.  
  361. self setClaimTeam( "none" );
  362. self.claimPlayer = undefined;
  363. }
  364.  
  365. if ( self.claimTeam != "none" )
  366. {
  367. if ( self.useTime )
  368. {
  369. if ( !self.numTouching[self.claimTeam] )
  370. {
  371. if ( isDefined( self.onEndUse ) )
  372. self [[self.onEndUse]]( self getClaimTeam(), self.claimPlayer, false );
  373.  
  374. self setClaimTeam( "none" );
  375. self.claimPlayer = undefined;
  376. }
  377. else
  378. {
  379. self.curProgress += (50 * self.useRate);
  380. if ( isDefined( self.onUseUpdate ) )
  381. self [[self.onUseUpdate]]( self getClaimTeam(), self.curProgress / self.useTime, (50*self.useRate) / self.useTime );
  382. }
  383. }
  384. else
  385. {
  386. if ( isReallyAlive( self.claimPlayer ) )
  387. self setPickedUp( self.claimPlayer );
  388.  
  389. self setClaimTeam( "none" );
  390. self.claimPlayer = undefined;
  391. }
  392. }
  393.  
  394. wait ( 0.05 );
  395. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  396. }
  397. }
  398.  
  399.  
  400.  
  401. /*
  402. =============
  403. pickupObjectDelay
  404.  
  405. Temporarily disallows picking up of "proximity" type objects
  406. =============
  407. */
  408. pickupObjectDelay( origin )
  409. {
  410. level endon ( "game_ended" );
  411.  
  412. self endon("death");
  413. self endon("disconnect");
  414.  
  415. self.canPickupObject = false;
  416.  
  417. for( ;; )
  418. {
  419. if ( distanceSquared( self.origin, origin ) > 64*64 )
  420. break;
  421.  
  422. wait 0.2;
  423. }
  424.  
  425. self.canPickupObject = true;
  426. }
  427.  
  428.  
  429. /*
  430. =============
  431. setPickedUp
  432.  
  433. Sets this object as picked up by passed player
  434. =============
  435. */
  436. setPickedUp( player )
  437. {
  438. assert( isReallyAlive( player ) );
  439.  
  440. if ( isDefined( player.carryObject ) )
  441. {
  442. if ( isDefined( self.onPickupFailed ) )
  443. self [[self.onPickupFailed]]( player );
  444.  
  445. return;
  446. }
  447.  
  448. player giveObject( self );
  449.  
  450. self setCarrier( player );
  451.  
  452. for ( index = 0; index < self.visuals.size; index++ )
  453. self.visuals[index] hide();
  454.  
  455. self.trigger.origin += (0,0,10000);
  456.  
  457. self notify ( "pickup_object" );
  458. if ( isDefined( self.onPickup ) )
  459. self [[self.onPickup]]( player );
  460.  
  461. self updateCompassIcons();
  462. self updateWorldIcons();
  463. }
  464.  
  465.  
  466. updateCarryObjectOrigin()
  467. {
  468. level endon ( "game_ended" );
  469.  
  470. objPingDelay = 5.0;
  471. for ( ;; )
  472. {
  473. if ( isDefined( self.carrier ) )
  474. {
  475. self.curOrigin = self.carrier.origin + (0,0,75);
  476. self.objPoints["allies"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin );
  477. self.objPoints["axis"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin );
  478.  
  479. if ( (self.visibleTeam == "friendly" || self.visibleTeam == "any") && self isFriendlyTeam( "allies" ) && self.objIDPingFriendly )
  480. {
  481. if ( self.objPoints["allies"].isShown )
  482. {
  483. self.objPoints["allies"].alpha = self.objPoints["allies"].baseAlpha;
  484. self.objPoints["allies"] fadeOverTime( objPingDelay + 1.0 );
  485. self.objPoints["allies"].alpha = 0;
  486. }
  487. objective_position( self.objIDAllies, self.curOrigin );
  488. }
  489. else if ( (self.visibleTeam == "friendly" || self.visibleTeam == "any") && self isFriendlyTeam( "axis" ) && self.objIDPingFriendly )
  490. {
  491. if ( self.objPoints["axis"].isShown )
  492. {
  493. self.objPoints["axis"].alpha = self.objPoints["axis"].baseAlpha;
  494. self.objPoints["axis"] fadeOverTime( objPingDelay + 1.0 );
  495. self.objPoints["axis"].alpha = 0;
  496. }
  497. objective_position( self.objIDAxis, self.curOrigin );
  498. }
  499.  
  500. if ( (self.visibleTeam == "enemy" || self.visibleTeam == "any") && !self isFriendlyTeam( "allies" ) && self.objIDPingEnemy )
  501. {
  502. if ( self.objPoints["allies"].isShown )
  503. {
  504. self.objPoints["allies"].alpha = self.objPoints["allies"].baseAlpha;
  505. self.objPoints["allies"] fadeOverTime( objPingDelay + 1.0 );
  506. self.objPoints["allies"].alpha = 0;
  507. }
  508. objective_position( self.objIDAllies, self.curOrigin );
  509. }
  510. else if ( (self.visibleTeam == "enemy" || self.visibleTeam == "any") && !self isFriendlyTeam( "axis" ) && self.objIDPingEnemy )
  511. {
  512. if ( self.objPoints["axis"].isShown )
  513. {
  514. self.objPoints["axis"].alpha = self.objPoints["axis"].baseAlpha;
  515. self.objPoints["axis"] fadeOverTime( objPingDelay + 1.0 );
  516. self.objPoints["axis"].alpha = 0;
  517. }
  518. objective_position( self.objIDAxis, self.curOrigin );
  519. }
  520.  
  521. self wait_endon( objPingDelay, "dropped", "reset" );
  522. }
  523. else
  524. {
  525. self.objPoints["allies"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin + self.offset3d );
  526. self.objPoints["axis"] maps\mp\gametypes\_objpoints::updateOrigin( self.curOrigin + self.offset3d );
  527.  
  528. wait ( 0.05 );
  529. }
  530. }
  531. }
  532.  
  533.  
  534. /*
  535. =============
  536. giveObject
  537.  
  538. Set player as holding this object
  539. Should only be called from setPickedUp
  540. =============
  541. */
  542. giveObject( object )
  543. {
  544. assert( !isDefined( self.carryObject ) );
  545.  
  546. self.carryObject = object;
  547. self thread trackCarrier();
  548.  
  549. if ( !object.allowWeapons )
  550. {
  551. self _disableWeapon();
  552. self thread manualDropThink();
  553. }
  554.  
  555. if ( isDefined( object.carryIcon ) )
  556. {
  557. if ( level.splitscreen )
  558. {
  559. self.carryIcon = createIcon( object.carryIcon, 33, 33 );
  560. self.carryIcon setPoint( "BOTTOM RIGHT", "BOTTOM RIGHT", 0, -78 );
  561. }
  562. else
  563. {
  564. self.carryIcon = createIcon( object.carryIcon, 50, 50 );
  565. self.carryIcon setPoint( "BOTTOM", "BOTTOM", 85, -62 );
  566. }
  567.  
  568. self.carryIcon.hidewheninmenu = true;
  569. }
  570. }
  571.  
  572.  
  573. /*
  574. =============
  575. returnHome
  576.  
  577. Resets a carryObject to it's default home position
  578. =============
  579. */
  580. returnHome()
  581. {
  582. self.isResetting = true;
  583.  
  584. self notify ( "reset" );
  585. for ( index = 0; index < self.visuals.size; index++ )
  586. {
  587. self.visuals[index].origin = self.visuals[index].baseOrigin;
  588. self.visuals[index].angles = self.visuals[index].baseAngles;
  589. self.visuals[index] show();
  590. }
  591. self.trigger.origin = self.trigger.baseOrigin;
  592.  
  593. self.curOrigin = self.trigger.origin;
  594.  
  595. if ( isDefined( self.onReset ) )
  596. self [[self.onReset]]();
  597.  
  598. self clearCarrier();
  599.  
  600. updateWorldIcons();
  601. updateCompassIcons();
  602.  
  603. self.isResetting = false;
  604. }
  605.  
  606.  
  607. isHome()
  608. {
  609. if ( isDefined( self.carrier ) )
  610. return false;
  611.  
  612. if ( self.curOrigin != self.trigger.baseOrigin )
  613. return false;
  614.  
  615. return true;
  616. }
  617.  
  618. /*
  619. =============
  620. setPosition
  621.  
  622. set a carryObject to a new position
  623. =============
  624. */
  625. setPosition( origin, angles )
  626. {
  627. self.isResetting = true;
  628.  
  629. for ( index = 0; index < self.visuals.size; index++ )
  630. {
  631. self.visuals[index].origin = self.origin;
  632. self.visuals[index].angles = self.angles;
  633. self.visuals[index] show();
  634. }
  635. self.trigger.origin = origin;
  636.  
  637. self.curOrigin = self.trigger.origin;
  638.  
  639. self clearCarrier();
  640.  
  641. updateWorldIcons();
  642. updateCompassIcons();
  643.  
  644. self.isResetting = false;
  645. }
  646.  
  647. onPlayerLastStand()
  648. {
  649. if ( isDefined( self.carryObject ) )
  650. {
  651. assert( self.carryObject.carrier == self );
  652. self.carryObject thread setDropped();
  653. }
  654. }
  655.  
  656. /*
  657. =============
  658. setDropped
  659.  
  660. Sets this carry object as dropped and calculates dropped position
  661. =============
  662. */
  663. setDropped()
  664. {
  665. self.isResetting = true;
  666.  
  667. self notify ( "dropped" );
  668.  
  669. // trace = bulletTrace( self.safeOrigin + (0,0,20), self.safeOrigin - (0,0,20), false, undefined );
  670. if ( isDefined( self.carrier ) )
  671. {
  672. trace = playerPhysicsTrace( self.carrier.origin + (0,0,20), self.carrier.origin - (0,0,2000), false, self.carrier.body );
  673. angleTrace = bulletTrace( self.carrier.origin + (0,0,20), self.carrier.origin - (0,0,2000), false, self.carrier.body );
  674. }
  675. else
  676. {
  677. trace = playerPhysicsTrace( self.safeOrigin + (0,0,20), self.safeOrigin - (0,0,20), false, undefined );
  678. angleTrace = bulletTrace( self.safeOrigin + (0,0,20), self.safeOrigin - (0,0,20), false, undefined );
  679. }
  680.  
  681. droppingPlayer = self.carrier;
  682. touchingBadTrigger = false;
  683.  
  684. if ( isDefined( trace ) )
  685. {
  686. tempAngle = randomfloat( 360 );
  687.  
  688. dropOrigin = trace;
  689. if ( angleTrace["fraction"] < 1 && distance( angleTrace["position"], trace ) < 10.0 )
  690. {
  691. forward = (cos( tempAngle ), sin( tempAngle ), 0);
  692. forward = vectornormalize( forward - common_scripts\utility::vector_multiply( angleTrace["normal"], vectordot( forward, angleTrace["normal"] ) ) );
  693. dropAngles = vectortoangles( forward );
  694. }
  695. else
  696. {
  697. dropAngles = (0,tempAngle,0);
  698. }
  699.  
  700. for ( index = 0; index < self.visuals.size; index++ )
  701. {
  702. self.visuals[index].origin = dropOrigin;
  703. self.visuals[index].angles = dropAngles;
  704. self.visuals[index] show();
  705. }
  706. self.trigger.origin = dropOrigin;
  707.  
  708. self.curOrigin = self.trigger.origin;
  709.  
  710. self thread pickupTimeout();
  711. }
  712.  
  713. if ( !isDefined( trace ) )
  714. {
  715. for ( index = 0; index < self.visuals.size; index++ )
  716. {
  717. self.visuals[index].origin = self.visuals[index].baseOrigin;
  718. self.visuals[index].angles = self.visuals[index].baseAngles;
  719. self.visuals[index] show();
  720. }
  721. self.trigger.origin = self.trigger.baseOrigin;
  722.  
  723. self.curOrigin = self.trigger.baseOrigin;
  724. }
  725.  
  726. if ( isDefined( self.onDrop ) )
  727. self [[self.onDrop]]( droppingPlayer );
  728.  
  729. self clearCarrier();
  730.  
  731. self updateCompassIcons();
  732. self updateWorldIcons();
  733.  
  734. self.isResetting = false;
  735. }
  736.  
  737.  
  738.  
  739. setCarrier( carrier )
  740. {
  741. self.carrier = carrier;
  742.  
  743. self thread updateVisibilityAccordingToRadar();
  744. }
  745.  
  746.  
  747. clearCarrier()
  748. {
  749. if ( !isdefined( self.carrier ) )
  750. return;
  751.  
  752. self.carrier takeObject( self );
  753.  
  754. self.carrier = undefined;
  755.  
  756. self notify("carrier_cleared");
  757. }
  758.  
  759.  
  760. pickupTimeout()
  761. {
  762. self endon ( "pickup_object" );
  763. self endon ( "stop_pickup_timeout" );
  764.  
  765. wait ( 0.05 );
  766.  
  767. mineTriggers = getEntArray( "minefield", "targetname" );
  768. hurtTriggers = getEntArray( "trigger_hurt", "classname" );
  769. radTriggers = getEntArray( "radiation", "targetname" );
  770.  
  771. for ( index = 0; index < radTriggers.size; index++ )
  772. {
  773. if ( !self.visuals[0] isTouching( radTriggers[index] ) )
  774. continue;
  775.  
  776. self returnHome();
  777. return;
  778. }
  779.  
  780. for ( index = 0; index < mineTriggers.size; index++ )
  781. {
  782. if ( !self.visuals[0] isTouching( mineTriggers[index] ) )
  783. continue;
  784.  
  785. self returnHome();
  786. return;
  787. }
  788.  
  789. for ( index = 0; index < hurtTriggers.size; index++ )
  790. {
  791. if ( !self.visuals[0] isTouching( hurtTriggers[index] ) )
  792. continue;
  793.  
  794. self returnHome();
  795. return;
  796. }
  797.  
  798. if ( isDefined( self.autoResetTime ) )
  799. {
  800. wait ( self.autoResetTime );
  801.  
  802. if ( !isDefined( self.carrier ) )
  803. self returnHome();
  804. }
  805. }
  806.  
  807. /*
  808. =============
  809. takeObject
  810.  
  811. Set player as dropping this object
  812. =============
  813. */
  814. takeObject( object )
  815. {
  816. if ( isDefined( self.carryIcon ) )
  817. self.carryIcon destroyElem();
  818.  
  819. if ( isDefined( self ) )
  820. self.carryObject = undefined;
  821.  
  822. self notify ( "drop_object" );
  823.  
  824. if ( object.triggerType == "proximity" )
  825. self thread pickupObjectDelay( object.trigger.origin );
  826.  
  827. if ( isReallyAlive( self ) && !object.allowWeapons )
  828. {
  829. self _enableWeapon();
  830. }
  831. }
  832.  
  833.  
  834. /*
  835. =============
  836. trackCarrier
  837.  
  838. Calculates and updates a safe drop origin for a carry object based on the current carriers position
  839. =============
  840. */
  841. trackCarrier()
  842. {
  843. level endon ( "game_ended" );
  844. self endon ( "disconnect" );
  845. self endon ( "death" );
  846. self endon ( "drop_object" );
  847.  
  848. while ( isDefined( self.carryObject ) && isReallyAlive( self ) )
  849. {
  850. if ( self isOnGround() )
  851. {
  852. trace = bulletTrace( self.origin + (0,0,20), self.origin - (0,0,20), false, undefined );
  853. if ( trace["fraction"] < 1 ) // if there is ground at the player's origin (not necessarily true just because of isOnGround)
  854. self.carryObject.safeOrigin = trace["position"];
  855. }
  856. wait ( 0.05 );
  857. }
  858. }
  859.  
  860.  
  861. /*
  862. =============
  863. manualDropThink
  864.  
  865. Allows the player to manually drop this object by pressing the fire button
  866. Does not allow drop if the use button is pressed
  867. =============
  868. */
  869. manualDropThink()
  870. {
  871. level endon ( "game_ended" );
  872.  
  873. self endon ( "disconnect" );
  874. self endon ( "death" );
  875. self endon ( "drop_object" );
  876.  
  877. for( ;; )
  878. {
  879. while ( self attackButtonPressed() || self fragButtonPressed() || self secondaryOffhandButtonPressed() || self meleeButtonPressed() )
  880. wait .05;
  881.  
  882. while ( !self attackButtonPressed() && !self fragButtonPressed() && !self secondaryOffhandButtonPressed() && !self meleeButtonPressed() )
  883. wait .05;
  884.  
  885. if ( isDefined( self.carryObject ) && !self useButtonPressed() )
  886. self.carryObject thread setDropped();
  887. }
  888. }
  889.  
  890.  
  891. deleteUseObject()
  892. {
  893. objective_delete( self.objIDAllies );
  894. objective_delete( self.objIDAxis );
  895.  
  896. maps\mp\gametypes\_objpoints::deleteObjPoint( self.objPoints["allies"] );
  897. maps\mp\gametypes\_objpoints::deleteObjPoint( self.objPoints["axis"] );
  898.  
  899. self.trigger = undefined;
  900.  
  901. self notify ( "deleted" );
  902. }
  903.  
  904. /*
  905. =============
  906. createUseObject
  907.  
  908. Creates and returns a use object
  909. =============
  910. */
  911. createUseObject( ownerTeam, trigger, visuals, offset )
  912. {
  913. useObject = spawnStruct();
  914. useObject.type = "useObject";
  915. useObject.curOrigin = trigger.origin;
  916. useObject.ownerTeam = ownerTeam;
  917. useObject.entNum = trigger getEntityNumber();
  918. useObject.keyObject = undefined;
  919.  
  920. if ( isSubStr( trigger.classname, "use" ) )
  921. useObject.triggerType = "use";
  922. else
  923. useObject.triggerType = "proximity";
  924.  
  925. // associated trigger
  926. useObject.trigger = trigger;
  927.  
  928. // associated visual object
  929. for ( index = 0; index < visuals.size; index++ )
  930. {
  931. visuals[index].baseOrigin = visuals[index].origin;
  932. visuals[index].baseAngles = visuals[index].angles;
  933. }
  934. useObject.visuals = visuals;
  935.  
  936. if ( !isDefined( offset ) )
  937. offset = (0,0,0);
  938.  
  939. useObject.offset3d = offset;
  940.  
  941. // compass objectives
  942. useObject.compassIcons = [];
  943. useObject.objIDAllies = getNextObjID();
  944. useObject.objIDAxis = getNextObjID();
  945.  
  946. objective_add( useObject.objIDAllies, "invisible", useObject.curOrigin );
  947. objective_add( useObject.objIDAxis, "invisible", useObject.curOrigin );
  948. objective_team( useObject.objIDAllies, "allies" );
  949. objective_team( useObject.objIDAxis, "axis" );
  950.  
  951. useObject.objPoints["allies"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_allies_" + useObject.entNum, useObject.curOrigin + offset, "allies", undefined );
  952. useObject.objPoints["axis"] = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_axis_" + useObject.entNum, useObject.curOrigin + offset, "axis", undefined );
  953.  
  954. useObject.objPoints["allies"].alpha = 0;
  955. useObject.objPoints["axis"].alpha = 0;
  956.  
  957. // misc
  958. useObject.interactTeam = "none"; // "none", "any", "friendly", "enemy";
  959.  
  960. // 3d world icons
  961. useObject.worldIcons = [];
  962. useObject.visibleTeam = "none"; // "none", "any", "friendly", "enemy";
  963.  
  964. // calbacks
  965. useObject.onUse = undefined;
  966. useObject.onCantUse = undefined;
  967.  
  968. useObject.useText = "default";
  969. useObject.useTime = 10000;
  970. useObject.curProgress = 0;
  971.  
  972. if ( useObject.triggerType == "proximity" )
  973. {
  974. useObject.teamUseTimes = [];
  975. useObject.teamUseTexts = [];
  976.  
  977. useObject.numTouching["neutral"] = 0;
  978. useObject.numTouching["axis"] = 0;
  979. useObject.numTouching["allies"] = 0;
  980. useObject.numTouching["none"] = 0;
  981. useObject.touchList["neutral"] = [];
  982. useObject.touchList["axis"] = [];
  983. useObject.touchList["allies"] = [];
  984. useObject.touchList["none"] = [];
  985. useObject.useRate = 0;
  986. useObject.claimTeam = "none";
  987. useObject.claimPlayer = undefined;
  988. useObject.lastClaimTeam = "none";
  989. useObject.lastClaimTime = 0;
  990.  
  991. useObject thread useObjectProxThink();
  992. }
  993. else
  994. {
  995. useObject.useRate = 1;
  996. useObject thread useObjectUseThink();
  997. }
  998.  
  999. return useObject;
  1000. }
  1001.  
  1002.  
  1003. /*
  1004. =============
  1005. setKeyObject
  1006.  
  1007. Sets this use object to require carry object
  1008. =============
  1009. */
  1010. setKeyObject( object )
  1011. {
  1012. self.keyObject = object;
  1013. }
  1014.  
  1015.  
  1016. /*
  1017. =============
  1018. useObjectUseThink
  1019.  
  1020. Think function for "use" type carry objects
  1021. =============
  1022. */
  1023. useObjectUseThink()
  1024. {
  1025. level endon ( "game_ended" );
  1026. self endon ( "deleted" );
  1027.  
  1028. while ( true )
  1029. {
  1030. self.trigger waittill ( "trigger", player );
  1031.  
  1032. if ( !isReallyAlive( player ) )
  1033. continue;
  1034.  
  1035. if ( !self canInteractWith( player.pers["team"] ) )
  1036. continue;
  1037.  
  1038. if ( !player isOnGround() )
  1039. continue;
  1040.  
  1041. if ( isSubStr( player getCurrentWeapon(), "killstreak" ) )
  1042. continue;
  1043.  
  1044. if ( isDefined( self.keyObject ) && (!isDefined( player.carryObject ) || player.carryObject != self.keyObject ) )
  1045. {
  1046. if ( isDefined( self.onCantUse ) )
  1047. self [[self.onCantUse]]( player );
  1048. continue;
  1049. }
  1050.  
  1051. if ( !player isWeaponEnabled() )
  1052. {
  1053. //player iPrintLnBold( "Action unavailable." );
  1054. continue;
  1055. }
  1056.  
  1057. result = true;
  1058. if ( self.useTime > 0 )
  1059. {
  1060. if ( isDefined( self.onBeginUse ) )
  1061. self [[self.onBeginUse]]( player );
  1062.  
  1063. if ( !isDefined( self.keyObject ) )
  1064. self thread cantUseHintThink();
  1065.  
  1066. team = player.pers["team"];
  1067.  
  1068. result = self useHoldThink( player );
  1069.  
  1070. self notify ( "finished_use" );
  1071.  
  1072. if ( isDefined( self.onEndUse ) )
  1073. self [[self.onEndUse]]( team, player, result );
  1074. }
  1075.  
  1076. if ( !result )
  1077. continue;
  1078.  
  1079. if ( isDefined( self.onUse ) )
  1080. self [[self.onUse]]( player );
  1081. }
  1082. }
  1083.  
  1084.  
  1085. cantUseHintThink()
  1086. {
  1087. level endon ( "game_ended" );
  1088. self endon ( "deleted" );
  1089. self endon ( "finished_use" );
  1090.  
  1091. while ( true )
  1092. {
  1093. self.trigger waittill ( "trigger", player );
  1094.  
  1095. if ( !isReallyAlive( player ) )
  1096. continue;
  1097.  
  1098. if ( !self canInteractWith( player.pers["team"] ) )
  1099. continue;
  1100.  
  1101. if ( isDefined( self.onCantUse ) )
  1102. self [[self.onCantUse]]( player );
  1103. }
  1104. }
  1105.  
  1106.  
  1107. getEarliestClaimPlayer()
  1108. {
  1109. assert( self.claimTeam != "none" );
  1110. team = self.claimTeam;
  1111.  
  1112. if ( isReallyAlive( self.claimPlayer ) )
  1113. earliestPlayer = self.claimPlayer;
  1114. else
  1115. earliestPlayer = undefined;
  1116.  
  1117. if ( self.touchList[team].size > 0 )
  1118. {
  1119. // find earliest touching player
  1120. earliestTime = undefined;
  1121. players = getArrayKeys( self.touchList[team] );
  1122. for ( index = 0; index < players.size; index++ )
  1123. {
  1124. touchdata = self.touchList[team][players[index]];
  1125. if ( isReallyAlive( players[index] ) && (!isDefined( earliestTime ) || touchdata.starttime < earliestTime) )
  1126. {
  1127. earliestPlayer = touchdata.player;
  1128. earliestTime = touchdata.starttime;
  1129. }
  1130. }
  1131. }
  1132.  
  1133. return earliestPlayer;
  1134. }
  1135.  
  1136.  
  1137. /*
  1138. =============
  1139. useObjectProxThink
  1140.  
  1141. Think function for "proximity" type carry objects
  1142. =============
  1143. */
  1144. useObjectProxThink()
  1145. {
  1146. level endon ( "game_ended" );
  1147. self endon ( "deleted" );
  1148.  
  1149. self thread proxTriggerThink();
  1150.  
  1151. while ( true )
  1152. {
  1153. if ( self.useTime && self.curProgress >= self.useTime )
  1154. {
  1155. self.curProgress = 0;
  1156.  
  1157. creditPlayer = getEarliestClaimPlayer();
  1158.  
  1159. if ( isDefined( self.onEndUse ) )
  1160. self [[self.onEndUse]]( self getClaimTeam(), creditPlayer, isDefined( creditPlayer ) );
  1161.  
  1162. if ( isDefined( creditPlayer ) && isDefined( self.onUse ) )
  1163. self [[self.onUse]]( creditPlayer );
  1164.  
  1165. self setClaimTeam( "none" );
  1166. self.claimPlayer = undefined;
  1167. }
  1168.  
  1169. if ( self.claimTeam != "none" )
  1170. {
  1171. if ( self.useTime )
  1172. {
  1173. if ( !self.numTouching[self.claimTeam] )
  1174. {
  1175. if ( isDefined( self.onEndUse ) )
  1176. self [[self.onEndUse]]( self getClaimTeam(), self.claimPlayer, false );
  1177.  
  1178. self setClaimTeam( "none" );
  1179. self.claimPlayer = undefined;
  1180. }
  1181. else
  1182. {
  1183. self.curProgress += (50 * self.useRate);
  1184. if ( isDefined( self.onUseUpdate ) )
  1185. self [[self.onUseUpdate]]( self getClaimTeam(), self.curProgress / self.useTime, (50*self.useRate) / self.useTime );
  1186. }
  1187. }
  1188. else
  1189. {
  1190. if ( isDefined( self.onUse ) )
  1191. self [[self.onUse]]( self.claimPlayer );
  1192.  
  1193. self setClaimTeam( "none" );
  1194. self.claimPlayer = undefined;
  1195. }
  1196. }
  1197.  
  1198. wait ( 0.05 );
  1199. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  1200. }
  1201. }
  1202.  
  1203.  
  1204. /*
  1205. =============
  1206. proxTriggerThink ("proximity" only)
  1207.  
  1208. Handles setting the current claiming team and player, as well as starting threads to track players touching the trigger
  1209. =============
  1210. */
  1211. proxTriggerThink()
  1212. {
  1213. level endon ( "game_ended" );
  1214. self endon ( "deleted" );
  1215.  
  1216. entityNumber = self.entNum;
  1217.  
  1218. while ( true )
  1219. {
  1220. self.trigger waittill ( "trigger", player );
  1221.  
  1222. if ( !isReallyAlive( player ) )
  1223. continue;
  1224.  
  1225. if ( isDefined( self.carrier ) )
  1226. continue;
  1227.  
  1228. if ( player isUsingRemote() )
  1229. continue;
  1230.  
  1231. if ( self canInteractWith( player.pers["team"], player ) && self.claimTeam == "none" )
  1232. {
  1233. if ( !isDefined( self.keyObject ) || (isDefined( player.carryObject ) && player.carryObject == self.keyObject ) )
  1234. {
  1235. setClaimTeam( player.pers["team"] );
  1236. self.claimPlayer = player;
  1237.  
  1238. relativeTeam = self getRelativeTeam( player.pers["team"] );
  1239. if ( isDefined( self.teamUseTimes[relativeTeam] ) )
  1240. self.useTime = self.teamUseTimes[relativeTeam];
  1241. // TODO we don't store the base self.useTime setting... we should.
  1242.  
  1243. if ( self.useTime && isDefined( self.onBeginUse ) )
  1244. self [[self.onBeginUse]]( self.claimPlayer );
  1245. }
  1246. else
  1247. {
  1248. if ( isDefined( self.onCantUse ) )
  1249. self [[self.onCantUse]]( player );
  1250. }
  1251. }
  1252.  
  1253. if ( self.useTime && isReallyAlive( player ) && !isDefined( player.touchTriggers[entityNumber] ) )
  1254. player thread triggerTouchThink( self );
  1255. }
  1256. }
  1257.  
  1258.  
  1259. /*
  1260. =============
  1261. setClaimTeam ("proximity" only)
  1262.  
  1263. Sets this object as claimed by specified team including grace period to prevent
  1264. object reset when claiming team leave trigger for short periods of time
  1265. =============
  1266. */
  1267. setClaimTeam( newTeam )
  1268. {
  1269. assert( newTeam != self.claimTeam );
  1270.  
  1271. if ( self.claimTeam == "none" && getTime() - self.lastClaimTime > 1000 )
  1272. self.curProgress = 0;
  1273. else if ( newTeam != "none" && newTeam != self.lastClaimTeam )
  1274. self.curProgress = 0;
  1275.  
  1276. self.lastClaimTeam = self.claimTeam;
  1277. self.lastClaimTime = getTime();
  1278. self.claimTeam = newTeam;
  1279.  
  1280. self updateUseRate();
  1281. }
  1282.  
  1283.  
  1284. getClaimTeam()
  1285. {
  1286. return self.claimTeam;
  1287. }
  1288.  
  1289. /*
  1290. =============
  1291. triggerTouchThink ("proximity" only)
  1292.  
  1293. Updates use object while player is touching the trigger and updates the players visual use bar
  1294. =============
  1295. */
  1296. triggerTouchThink( object )
  1297. {
  1298. team = self.pers["team"];
  1299.  
  1300. object.numTouching[team]++;
  1301.  
  1302. touchName = self.guid;
  1303. struct = spawnstruct();
  1304. struct.player = self;
  1305. struct.starttime = gettime();
  1306. object.touchList[team][touchName] = struct;
  1307.  
  1308. if( !isDefined( object.noUseBar ) )
  1309. object.noUseBar = false;
  1310.  
  1311. self.touchTriggers[object.entNum] = object.trigger;
  1312.  
  1313. object updateUseRate();
  1314.  
  1315. while ( isReallyAlive( self ) && isDefined( object.trigger ) && self isTouching( object.trigger ) && !level.gameEnded && object.useTime )
  1316. {
  1317. self updateProxBar( object, false );
  1318. wait ( 0.05 );
  1319. }
  1320.  
  1321. // disconnected player will skip this code
  1322. if ( isDefined( self ) )
  1323. {
  1324. self updateProxBar( object, true );
  1325. self.touchTriggers[object.entNum] = undefined;
  1326. }
  1327.  
  1328. if ( level.gameEnded )
  1329. return;
  1330.  
  1331. object.touchList[team][touchName] = undefined;
  1332.  
  1333. object.numTouching[team]--;
  1334. object updateUseRate();
  1335. }
  1336.  
  1337.  
  1338. /*
  1339. =============
  1340. updateProxBar ("proximity" only)
  1341.  
  1342. Updates drawing of the players use bar when using a use object
  1343. to disable set noUseBar on object
  1344. =============
  1345. */
  1346. updateProxBar( object, forceRemove )
  1347. {
  1348. if ( forceRemove || !object canInteractWith( self.pers["team"] ) || self.pers["team"] != object.claimTeam || object.noUseBar )
  1349. {
  1350. if ( isDefined( self.proxBar ) )
  1351. self.proxBar hideElem();
  1352.  
  1353. if ( isDefined( self.proxBarText ) )
  1354. self.proxBarText hideElem();
  1355. return;
  1356. }
  1357.  
  1358. if ( !isDefined( self.proxBar ) )
  1359. {
  1360. self.proxBar = createPrimaryProgressBar();
  1361. self.proxBar.lastUseRate = -1;
  1362. self.proxBar.lastHostMigrationState = false;
  1363. }
  1364.  
  1365. if ( self.proxBar.hidden )
  1366. {
  1367. self.proxBar showElem();
  1368. self.proxBar.lastUseRate = -1;
  1369. self.proxBar.lastHostMigrationState = false;
  1370. }
  1371.  
  1372. if ( !isDefined( self.proxBarText ) )
  1373. {
  1374. self.proxBarText = createPrimaryProgressBarText();
  1375.  
  1376. relativeTeam = object getRelativeTeam( self.pers["team"] );
  1377.  
  1378. if ( isDefined( object.teamUseTexts[relativeTeam] ) )
  1379. self.proxBarText setText( object.teamUseTexts[relativeTeam] );
  1380. else
  1381. self.proxBarText setText( object.useText );
  1382. }
  1383.  
  1384. if ( self.proxBarText.hidden )
  1385. {
  1386. self.proxBarText showElem();
  1387.  
  1388. relativeTeam = object getRelativeTeam( self.pers["team"] );
  1389.  
  1390. if ( isDefined( object.teamUseTexts[relativeTeam] ) )
  1391. self.proxBarText setText( object.teamUseTexts[relativeTeam] );
  1392. else
  1393. self.proxBarText setText( object.useText );
  1394. }
  1395.  
  1396. if ( self.proxBar.lastUseRate != object.useRate || self.proxBar.lastHostMigrationState != isDefined( level.hostMigrationTimer ) )
  1397. {
  1398. if( object.curProgress > object.useTime)
  1399. object.curProgress = object.useTime;
  1400.  
  1401. progress = object.curProgress / object.useTime;
  1402. rate = (1000 / object.useTime) * object.useRate;
  1403. if ( isDefined( level.hostMigrationTimer ) )
  1404. rate = 0;
  1405.  
  1406. self.proxBar updateBar( progress, rate );
  1407.  
  1408. self.proxBar.lastUseRate = object.useRate;
  1409.  
  1410. self.proxBar.lastHostMigrationState = isDefined( level.hostMigrationTimer );
  1411. }
  1412. }
  1413.  
  1414.  
  1415. /*
  1416. =============
  1417. updateUseRate ("proximity" only)
  1418.  
  1419. Handles the rate a which a use objects progress bar is filled based on the number of players touching the trigger
  1420. Stops updating if an enemy is touching the trigger
  1421. =============
  1422. */
  1423. updateUseRate( )
  1424. {
  1425. numClaimants = self.numTouching[self.claimTeam];
  1426. numOther = 0;
  1427. hasObjScale = 0;
  1428.  
  1429. if ( self.claimTeam != "axis" )
  1430. numOther += self.numTouching["axis"];
  1431. if ( self.claimTeam != "allies" )
  1432. numOther += self.numTouching["allies"];
  1433.  
  1434. foreach (struct in self.touchList[self.claimteam])
  1435. {
  1436. if (struct.player.pers["team"] != self.claimteam)
  1437. continue;
  1438.  
  1439. if (struct.player.objectiveScaler == 1)
  1440. continue;
  1441.  
  1442. numClaimants *= struct.player.objectiveScaler;
  1443. hasObjScale = struct.player.objectiveScaler;
  1444. }
  1445.  
  1446. self.useRate = 0;
  1447.  
  1448. if ( numClaimants && !numOther )
  1449. self.useRate = min( numClaimants, 4 );
  1450.  
  1451. if ( isDefined( self.isArena ) && self.isArena && hasObjScale != 0 )
  1452. self.useRate = 1 * hasObjScale;
  1453. else if ( isDefined( self.isArena ) && self.isArena )
  1454. self.useRate = 1;
  1455. }
  1456.  
  1457.  
  1458. attachUseModel()
  1459. {
  1460. self endon("death");
  1461. self endon("disconnect");
  1462. self endon("done_using");
  1463.  
  1464. wait 1.3;
  1465.  
  1466. self attach( "prop_suitcase_bomb", "tag_inhand", true );
  1467. self.attachedUseModel = "prop_suitcase_bomb";
  1468. }
  1469.  
  1470. /*
  1471. =============
  1472. useHoldThink
  1473.  
  1474. Claims the use trigger for player and displays a use bar
  1475. Returns true if the player sucessfully fills the use bar
  1476. =============
  1477. */
  1478. useHoldThink( player )
  1479. {
  1480. player notify ( "use_hold" );
  1481. player playerLinkTo( self.trigger );
  1482. player PlayerLinkedOffsetEnable();
  1483. player clientClaimTrigger( self.trigger );
  1484. player.claimTrigger = self.trigger;
  1485.  
  1486. useWeapon = self.useWeapon;
  1487. lastWeapon = player getCurrentWeapon();
  1488.  
  1489. if ( isDefined( useWeapon ) )
  1490. {
  1491. assert( isDefined( lastWeapon ) );
  1492. if ( lastWeapon == useWeapon )
  1493. {
  1494. assert( isdefined( player.lastNonUseWeapon ) );
  1495. lastWeapon = player.lastNonUseWeapon;
  1496. }
  1497. assert( lastWeapon != useWeapon );
  1498.  
  1499. player.lastNonUseWeapon = lastWeapon;
  1500.  
  1501. player _giveWeapon( useWeapon );
  1502. player setWeaponAmmoStock( useWeapon, 0 );
  1503. player setWeaponAmmoClip( useWeapon, 0 );
  1504. player switchToWeapon( useWeapon );
  1505.  
  1506. player thread attachUseModel();
  1507. }
  1508. else
  1509. {
  1510. player _disableWeapon();
  1511. }
  1512.  
  1513. self.curProgress = 0;
  1514. self.inUse = true;
  1515. self.useRate = 0;
  1516.  
  1517. player thread personalUseBar( self );
  1518.  
  1519. result = useHoldThinkLoop( player, lastWeapon );
  1520.  
  1521. if ( isDefined( player ) )
  1522. {
  1523. player detachUseModels();
  1524. player notify( "done_using" );
  1525. }
  1526.  
  1527. // result may be undefined if useholdthinkloop hits an endon
  1528.  
  1529. if ( isDefined( useWeapon ) && isDefined( player ) )
  1530. player thread takeUseWeapon( useWeapon );
  1531.  
  1532. if ( isDefined( result ) && result )
  1533. return true;
  1534.  
  1535. if ( isDefined( player ) )
  1536. {
  1537. player.claimTrigger = undefined;
  1538. if ( isDefined( useWeapon ) )
  1539. {
  1540. if ( lastWeapon != "none" )
  1541. player switchToWeapon( lastWeapon );
  1542. else
  1543. player takeWeapon( useWeapon );
  1544.  
  1545. // while ( player getCurrentWeapon() == useWeapon && isReallyAlive( player ) )
  1546. // wait ( 0.05 );
  1547. }
  1548. else
  1549. {
  1550. player _enableWeapon();
  1551. }
  1552.  
  1553. player unlink();
  1554.  
  1555. if ( !isReallyAlive( player ) )
  1556. player.killedInUse = true;
  1557. }
  1558.  
  1559. self.inUse = false;
  1560. self.trigger releaseClaimedTrigger();
  1561. return false;
  1562. }
  1563.  
  1564. detachUseModels()
  1565. {
  1566. if ( isDefined( self.attachedUseModel ) )
  1567. {
  1568. self detach( self.attachedUseModel, "tag_inhand" );
  1569. self.attachedUseModel = undefined;
  1570. }
  1571. }
  1572.  
  1573. takeUseWeapon( useWeapon )
  1574. {
  1575. self endon( "use_hold" );
  1576. self endon( "death" );
  1577. self endon( "disconnect" );
  1578. level endon( "game_ended" );
  1579.  
  1580. while ( self getCurrentWeapon() == useWeapon && !isDefined( self.throwingGrenade ) )
  1581. wait ( 0.05 );
  1582.  
  1583. self takeWeapon( useWeapon );
  1584. }
  1585.  
  1586. useHoldThinkLoop( player, lastWeapon )
  1587. {
  1588. level endon ( "game_ended" );
  1589. self endon("disabled");
  1590.  
  1591. useWeapon = self.useWeapon;
  1592. waitForWeapon = true;
  1593. timedOut = 0;
  1594.  
  1595. maxWaitTime = 1.5; // must be greater than the putaway timer for all weapons
  1596.  
  1597. while( isReallyAlive( player ) && player isTouching( self.trigger ) && player useButtonPressed() && !isDefined( player.throwingGrenade ) && !player meleeButtonPressed() && self.curProgress < self.useTime && (self.useRate || waitForWeapon) && !(waitForWeapon && timedOut > maxWaitTime) )
  1598. {
  1599. timedOut += 0.05;
  1600.  
  1601. if ( !isDefined( useWeapon ) || player getCurrentWeapon() == useWeapon )
  1602. {
  1603. self.curProgress += (50 * self.useRate);
  1604. self.useRate = 1 * player.objectiveScaler;
  1605. waitForWeapon = false;
  1606. }
  1607. else
  1608. {
  1609. self.useRate = 0;
  1610. }
  1611.  
  1612. if ( self.curProgress >= self.useTime )
  1613. {
  1614. self.inUse = false;
  1615. player clientReleaseTrigger( self.trigger );
  1616. player.claimTrigger = undefined;
  1617.  
  1618. if ( isDefined( useWeapon ) )
  1619. {
  1620. player setWeaponAmmoStock( useWeapon, 1 );
  1621. player setWeaponAmmoClip( useWeapon, 1 );
  1622. if ( lastWeapon != "none" )
  1623. player switchToWeapon( lastWeapon );
  1624. else
  1625. player takeWeapon( useWeapon );
  1626. }
  1627. else
  1628. {
  1629. player _enableWeapon();
  1630. }
  1631. player unlink();
  1632.  
  1633. return isReallyAlive( player );
  1634. }
  1635.  
  1636. wait 0.05;
  1637. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  1638. }
  1639.  
  1640. return false;
  1641. }
  1642.  
  1643. /*
  1644. =============
  1645. personalUseBar
  1646.  
  1647. Displays and updates a players use bar
  1648. =============
  1649. */
  1650. personalUseBar( object )
  1651. {
  1652. self endon("disconnect");
  1653.  
  1654. useBar = createPrimaryProgressBar();
  1655. useBarText = createPrimaryProgressBarText();
  1656. useBarText setText( object.useText );
  1657.  
  1658. lastRate = -1;
  1659. lastHostMigrationState = isDefined( level.hostMigrationTimer );
  1660. while ( isReallyAlive( self ) && object.inUse && !level.gameEnded )
  1661. {
  1662. if ( lastRate != object.useRate || lastHostMigrationState != isDefined( level.hostMigrationTimer ) )
  1663. {
  1664. if( object.curProgress > object.useTime)
  1665. object.curProgress = object.useTime;
  1666.  
  1667. progress = object.curProgress / object.useTime;
  1668. rate = (1000 / object.useTime) * object.useRate;
  1669. if ( isDefined( level.hostMigrationTimer ) )
  1670. rate = 0;
  1671.  
  1672. useBar updateBar( progress, rate );
  1673.  
  1674. if ( !object.useRate )
  1675. {
  1676. useBar hideElem();
  1677. useBarText hideElem();
  1678. }
  1679. else
  1680. {
  1681. useBar showElem();
  1682. useBarText showElem();
  1683. }
  1684. }
  1685. lastRate = object.useRate;
  1686. lastHostMigrationState = isDefined( level.hostMigrationTimer );
  1687. wait ( 0.05 );
  1688. }
  1689.  
  1690. useBar destroyElem();
  1691. useBarText destroyElem();
  1692. }
  1693.  
  1694.  
  1695. /*
  1696. =============
  1697. updateTrigger
  1698.  
  1699. Displays and updates a players use bar
  1700. =============
  1701. */
  1702. updateTrigger()
  1703. {
  1704. if ( self.triggerType != "use" )
  1705. return;
  1706.  
  1707. if ( self.interactTeam == "none" )
  1708. {
  1709. self.trigger.origin -= (0,0,50000);
  1710. }
  1711. else if ( self.interactTeam == "any" )
  1712. {
  1713. self.trigger.origin = self.curOrigin;
  1714. self.trigger setTeamForTrigger( "none" );
  1715. }
  1716. else if ( self.interactTeam == "friendly" )
  1717. {
  1718. self.trigger.origin = self.curOrigin;
  1719. if ( self.ownerTeam == "allies" )
  1720. self.trigger setTeamForTrigger( "allies" );
  1721. else if ( self.ownerTeam == "axis" )
  1722. self.trigger setTeamForTrigger( "axis" );
  1723. else
  1724. self.trigger.origin -= (0,0,50000);
  1725. }
  1726. else if ( self.interactTeam == "enemy" )
  1727. {
  1728. self.trigger.origin = self.curOrigin;
  1729. if ( self.ownerTeam == "allies" )
  1730. self.trigger setTeamForTrigger( "axis" );
  1731. else if ( self.ownerTeam == "axis" )
  1732. self.trigger setTeamForTrigger( "allies" );
  1733. else
  1734. self.trigger setTeamForTrigger( "none" );
  1735. }
  1736. }
  1737.  
  1738.  
  1739. updateWorldIcons()
  1740. {
  1741. if ( self.visibleTeam == "any" )
  1742. {
  1743. updateWorldIcon( "friendly", true );
  1744. updateWorldIcon( "enemy", true );
  1745. }
  1746. else if ( self.visibleTeam == "friendly" )
  1747. {
  1748. updateWorldIcon( "friendly", true );
  1749. updateWorldIcon( "enemy", false );
  1750. }
  1751. else if ( self.visibleTeam == "enemy" )
  1752. {
  1753. updateWorldIcon( "friendly", false );
  1754. updateWorldIcon( "enemy", true );
  1755. }
  1756. else
  1757. {
  1758. updateWorldIcon( "friendly", false );
  1759. updateWorldIcon( "enemy", false );
  1760. }
  1761. }
  1762.  
  1763.  
  1764. updateWorldIcon( relativeTeam, showIcon )
  1765. {
  1766. if ( !isDefined( self.worldIcons[relativeTeam] ) )
  1767. showIcon = false;
  1768.  
  1769. updateTeams = getUpdateTeams( relativeTeam );
  1770.  
  1771. for ( index = 0; index < updateTeams.size; index++ )
  1772. {
  1773. opName = "objpoint_" + updateTeams[index] + "_" + self.entNum;
  1774. objPoint = maps\mp\gametypes\_objpoints::getObjPointByName( opName );
  1775.  
  1776. objPoint notify( "stop_flashing_thread" );
  1777. objPoint thread maps\mp\gametypes\_objpoints::stopFlashing();
  1778.  
  1779. if ( showIcon )
  1780. {
  1781. objPoint setShader( self.worldIcons[relativeTeam], level.objPointSize, level.objPointSize );
  1782. objPoint fadeOverTime( 0.05 ); // overrides old fadeOverTime setting from flashing thread
  1783. objPoint.alpha = objPoint.baseAlpha;
  1784. objPoint.isShown = true;
  1785.  
  1786. if ( isDefined( self.compassIcons[relativeTeam] ) )
  1787. objPoint setWayPoint( true, true );
  1788. else
  1789. objPoint setWayPoint( true, false );
  1790.  
  1791. if ( self.type == "carryObject" )
  1792. {
  1793. if ( isDefined( self.carrier ) && !shouldPingObject( relativeTeam ) )
  1794. objPoint SetTargetEnt( self.carrier );
  1795. else
  1796. objPoint ClearTargetEnt();
  1797. }
  1798. }
  1799. else
  1800. {
  1801. objPoint fadeOverTime( 0.05 );
  1802. objPoint.alpha = 0;
  1803. objPoint.isShown = false;
  1804. objPoint ClearTargetEnt();
  1805. }
  1806. }
  1807. }
  1808.  
  1809.  
  1810. updateTimer( seconds, showIcon )
  1811. {
  1812.  
  1813. }
  1814.  
  1815.  
  1816. updateCompassIcons()
  1817. {
  1818. if ( self.visibleTeam == "any" )
  1819. {
  1820. updateCompassIcon( "friendly", true );
  1821. updateCompassIcon( "enemy", true );
  1822. }
  1823. else if ( self.visibleTeam == "friendly" )
  1824. {
  1825. updateCompassIcon( "friendly", true );
  1826. updateCompassIcon( "enemy", false );
  1827. }
  1828. else if ( self.visibleTeam == "enemy" )
  1829. {
  1830. updateCompassIcon( "friendly", false );
  1831. updateCompassIcon( "enemy", true );
  1832. }
  1833. else
  1834. {
  1835. updateCompassIcon( "friendly", false );
  1836. updateCompassIcon( "enemy", false );
  1837. }
  1838. }
  1839.  
  1840.  
  1841. updateCompassIcon( relativeTeam, showIcon )
  1842. {
  1843. updateTeams = getUpdateTeams( relativeTeam );
  1844.  
  1845. for ( index = 0; index < updateTeams.size; index++ )
  1846. {
  1847. showIconThisTeam = showIcon;
  1848. if ( !showIconThisTeam && shouldShowCompassDueToRadar( updateTeams[ index ] ) )
  1849. showIconThisTeam = true;
  1850.  
  1851. objId = self.objIDAllies;
  1852. if ( updateTeams[ index ] == "axis" )
  1853. objId = self.objIDAxis;
  1854.  
  1855. if ( !isDefined( self.compassIcons[relativeTeam] ) || !showIconThisTeam )
  1856. {
  1857. objective_state( objId, "invisible" );
  1858. continue;
  1859. }
  1860.  
  1861. objective_icon( objId, self.compassIcons[relativeTeam] );
  1862. objective_state( objId, "active" );
  1863.  
  1864. if ( self.type == "carryObject" )
  1865. {
  1866. if ( isReallyAlive( self.carrier ) && !shouldPingObject( relativeTeam ) )
  1867. objective_onentity( objId, self.carrier );
  1868. else
  1869. objective_position( objId, self.curOrigin );
  1870. }
  1871. }
  1872. }
  1873.  
  1874.  
  1875. shouldPingObject( relativeTeam )
  1876. {
  1877. if ( relativeTeam == "friendly" && self.objIDPingFriendly )
  1878. return true;
  1879. else if ( relativeTeam == "enemy" && self.objIDPingEnemy )
  1880. return true;
  1881.  
  1882. return false;
  1883. }
  1884.  
  1885.  
  1886. getUpdateTeams( relativeTeam )
  1887. {
  1888. updateTeams = [];
  1889. if ( relativeTeam == "friendly" )
  1890. {
  1891. if ( self isFriendlyTeam( "allies" ) )
  1892. updateTeams[0] = "allies";
  1893. else if ( self isFriendlyTeam( "axis" ) )
  1894. updateTeams[0] = "axis";
  1895. }
  1896. else if ( relativeTeam == "enemy" )
  1897. {
  1898. if ( !self isFriendlyTeam( "allies" ) )
  1899. updateTeams[updateTeams.size] = "allies";
  1900.  
  1901. if ( !self isFriendlyTeam( "axis" ) )
  1902. updateTeams[updateTeams.size] = "axis";
  1903. }
  1904.  
  1905. return updateTeams;
  1906. }
  1907.  
  1908. shouldShowCompassDueToRadar( team )
  1909. {
  1910. // the only case we return true in this function is when the enemy has UAV,
  1911. // and an enemy visible on UAV is holding the object.
  1912.  
  1913. if ( !isdefined( self.carrier ) )
  1914. return false;
  1915.  
  1916. if ( self.carrier hasPerk( "specialty_gpsjammer", true ) )
  1917. return false;
  1918.  
  1919. return getTeamRadar( team );
  1920. }
  1921.  
  1922. updateVisibilityAccordingToRadar()
  1923. {
  1924. self endon("death");
  1925. self endon("carrier_cleared");
  1926.  
  1927. while(1)
  1928. {
  1929. level waittill("radar_status_change");
  1930. self updateCompassIcons();
  1931. }
  1932. }
  1933.  
  1934. setOwnerTeam( team )
  1935. {
  1936. self.ownerTeam = team;
  1937. self updateTrigger();
  1938. self updateCompassIcons();
  1939. self updateWorldIcons();
  1940. }
  1941.  
  1942. getOwnerTeam()
  1943. {
  1944. return self.ownerTeam;
  1945. }
  1946.  
  1947. setUseTime( time )
  1948. {
  1949.  
  1950. self.useTime = int (time * 1000 );
  1951. }
  1952.  
  1953. setUseText( text )
  1954. {
  1955. self.useText = text;
  1956. }
  1957.  
  1958. setTeamUseTime( relativeTeam, time )
  1959. {
  1960. self.teamUseTimes[relativeTeam] = int( time * 1000 );
  1961. }
  1962.  
  1963. setTeamUseText( relativeTeam, text )
  1964. {
  1965. self.teamUseTexts[relativeTeam] = text;
  1966. }
  1967.  
  1968. setUseHintText( text )
  1969. {
  1970. self.trigger setHintString( text );
  1971. }
  1972.  
  1973. allowCarry( relativeTeam )
  1974. {
  1975. self.interactTeam = relativeTeam;
  1976. }
  1977.  
  1978. allowUse( relativeTeam )
  1979. {
  1980. self.interactTeam = relativeTeam;
  1981. updateTrigger();
  1982. }
  1983.  
  1984. setVisibleTeam( relativeTeam )
  1985. {
  1986. self.visibleTeam = relativeTeam;
  1987.  
  1988. updateCompassIcons();
  1989. updateWorldIcons();
  1990. }
  1991.  
  1992. setModelVisibility( visibility )
  1993. {
  1994. if ( visibility )
  1995. {
  1996. for ( index = 0; index < self.visuals.size; index++ )
  1997. {
  1998. self.visuals[index] show();
  1999. if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" )
  2000. {
  2001. foreach ( player in level.players )
  2002. {
  2003. if ( player isTouching( self.visuals[index] ) )
  2004. player _suicide();
  2005. }
  2006. self.visuals[index] thread makeSolid();
  2007. }
  2008. }
  2009. }
  2010. else
  2011. {
  2012. for ( index = 0; index < self.visuals.size; index++ )
  2013. {
  2014. self.visuals[index] hide();
  2015. if ( self.visuals[index].classname == "script_brushmodel" || self.visuals[index].classname == "script_model" )
  2016. {
  2017. self.visuals[index] notify("changing_solidness");
  2018. self.visuals[index] notsolid();
  2019. }
  2020. }
  2021. }
  2022. }
  2023.  
  2024. makeSolid()
  2025. {
  2026. self endon("death");
  2027. self notify("changing_solidness");
  2028. self endon("changing_solidness");
  2029.  
  2030. while(1)
  2031. {
  2032. for ( i = 0; i < level.players.size; i++ )
  2033. {
  2034. if ( level.players[i] isTouching( self ) )
  2035. break;
  2036. }
  2037. if ( i == level.players.size )
  2038. {
  2039. self solid();
  2040. break;
  2041. }
  2042. wait .05;
  2043. }
  2044. }
  2045.  
  2046. setCarrierVisible( relativeTeam )
  2047. {
  2048. self.carrierVisible = relativeTeam;
  2049. }
  2050.  
  2051. setCanUse( relativeTeam )
  2052. {
  2053. self.useTeam = relativeTeam;
  2054. }
  2055.  
  2056. set2DIcon( relativeTeam, shader )
  2057. {
  2058. self.compassIcons[relativeTeam] = shader;
  2059. updateCompassIcons();
  2060. }
  2061.  
  2062. set3DIcon( relativeTeam, shader )
  2063. {
  2064. self.worldIcons[relativeTeam] = shader;
  2065. updateWorldIcons();
  2066. }
  2067.  
  2068. set3DUseIcon( relativeTeam, shader )
  2069. {
  2070. self.worldUseIcons[relativeTeam] = shader;
  2071. }
  2072.  
  2073. setCarryIcon( shader )
  2074. {
  2075. self.carryIcon = shader;
  2076. }
  2077.  
  2078. disableObject()
  2079. {
  2080. self notify("disabled");
  2081.  
  2082. if ( self.type == "carryObject" )
  2083. {
  2084. if ( isDefined( self.carrier ) )
  2085. self.carrier takeObject( self );
  2086.  
  2087. for ( index = 0; index < self.visuals.size; index++ )
  2088. {
  2089. self.visuals[index] hide();
  2090. }
  2091. }
  2092.  
  2093. self.trigger common_scripts\utility::trigger_off();
  2094. self setVisibleTeam( "none" );
  2095. }
  2096.  
  2097.  
  2098. enableObject()
  2099. {
  2100. if ( self.type == "carryObject" )
  2101. {
  2102. for ( index = 0; index < self.visuals.size; index++ )
  2103. {
  2104. self.visuals[index] show();
  2105. }
  2106. }
  2107.  
  2108. self.trigger common_scripts\utility::trigger_on();
  2109. self setVisibleTeam( "any" );
  2110. }
  2111.  
  2112.  
  2113. getRelativeTeam( team )
  2114. {
  2115. if ( team == self.ownerTeam )
  2116. return "friendly";
  2117. else
  2118. return "enemy";
  2119. //else
  2120. // return "neutral";
  2121. }
  2122.  
  2123.  
  2124. isFriendlyTeam( team )
  2125. {
  2126. if ( self.ownerTeam == "any" )
  2127. return true;
  2128.  
  2129. if ( self.ownerTeam == team )
  2130. return true;
  2131.  
  2132. return false;
  2133. }
  2134.  
  2135.  
  2136. canInteractWith( team, player )
  2137. {
  2138. switch( self.interactTeam )
  2139. {
  2140. case "none":
  2141. return false;
  2142.  
  2143. case "any":
  2144. return true;
  2145.  
  2146. case "friendly":
  2147. if ( team == self.ownerTeam )
  2148. return true;
  2149. else
  2150. return false;
  2151.  
  2152. case "enemy":
  2153. if ( team != self.ownerTeam )
  2154. return true;
  2155. else
  2156. return false;
  2157.  
  2158. default:
  2159. assertEx( 0, "invalid interactTeam" );
  2160. return false;
  2161. }
  2162. }
  2163.  
  2164.  
  2165. isTeam( team )
  2166. {
  2167. if ( team == "neutral" )
  2168. return true;
  2169. if ( team == "allies" )
  2170. return true;
  2171. if ( team == "axis" )
  2172. return true;
  2173. if ( team == "any" )
  2174. return true;
  2175. if ( team == "none" )
  2176. return true;
  2177.  
  2178. return false;
  2179. }
  2180.  
  2181. isRelativeTeam( relativeTeam )
  2182. {
  2183. if ( relativeTeam == "friendly" )
  2184. return true;
  2185. if ( relativeTeam == "enemy" )
  2186. return true;
  2187. if ( relativeTeam == "any" )
  2188. return true;
  2189. if ( relativeTeam == "none" )
  2190. return true;
  2191.  
  2192. return false;
  2193. }
  2194.  
  2195.  
  2196. getEnemyTeam( team )
  2197. {
  2198. if ( team == "neutral" )
  2199. return "none";
  2200. else if ( team == "allies" )
  2201. return "axis";
  2202. else
  2203. return "allies";
  2204. }
  2205.  
  2206. getNextObjID()
  2207. {
  2208. if ( !isDefined( level.reclaimedReservedObjectives ) || level.reclaimedReservedObjectives.size < 1 )
  2209. {
  2210. nextID = level.numGametypeReservedObjectives;
  2211. level.numGametypeReservedObjectives++;
  2212. }
  2213. else
  2214. {
  2215. nextId = level.reclaimedReservedObjectives[level.reclaimedReservedObjectives.size - 1];
  2216. level.reclaimedReservedObjectives[level.reclaimedReservedObjectives.size - 1] = undefined;
  2217. }
  2218.  
  2219. if ( nextId > 31 )
  2220. nextId = 31;
  2221.  
  2222. return nextID;
  2223. }
  2224.  
  2225. getLabel()
  2226. {
  2227. label = self.trigger.script_label;
  2228. if ( !isDefined( label ) )
  2229. {
  2230. label = "";
  2231. return label;
  2232. }
  2233.  
  2234. if ( label[0] != "_" )
  2235. return ("_" + label);
  2236.  
  2237. return label;
  2238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement