Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 43.20 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include common_scripts\_fx;
  3. #include common_scripts\_createfxMenu;
  4.  
  5. createEffect( type, fxid )
  6. {
  7. ent = spawnStruct();
  8. if ( !isdefined( level.createFXent ) )
  9. level.createFXent = [];
  10.  
  11. level.createFXent[ level.createFXent.size ] = ent;
  12. ent.v = [];
  13. ent.v[ "type" ] = type;
  14. ent.v[ "fxid" ] = fxid;
  15. ent.v[ "angles" ] = ( 0, 0, 0 );
  16. ent.v[ "origin" ] = ( 0, 0, 0 );
  17. ent.drawn = true;
  18. return ent;
  19. }
  20.  
  21. add_effect( name, effect )
  22. {
  23. if ( !isdefined( level._effect ) )
  24. level._effect = [];
  25.  
  26. level._effect[ name ] = loadfx( effect );
  27. }
  28.  
  29. createLoopSound()
  30. {
  31. ent = spawnStruct();
  32. if ( !isdefined( level.createFXent ) )
  33. level.createFXent = [];
  34.  
  35. level.createFXent[ level.createFXent.size ] = ent;
  36. ent.v = [];
  37. ent.v[ "type" ] = "soundfx";
  38. ent.v[ "fxid" ] = "No FX";
  39. ent.v[ "soundalias" ] = "nil";
  40. ent.v[ "angles" ] = ( 0, 0, 0 );
  41. ent.v[ "origin" ] = ( 0, 0, 0 );
  42. ent.drawn = true;
  43. return ent;
  44. }
  45.  
  46. createNewExploder()
  47. {
  48. ent = spawnStruct();
  49. if ( !isdefined( level.createFXent ) )
  50. level.createFXent = [];
  51.  
  52. level.createFXent[ level.createFXent.size ] = ent;
  53. ent.v = [];
  54. ent.v[ "type" ] = "exploder";
  55. ent.v[ "fxid" ] = "No FX";
  56. ent.v[ "soundalias" ] = "nil";
  57. ent.v[ "loopsound" ] = "nil";
  58. ent.v[ "angles" ] = ( 0, 0, 0 );
  59. ent.v[ "origin" ] = ( 0, 0, 0 );
  60. ent.v[ "exploder" ] = 1;
  61. ent.v[ "flag" ] = "nil";
  62. ent.v[ "exploder_type" ] = "normal";
  63. ent.drawn = true;
  64. return ent;
  65. }
  66.  
  67. set_forward_and_up_vectors()
  68. {
  69. self.v[ "up" ] = anglestoup( self.v[ "angles" ] );
  70. self.v[ "forward" ] = anglestoforward( self.v[ "angles" ] );
  71. }
  72.  
  73. createfx_common()
  74. {
  75. precacheShader( "black" );
  76.  
  77. if( level.mp_createfx )
  78. hack_start( "painter_mp" );
  79. else
  80. hack_start( "painter" );
  81.  
  82. flag_init( "createfx_saving" );
  83. // Effects placing tool
  84. if ( !isdefined( level.createFX ) )
  85. level.createFX = [];
  86. level.createfx_loopcounter = 0;
  87.  
  88. triggers = getentarray( "trigger_multiple", "classname" );
  89. for ( i = 0;i < triggers.size;i++ )
  90. triggers[ i ] delete();
  91.  
  92. triggers = getentarray( "trigger_radius", "classname" );
  93. for ( i = 0;i < triggers.size;i++ )
  94. triggers[ i ] delete();
  95. }
  96.  
  97. createFxLogic()
  98. {
  99. waittillframeend;// let _load run first
  100.  
  101. menu_init();
  102.  
  103. if ( !isdefined( level._effect ) )
  104. level._effect = [];
  105.  
  106. if ( GetDvar( "createfx_map" ) == "" )
  107. SetDevDvar( "createfx_map", level.script );
  108. else if ( GetDvar( "createfx_map" ) == level.script )
  109. [[ level.func_position_player ]]();
  110.  
  111. level.createFxHudElements = [];
  112. level.createFx_hudElements = 30;
  113. // all this offset stuff lets us duplicate the text which puts an outline around
  114. // it and makes it more legible
  115. strOffsetX = [];
  116. strOffsetY = [];
  117. strOffsetX[ 0 ] = 0;
  118. strOffsetY[ 0 ] = 0;
  119. strOffsetX[ 1 ] = 1;
  120. strOffsetY[ 1 ] = 1;
  121. strOffsetX[ 2 ] = -2;
  122. strOffsetY[ 2 ] = 1;
  123. strOffsetX[ 3 ] = 1;
  124. strOffsetY[ 3 ] = -1;
  125. strOffsetX[ 4 ] = -2;
  126. strOffsetY[ 4 ] = -1;
  127.  
  128. SetDevDvar( "fx", "nil" );
  129.  
  130. // setup "crosshair"
  131. crossHair = newHudElem();
  132. crossHair.location = 0;
  133. crossHair.alignX = "center";
  134. crossHair.alignY = "middle";
  135. crossHair.foreground = 1;
  136. crossHair.fontScale = 2;
  137. crossHair.sort = 20;
  138. crossHair.alpha = 1;
  139. crossHair.x = 320;
  140. crossHair.y = 233;
  141. crossHair setText( "." );
  142.  
  143. // setup the free text marker to allow some permanent strings
  144. level.clearTextMarker = newHudElem();
  145. level.clearTextMarker.alpha = 0;
  146. level.clearTextMarker setText( "marker" );
  147.  
  148. for ( i = 0;i < level.createFx_hudElements;i++ )
  149. {
  150. newStrArray = [];
  151. for ( p = 0;p < 1;p++ )
  152. {
  153. newStr = newHudElem();
  154. newStr.alignX = "left";
  155. newStr.location = 0;
  156. newStr.foreground = 1;
  157. newStr.fontScale = 1.40;
  158. newStr.sort = 20 - p;
  159. newStr.alpha = 1;
  160. newStr.x = 0 + strOffsetX[ p ];
  161. newStr.y = 60 + strOffsetY[ p ] + i * 15;
  162. if ( p > 0 )
  163. newStr.color = ( 0, 0, 0 );
  164.  
  165. newStrArray[ newStrArray.size ] = newStr;
  166. }
  167.  
  168. level.createFxHudElements[ i ] = newStrArray;
  169. }
  170.  
  171. newStrArray = [];
  172. for ( p = 0;p < 5;p++ )
  173. {
  174. // setup instructional text
  175. newStr = newHudElem();
  176. newStr.alignX = "center";
  177. newStr.location = 0;
  178. newStr.foreground = 1;
  179. newStr.fontScale = 1.40;
  180. newStr.sort = 20 - p;
  181. newStr.alpha = 1;
  182. newStr.x = 320 + strOffsetX[ p ];
  183. newStr.y = 80 + strOffsetY[ p ];
  184. if ( p > 0 )
  185. newStr.color = ( 0, 0, 0 );
  186.  
  187. newStrArray[ newStrArray.size ] = newStr;
  188. }
  189.  
  190. level.createFX_centerPrint = newStrArray;
  191.  
  192. // gets cumulatively added to to create digital accelleration
  193. level.selectedMove_up = 0;
  194. level.selectedMove_forward = 0;
  195. level.selectedMove_right = 0;
  196. level.selectedRotate_pitch = 0;
  197. level.selectedRotate_roll = 0;
  198. level.selectedRotate_yaw = 0;
  199. level.selected_fx = [];
  200. level.selected_fx_ents = [];
  201.  
  202. level.createfx_lockedList = [];
  203. level.createfx_lockedList[ "escape" ] = true;
  204. level.createfx_lockedList[ "BUTTON_LSHLDR" ] = true;
  205. level.createfx_lockedList[ "BUTTON_RSHLDR" ] = true;
  206. level.createfx_lockedList[ "mouse1" ] = true;
  207. level.createfx_lockedList[ "ctrl" ] = true;
  208.  
  209. level.createfx_draw_enabled = true;
  210. level.last_displayed_ent = undefined;
  211.  
  212. level.buttonIsHeld = [];
  213. axisMode = false;
  214. lastPlayerOrigin = (0,0,0);
  215. if( !level.mp_createfx )
  216. lastPlayerOrigin = level.player.origin;
  217.  
  218. colors = [];
  219. colors[ "loopfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
  220. colors[ "loopfx" ][ "highlighted" ] = ( 0.4, 0.95, 1.0 );
  221. colors[ "loopfx" ][ "default" ] = ( 0.3, 0.8, 1.0 );
  222.  
  223. colors[ "oneshotfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
  224. colors[ "oneshotfx" ][ "highlighted" ] = ( 0.4, 0.95, 1.0 );
  225. colors[ "oneshotfx" ][ "default" ] = ( 0.3, 0.8, 1.0 );
  226.  
  227. colors[ "exploder" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
  228. colors[ "exploder" ][ "highlighted" ] = ( 1.0, 0.2, 0.2 );
  229. colors[ "exploder" ][ "default" ] = ( 1.0, 0.1, 0.1 );
  230.  
  231. colors[ "rainfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
  232. colors[ "rainfx" ][ "highlighted" ] = ( .95, 0.4, 0.95 );
  233. colors[ "rainfx" ][ "default" ] = ( .78, 0.0, 0.73 );
  234.  
  235. colors[ "soundfx" ][ "selected" ] = ( 1.0, 1.0, 0.2 );
  236. colors[ "soundfx" ][ "highlighted" ] = ( .5, 1.0, 0.75 );
  237. colors[ "soundfx" ][ "default" ] = ( .2, 0.9, 0.2 );
  238.  
  239. lastHighlightedEnt = undefined;
  240. level.fx_rotating = false;
  241. setMenu( "none" );
  242. level.createfx_selecting = false;
  243.  
  244. // black background for text
  245. black = newHudElem();
  246. black.x = -120;
  247. black.y = 200;
  248. // black[i].alignX = "center";
  249. // black[i].alignY = "middle";
  250. black.foreground = 0;
  251. black setShader( "black", 250, 160 );
  252. black.alpha = 0;// 0.6;
  253.  
  254. level.createfx_inputlocked = false;
  255.  
  256. for ( i = 0; i < level.createFXent.size; i++ )
  257. {
  258. ent = level.createFXent[ i ];
  259. ent post_entity_creation_function();
  260. }
  261.  
  262. thread draw_distance();
  263. lastSelectEntity = undefined;
  264. thread createfx_autosave();
  265.  
  266. for ( ;; )
  267. {
  268. changedSelectedEnts = false;
  269.  
  270. // calculate the "cursor"
  271. right = anglestoright( level.player getplayerangles() );
  272. forward = anglestoforward( level.player getplayerangles() );
  273. up = anglestoup( level.player getplayerangles() );
  274. dot = 0.85;
  275.  
  276. placeEnt_vector = vector_multiply( forward, 750 );
  277. level.createfxCursor = bullettrace( level.player geteye(), level.player geteye() + placeEnt_vector, false, undefined );
  278. highlightedEnt = undefined;
  279.  
  280. // ************************************************************
  281. //
  282. // General input
  283. //
  284. // ************************************************************
  285.  
  286. level.buttonClick = [];
  287. level.button_is_kb = [];
  288. process_button_held_and_clicked();
  289. ctrlHeld = button_is_held( "ctrl", "BUTTON_LSHLDR" );
  290. leftClick = button_is_clicked( "mouse1", "BUTTON_A" );
  291. leftHeld = button_is_held( "mouse1", "BUTTON_A" );
  292.  
  293. create_fx_menu();
  294.  
  295. if ( button_is_clicked( "shift", "BUTTON_X" ) )
  296. axisMode = !axisMode;
  297.  
  298. //changing to allow devgui item
  299. if ( button_is_clicked( "F5" ) )
  300. SetDevDvar( "scr_createfx_dump", 1 );
  301.  
  302. if( GetDvarInt( "scr_createfx_dump" ) )
  303. {
  304. SetDevDvar( "scr_createfx_dump", 0 );
  305. generate_fx_log();
  306. }
  307.  
  308. if ( button_is_clicked( "F2" ) )
  309. toggle_createfx_drawing();
  310.  
  311. if ( button_is_clicked( "ins" ) )
  312. insert_effect();
  313.  
  314. if ( button_is_clicked( "del" ) )
  315. delete_pressed();
  316.  
  317. if ( button_is_clicked( "end", "l" ) )
  318. {
  319. drop_selection_to_ground();
  320. changedSelectedEnts = true;
  321. }
  322.  
  323. if ( button_is_clicked( "escape" ) )
  324. clear_settable_fx();
  325.  
  326. if ( button_is_clicked( "space" ) )
  327. set_off_exploders();
  328.  
  329. if ( button_is_clicked( "g" ) )
  330. {
  331. select_all_exploders_of_currently_selected( "exploder" );
  332. select_all_exploders_of_currently_selected( "flag" );
  333. }
  334.  
  335. if ( button_is_clicked( "tab", "BUTTON_RSHLDR" ) )
  336. {
  337. move_selection_to_cursor();
  338. changedSelectedEnts = true;
  339. }
  340.  
  341. if ( button_is_held( "h", "F1" ) )
  342. {
  343. show_help();
  344. wait( 0.05 );
  345. continue;
  346. }
  347.  
  348. if ( button_is_clicked( "BUTTON_LSTICK" ) )
  349. copy_ents();
  350. if ( button_is_clicked( "BUTTON_RSTICK" ) )
  351. paste_ents();
  352.  
  353. if ( ctrlHeld )
  354. {
  355. if ( button_is_clicked( "c" ) )
  356. copy_ents();
  357.  
  358. if ( button_is_clicked( "v" ) )
  359. paste_ents();
  360. }
  361.  
  362. if ( isdefined( level.selected_fx_option_index ) )
  363. menu_fx_option_set();
  364.  
  365. // ************************************************************
  366. //
  367. // Highlighted Entity Handling
  368. //
  369. // ************************************************************
  370. for ( i = 0; i < level.createFXent.size; i++ )
  371. {
  372. ent = level.createFXent[ i ];
  373.  
  374. difference = vectornormalize( ent.v[ "origin" ] - ( level.player.origin + ( 0, 0, 55 ) ) );
  375. newdot = vectordot( forward, difference );
  376. if ( newdot < dot )
  377. continue;
  378.  
  379. dot = newdot;
  380. highlightedEnt = ent;
  381. }
  382. level.fx_highLightedEnt = highLightedEnt;
  383.  
  384. if ( isdefined( highLightedEnt ) )
  385. {
  386. if ( isdefined( lastHighlightedEnt ) )
  387. {
  388. if ( lastHighlightedEnt != highlightedEnt )
  389. {
  390. // a highlighted ent is no longer highlighted so scale down the text size
  391. // lastHighlightedEnt.text = ".";
  392. // lastHighlightedEnt.textsize = 2;
  393. if ( !ent_is_selected( lastHighlightedEnt ) )
  394. lastHighlightedEnt thread entity_highlight_disable();
  395.  
  396. // an ent became highlighted for the first time so scale up the text size on the new ent
  397. // highlightedEnt.text = HighlightedEnt.v["fxid"];
  398. // highlightedEnt.textsize = 1;
  399. if ( !ent_is_selected( highlightedEnt ) )
  400. highlightedEnt thread entity_highlight_enable();
  401. }
  402. }
  403. else
  404. {
  405. // an ent became highlighted for the first time so scale up the text size on the new ent
  406. // HighlightedEnt.text = HighlightedEnt.v["fxid"];
  407. // HighlightedEnt.textsize = 1;
  408. if ( !ent_is_selected( highlightedEnt ) )
  409. highlightedEnt thread entity_highlight_enable();
  410. }
  411. }
  412.  
  413. manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, colors, right );
  414.  
  415. // ************************************************************
  416. //
  417. // Rotation and Movement
  418. //
  419. // ************************************************************
  420.  
  421. if ( axisMode && level.selected_fx_ents.size > 0 )
  422. {
  423. // draw axis and do rotation if shift is held
  424. thread [[ level.func_process_fx_rotater ]]();
  425. if ( button_is_clicked( "enter", "p" ) )
  426. reset_axis_of_selected_ents();
  427.  
  428. if ( button_is_clicked( "v" ) )
  429. copy_angles_of_selected_ents();
  430.  
  431. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  432. level.selected_fx_ents[ i ] draw_axis();
  433.  
  434. if ( level.selectedRotate_pitch != 0 || level.selectedRotate_yaw != 0 || level.selectedRotate_roll != 0 )
  435. changedSelectedEnts = true;
  436. wait( 0.05 );
  437. /*
  438. for ( i=0; i < level.selected_fx_ents.size; i++)
  439. {
  440. ent = level.selected_fx_ents[i];
  441. ent.angles = ent.angles + (level.selectedRotate_pitch, level.selectedRotate_yaw, 0);
  442. ent set_forward_and_up_vectors();
  443. }
  444.  
  445. if (level.selectedRotate_pitch != 0 || level.selectedRotate_yaw != 0)
  446. changedSelectedEnts = true;
  447. */
  448. }
  449. else
  450. {
  451. selectedMove_vector = get_selected_move_vector();
  452. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  453. {
  454. ent = level.selected_fx_ents[ i ];
  455. if ( isdefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
  456. continue;
  457.  
  458. ent.v[ "origin" ] = ent.v[ "origin" ] + selectedMove_vector;
  459. }
  460.  
  461. if ( distance( ( 0, 0, 0 ), selectedMove_vector ) > 0 )
  462. changedSelectedEnts = true;
  463. wait( 0.05 );
  464. }
  465.  
  466. if ( changedSelectedEnts )
  467. update_selected_entities();
  468.  
  469. if( !level.mp_createfx )
  470. lastPlayerOrigin = [[ level.func_position_player_get ]]( lastPlayerOrigin );
  471.  
  472. lastHighlightedEnt = highlightedEnt;
  473.  
  474. // if the last selected entity changes then reset the options offset
  475. if ( last_selected_entity_has_changed( lastSelectEntity ) )
  476. {
  477. level.effect_list_offset = 0;
  478. clear_settable_fx();
  479. setmenu( "none" );
  480. }
  481.  
  482. if ( level.selected_fx_ents.size )
  483. lastSelectEntity = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ];
  484. else
  485. lastSelectEntity = undefined;
  486. }
  487. }
  488.  
  489. copy_angles_of_selected_ents()
  490. {
  491. // so it stops rotating them over time
  492. level notify( "new_ent_selection" );
  493.  
  494. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  495. {
  496. ent = level.selected_fx_ents[ i ];
  497. ent.v[ "angles" ] = level.selected_fx_ents[ level.selected_fx_ents.size - 1 ].v[ "angles" ];
  498. ent set_forward_and_up_vectors();
  499. }
  500.  
  501. update_selected_entities();
  502. }
  503.  
  504. reset_axis_of_selected_ents()
  505. {
  506. // so it stops rotating them over time
  507. level notify( "new_ent_selection" );
  508.  
  509. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  510. {
  511. ent = level.selected_fx_ents[ i ];
  512. ent.v[ "angles" ] = ( 0, 0, 0 );
  513. ent set_forward_and_up_vectors();
  514. }
  515.  
  516. update_selected_entities();
  517. }
  518.  
  519. last_selected_entity_has_changed( lastSelectEntity )
  520. {
  521. if ( isdefined( lastSelectEntity ) )
  522. {
  523. if ( !entities_are_selected() )
  524. return true;
  525. }
  526. else
  527. return entities_are_selected();
  528.  
  529. return( lastSelectEntity != level.selected_fx_ents[ level.selected_fx_ents.size - 1 ] );
  530. }
  531.  
  532. createfx_showOrigin( id, org, delay, org2, type, exploder, id2, fireFx, fireFxDelay, fireFxSound, fxSound, fxQuake, fxDamage, soundalias, repeat, delay_min, delay_max, damage_radius, fireFxTimeout )
  533. {
  534. }
  535.  
  536. drop_selection_to_ground()
  537. {
  538. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  539. {
  540. ent = level.selected_fx_ents[ i ];
  541. trace = bullettrace( ent.v[ "origin" ], ent.v[ "origin" ] + ( 0, 0, -2048 ), false, undefined );
  542. ent.v[ "origin" ] = trace[ "position" ];
  543. }
  544. }
  545.  
  546. set_off_exploders()
  547. {
  548. level notify( "createfx_exploder_reset" );
  549. exploders = [];
  550. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  551. {
  552. ent = level.selected_fx_ents[ i ];
  553. if ( isdefined( ent.v[ "exploder" ] ) )
  554. exploders[ ent.v[ "exploder" ] ] = true;
  555. }
  556.  
  557. keys = getarraykeys( exploders );
  558. for ( i = 0; i < keys.size; i++ )
  559. exploder( keys[ i ] );
  560. }
  561.  
  562. draw_distance()
  563. {
  564. count = 0;
  565. if ( GetDvarInt( "createfx_drawdist" ) == 0 )
  566. SetDevDvar( "createfx_drawdist", "1500" );
  567.  
  568. for ( ;; )
  569. {
  570. maxDist = GetDvarInt( "createfx_drawdist" );
  571. for ( i = 0; i < level.createFXent.size; i++ )
  572. {
  573. ent = level.createFXent[ i ];
  574. ent.drawn = distance( level.player.origin, ent.v[ "origin" ] ) <= maxDist;
  575.  
  576. count++ ;
  577. if ( count > 100 )
  578. {
  579. count = 0;
  580. wait( 0.05 );
  581. }
  582. }
  583. if ( level.createFXent.size == 0 )
  584. wait( 0.05 );
  585. }
  586. }
  587.  
  588. createfx_autosave()
  589. {
  590. for ( ;; )
  591. {
  592. wait( 300 );
  593. flag_waitopen( "createfx_saving" );
  594. generate_fx_log( true );
  595. }
  596. }
  597.  
  598. rotate_over_time( org, rotater )
  599. {
  600. level endon( "new_ent_selection" );
  601. timer = 0.1;
  602. for ( p = 0;p < timer * 20;p++ )
  603. {
  604. if ( level.selectedRotate_pitch != 0 )
  605. org AddPitch( level.selectedRotate_pitch );
  606. else
  607. if ( level.selectedRotate_yaw != 0 )
  608. org AddYaw( level.selectedRotate_yaw );
  609. else
  610. org AddRoll( level.selectedRotate_roll );
  611.  
  612. wait( 0.05 );
  613. org draw_axis();
  614.  
  615. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  616. {
  617. ent = level.selected_fx_ents[ i ];
  618. if ( isdefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
  619. continue;
  620.  
  621. ent.v[ "origin" ] = rotater[ i ].origin;
  622. ent.v[ "angles" ] = rotater[ i ].angles;
  623. }
  624. }
  625. }
  626.  
  627. delete_pressed()
  628. {
  629. if ( level.createfx_inputlocked )
  630. {
  631. remove_selected_option();
  632. return;
  633. }
  634.  
  635. delete_selection();
  636. }
  637.  
  638. remove_selected_option()
  639. {
  640. if ( !isdefined( level.selected_fx_option_index ) )
  641. {
  642. return;
  643. }
  644.  
  645. name = level.createFX_options[ level.selected_fx_option_index ][ "name" ];
  646. for ( i = 0; i < level.createFXent.size; i++ )
  647. {
  648. ent = level.createFXent[ i ];
  649. if ( !ent_is_selected( ent ) )
  650. continue;
  651.  
  652. ent remove_option( name );
  653. }
  654.  
  655. update_selected_entities();
  656. clear_settable_fx();
  657. }
  658.  
  659. remove_option( name )
  660. {
  661. self.v[ name ] = undefined;
  662. }
  663.  
  664. delete_selection()
  665. {
  666. newArray = [];
  667.  
  668. for ( i = 0; i < level.createFXent.size; i++ )
  669. {
  670. ent = level.createFXent[ i ];
  671. if ( ent_is_selected( ent ) )
  672. {
  673. if ( isdefined( ent.looper ) )
  674. ent.looper delete();
  675.  
  676. ent notify( "stop_loop" );
  677. }
  678. else
  679. newArray[ newArray.size ] = ent;
  680. }
  681.  
  682. level.createFXent = newArray;
  683.  
  684. level.selected_fx = [];
  685. level.selected_fx_ents = [];
  686. clear_fx_hudElements();
  687. }
  688.  
  689. move_selection_to_cursor()
  690. {
  691. origin = level.createfxCursor[ "position" ];
  692. if ( level.selected_fx_ents.size <= 0 )
  693. return;
  694.  
  695. center = get_center_of_array( level.selected_fx_ents );
  696. difference = center - origin;
  697. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  698. {
  699. ent = level.selected_fx_ents[ i ];
  700. if ( isdefined( ent.model ) )// ents with brushmodels are from radiant and dont get moved
  701. continue;
  702.  
  703. ent.v[ "origin" ] -= difference;
  704. }
  705. }
  706.  
  707. insert_effect()
  708. {
  709. setMenu( "creation" );
  710. level.effect_list_offset = 0;
  711. clear_fx_hudElements();
  712. set_fx_hudElement( "Pick effect type to create:" );
  713. set_fx_hudElement( "1. One Shot fx" );
  714. set_fx_hudElement( "2. Looping fx" );
  715. set_fx_hudElement( "3. Looping sound" );
  716. set_fx_hudElement( "4. Exploder" );
  717. set_fx_hudElement( "(c) Cancel" );
  718. set_fx_hudElement( "(x) Exit" );
  719. /*
  720. set_fx_hudElement("Pick an effect:");
  721. set_fx_hudElement("In the console, type");
  722. set_fx_hudElement("/fx name");
  723. set_fx_hudElement("Where name is the name of the sound alias");
  724. */
  725. }
  726.  
  727. show_help()
  728. {
  729. clear_fx_hudElements();
  730. set_fx_hudElement( "Help:" );
  731. set_fx_hudElement( "Insert Insert entity" );
  732. set_fx_hudElement( "L Drop selected entities to the ground" );
  733. set_fx_hudElement( "A Add option to the selected entities" );
  734. set_fx_hudElement( "P Reset the rotation of the selected entities" );
  735. set_fx_hudElement( "V Copy the angles from the most recently selected fx onto all selected fx." );
  736. set_fx_hudElement( "Delete Kill the selected entities" );
  737. set_fx_hudElement( "ESCAPE Cancel out of option-modify-mode, must have console open" );
  738. set_fx_hudElement( "Ctrl-C Copy" );
  739. set_fx_hudElement( "Ctrl-V Paste" );
  740. set_fx_hudElement( "F2 Toggle createfx dot and text drawing" );
  741. set_fx_hudElement( "F5 SAVES your work" );
  742. set_fx_hudElement( "Dpad Move selected entitise on X/Y or rotate pitch/yaw" );
  743. set_fx_hudElement( "A button Toggle the selection of the current entity" );
  744. set_fx_hudElement( "X button Toggle entity rotation mode" );
  745. set_fx_hudElement( "Y button Move selected entites up or rotate roll" );
  746. set_fx_hudElement( "B button Move selected entites down or rotate roll" );
  747. set_fx_hudElement( "R Shoulder Move selected entities to the cursor" );
  748. set_fx_hudElement( "L Shoulder Hold to select multiple entites" );
  749. set_fx_hudElement( "L JoyClick Copy" );
  750. set_fx_hudElement( "R JoyClick Paste" );
  751. set_fx_hudElement( "N UFO" );
  752. set_fx_hudElement( "T Toggle Timescale FAST" );
  753. set_fx_hudElement( "Y Toggle Timescale SLOW" );
  754. set_fx_hudElement( "[ Toggle FX Visibility" );
  755. set_fx_hudElement( "] Toggle ShowTris" );
  756. set_fx_hudElement( "F11 Toggle FX Profile" );
  757. }
  758.  
  759.  
  760. select_last_entity()
  761. {
  762. select_entity( level.createFXent.size - 1, level.createFXent[ level.createFXent.size - 1 ] );
  763. }
  764.  
  765. select_all_exploders_of_currently_selected( key )
  766. {
  767. selected_exploders = [];
  768. foreach ( ent in level.selected_fx_ents )
  769. {
  770. if ( !isdefined( ent.v[ key ] ) )
  771. continue;
  772.  
  773. value = ent.v[ key ];
  774. selected_exploders[ value ] = true;
  775. }
  776.  
  777. foreach ( value, _ in selected_exploders )
  778. {
  779. foreach ( index, ent in level.createFXent )
  780. {
  781. if ( index_is_selected( index ) )
  782. continue;
  783. if ( !isdefined( ent.v[ key ] ) )
  784. continue;
  785. if ( ent.v[ key ] != value )
  786. continue;
  787.  
  788. select_entity( index, ent );
  789. }
  790. }
  791.  
  792. update_selected_entities();
  793. }
  794.  
  795. copy_ents()
  796. {
  797. if ( level.selected_fx_ents.size <= 0 )
  798. return;
  799.  
  800. array = [];
  801. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  802. {
  803. ent = level.selected_fx_ents[ i ];
  804. newent = spawnstruct();
  805.  
  806. newent.v = ent.v;
  807. newent post_entity_creation_function();
  808. array[ array.size ] = newent;
  809. }
  810.  
  811. level.stored_ents = array;
  812. }
  813.  
  814. post_entity_creation_function()
  815. {
  816. self.textAlpha = 0;
  817. self.drawn = true;
  818. }
  819.  
  820. paste_ents()
  821. {
  822. if ( !isdefined( level.stored_ents ) )
  823. return;
  824.  
  825. clear_entity_selection();
  826.  
  827. for ( i = 0;i < level.stored_ents.size;i++ )
  828. add_and_select_entity( level.stored_ents[ i ] );
  829.  
  830. move_selection_to_cursor();
  831. update_selected_entities();
  832. level.stored_ents = [];
  833. copy_ents();// roundabout way to put new entities in the copy queue
  834. }
  835.  
  836. add_and_select_entity( ent )
  837. {
  838. level.createFXent[ level.createFXent.size ] = ent;
  839. select_last_entity();
  840. }
  841.  
  842. get_center_of_array( array )
  843. {
  844. center = ( 0, 0, 0 );
  845. for ( i = 0; i < array.size; i++ )
  846. center = ( center[ 0 ] + array[ i ].v[ "origin" ][ 0 ], center[ 1 ] + array[ i ].v[ "origin" ][ 1 ], center[ 2 ] + array[ i ].v[ "origin" ][ 2 ] );
  847.  
  848. return( center[ 0 ] / array.size, center[ 1 ] / array.size, center[ 2 ] / array.size );
  849. }
  850.  
  851. ent_draw_axis()
  852. {
  853. self endon( "death" );
  854. for ( ;; )
  855. {
  856. draw_axis();
  857. wait( 0.05 );
  858. }
  859. }
  860.  
  861. rotation_is_occuring()
  862. {
  863. if ( level.selectedRotate_roll != 0 )
  864. return true;
  865. if ( level.selectedRotate_pitch != 0 )
  866. return true;
  867. return level.selectedRotate_yaw != 0;
  868. }
  869.  
  870. print_fx_options( ent, tab, file, autosave )
  871. {
  872. for ( i = 0; i < level.createFX_options.size; i++ )
  873. {
  874. option = level.createFX_options[ i ];
  875. if ( !isdefined( ent.v[ option[ "name" ] ] ) )
  876. continue;
  877. if ( !mask( option[ "mask" ], ent.v[ "type" ] ) )
  878. continue;
  879.  
  880. if ( option[ "type" ] == "string" )
  881. {
  882. // if ( !autosave )
  883. // println( " ent.v[ \"" + option[ "name" ] + "\" ] = \"" + ent.v[ option[ "name" ] ] + "\";" );
  884. cfxprintln( file, tab + "ent.v[ \"" + option[ "name" ] + "\" ] = \"" + ent.v[ option[ "name" ] ] + "\";" );
  885. continue;
  886. }
  887.  
  888. // int or float
  889. // if ( !autosave )
  890. // println( " ent.v[ \"" + option[ "name" ] + "\" ] = " + ent.v[ option[ "name" ] ] + ";" );
  891. cfxprintln( file, tab + "ent.v[ \"" + option[ "name" ] + "\" ] = " + ent.v[ option[ "name" ] ] + ";" );
  892. }
  893. }
  894.  
  895. entity_highlight_disable()
  896. {
  897. self notify( "highlight change" );
  898. self endon( "highlight change" );
  899.  
  900. for ( ;; )
  901. {
  902. self.textalpha = self.textalpha * 0.85;
  903. self.textalpha = self.textalpha - 0.05;
  904. if ( self.textalpha < 0 )
  905. break;
  906. wait( 0.05 );
  907. }
  908.  
  909. self.textalpha = 0;
  910. }
  911.  
  912. entity_highlight_enable()
  913. {
  914. self notify( "highlight change" );
  915. self endon( "highlight change" );
  916.  
  917. for ( ;; )
  918. {
  919. // self.textalpha = sin(gettime()) * 0.5 + 0.5;
  920. self.textalpha = self.textalpha + 0.05;
  921. self.textalpha = self.textalpha * 1.25;
  922. if ( self.textalpha > 1 )
  923. break;
  924. wait( 0.05 );
  925. }
  926.  
  927. self.textalpha = 1;
  928.  
  929. }
  930.  
  931.  
  932. toggle_createfx_drawing()
  933. {
  934. level.createfx_draw_enabled = !level.createfx_draw_enabled;
  935. }
  936.  
  937. manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, colors, right )
  938. {
  939. if ( !level.createfx_draw_enabled )
  940. return;
  941.  
  942. for ( i = 0; i < level.createFXent.size; i++ )
  943. {
  944. ent = level.createFXent[ i ];
  945. if ( !ent.drawn )
  946. continue;
  947.  
  948. scale = GetDvarFloat( "createfx_scaleid" );
  949.  
  950. if ( isdefined( highlightedEnt ) && ent == highlightedEnt )
  951. {
  952. if ( !entities_are_selected() )
  953. display_fx_info( ent );
  954.  
  955. if ( leftClick )
  956. {
  957. entWasSelected = index_is_selected( i );
  958. level.createfx_selecting = !entWasSelected;// used for drag select / deselect
  959. if ( !ctrlHeld )
  960. {
  961. selectedSize = level.selected_fx_ents.size;
  962. clear_entity_selection();
  963. if ( entWasSelected && selectedSize == 1 )
  964. select_entity( i, ent );
  965. }
  966. toggle_entity_selection( i, ent );
  967. }
  968. else
  969. if ( leftHeld )
  970. {
  971. if ( ctrlHeld )
  972. {
  973. if ( level.createfx_selecting )
  974. select_entity( i, ent );
  975.  
  976. if ( !level.createfx_selecting )
  977. deselect_entity( i, ent );
  978. }
  979. }
  980.  
  981.  
  982. colorIndex = "highlighted";
  983. if ( index_is_selected( i ) )
  984. colorIndex = "selected";
  985.  
  986.  
  987. print3d( ent.v[ "origin" ], ".", colors[ ent.v[ "type" ] ][ colorIndex ], 1, scale );
  988. if ( ent.textalpha > 0 )
  989. {
  990. printRight = vector_multiply( right, ent.v[ "fxid" ].size * - 2.93 * scale );
  991. print3d( ent.v[ "origin" ] + printRight + ( 0, 0, 15 ), ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorIndex ], ent.textalpha, scale );
  992. }
  993. }
  994. else
  995. {
  996. colorIndex = "default";
  997. if ( index_is_selected( i ) )
  998. colorIndex = "selected";
  999.  
  1000. print3d( ent.v[ "origin" ], ".", colors[ ent.v[ "type" ] ][ colorIndex ], 1, scale );
  1001. if ( ent.textalpha > 0 )
  1002. {
  1003. printRight = vector_multiply( right, ent.v[ "fxid" ].size * - 2.93 );
  1004. print3d( ent.v[ "origin" ] + printRight + ( 0, 0, 15 ), ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorIndex ], ent.textalpha, scale );
  1005. }
  1006. }
  1007. }
  1008. }
  1009.  
  1010. clear_settable_fx()
  1011. {
  1012. level.createfx_inputlocked = false;
  1013. SetDevDvar( "fx", "nil" );
  1014. // in case we were modifying an option
  1015. level.selected_fx_option_index = undefined;
  1016. reset_fx_hud_colors();
  1017. }
  1018.  
  1019. reset_fx_hud_colors()
  1020. {
  1021. for ( i = 0;i < level.createFx_hudElements; i++ )
  1022. level.createFxHudElements[ i ][ 0 ].color = ( 1, 1, 1 );
  1023. }
  1024.  
  1025.  
  1026. button_is_held( name, name2 )
  1027. {
  1028. if ( isdefined( name2 ) )
  1029. {
  1030. if ( isdefined( level.buttonIsHeld[ name2 ] ) )
  1031. return true;
  1032. }
  1033. return isdefined( level.buttonIsHeld[ name ] );
  1034. }
  1035.  
  1036. button_is_clicked( name, name2 )
  1037. {
  1038. if ( isdefined( name2 ) )
  1039. {
  1040. if ( isdefined( level.buttonClick[ name2 ] ) )
  1041. return true;
  1042. }
  1043. return isdefined( level.buttonClick[ name ] );
  1044. }
  1045.  
  1046. toggle_entity_selection( index, ent )
  1047. {
  1048. if ( isdefined( level.selected_fx[ index ] ) )
  1049. deselect_entity( index, ent );
  1050. else
  1051. select_entity( index, ent );
  1052. }
  1053.  
  1054. select_entity( index, ent )
  1055. {
  1056. if ( isdefined( level.selected_fx[ index ] ) )
  1057. return;
  1058. clear_settable_fx();
  1059. level notify( "new_ent_selection" );
  1060.  
  1061. ent thread entity_highlight_enable();
  1062.  
  1063. level.selected_fx[ index ] = true;
  1064. level.selected_fx_ents[ level.selected_fx_ents.size ] = ent;
  1065. }
  1066.  
  1067. ent_is_highlighted( ent )
  1068. {
  1069. if ( !isdefined( level.fx_highLightedEnt ) )
  1070. return false;
  1071. return ent == level.fx_highLightedEnt;
  1072. }
  1073.  
  1074.  
  1075. deselect_entity( index, ent )
  1076. {
  1077. if ( !isdefined( level.selected_fx[ index ] ) )
  1078. return;
  1079.  
  1080. clear_settable_fx();
  1081. level notify( "new_ent_selection" );
  1082.  
  1083. level.selected_fx[ index ] = undefined;
  1084.  
  1085. if ( !ent_is_highlighted( ent ) )
  1086. ent thread entity_highlight_disable();
  1087.  
  1088. // remove the entity from the array of selected entities
  1089. newArray = [];
  1090. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  1091. {
  1092. if ( level.selected_fx_ents[ i ] != ent )
  1093. newArray[ newArray.size ] = level.selected_fx_ents[ i ];
  1094. }
  1095. level.selected_fx_ents = newArray;
  1096. }
  1097.  
  1098. index_is_selected( index )
  1099. {
  1100. return isdefined( level.selected_fx[ index ] );
  1101. }
  1102.  
  1103. ent_is_selected( ent )
  1104. {
  1105. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  1106. {
  1107. if ( level.selected_fx_ents[ i ] == ent )
  1108. return true;
  1109. }
  1110. return false;
  1111. }
  1112.  
  1113. clear_entity_selection()
  1114. {
  1115. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  1116. {
  1117. if ( !ent_is_highlighted( level.selected_fx_ents[ i ] ) )
  1118. level.selected_fx_ents[ i ] thread entity_highlight_disable();
  1119. }
  1120. level.selected_fx = [];
  1121. level.selected_fx_ents = [];
  1122. }
  1123.  
  1124. draw_axis()
  1125. {
  1126. range = 25 * GetDvarFloat( "createfx_scaleid" );
  1127.  
  1128. // range = 25;
  1129. forward = anglestoforward( self.v[ "angles" ] );
  1130. forward = vector_multiply( forward, range );
  1131. right = anglestoright( self.v[ "angles" ] );
  1132. right = vector_multiply( right, range );
  1133. up = anglestoup( self.v[ "angles" ] );
  1134. up = vector_multiply( up, range );
  1135. line( self.v[ "origin" ], self.v[ "origin" ] + forward, ( 1, 0, 0 ), 1 );
  1136. line( self.v[ "origin" ], self.v[ "origin" ] + up, ( 0, 1, 0 ), 1 );
  1137. line( self.v[ "origin" ], self.v[ "origin" ] + right, ( 0, 0, 1 ), 1 );
  1138. }
  1139.  
  1140.  
  1141. clear_fx_hudElements()
  1142. {
  1143. level.clearTextMarker clearAllTextAfterHudElem();
  1144.  
  1145. for ( i = 0;i < level.createFx_hudElements;i++ )
  1146. {
  1147. for ( p = 0;p < 1;p++ )
  1148. level.createFxHudElements[ i ][ p ] setText( "" );
  1149. }
  1150. level.fxHudElements = 0;
  1151. }
  1152.  
  1153.  
  1154. set_fx_hudElement( text )
  1155. {
  1156. for ( p = 0;p < 1;p++ )
  1157. level.createFxHudElements[ level.fxHudElements ][ p ] setText( text );
  1158.  
  1159. level.fxHudElements++ ;
  1160. assert( level.fxHudElements < level.createFx_hudElements );
  1161. }
  1162.  
  1163. createfx_centerprint( text )
  1164. {
  1165. thread createfx_centerprint_thread( text );
  1166. }
  1167.  
  1168. createfx_centerprint_thread( text )
  1169. {
  1170. level notify( "new_createfx_centerprint" );
  1171. level endon( "new_createfx_centerprint" );
  1172. for ( p = 0;p < 5;p++ )
  1173. level.createFX_centerPrint[ p ] setText( text );
  1174. wait( 4.5 );
  1175. for ( p = 0;p < 5;p++ )
  1176. level.createFX_centerPrint[ p ] setText( "" );
  1177. }
  1178.  
  1179. buttonDown( button, button2 )
  1180. {
  1181. return buttonPressed_internal( button ) || buttonPressed_internal( button2 );
  1182. }
  1183.  
  1184.  
  1185.  
  1186. buttonPressed_internal( button )
  1187. {
  1188. if ( !isdefined( button ) )
  1189. return false;
  1190.  
  1191. // keyboard buttons can be locked so you can type in the fx info on the keyboard without
  1192. // accidentally activating features
  1193. if ( kb_locked( button ) )
  1194. return false;
  1195.  
  1196. return level.player buttonPressed( button );
  1197. }
  1198.  
  1199.  
  1200. get_selected_move_vector()
  1201. {
  1202. yaw = level.player getplayerangles()[ 1 ];
  1203. angles = ( 0, yaw, 0 );
  1204. right = anglestoright( angles );
  1205. forward = anglestoforward( angles );
  1206. up = anglestoup( angles );
  1207.  
  1208. keypressed = false;
  1209. rate = 1;
  1210.  
  1211. if ( buttonDown( "kp_uparrow", "DPAD_UP" ) )
  1212. {
  1213. if ( level.selectedMove_forward < 0 )
  1214. level.selectedMove_forward = 0;
  1215.  
  1216. level.selectedMove_forward = level.selectedMove_forward + rate;
  1217. }
  1218. else
  1219. if ( buttonDown( "kp_downarrow", "DPAD_DOWN" ) )
  1220. {
  1221. if ( level.selectedMove_forward > 0 )
  1222. level.selectedMove_forward = 0;
  1223. level.selectedMove_forward = level.selectedMove_forward - rate;
  1224. }
  1225. else
  1226. level.selectedMove_forward = 0;
  1227.  
  1228. if ( buttonDown( "kp_rightarrow", "DPAD_RIGHT" ) )
  1229. {
  1230. if ( level.selectedMove_right < 0 )
  1231. level.selectedMove_right = 0;
  1232.  
  1233. level.selectedMove_right = level.selectedMove_right + rate;
  1234. }
  1235. else
  1236. if ( buttonDown( "kp_leftarrow", "DPAD_LEFT" ) )
  1237. {
  1238. if ( level.selectedMove_right > 0 )
  1239. level.selectedMove_right = 0;
  1240. level.selectedMove_right = level.selectedMove_right - rate;
  1241. }
  1242. else
  1243. level.selectedMove_right = 0;
  1244.  
  1245. if ( buttonDown( "BUTTON_Y" ) )
  1246. {
  1247. if ( level.selectedMove_up < 0 )
  1248. level.selectedMove_up = 0;
  1249.  
  1250. level.selectedMove_up = level.selectedMove_up + rate;
  1251. }
  1252. else
  1253. if ( buttonDown( "BUTTON_B" ) )
  1254. {
  1255. if ( level.selectedMove_up > 0 )
  1256. level.selectedMove_up = 0;
  1257. level.selectedMove_up = level.selectedMove_up - rate;
  1258. }
  1259. else
  1260. level.selectedMove_up = 0;
  1261.  
  1262. // vector = (level.selectedMove_right, level.selectedMove_forward, level.selectedMove_up);
  1263. vector = ( 0, 0, 0 );
  1264. vector += vector_multiply( forward, level.selectedMove_forward );
  1265. vector += vector_multiply( right, level.selectedMove_right );
  1266. vector += vector_multiply( up, level.selectedMove_up );
  1267.  
  1268. return vector;
  1269. }
  1270.  
  1271. process_button_held_and_clicked()
  1272. {
  1273. add_button( "mouse1" );
  1274. add_kb_button( "shift" );
  1275. add_kb_button( "ctrl" );
  1276. add_button( "BUTTON_RSHLDR" );
  1277. add_button( "BUTTON_LSHLDR" );
  1278. add_button( "BUTTON_RSTICK" );
  1279. add_button( "BUTTON_LSTICK" );
  1280. add_button( "BUTTON_A" );
  1281. add_button( "BUTTON_B" );
  1282. add_button( "BUTTON_X" );
  1283. add_button( "BUTTON_Y" );
  1284. add_button( "DPAD_UP" );
  1285. add_button( "DPAD_LEFT" );
  1286. add_button( "DPAD_RIGHT" );
  1287. add_button( "DPAD_DOWN" );
  1288. add_kb_button( "escape" );
  1289.  
  1290. add_kb_button( "a" );
  1291. add_kb_button( "g" );
  1292. add_button( "F1" );
  1293. add_button( "F5" );
  1294. add_button( "F2" );
  1295. add_kb_button( "c" );
  1296. add_kb_button( "h" );
  1297. add_kb_button( "i" );
  1298. add_kb_button( "k" );
  1299. add_kb_button( "l" );
  1300. add_kb_button( "m" );
  1301. add_kb_button( "p" );
  1302. add_kb_button( "x" );
  1303. add_button( "del" );// DEL is allowed to be pressed while in select mode
  1304. add_kb_button( "end" );
  1305. add_kb_button( "tab" );
  1306. add_kb_button( "ins" );
  1307. add_kb_button( "add" );
  1308. add_kb_button( "space" );
  1309. add_kb_button( "enter" );
  1310. add_kb_button( "v" );
  1311. add_kb_button( "1" );
  1312. add_kb_button( "2" );
  1313. add_kb_button( "3" );
  1314. add_kb_button( "4" );
  1315. add_kb_button( "5" );
  1316. add_kb_button( "6" );
  1317. add_kb_button( "7" );
  1318. add_kb_button( "8" );
  1319. add_kb_button( "9" );
  1320. add_kb_button( "0" );
  1321. }
  1322.  
  1323.  
  1324. locked( name )
  1325. {
  1326. if ( isdefined( level.createfx_lockedList[ name ] ) )
  1327. return false;
  1328.  
  1329. return kb_locked( name );
  1330. }
  1331.  
  1332. kb_locked( name )
  1333. {
  1334. return level.createfx_inputlocked && isdefined( level.button_is_kb[ name ] );
  1335. }
  1336.  
  1337.  
  1338. add_button( name )
  1339. {
  1340. if ( locked( name ) )
  1341. return;
  1342.  
  1343. if ( !isdefined( level.buttonIsHeld[ name ] ) )
  1344. {
  1345. if ( level.player buttonPressed( name ) )
  1346. {
  1347. level.buttonIsHeld[ name ] = true;
  1348. level.buttonClick[ name ] = true;
  1349. // println("Button: " + name);
  1350. }
  1351. }
  1352. else
  1353. {
  1354. if ( !level.player buttonPressed( name ) )
  1355. {
  1356. level.buttonIsHeld[ name ] = undefined;
  1357. }
  1358. }
  1359. }
  1360.  
  1361. add_kb_button( name )
  1362. {
  1363. level.button_is_kb[ name ] = true;
  1364. add_button( name );
  1365. }
  1366.  
  1367.  
  1368.  
  1369. set_anglemod_move_vector()
  1370. {
  1371. rate = 2;
  1372.  
  1373. if ( buttonDown( "kp_uparrow", "DPAD_UP" ) )
  1374. {
  1375. if ( level.selectedRotate_pitch < 0 )
  1376. level.selectedRotate_pitch = 0;
  1377.  
  1378. level.selectedRotate_pitch = level.selectedRotate_pitch + rate;
  1379. }
  1380. else
  1381. if ( buttonDown( "kp_downarrow", "DPAD_DOWN" ) )
  1382. {
  1383. if ( level.selectedRotate_pitch > 0 )
  1384. level.selectedRotate_pitch = 0;
  1385. level.selectedRotate_pitch = level.selectedRotate_pitch - rate;
  1386. }
  1387. else
  1388. level.selectedRotate_pitch = 0;
  1389.  
  1390. if ( buttonDown( "kp_leftarrow", "DPAD_LEFT" ) )
  1391. {
  1392. if ( level.selectedRotate_yaw < 0 )
  1393. level.selectedRotate_yaw = 0;
  1394.  
  1395. level.selectedRotate_yaw = level.selectedRotate_yaw + rate;
  1396. }
  1397. else
  1398. if ( buttonDown( "kp_rightarrow", "DPAD_RIGHT" ) )
  1399. {
  1400. if ( level.selectedRotate_yaw > 0 )
  1401. level.selectedRotate_yaw = 0;
  1402. level.selectedRotate_yaw = level.selectedRotate_yaw - rate;
  1403. }
  1404. else
  1405. level.selectedRotate_yaw = 0;
  1406.  
  1407. if ( buttonDown( "BUTTON_Y" ) )
  1408. {
  1409. if ( level.selectedRotate_roll < 0 )
  1410. level.selectedRotate_roll = 0;
  1411.  
  1412. level.selectedRotate_roll = level.selectedRotate_roll + rate;
  1413. }
  1414. else
  1415. if ( buttonDown( "BUTTON_B" ) )
  1416. {
  1417. if ( level.selectedRotate_roll > 0 )
  1418. level.selectedRotate_roll = 0;
  1419. level.selectedRotate_roll = level.selectedRotate_roll - rate;
  1420. }
  1421. else
  1422. level.selectedRotate_roll = 0;
  1423.  
  1424. }
  1425.  
  1426. cfxprintlnStart()
  1427. {
  1428. fileprint_launcher_start_file();
  1429. }
  1430.  
  1431. cfxprintln( file, string )
  1432. {
  1433. fileprint_launcher( string );
  1434. if ( file == -1 )
  1435. return;
  1436. fprintln( file, string );
  1437. }
  1438.  
  1439. cfxprintlnEnd( file, autosave, radiant_exploder_add_string )
  1440. {
  1441. bP4add = true;
  1442.  
  1443. if( radiant_exploder_add_string != "" || autosave )
  1444. bP4add = false;
  1445.  
  1446. scriptname = level.script+radiant_exploder_add_string+"_fx.gsc";
  1447. if( autosave )
  1448. scriptname = "backup.gsc";
  1449.  
  1450. fileprint_launcher_end_file( "/share/raw/maps/createfx/" + scriptname, bP4add );
  1451. }
  1452.  
  1453. update_selected_entities()
  1454. {
  1455. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  1456. {
  1457. ent = level.selected_fx_ents[ i ];
  1458. ent [[ level.func_updatefx ]]();
  1459. }
  1460. }
  1461.  
  1462. hack_start( painter_spmp )
  1463. {
  1464. if ( !isdefined( painter_spmp ) )
  1465. painter_spmp = "painter_mp";
  1466. precachemenu( painter_spmp );
  1467. if( painter_spmp == "painter_mp" )
  1468. return;
  1469.  
  1470. wait .05;
  1471. level.player openpopupmenu( painter_spmp );// painter.menu execs some console commands( ufo mode ).. sneaky hacks.
  1472. level.player closepopupmenu( painter_spmp );
  1473. }
  1474.  
  1475. get_player()
  1476. {
  1477. return getentarray( "player", "classname" )[ 0 ];
  1478. }
  1479.  
  1480. createfx_orgranize_array()
  1481. {
  1482. types = [];
  1483. types[ 0 ] = "soundfx";
  1484. types[ 1 ] = "loopfx";
  1485. types[ 2 ] = "oneshotfx";
  1486. types[ 3 ] = "exploder";
  1487.  
  1488. array = [];
  1489. foreach ( index, _ in types )
  1490. {
  1491. array[ index ] = [];
  1492. }
  1493.  
  1494. foreach ( ent in level.createFXent )
  1495. {
  1496. found_type = false;
  1497. foreach ( index, type in types )
  1498. {
  1499. if ( ent.v[ "type" ] != type )
  1500. continue;
  1501.  
  1502. found_type = true;
  1503. array[ index ][ array[ index ].size ] = ent;
  1504. break;
  1505. }
  1506.  
  1507. assertex( found_type, "Didnt understand createfx type " + ent.v[ "type" ] );
  1508. }
  1509.  
  1510. new_array = [];
  1511. for ( i = 0; i < types.size; i++ )
  1512. {
  1513. foreach ( ent in array[ i ] )
  1514. {
  1515. new_array[ new_array.size ] = ent;
  1516. }
  1517. }
  1518.  
  1519. level.createFXent = new_array;
  1520. }
  1521.  
  1522. stop_fx_looper()
  1523. {
  1524. if ( isdefined( self.looper ) )
  1525. self.looper delete();
  1526. self stop_loopsound();
  1527. }
  1528.  
  1529. stop_loopsound()
  1530. {
  1531. self notify( "stop_loop" );
  1532. }
  1533.  
  1534. func_get_level_fx()
  1535. {
  1536. AssertEx( IsDefined( level._effect ), "No effect aliases defined!" );
  1537.  
  1538. if ( !IsDefined( level._effect_keys ) )
  1539. {
  1540. keys = getarraykeys( level._effect );
  1541. }
  1542. else
  1543. {
  1544. keys = getarraykeys( level._effect );
  1545. if ( keys.size == level._effect_keys.size )
  1546. {
  1547. return level._effect_keys;
  1548. }
  1549. }
  1550.  
  1551. println( "alphabetizing fx" );
  1552. keys = alphabetize( keys );
  1553. level._effect_keys = keys;
  1554. return keys;
  1555. }
  1556.  
  1557. restart_fx_looper()
  1558. {
  1559. stop_fx_looper();
  1560.  
  1561. self set_forward_and_up_vectors();
  1562. if ( self.v[ "type" ] == "loopfx" )
  1563. {
  1564. // new entities from copy/paste wont have a looper
  1565. self create_looper();
  1566. }
  1567.  
  1568. if ( self.v[ "type" ] == "oneshotfx" )
  1569. {
  1570. // new entities from copy/paste wont have a looper
  1571. self create_triggerfx();
  1572. }
  1573.  
  1574. if ( self.v[ "type" ] == "soundfx" )
  1575. {
  1576. // new entities from copy/paste wont have a looper
  1577. self create_loopsound();
  1578. }
  1579. }
  1580.  
  1581. process_fx_rotater()
  1582. {
  1583. if ( level.fx_rotating )
  1584. return;
  1585.  
  1586.  
  1587. set_anglemod_move_vector();
  1588.  
  1589. if ( !rotation_is_occuring() )
  1590. return;
  1591.  
  1592. level.fx_rotating = true;
  1593.  
  1594. if ( level.selected_fx_ents.size > 1 )
  1595. {
  1596. center = get_center_of_array( level.selected_fx_ents );
  1597. org = spawn( "script_origin", center );
  1598. org.v[ "angles" ] = level.selected_fx_ents[ 0 ].v[ "angles" ];
  1599. org.v[ "origin" ] = center;
  1600.  
  1601. rotater = [];
  1602. for ( i = 0; i < level.selected_fx_ents.size; i++ )
  1603. {
  1604. rotater[ i ] = spawn( "script_origin", level.selected_fx_ents[ i ].v[ "origin" ] );
  1605. rotater[ i ].angles = level.selected_fx_ents[ i ].v[ "angles" ];
  1606. rotater[ i ] linkto( org );
  1607. }
  1608.  
  1609. // println ("pitch " + level.selectedRotate_pitch + " yaw " + level.selectedRotate_yaw);
  1610.  
  1611. rotate_over_time( org, rotater );
  1612.  
  1613. org delete();
  1614.  
  1615. for ( i = 0; i < rotater.size; i++ )
  1616. rotater[ i ] delete();
  1617. }
  1618. else if ( level.selected_fx_ents.size == 1 )
  1619. {
  1620. ent = level.selected_fx_ents[ 0 ];
  1621. rotater = spawn( "script_origin", ( 0, 0, 0 ) );
  1622. rotater.angles = ent.v[ "angles" ];
  1623. if ( level.selectedRotate_pitch != 0 )
  1624. rotater AddPitch( level.selectedRotate_pitch );
  1625. else
  1626. if ( level.selectedRotate_yaw != 0 )
  1627. rotater AddYaw( level.selectedRotate_yaw );
  1628. else
  1629. rotater AddRoll( level.selectedRotate_roll );
  1630. ent.v[ "angles" ] = rotater.angles;
  1631. rotater delete();
  1632. wait( 0.05 );
  1633. }
  1634.  
  1635. level.fx_rotating = false;
  1636. }
  1637.  
  1638. generate_fx_log( autosave )
  1639. {
  1640. // first lets fix all the really small numbers so they dont cause errors because the game will print out
  1641. // 4.2343-7e or whatever but cant accept it back in from script
  1642.  
  1643. /#
  1644. flag_waitopen( "createfx_saving" );
  1645. flag_set( "createfx_saving" );
  1646. autosave = isdefined( autosave );
  1647. tab = "\t";
  1648.  
  1649. radiant_exploder_add_string = "";
  1650. if( GetDvarInt("scr_map_exploder_dump") )
  1651. radiant_exploder_add_string = "_radiant_exploders";
  1652.  
  1653. filename = "createfx/" + level.script + radiant_exploder_add_string + "_fx.gsc";
  1654. if ( autosave )
  1655. filename = "createfx/backup.gsc";
  1656.  
  1657. // file = openfile( filename, "write" );
  1658. // assertex( file != -1, "File not writeable (maybe you should check it out): " + filename );
  1659. file = -1;
  1660.  
  1661. cfxprintlnStart();
  1662. cfxprintln( file, "//_createfx generated. Do not touch!!" );
  1663. cfxprintln( file, "#include common_scripts\\utility;" );
  1664. cfxprintln( file, "#include common_scripts\\_createfx;\n" );
  1665. cfxprintln( file, "main()" );
  1666. cfxprintln( file, "{" );
  1667.  
  1668. createfx_orgranize_array();
  1669.  
  1670. limit = 0.1;
  1671. for ( p = 0; p < level.createFXent.size; p++ )
  1672. {
  1673. ent = level.createFXent[ p ];
  1674. origin = [];
  1675. angles = [];
  1676. for ( i = 0;i < 3;i++ )
  1677. {
  1678. origin[ i ] = ent.v[ "origin" ][ i ];
  1679. angles[ i ] = ent.v[ "angles" ][ i ];
  1680.  
  1681. if ( origin[ i ] < limit && origin[ i ] > limit * - 1 )
  1682. origin[ i ] = 0;
  1683. if ( angles[ i ] < limit && angles[ i ] > limit * - 1 )
  1684. angles[ i ] = 0;
  1685. }
  1686.  
  1687. ent.v[ "origin" ] = ( origin[ 0 ], origin[ 1 ], origin[ 2 ] );
  1688. ent.v[ "angles" ] = ( angles[ 0 ], angles[ 1 ], angles[ 2 ] );
  1689. }
  1690.  
  1691. cfxprintln( file, tab + "// CreateFX entities placed: " + level.createFxEnt.size );
  1692.  
  1693. for ( i = 0; i < level.createFXent.size; i++ )
  1694. {
  1695. if ( file != -1 && level.createfx_loopcounter > 32 )
  1696. {
  1697. level.createfx_loopcounter = 0;
  1698. wait .05; // loop protection fails on writing the file
  1699. }
  1700. level.createfx_loopcounter++;
  1701.  
  1702. e = level.createFXent[ i ];
  1703. assertEX( isdefined( e.v[ "type" ] ), "effect at origin " + e.v[ "origin" ] + " has no type" );
  1704.  
  1705. // don't post .map effects in the script.
  1706. // if (e.v["worldfx"])
  1707. // continue;
  1708.  
  1709. // when scr_map_exploder_dump is set just output the exploders from radiant. could output two scripts but keeping it simple.
  1710. if( GetDvarInt("scr_map_exploder_dump") )
  1711. {
  1712. if ( !isdefined( e.model ) )
  1713. continue;
  1714. }
  1715. else if ( isdefined( e.model ) )
  1716. continue; // entities with models are from radiant and don't get reported
  1717.  
  1718. if ( e.v[ "type" ] == "loopfx" )
  1719. cfxprintln( file, tab + "ent = createLoopEffect( \"" + e.v[ "fxid" ] + "\" );" );
  1720. if ( e.v[ "type" ] == "oneshotfx" )
  1721. cfxprintln( file, tab + "ent = createOneshotEffect( \"" + e.v[ "fxid" ] + "\" );" );
  1722. if ( e.v[ "type" ] == "exploder" )
  1723. cfxprintln( file, tab + "ent = createExploder( \"" + e.v[ "fxid" ] + "\" );" );
  1724. if ( e.v[ "type" ] == "soundfx" )
  1725. cfxprintln( file, tab + "ent = createLoopSound();" );
  1726.  
  1727. cfxprintln( file, tab + "ent.v[ \"origin\" ] = ( " + e.v[ "origin" ][ 0 ] + ", " + e.v[ "origin" ][ 1 ] + ", " + e.v[ "origin" ][ 2 ] + " );" );
  1728. cfxprintln( file, tab + "ent.v[ \"angles\" ] = ( " + e.v[ "angles" ][ 0 ] + ", " + e.v[ "angles" ][ 1 ] + ", " + e.v[ "angles" ][ 2 ] + " );" );
  1729.  
  1730. print_fx_options( e, tab, file, autosave );
  1731. cfxprintln( file, "" );
  1732. }
  1733.  
  1734. cfxprintln( file, "}" );
  1735. cfxprintln( file, " " );
  1736. cfxprintlnEnd( file, autosave, radiant_exploder_add_string );
  1737.  
  1738. // saved = closefile( file );
  1739. // assertex( saved == 1, "File not saved (see above message?): " + filename );
  1740. flag_clear( "createfx_saving" );
  1741.  
  1742. // println( "CreateFX entities placed: " + level.createFxEnt.size );
  1743. #/
  1744. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement