Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.75 KB | None | 0 0
  1. #include common_scripts\utility;
  2.  
  3. /*QUAKED trigger_multiple_dyn_metal_detector (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  4. defaulttexture="flag"
  5. Comments to be added.*/
  6.  
  7. /*QUAKED trigger_multiple_dyn_creaky_board (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  8. defaulttexture="flag"
  9. Comments to be added.*/
  10.  
  11. /*QUAKED trigger_multiple_dyn_photo_copier (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  12. defaulttexture="flag"
  13. Comments to be added.*/
  14.  
  15. /*QUAKED trigger_multiple_dyn_copier_no_light (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  16. defaulttexture="flag"
  17. Comments to be added.*/
  18.  
  19. /*QUAKED trigger_radius_dyn_motion_light (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
  20. Comments to be added.*/
  21.  
  22. /*QUAKED trigger_radius_dyn_motion_dlight (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
  23. Comments to be added.*/
  24.  
  25. /*QUAKED trigger_multiple_dog_bark (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  26. Comments to be added.*/
  27.  
  28. /*QUAKED trigger_radius_bird_startle (0.12 0.23 1.0) (-16 -16 -16) (16 16 16)
  29. Comments to be added.*/
  30.  
  31. /*QUAKED trigger_multiple_dyn_motion_light (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  32. defaulttexture="flag"
  33. Comments to be added.*/
  34.  
  35. /*QUAKED trigger_multiple_dyn_door (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  36. defaulttexture="flag"
  37. Comments to be added.*/
  38.  
  39. /*QUAKED trigger_multiple_freefall (0.12 0.23 1.0) ? AI_AXIS AI_ALLIES AI_NEUTRAL NOTPLAYER VEHICLE TRIGGER_SPAWN TOUCH_ONCE
  40. defaulttexture="flag"
  41. Player free falling with animation and screaming of doom.*/
  42.  
  43. // Crouch Speed 5.7-6.0
  44. // Run Speed 8.7-9.2
  45. // Sprint Speed 13.0-14.0
  46.  
  47.  
  48. // ========================= Constants ==========================
  49.  
  50. // Vending Machine
  51. CONST_vending_machine_health = 400;
  52. CONST_soda_pop_time = 0.1; // seconds
  53. CONST_soda_count = 12; // number of soda per machine
  54. CONST_soda_launch_force = 1000; // soda shoot out force
  55. CONST_soda_random_factor = 0.15; // in percentage 0.2 = 20%
  56. CONST_soda_splash_dmg_scaler = 3; // splash damage multiplier
  57.  
  58. // Metal Detector
  59. CONST_alarm_tolerance = 0; // number of alarm sounds before silenced, 0 disables silencing
  60. CONST_alarm_interval = 7; // alarm interval time in seconds
  61. CONST_alarm_interval_sp = 2; // alarm interval time in seconds for single player
  62.  
  63. // Civilian Jet
  64. CONST_jet_speed = 2000; // jet while landing is 130 - 160mph( 2292inch / sec - 2820inch / sec ), emergency landing is 110mph
  65. CONST_jet_extend = 20000; // units, each jet and flyto origin will extend from each other by
  66.  
  67. init()
  68. {
  69.  
  70. //rotate fan blades in mp_highrise
  71. array_thread( getEntArray( "com_wall_fan_blade_rotate", "targetname" ), ::fan_blade_rotate, "slow" );
  72. array_thread( getEntArray( "com_wall_fan_blade_rotate_fast", "targetname" ), ::fan_blade_rotate, "fast" );
  73.  
  74. trigger_classes = [];
  75. trigger_classes[ "trigger_multiple_dyn_metal_detector" ] = ::metal_detector;
  76. trigger_classes[ "trigger_multiple_dyn_creaky_board" ] = ::creaky_board;
  77. trigger_classes[ "trigger_multiple_dyn_photo_copier" ] = ::photo_copier;
  78. trigger_classes[ "trigger_multiple_dyn_copier_no_light" ] = ::photo_copier_no_light;
  79. trigger_classes[ "trigger_radius_motion_light" ] = ::motion_light;
  80. trigger_classes[ "trigger_radius_dyn_motion_dlight" ] = ::outdoor_motion_dlight;
  81. trigger_classes[ "trigger_multiple_dog_bark" ] = ::dog_bark;
  82. trigger_classes[ "trigger_radius_bird_startle" ] = ::bird_startle;
  83. trigger_classes[ "trigger_multiple_dyn_motion_light" ] = ::motion_light;
  84. trigger_classes[ "trigger_multiple_dyn_door" ] = ::trigger_door;
  85. //trigger_classes[ "trigger_multiple_freefall" ] = ::freefall;
  86.  
  87. player_init();
  88.  
  89. foreach ( classname, function in trigger_classes )
  90. {
  91. triggers = getEntArray( classname, "classname" );
  92. array_thread( triggers, ::triggerTouchThink );
  93. array_thread( triggers, function );
  94. }
  95.  
  96. array_thread( getEntArray( "vending_machine", "targetname" ), ::vending_machine );
  97. array_thread( getEntArray( "toggle", "targetname" ), ::use_toggle );
  98.  
  99. level thread onPlayerConnect();
  100.  
  101. civilian_jet = getEnt( "civilian_jet_origin", "targetname" );
  102. if ( isDefined( civilian_jet ) )
  103. civilian_jet thread civilian_jet_flyby();
  104. }
  105.  
  106. onPlayerConnect()
  107. {
  108. for ( ;; )
  109. {
  110. level waittill( "connecting", player );
  111. player thread movementTracker();
  112. }
  113. }
  114.  
  115. player_init()
  116. {
  117. if ( isSP() )
  118. {
  119. foreach ( player in level.players )
  120. {
  121. player.touchTriggers = [];
  122. player thread movementTracker();
  123. }
  124. }
  125. }
  126.  
  127. ai_init()
  128. {
  129. /*if ( !isdefined( level.registeredAI ) )
  130. level.registeredAI = [];
  131.  
  132. level.registeredAI[ level.registeredAI.size ] = self;
  133. */
  134.  
  135. // self is AI
  136. self.touchTriggers = [];
  137. self thread movementTracker();
  138. }
  139.  
  140.  
  141. // ================================================================================ //
  142. // Civilian Jet //
  143. // ================================================================================ //
  144.  
  145. civilian_jet_flyby()
  146. {
  147. level endon( "game_ended" );
  148.  
  149. self jet_init();
  150.  
  151. level waittill( "prematch_over" );
  152.  
  153. while ( 1 )
  154. {
  155. self thread jet_timer();
  156. self waittill( "start_flyby" );
  157.  
  158. self thread jet_flyby();
  159. self waittill( "flyby_done" );
  160.  
  161. self jet_reset();
  162. }
  163. }
  164.  
  165.  
  166. jet_init()
  167. {
  168. // move jet plane and flyto origin out of the map and hide on level load
  169. self.jet_parts = getentarray( self.target, "targetname" );
  170. self.jet_flyto = getent( "civilian_jet_flyto", "targetname" );
  171. self.engine_fxs = getentarray( "engine_fx", "targetname" );
  172. self.flash_fxs = getentarray( "flash_fx", "targetname" );
  173.  
  174. self.jet_engine_fx = loadfx( "fire/jet_afterburner" );
  175. self.jet_flash_fx_red = loadfx( "misc/aircraft_light_wingtip_red" );
  176. self.jet_flash_fx_green = loadfx( "misc/aircraft_light_wingtip_green" );
  177. self.jet_flash_fx_blink = loadfx( "misc/aircraft_light_red_blink" );
  178.  
  179. level.civilianJetFlyBy = undefined; // priority with air supremacies
  180.  
  181. assertex( isdefined( self.jet_parts ), "Missing cilivian jet model" );
  182. assertex( isdefined( self.jet_flyto ), "Missing cilivian jet flyto script_origin: civilian_jet_flyto" );
  183. assertex( isdefined( self.engine_fxs ), "Missing cilivian jet engine fxs script_origins: engine_fx" );
  184. assertex( isdefined( self.flash_fxs ), "Missing cilivian jet signal light script_origins: flash_fxs" );
  185.  
  186. // extending vector to place jet and flyto origin outside sky box
  187. negative_vec = Vector_multiply( VectorNormalize( self.origin - self.jet_flyto.origin ), CONST_jet_extend );
  188.  
  189. // extend flyto origin
  190. self.jet_flyto.origin -= negative_vec;
  191.  
  192. // extend jet
  193. self.origin += negative_vec;
  194. foreach ( part in self.jet_parts )
  195. {
  196. part.origin += negative_vec;
  197. part.old_origin = part.origin;
  198. part hide();
  199. }
  200.  
  201. // extend jet's engine fx origins
  202. foreach ( engine_fx in self.engine_fxs )
  203. engine_fx.origin += negative_vec;
  204.  
  205. foreach ( flash_fx in self.flash_fxs )
  206. flash_fx.origin += negative_vec;
  207.  
  208. // -------------- flight time and vector calculation -------------
  209. jet_origin = self.origin;// origin is the nose of the jet
  210. jet_flyto_pos = self.jet_flyto.origin;
  211. self.jet_fly_vec = jet_flyto_pos - jet_origin;
  212.  
  213. jet_speed = CONST_jet_speed;
  214. jet_flight_dist = abs( distance( jet_origin, jet_flyto_pos ) );
  215. self.jet_flight_time = jet_flight_dist / jet_speed;
  216. }
  217.  
  218.  
  219. jet_reset()
  220. {
  221. foreach ( part in self.jet_parts )
  222. {
  223. part.origin = part.old_origin;
  224. part hide();
  225. }
  226. }
  227.  
  228.  
  229. jet_timer()
  230. {
  231. level endon( "game_ended" );
  232.  
  233. match_timelimit = getTimeInterval();
  234. assert( isdefined( match_timelimit ) );
  235. timelimit = max( 10, match_timelimit );
  236. timelimit = min( timelimit, 100 );
  237.  
  238. if ( getdvar( "jet_flyby_timer" ) != "" )
  239. level.civilianJetFlyBy_timer = 5 + getdvarint( "jet_flyby_timer" );
  240. else
  241. level.civilianJetFlyBy_timer = ( 0.25 + randomFloatRange( 0.3, 0.7 ) ) * 60 * timeLimit; // seconds into the match when jet flys by
  242.  
  243. wait level.civilianJetFlyBy_timer;
  244.  
  245. // wait till all the airborne kill streaks are done
  246. while ( isDefined( level.airstrikeInProgress ) || isDefined( level.ac130player ) || isDefined( level.chopper ) || isDefined( level.remoteMissileInProgress ) )
  247. wait 0.05;
  248.  
  249. // start flyby
  250. self notify( "start_flyby" );
  251.  
  252. // blocks out all airborne kill streaks
  253. level.civilianJetFlyBy = true;
  254. self waittill( "flyby_done" );
  255. level.civilianJetFlyBy = undefined;
  256. }
  257.  
  258. getTimeInterval()
  259. {
  260. if ( isSP() )
  261. return 10.0;
  262.  
  263. if ( isDefined( game[ "status" ] ) && game[ "status" ] == "overtime" )
  264. return 1.0;
  265. else
  266. return getWatchedDvar( "timelimit" );
  267. }
  268.  
  269. getWatchedDvar( dvarString )
  270. {
  271. dvarString = "scr_" + level.gameType + "_" + dvarString;
  272. return( level.watchDvars[ dvarString ].value );
  273. }
  274.  
  275.  
  276. jet_flyby()
  277. {
  278. // show plane
  279. foreach ( part in self.jet_parts )
  280. part show();
  281.  
  282. engine_fx_array = [];
  283. flash_fx_array = [];
  284.  
  285. foreach ( engine_fx in self.engine_fxs )
  286. {
  287. engine_fx_ent = spawn( "script_model", engine_fx.origin );
  288. engine_fx_ent setModel( "tag_origin" );
  289. engine_fx_ent.angles = engine_fx.angles;
  290. engine_fx_array [ engine_fx_array.size ] = engine_fx_ent;
  291. }
  292.  
  293. foreach ( flash_fx in self.flash_fxs )
  294. {
  295. flash_fx_ent = spawn( "script_model", flash_fx.origin );
  296. flash_fx_ent setModel( "tag_origin" );
  297. flash_fx_ent.color = flash_fx.script_noteworthy;
  298. flash_fx_ent.angles = flash_fx.angles;
  299. flash_fx_array [ flash_fx_array.size ] = flash_fx_ent;
  300. }
  301.  
  302. assertex( isdefined( level.mapcenter ), "Calling for civilian jet flyby when level.mapcenter is not yet defined." );
  303. self thread jet_planeSound( self.jet_parts[ 0 ], level.mapcenter );
  304.  
  305. wait 0.05;
  306.  
  307. // play engine fx on fx ents
  308. foreach ( engine_fx_ent in engine_fx_array )
  309. playfxontag( self.jet_engine_fx, engine_fx_ent, "tag_origin" );
  310.  
  311. // play flash fx on fx ents
  312. foreach ( flash_fx_ent in flash_fx_array )
  313. {
  314. if ( isdefined( flash_fx_ent.color ) && flash_fx_ent.color == "blink" )
  315. playfxontag( self.jet_flash_fx_blink, flash_fx_ent, "tag_origin" );
  316. else if ( isdefined( flash_fx_ent.color ) && flash_fx_ent.color == "red" )
  317. playfxontag( self.jet_flash_fx_red, flash_fx_ent, "tag_origin" );
  318. else
  319. playfxontag( self.jet_flash_fx_green, flash_fx_ent, "tag_origin" );
  320. }
  321.  
  322. // move plane
  323. foreach ( part in self.jet_parts )
  324. part moveTo( part.origin + self.jet_fly_vec, self.jet_flight_time );
  325.  
  326. // move fx ents
  327. foreach ( engine_fx_ent in engine_fx_array )
  328. engine_fx_ent moveTo( engine_fx_ent.origin + self.jet_fly_vec, self.jet_flight_time );
  329. foreach ( flash_fx_ent in flash_fx_array )
  330. flash_fx_ent moveTo( flash_fx_ent.origin + self.jet_fly_vec, self.jet_flight_time );
  331.  
  332. wait( self.jet_flight_time + 1 );
  333.  
  334. // delete fxs
  335. foreach ( engine_fx_ent in engine_fx_array )
  336. engine_fx_ent delete();
  337. foreach ( flash_fx_ent in flash_fx_array )
  338. flash_fx_ent delete();
  339.  
  340. self notify( "flyby_done" );
  341. }
  342.  
  343.  
  344. jet_planeSound( plane, bombsite )
  345. {
  346. plane thread playsound_loop_on_ent( "veh_mig29_dist_loop" );
  347. while ( !targetisclose( plane, bombsite ) )
  348. wait .05;
  349.  
  350. plane thread playsound_loop_on_ent( "veh_mig29_close_loop" );
  351. while ( targetisinfront( plane, bombsite ) )
  352. wait .05;
  353. wait .5;
  354.  
  355. plane thread playsound_float( "veh_mig29_sonic_boom" );
  356. while ( targetisclose( plane, bombsite ) )
  357. wait .05;
  358.  
  359. plane notify( "stop sound" + "veh_mig29_close_loop" );
  360. self waittill( "flyby_done" );
  361.  
  362. plane notify( "stop sound" + "veh_mig29_dist_loop" );
  363. }
  364.  
  365.  
  366. playsound_float( alias, origin, master )
  367. {
  368. org = spawn( "script_origin", ( 0, 0, 1 ) );
  369. org hide();
  370. if ( !isdefined( origin ) )
  371. origin = self.origin;
  372. org.origin = origin;
  373. if ( isdefined( master ) && master )
  374. org playsoundasmaster( alias );
  375. else
  376. org playsound( alias );
  377. wait( 10.0 );
  378. org delete();
  379. }
  380.  
  381.  
  382. playsound_loop_on_ent( alias, offset )
  383. {
  384. org = spawn( "script_origin", ( 0, 0, 0 ) );
  385. org hide();
  386. org endon( "death" );
  387. thread delete_on_death( org );
  388. if ( isdefined( offset ) )
  389. {
  390. org.origin = self.origin + offset;
  391. org.angles = self.angles;
  392. org linkto( self );
  393. }
  394. else
  395. {
  396. org.origin = self.origin;
  397. org.angles = self.angles;
  398. org linkto( self );
  399. }
  400. // org endon ("death");
  401. org playloopsound( alias );
  402. // println ("playing loop sound ", alias," on entity at origin ", self.origin, " at ORIGIN ", org.origin);
  403. self waittill( "stop sound" + alias );
  404. org stoploopsound( alias );
  405. org delete();
  406. }
  407.  
  408. targetisinfront( other, target )
  409. {
  410. forwardvec = anglestoforward( flat_angle( other.angles ) );
  411. normalvec = vectorNormalize( flat_origin( target ) - other.origin );
  412. dot = vectordot( forwardvec, normalvec );
  413.  
  414. if ( dot > 0 )
  415. return true;
  416. else
  417. return false;
  418. }
  419.  
  420. targetisclose( other, target )
  421. {
  422. infront = targetisinfront( other, target );
  423.  
  424. if ( infront )
  425. dir = 1;
  426. else
  427. dir = -1;
  428.  
  429. a = flat_origin( other.origin );
  430. b = a + Vector_Multiply( anglestoforward( flat_angle( other.angles ) ), ( dir * 100000 ) );
  431. point = pointOnSegmentNearestToPoint( a, b, target );
  432. dist = distance( a, point );
  433.  
  434. if ( dist < 3000 )
  435. return true;
  436. else
  437. return false;
  438. }
  439.  
  440. // ================================================================================ //
  441. // Vending Machine //
  442. // ================================================================================ //
  443.  
  444. vending_machine()
  445. {
  446. level endon( "game_ended" );
  447. self endon( "death" );
  448.  
  449. // self is use trigger
  450. self SetCursorHint( "HINT_ACTIVATE" );
  451.  
  452. self.vm_normal = getent( self.target, "targetname" );
  453. assertex( isdefined( self.vm_normal ), "Vending machine use trigger is missing target to the normal vending machine script_model" );
  454. vm_soda_start = getent( self.vm_normal.target, "targetname" );
  455. assertex( isdefined( vm_soda_start ), "Vending machine normal script_model is missing target to the start-soda can script_model" );
  456. vm_soda_stop = getent( vm_soda_start.target, "targetname" );
  457. assertex( isdefined( vm_soda_start ), "Start-soda can script_model is missing target to the end-soda can script_model" );
  458. self.vm_launch_from = getent( vm_soda_stop.target, "targetname" );
  459. assertex( isdefined( self.vm_launch_from ), "End-soda can script_model is missing target to the physics launch-from script_origin" );
  460. self.vm_launch_to = getent( self.vm_launch_from.target, "targetname" );
  461. assertex( isdefined( self.vm_launch_to ), "launch-from can script_origin is missing target to the physics launch-to script_origin" );
  462.  
  463. if ( isdefined( self.vm_launch_to.target ) )
  464. self.vm_fx_loc = getent( self.vm_launch_to.target, "targetname" );
  465.  
  466. //assertex( isdefined( self.vm_launch_to ), "launch-to can script_origin is missing target to the fx location script_origin" );
  467.  
  468. self.vm_normal setCanDamage( true );
  469.  
  470. self.vm_normal_model = self.vm_normal.model;
  471. self.vm_damaged_model = self.vm_normal.script_noteworthy;
  472. self.vm_soda_model = vm_soda_start.model;
  473.  
  474. self.vm_soda_start_pos = vm_soda_start.origin;
  475. self.vm_soda_start_angle = vm_soda_start.angles;
  476. self.vm_soda_stop_pos = vm_soda_stop.origin;
  477. self.vm_soda_stop_angle = vm_soda_stop.angles;
  478.  
  479. // precache damage model
  480. precacheModel( self.vm_damaged_model );
  481.  
  482. // ride the no longer needed models
  483. vm_soda_start delete();
  484. vm_soda_stop delete();
  485.  
  486. self.soda_array = [];
  487. self.soda_count = CONST_soda_count;
  488. self.soda_slot = undefined;// the soda can thats resting in the slot
  489. self.hp = CONST_vending_machine_health;
  490.  
  491. self thread vending_machine_damage_monitor( self.vm_normal );
  492. self playloopsound( "vending_machine_hum" );
  493.  
  494. while ( 1 )
  495. {
  496. self waittill( "trigger", player );
  497. //level.players[0] iprintln( "used" );
  498.  
  499. self playsound( "vending_machine_button_press" );
  500. if ( !self.soda_count )
  501. continue;
  502.  
  503. // drop a can, and shoot out the previous one if in slot
  504. if ( isdefined( self.soda_slot ) )
  505. self soda_can_eject();
  506. soda_can_drop( spawn_soda() );
  507. wait 0.05;
  508. }
  509. }
  510.  
  511. vending_machine_damage_monitor( vending_machine )
  512. {
  513. level endon( "game_ended" );
  514.  
  515. exp_dmg = "mod_grenade mod_projectile mod_explosive mod_grenade_splash mod_projectile_splash splash";
  516. sparks_fx = loadfx( "explosions/tv_explosion" );
  517.  
  518. while ( 1 )
  519. {
  520. vending_machine waittill( "damage", damage, other, direction_vec, P, type );
  521.  
  522. if ( isdefined( type ) )
  523. {
  524. if ( isSubStr( exp_dmg, ToLower( type ) ) )
  525. damage *= CONST_soda_splash_dmg_scaler; // multiply explosive dmg
  526.  
  527. self.hp -= damage;
  528. if ( self.hp > 0 )
  529. continue;
  530.  
  531. // vending machine is now dead, button usage is disabled
  532. self notify( "death" );
  533.  
  534. // disable use trigger
  535. self.origin += ( 0, 0, 10000 );
  536.  
  537. if( !isdefined( self.vm_fx_loc ) )
  538. playfx_loc = self.vm_normal.origin + ( ( 17, -13, 52 ) - ( -20, 18, 0 ) );
  539. else
  540. playfx_loc = self.vm_fx_loc.origin;
  541.  
  542. playfx( sparks_fx, playfx_loc );
  543.  
  544. // when vending machine is explosively damaged, shoots out soda cans
  545. self.vm_normal setmodel( self.vm_damaged_model );
  546.  
  547. while ( self.soda_count > 0 )
  548. {
  549. // drop a can, and shoot out the previous one if in slot
  550. if ( isdefined( self.soda_slot ) )
  551. self soda_can_eject();
  552. soda_can_drop( spawn_soda() );
  553. wait 0.05;
  554. }
  555.  
  556. self stoploopsound( "vending_machine_hum" );
  557. return;
  558. }
  559. }
  560. }
  561.  
  562. spawn_soda()
  563. {
  564. soda = spawn( "script_model", self.vm_soda_start_pos );
  565. soda setmodel( self.vm_soda_model );
  566. soda.origin = self.vm_soda_start_pos;
  567. soda.angles = self.vm_soda_start_angle;
  568. return soda;
  569. }
  570.  
  571. soda_can_drop( soda )
  572. {
  573. soda MoveTo( self.vm_soda_stop_pos, CONST_soda_pop_time );
  574. soda playsound( "vending_machine_soda_drop" ); // soda can drop sound
  575. wait CONST_soda_pop_time;
  576.  
  577. self.soda_slot = soda;
  578. self.soda_count -- ;
  579. }
  580.  
  581. soda_can_eject()
  582. {
  583. self endon( "death" );
  584.  
  585. if( isdefined( self.soda_slot.ejected ) && self.soda_slot.ejected == true )
  586. return;
  587.  
  588. // physics launch
  589. force_max = CONST_soda_launch_force * ( 1 + CONST_soda_random_factor );
  590. force_min = force_max * 0.75 * ( 1 + CONST_soda_random_factor );
  591.  
  592. launch_vec = vectorNormalize( self.vm_launch_to.origin - self.vm_launch_from.origin );
  593. force_vec = vector_multiply( launch_vec, randomfloatrange( force_min, force_max ) );
  594. launch_force_vec = ( force_vec[ 0 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ), force_vec[ 1 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ), force_vec[ 2 ] * randomfloatrange( 1, 1 + CONST_soda_random_factor ) );
  595.  
  596. self.soda_slot PhysicsLaunchClient( self.vm_launch_from.origin, launch_force_vec );
  597. self.soda_slot.ejected = true;
  598. }
  599.  
  600. // ================================================================================ //
  601. // Free Fall //
  602. // ================================================================================ //
  603.  
  604. freefall()
  605. {
  606. level endon( "game_ended" );
  607.  
  608. freefall_weapon = "briefcase_bomb_mp";
  609. precacheItem( freefall_weapon );
  610.  
  611. while ( 1 )
  612. {
  613. self waittill( "trigger_enter", player );
  614.  
  615. if ( !( player hasWeapon( freefall_weapon ) ) )
  616. {
  617. player playsound( "freefall_death" );
  618.  
  619. player giveweapon( freefall_weapon );
  620. player setWeaponAmmoStock( freefall_weapon, 0 );
  621. player setWeaponAmmoClip( freefall_weapon, 0 );
  622. player switchToWeapon( freefall_weapon );
  623. }
  624. }
  625. }
  626.  
  627. // ================================================================================ //
  628. // Metal Detector //
  629. // ================================================================================ //
  630.  
  631. metal_detector()
  632. {
  633. // self is trigger: trigger_multiple_dyn_metal_detector
  634.  
  635. level endon( "game_ended" );
  636. assertex( isdefined( self.target ), "trigger_multiple_dyn_metal_detector is missing target damage trigger used for detecting entities other than players" );
  637.  
  638. damage_trig = getent( self.target, "targetname" );
  639. damage_trig EnableGrenadeTouchDamage();
  640.  
  641. bound_org_1 = getent( damage_trig.target, "targetname" );
  642. bound_org_2 = getent( bound_org_1.target, "targetname" );
  643.  
  644. assertex( isdefined( bound_org_1 ) && isdefined( bound_org_2 ), "Metal detector missing bound origins for claymore test" );
  645.  
  646. detector_1 = getent( bound_org_2.target, "targetname" );
  647. detector_2 = getent( detector_1.target, "targetname" );
  648.  
  649. assertex( isdefined( detector_1 ) && isdefined( detector_2 ), "Recompile the bsp to fix this, metal detector prefab changed." );
  650.  
  651. bounds = [];
  652. bound_x_min = min( bound_org_1.origin[ 0 ], bound_org_2.origin[ 0 ] ); bounds[ 0 ] = bound_x_min;
  653. bound_x_max = max( bound_org_1.origin[ 0 ], bound_org_2.origin[ 0 ] ); bounds[ 1 ] = bound_x_max;
  654. bound_y_min = min( bound_org_1.origin[ 1 ], bound_org_2.origin[ 1 ] ); bounds[ 2 ] = bound_y_min;
  655. bound_y_max = max( bound_org_1.origin[ 1 ], bound_org_2.origin[ 1 ] ); bounds[ 3 ] = bound_y_max;
  656. bound_z_min = min( bound_org_1.origin[ 2 ], bound_org_2.origin[ 2 ] ); bounds[ 4 ] = bound_z_min;
  657. bound_z_max = max( bound_org_1.origin[ 2 ], bound_org_2.origin[ 2 ] ); bounds[ 5 ] = bound_z_max;
  658.  
  659. bound_org_1 delete();
  660. bound_org_2 delete();
  661.  
  662. if ( !isSP() )
  663. self.alarm_interval = CONST_alarm_interval;
  664. else
  665. self.alarm_interval = CONST_alarm_interval_sp;
  666.  
  667. self.alarm_playing = 0;
  668. self.alarm_annoyance = 0;
  669. self.tolerance = CONST_alarm_tolerance;
  670.  
  671. self thread metal_detector_dmg_monitor( damage_trig );
  672. self thread metal_detector_touch_monitor();
  673. self thread metal_detector_weapons( bounds, "weapon_claymore", "weapon_c4" );
  674.  
  675. light_pos1 = ( detector_1.origin[ 0 ], detector_1.origin[ 1 ], bound_z_max );
  676. light_pos2 = ( detector_2.origin[ 0 ], detector_2.origin[ 1 ], bound_z_max );
  677.  
  678. //light_pos1 = ( bound_x_min, bound_y_min, bound_z_max );
  679. //light_pos2 = ( bound_x_max, bound_y_max, bound_z_max );
  680. md_light = loadfx( "props/metal_detector_light" );
  681.  
  682. while ( 1 )
  683. {
  684. self waittill_any( "dmg_triggered", "touch_triggered", "weapon_triggered" );
  685. self thread playsound_and_light( "alarm_metal_detector", md_light, light_pos1, light_pos2 );
  686. }
  687. }
  688.  
  689. playsound_and_light( sound, light, light_pos1, light_pos2 )
  690. {
  691. level endon( "game_ended" );
  692.  
  693. if ( !self.alarm_playing )
  694. {
  695. self.alarm_playing = 1;
  696. self thread annoyance_tracker();
  697.  
  698. if ( !self.alarm_annoyance )
  699. self playsound( sound );
  700.  
  701. // 1000ms red light fx
  702. playfx( light, light_pos1 );
  703. playfx( light, light_pos2 );
  704.  
  705. wait self.alarm_interval;
  706. self.alarm_playing = 0;
  707. }
  708. }
  709.  
  710. annoyance_tracker()
  711. {
  712. level endon( "game_ended" );
  713.  
  714. if ( !self.tolerance )
  715. return;
  716.  
  717. interval = self.alarm_interval + 0.15;
  718. if ( self.tolerance )
  719. self.tolerance -- ;
  720. else
  721. self.alarm_annoyance = 1;
  722.  
  723. current_time = gettime();// ms
  724.  
  725. alarm_timeout = CONST_alarm_interval;
  726. if ( isSP() )
  727. alarm_timeout = CONST_alarm_interval_sp;
  728.  
  729. self waittill_any_or_timeout( "dmg_triggered", "touch_triggered", "weapon_triggered", ( alarm_timeout + 2 ) );
  730.  
  731. time_delta = ( gettime() - current_time );
  732. if ( time_delta > ( ( alarm_timeout * 1000 ) + 1150 ) )
  733. {
  734. self.alarm_annoyance = 0;
  735. self.tolerance = CONST_alarm_tolerance;
  736. }
  737. }
  738.  
  739. waittill_any_or_timeout( msg1, msg2, msg3, timer )
  740. {
  741. level endon( "game_ended" );
  742.  
  743. self endon( msg1 );
  744. self endon( msg2 );
  745. self endon( msg3 );
  746. wait timer;
  747. }
  748.  
  749. metal_detector_weapons( bounds, weapon_1, weapon_2 )
  750. {
  751. level endon( "game_ended" );
  752. while ( 1 )
  753. {
  754. self waittill_weapon_placed();
  755.  
  756. all_grenades = getentarray( "grenade", "classname" );
  757. foreach ( grenade in all_grenades )
  758. {
  759. if ( isdefined( grenade.model ) && ( grenade.model == weapon_1 || grenade.model == weapon_2 ) )
  760. {
  761. if ( isInBound( grenade, bounds ) )
  762. self thread weapon_notify_loop( grenade, bounds );
  763. }
  764. }
  765. }
  766. }
  767.  
  768. waittill_weapon_placed()
  769. {
  770. level endon( "game_ended" );
  771. self endon( "dmg_triggered" );
  772. self waittill( "touch_triggered" );
  773. }
  774.  
  775. weapon_notify_loop( grenade, bounds )
  776. {
  777. grenade endon( "death" );
  778.  
  779. while ( isInBound( grenade, bounds ) )
  780. {
  781. self notify( "weapon_triggered" );
  782. wait self.alarm_interval;
  783. }
  784. }
  785.  
  786. isInBound( ent, bounds )
  787. {
  788. bound_x_min = bounds[ 0 ]; bound_x_max = bounds[ 1 ];
  789. bound_y_min = bounds[ 2 ]; bound_y_max = bounds[ 3 ];
  790. bound_z_min = bounds[ 4 ]; bound_z_max = bounds[ 5 ];
  791.  
  792. ent_x = ent.origin[ 0 ];
  793. ent_y = ent.origin[ 1 ];
  794. ent_z = ent.origin[ 2 ];
  795.  
  796. if ( isInBound_single( ent_x, bound_x_min, bound_x_max ) )
  797. {
  798. if ( isInBound_single( ent_y, bound_y_min, bound_y_max ) )
  799. {
  800. if ( isInBound_single( ent_z, bound_z_min, bound_z_max ) )
  801. return true;
  802. }
  803. }
  804. return false;
  805. }
  806.  
  807. isInBound_single( var, v_min, v_max )
  808. {
  809. if ( var > v_min && var < v_max )
  810. return true;
  811. return false;
  812. }
  813.  
  814.  
  815. metal_detector_dmg_monitor( damage_trig )
  816. {
  817. level endon( "game_ended" );
  818. while ( 1 )
  819. {
  820. damage_trig waittill( "damage", damage, other, direction_vec, P, type );
  821. if ( isdefined( type ) && alarm_validate_damage( type ) )
  822. self notify( "dmg_triggered" );
  823. }
  824. }
  825.  
  826. metal_detector_touch_monitor()
  827. {
  828. level endon( "game_ended" );
  829. while ( 1 )
  830. {
  831. self waittill( "trigger_enter" );
  832. while ( anythingTouchingTrigger( self ) )
  833. {
  834. self notify( "touch_triggered" );
  835. wait self.alarm_interval;
  836. }
  837. }
  838. }
  839.  
  840. alarm_validate_damage( damageType )
  841. {
  842. //disallowed_dmg = "mod_pistol_bullet mod_rifle_bullet bullet mod_crush mod_grenade_splash mod_projectile_splash splash unknown";
  843. //disallowed_dmg_array = strtok( disallowed_damage, " " );
  844.  
  845. allowed_dmg = "mod_melee melee mod_grenade mod_projectile mod_explosive mod_impact";
  846. allowed_dmg_array = strtok( allowed_dmg, " " );
  847.  
  848. foreach ( dmg in allowed_dmg_array )
  849. {
  850. if ( ToLower( dmg ) == ToLower( damageType ) )
  851. return true;
  852. }
  853. return false;
  854. }
  855.  
  856.  
  857. // ================================================================================ //
  858.  
  859.  
  860. creaky_board()
  861. {
  862. level endon( "game_ended" );
  863.  
  864. for ( ;; )
  865. {
  866. self waittill( "trigger_enter", player );
  867. player thread do_creak( self );
  868. }
  869. }
  870.  
  871.  
  872. do_creak( trigger )
  873. {
  874. self endon( "disconnect" );
  875. self endon( "death" );
  876.  
  877. self playSound( "step_walk_plr_woodcreak_on" );
  878.  
  879. for ( ;; )
  880. {
  881. self waittill( "trigger_leave", leftTrigger );
  882. if ( trigger != leftTrigger )
  883. continue;
  884.  
  885. self playSound( "step_walk_plr_woodcreak_off" );
  886. return;
  887. }
  888. }
  889.  
  890.  
  891. motion_light()
  892. {
  893. level endon( "game_ended" );
  894. self.moveTracker = true;
  895.  
  896. self.lightsOn = false;
  897. lights = getEntArray( self.target, "targetname" );
  898. assertEx( lights.size, "ERROR: trigger_ * _motion_light with no targets at " + self.origin );
  899.  
  900. precacheModel( "com_two_light_fixture_off" );
  901. precacheModel( "com_two_light_fixture_on" );
  902.  
  903. foreach ( light in lights )
  904. {
  905. light.lightRigs = [];
  906. infoNull = getEnt( light.target, "targetname" );
  907. if ( !isDefined( infoNull.target ) )
  908. continue;
  909.  
  910. light.lightRigs = getEntArray( infoNull.target, "targetname" );
  911. }
  912.  
  913.  
  914. for ( ;; )
  915. {
  916. self waittill( "trigger_enter" );
  917.  
  918. while ( anythingTouchingTrigger( self ) )
  919. {
  920. objectMoved = false;
  921. foreach ( object in self.touchList )
  922. {
  923. if ( isDefined( object.distMoved ) && object.distMoved > 5.0 )
  924. objectMoved = true;
  925. }
  926.  
  927. if ( objectMoved )
  928. {
  929. if ( !self.lightsOn )
  930. {
  931. self.lightsOn = true;
  932. lights[ 0 ] playSound( "switch_auto_lights_on" );
  933.  
  934. foreach ( light in lights )
  935. {
  936. light setLightIntensity( 1.0 );
  937.  
  938. if ( isdefined( light.lightRigs ) )
  939. {
  940. foreach ( rig in light.lightRigs )
  941. rig setModel( "com_two_light_fixture_on" );
  942. }
  943. }
  944. }
  945. self thread motion_light_timeout( lights, 10.0 );
  946. }
  947.  
  948. wait( 0.05 );
  949. }
  950. }
  951. }
  952.  
  953.  
  954. motion_light_timeout( lights, timeOut )
  955. {
  956. self notify( "motion_light_timeout" );
  957. self endon( "motion_light_timeout" );
  958.  
  959. wait( timeOut );
  960.  
  961. foreach ( light in lights )
  962. {
  963. light setLightIntensity( 0 );
  964. if ( isdefined( light.lightRigs ) )
  965. {
  966. foreach ( rig in light.lightRigs )
  967. rig setModel( "com_two_light_fixture_off" );
  968. }
  969. }
  970.  
  971. lights[ 0 ] playSound( "switch_auto_lights_off" );
  972.  
  973. self.lightsOn = false;
  974. }
  975.  
  976.  
  977. outdoor_motion_dlight()
  978. {
  979.  
  980. if( !isdefined( level.outdoor_motion_light ) )
  981. {
  982. level.outdoor_motion_light = loadFx( "misc/outdoor_motion_light" );
  983. }
  984.  
  985. level endon( "game_ended" );
  986. self.moveTracker = true;
  987.  
  988. self.lightsOn = false;
  989. lightRig = getEnt( self.target, "targetname" );
  990. assertEx( lightRig.size, "ERROR: trigger_ * _motion_light with no targets at " + self.origin );
  991. lights = getEntArray( lightRig.target, "targetname" );
  992. assertEx( lights.size, "ERROR: trigger_ * _motion_light model target with no light targets at " + lightRig.origin );
  993.  
  994. precacheModel( "com_two_light_fixture_off" );
  995. precacheModel( "com_two_light_fixture_on" );
  996.  
  997. for ( ;; )
  998. {
  999. self waittill( "trigger_enter" );
  1000.  
  1001. while ( anythingTouchingTrigger( self ) )
  1002. {
  1003. objectMoved = false;
  1004. foreach ( object in self.touchList )
  1005. {
  1006. if ( isDefined( object.distMoved ) && object.distMoved > 5.0 )
  1007. objectMoved = true;
  1008. }
  1009.  
  1010. if ( objectMoved )
  1011. {
  1012. if ( !self.lightsOn )
  1013. {
  1014. self.lightsOn = true;
  1015. lightRig playSound( "switch_auto_lights_on" );
  1016. lightRig setModel( "com_two_light_fixture_on" );
  1017.  
  1018. foreach ( light in lights )
  1019. {
  1020. assert( !isDefined( light.lightEnt ) );
  1021. light.lightEnt = spawn( "script_model", light.origin );
  1022. light.lightEnt setModel( "tag_origin" );
  1023. playFxOnTag( level.outdoor_motion_light, light.lightEnt, "tag_origin" );
  1024. }
  1025. }
  1026. self thread outdoor_motion_dlight_timeout( lightRig, lights, 10.0 );
  1027. }
  1028.  
  1029. wait( 0.05 );
  1030. }
  1031. }
  1032. }
  1033.  
  1034.  
  1035. outdoor_motion_dlight_timeout( lightRig, lights, timeOut )
  1036. {
  1037. self notify( "motion_light_timeout" );
  1038. self endon( "motion_light_timeout" );
  1039.  
  1040. wait( timeOut );
  1041.  
  1042. foreach ( light in lights )
  1043. {
  1044. assert( isDefined( light.lightEnt ) );
  1045. light.lightEnt delete();
  1046. }
  1047.  
  1048. lightRig playSound( "switch_auto_lights_off" );
  1049. lightRig setModel( "com_two_light_fixture_off" );
  1050.  
  1051. self.lightsOn = false;
  1052. }
  1053.  
  1054. dog_bark()
  1055. {
  1056. level endon( "game_ended" );
  1057. self.moveTracker = true;
  1058.  
  1059. dogOrigin = getEnt( self.target, "targetname" );
  1060. assertEx( isDefined( dogOrigin ), "ERROR: trigger_multiple_dog_bark with no target at " + self.origin );
  1061.  
  1062. for ( ;; )
  1063. {
  1064. self waittill( "trigger_enter", player );
  1065.  
  1066. while ( anythingTouchingTrigger( self ) )
  1067. {
  1068. maxDistMoved = 0;
  1069. foreach ( object in self.touchList )
  1070. {
  1071. if ( isDefined( object.distMoved ) && object.distMoved > maxDistMoved )
  1072. maxDistMoved = object.distMoved;
  1073. }
  1074.  
  1075. if ( maxDistMoved > 6.0 )
  1076. {
  1077. dogOrigin playSound( "dyn_anml_dog_bark" );
  1078. wait( randomFloatRange( 16 / maxDistMoved, 16 / maxDistMoved + randomFloat( 1.0 ) ) );
  1079. }
  1080. else
  1081. {
  1082. wait( 0.05 );
  1083. }
  1084. }
  1085. }
  1086. }
  1087.  
  1088.  
  1089. trigger_door()
  1090. {
  1091. doorEnt = getEnt( self.target, "targetname" );
  1092. assertEx( isDefined( doorEnt ), "ERROR: trigger_multiple_dyn_door with no door brush at " + self.origin );
  1093.  
  1094. self.doorEnt = doorEnt;
  1095. self.doorAngle = getVectorRightAngle( vectorNormalize( self getOrigin() - doorEnt getOrigin() ) );
  1096. doorEnt.baseYaw = doorEnt.angles[ 1 ];
  1097. openTime = 1.0;
  1098.  
  1099. for ( ;; )
  1100. {
  1101. self waittill( "trigger_enter", player );
  1102.  
  1103. doorEnt thread doorOpen( openTime, self getDoorSide( player ) );
  1104.  
  1105. if ( anythingTouchingTrigger( self ) )
  1106. self waittill( "trigger_empty" );
  1107.  
  1108. wait( 3.0 );
  1109.  
  1110. if ( anythingTouchingTrigger( self ) )
  1111. self waittill( "trigger_empty" );
  1112.  
  1113. doorEnt thread doorClose( openTime );
  1114. }
  1115. }
  1116.  
  1117.  
  1118. doorOpen( openTime, doorSide )
  1119. {
  1120. if ( doorSide )
  1121. self rotateTo( ( 0, self.baseYaw + 90, 1 ), openTime, 0.1, 0.75 );
  1122. else
  1123. self rotateTo( ( 0, self.baseYaw - 90, 1 ), openTime, 0.1, 0.75 );
  1124.  
  1125. self playSound( "door_generic_house_open" );
  1126.  
  1127. wait( openTime + 0.05 );
  1128. }
  1129.  
  1130.  
  1131. doorClose( openTime )
  1132. {
  1133. self rotateTo( ( 0, self.baseYaw, 1 ), openTime );
  1134. self playSound( "door_generic_house_close" );
  1135.  
  1136. wait( openTime + 0.05 );
  1137. }
  1138.  
  1139. getDoorSide( player )
  1140. {
  1141. return( vectorDot( self.doorAngle, vectornormalize( player.origin - self.doorEnt getOrigin() ) ) > 0 );
  1142. }
  1143.  
  1144.  
  1145. getVectorRightAngle( vDir )
  1146. {
  1147. return( vDir[ 1 ], 0 - vDir[ 0 ], vDir[ 2 ] );
  1148. }
  1149.  
  1150. use_toggle()
  1151. {
  1152. if ( self.classname != "trigger_use_touch" )
  1153. return;
  1154.  
  1155. lights = getEntArray( self.target, "targetname" );
  1156. assert( lights.size );
  1157.  
  1158. self.lightsOn = 1;
  1159. foreach ( light in lights )
  1160. light setLightIntensity( 1.5 * self.lightsOn );
  1161.  
  1162.  
  1163. for ( ;; )
  1164. {
  1165. self waittill( "trigger" );
  1166.  
  1167. self.lightsOn = !self.lightsOn;
  1168. if ( self.lightsOn )
  1169. {
  1170. foreach ( light in lights )
  1171. light setLightIntensity( 1.5 );
  1172.  
  1173. self playSound( "switch_auto_lights_on" );
  1174. }
  1175. else
  1176. {
  1177. foreach ( light in lights )
  1178. light setLightIntensity( 0 );
  1179.  
  1180. self playSound( "switch_auto_lights_off" );
  1181. }
  1182. }
  1183. }
  1184.  
  1185.  
  1186. bird_startle()
  1187. {
  1188. }
  1189.  
  1190.  
  1191. photo_copier_init( trigger )
  1192. {
  1193. // self is trigger
  1194.  
  1195. self.copier = get_photo_copier( trigger );
  1196. assertex( self.copier.classname == "script_model", "Photocopier at " + trigger.origin + " doesn't target a photo copier" );
  1197.  
  1198. copy_bar = getent( self.copier.target, "targetname" );
  1199. assertex( copy_bar.classname == "script_brushmodel", "Photocopier at " + trigger.origin + " doesn't target a photo copier" );
  1200.  
  1201. light = getent( copy_bar.target, "targetname" );
  1202. assertex( light.classname == "light_spot" || light.classname == "light", "Photocopier at " + trigger.origin + " doesn't have a light" );
  1203.  
  1204. light.intensity = light getlightintensity();
  1205. light setlightintensity( 0 );
  1206. trigger.copy_bar = copy_bar;
  1207. trigger.start_pos = copy_bar.origin;
  1208. trigger.light = light;
  1209.  
  1210. angles = self.copier.angles + ( 0, 90, 0 );
  1211. forward = anglestoforward( angles );
  1212. trigger.end_pos = trigger.start_pos + vector_multiply( forward, 30 );
  1213. }
  1214.  
  1215. get_photo_copier( trigger )
  1216. {
  1217. if ( !isdefined( trigger.target ) )
  1218. {
  1219. //cant target directly to a destructible toy, so we are grabing the nearest one, since primary light requires them to be far anyway
  1220. toys = getentarray( "destructible_toy", "targetname" );
  1221. copier = toys[ 0 ];
  1222. foreach ( toy in toys )
  1223. {
  1224. if ( isdefined( toy.destructible_type ) && toy.destructible_type == "toy_copier" )
  1225. {
  1226. if ( distance( trigger.origin, copier.origin ) > distance( trigger.origin, toy.origin ) )
  1227. copier = toy;
  1228. }
  1229. }
  1230. assertex( distance( trigger.origin, copier.origin ) < 128, "Photocopier at " + trigger.origin + " doesn't contain a photo copier" );
  1231. }
  1232. else
  1233. {
  1234. copier = getent( trigger.target, "targetname" );
  1235. assertex( isdefined( copier ), "Photocopier at " + trigger.origin + " doesn't target a photo copier" );
  1236. copier setcandamage( true );
  1237. }
  1238.  
  1239. return copier;
  1240. }
  1241.  
  1242. waittill_copier_copies()
  1243. {
  1244. self.copier endon( "FX_State_Change0" );
  1245. self.copier endon( "death" );
  1246.  
  1247. self waittill( "trigger_enter" );
  1248. }
  1249.  
  1250. photo_copier()
  1251. {
  1252. level endon( "game_ended" );
  1253. photo_copier_init( self );
  1254.  
  1255. self.copier endon( "FX_State_Change0" ); // this is when copier breaks
  1256. self thread photo_copier_stop(); // monitor copier for quick stop
  1257.  
  1258. for ( ;; )
  1259. {
  1260. waittill_copier_copies();
  1261.  
  1262. self playSound( "mach_copier_run" );
  1263.  
  1264. if ( isdefined( self.copy_bar ) )
  1265. {
  1266. reset_copier( self );
  1267. thread photo_copier_copy_bar_goes();
  1268. thread photo_copier_light_on();
  1269. }
  1270. wait( 3 );
  1271. }
  1272. }
  1273.  
  1274. photo_copier_no_light()
  1275. {
  1276. level endon( "game_ended" );
  1277.  
  1278. self.copier = get_photo_copier( self );
  1279. assertex( self.copier.classname == "script_model", "Photocopier at " + self.origin + " doesn't target or contain a photo copier" );
  1280. self.copier endon( "FX_State_Change0" ); // this is when copier breaks
  1281.  
  1282. for ( ;; )
  1283. {
  1284. waittill_copier_copies();
  1285. self playSound( "mach_copier_run" );
  1286. wait( 3 );
  1287. }
  1288. }
  1289.  
  1290. // reset light and copy bar position, interruptes previous copy in progress
  1291. reset_copier( trigger )
  1292. {
  1293. trigger.copy_bar moveto( trigger.start_pos, 0.2 ); // reset position
  1294. trigger.light setlightintensity( 0 );
  1295. }
  1296.  
  1297. photo_copier_copy_bar_goes()
  1298. {
  1299. self.copier notify( "bar_goes" );
  1300. self.copier endon( "bar_goes" );
  1301. self.copier endon( "FX_State_Change0" );
  1302. self.copier endon( "death" );
  1303.  
  1304. copy_bar = self.copy_bar;
  1305. wait( 2.0 );
  1306. copy_bar moveto( self.end_pos, 1.6 );
  1307. wait( 1.8 );
  1308. copy_bar moveto( self.start_pos, 1.6 );
  1309. wait( 1.6 ); // wait( 13.35 );
  1310.  
  1311. light = self.light;
  1312. timer = 0.2;
  1313. steps = timer / 0.05;
  1314.  
  1315. for ( i = 0; i < steps; i++ )
  1316. {
  1317. intensity = i * 0.05;
  1318. intensity /= timer;
  1319. intensity = 1 - ( intensity * light.intensity );
  1320. if ( intensity > 0 )
  1321. light setlightintensity( intensity );
  1322. wait( 0.05 );
  1323. }
  1324. }
  1325.  
  1326. photo_copier_light_on()
  1327. {
  1328. self.copier notify( "light_on" );
  1329. self.copier endon( "light_on" );
  1330. self.copier endon( "FX_State_Change0" );
  1331. self.copier endon( "death" );
  1332.  
  1333. light = self.light;
  1334. timer = 0.2;
  1335. steps = timer / 0.05;
  1336.  
  1337. for ( i = 0; i < steps; i++ )
  1338. {
  1339. intensity = i * 0.05;
  1340. intensity /= timer;
  1341. light setlightintensity( intensity * light.intensity );
  1342. wait( 0.05 );
  1343. }
  1344.  
  1345. photo_light_flicker( light );
  1346. }
  1347.  
  1348. // stopping light and bar move on death
  1349. photo_copier_stop()
  1350. {
  1351. self.copier waittill( "FX_State_Change0" );
  1352. self.copier endon( "death" );
  1353.  
  1354. reset_copier( self );
  1355. }
  1356.  
  1357. photo_light_flicker( light )
  1358. {
  1359. // flicker
  1360. light setlightintensity( 1 );
  1361. wait( 0.05 );
  1362. light setlightintensity( 0 );
  1363. wait( 0.10 );
  1364. light setlightintensity( 1 );
  1365. wait( 0.05 );
  1366. light setlightintensity( 0 );
  1367. wait( 0.10 );
  1368. light setlightintensity( 1 );
  1369. }
  1370.  
  1371.  
  1372. fan_blade_rotate( type )
  1373. {
  1374. assert( isdefined( type ) );
  1375.  
  1376. speed = 0;
  1377. time = 20000;
  1378.  
  1379. speed_multiplier = 1.0;
  1380. if( isdefined( self.speed ) )
  1381. {
  1382. speed_multiplier = self.speed;
  1383. }
  1384.  
  1385. if ( type == "slow" )
  1386. speed = randomfloatrange( 100*speed_multiplier, 360*speed_multiplier );
  1387. else if ( type == "fast" )
  1388. speed = randomfloatrange( 720*speed_multiplier, 1000*speed_multiplier );
  1389. else
  1390. assertmsg( "Type must be fast or slow" );
  1391.  
  1392. wait randomfloatrange( 0, 1 );
  1393.  
  1394. fan_angles = self.angles;
  1395. fan_vec = Vector_multiply( AnglesToRight( self.angles ), 100 ); // assures normalized vector is length of "1"
  1396. fan_vec = VectorNormalize( fan_vec );
  1397.  
  1398. while ( true )
  1399. {
  1400. dot_x = abs( vectorDot( fan_vec, ( 1, 0, 0 ) ) );
  1401. dot_y = abs( vectorDot( fan_vec, ( 0, 1, 0 ) ) );
  1402. dot_z = abs( vectorDot( fan_vec, ( 0, 0, 1 ) ) );
  1403.  
  1404. if ( dot_x > 0.9 )
  1405. self rotatevelocity( ( speed, 0, 0 ), time );
  1406. else if ( dot_y > 0.9 )
  1407. self rotatevelocity( ( speed, 0, 0 ), time );
  1408. else if ( dot_z > 0.9 )
  1409. self rotatevelocity( ( 0, speed, 0 ), time );
  1410. else
  1411. self rotatevelocity( ( 0, speed, 0 ), time );
  1412.  
  1413. wait time;
  1414. }
  1415. }
  1416.  
  1417.  
  1418. triggerTouchThink( enterFunc, exitFunc )
  1419. {
  1420. level endon( "game_ended" );
  1421.  
  1422. self.entNum = self getEntityNumber();
  1423.  
  1424. while ( true )
  1425. {
  1426. self waittill( "trigger", player );
  1427.  
  1428. if ( !isPlayer( player ) && !isDefined( player.finished_spawning ) )
  1429. continue;
  1430.  
  1431. if ( !isAlive( player ) )
  1432. continue;
  1433.  
  1434. if ( !isDefined( player.touchTriggers[ self.entNum ] ) )
  1435. player thread playerTouchTriggerThink( self, enterFunc, exitFunc );
  1436. }
  1437. }
  1438.  
  1439.  
  1440. playerTouchTriggerThink( trigger, enterFunc, exitFunc )
  1441. {
  1442. if ( !isPlayer( self ) )
  1443. self endon( "death" );
  1444.  
  1445. if ( !isSP() )
  1446. touchName = self.guid; // generate GUID
  1447. else
  1448. touchName = "player" + gettime(); // generate GUID
  1449.  
  1450. trigger.touchList[ touchName ] = self;
  1451. if ( isDefined( trigger.moveTracker ) )
  1452. self.moveTrackers++ ;
  1453.  
  1454. trigger notify( "trigger_enter", self );
  1455. self notify( "trigger_enter", trigger );
  1456.  
  1457. if ( isDefined( enterFunc ) )
  1458. self thread [[ enterFunc ]]( trigger );
  1459.  
  1460. self.touchTriggers[ trigger.entNum ] = trigger;
  1461.  
  1462. while ( isAlive( self ) && self isTouching( trigger ) && ( isSP() || !level.gameEnded ) )
  1463. wait( 0.05 );
  1464.  
  1465. // disconnected player will skip this code
  1466. if ( isDefined( self ) )
  1467. {
  1468. self.touchTriggers[ trigger.entNum ] = undefined;
  1469. if ( isDefined( trigger.moveTracker ) )
  1470. self.moveTrackers -- ;
  1471.  
  1472. self notify( "trigger_leave", trigger );
  1473.  
  1474. if ( isDefined( exitFunc ) )
  1475. self thread [[ exitFunc ]]( trigger );
  1476. }
  1477.  
  1478. if ( !isSP() && level.gameEnded )
  1479. return;
  1480.  
  1481. trigger.touchList[ touchName ] = undefined;
  1482. trigger notify( "trigger_leave", self );
  1483.  
  1484. if ( !anythingTouchingTrigger( trigger ) )
  1485. trigger notify( "trigger_empty" );
  1486. }
  1487.  
  1488.  
  1489. movementTracker()
  1490. {
  1491. self endon( "disconnect" );
  1492.  
  1493. if ( !isPlayer( self ) )
  1494. self endon( "death" );
  1495.  
  1496. self.moveTrackers = 0;
  1497. self.distMoved = 0;
  1498.  
  1499. for ( ;; )
  1500. {
  1501. self waittill( "trigger_enter" );
  1502.  
  1503. lastOrigin = self.origin;
  1504. while ( self.moveTrackers )
  1505. {
  1506. self.distMoved = distance( lastOrigin, self.origin );
  1507. lastOrigin = self.origin;
  1508. wait( 0.05 );
  1509. }
  1510.  
  1511. self.distMoved = 0;
  1512. }
  1513. }
  1514.  
  1515.  
  1516. anythingTouchingTrigger( trigger )
  1517. {
  1518. return( trigger.touchList.size );
  1519. }
  1520.  
  1521.  
  1522. playerTouchingTrigger( player, trigger )
  1523. {
  1524. assert( isDefined( trigger.entNum ) );
  1525. return( isDefined( player.touchTriggers[ trigger.entNum ] ) );
  1526. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement