Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.19 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include common_scripts\utility;
  3.  
  4. CONST_default_radial_radius = 8; // default distance between radial button and center
  5. CONST_radial_center_extrude_dist = 40; // this is the distance between the floating radial center and the oberver's eye
  6. CONST_direct_travel = 1; // no path, directly zoom to position
  7. CONST_view_travel_unit_dist = 1200; // distance unit per travel interval
  8. CONST_view_travel_unit_time = 1; // in seconds per travel interval
  9. CONST_blur_strength = 3; // blur strength during view travel, sine curved over travel duration
  10.  
  11. init()
  12. {
  13. precacheShellShock( "frag_grenade_mp" );
  14.  
  15. radial_button_definitions(); // define radial button sets and buttons
  16. radial_init(); // setup radial button mechanism
  17. view_path_setup(); // setup view flight paths
  18. player_init();
  19. }
  20.  
  21. // ====================================================================================
  22. // == inits ==
  23. // ====================================================================================
  24.  
  25. radial_button_definitions()
  26. {
  27. newRadialButtonGroup( "main", "player_view1_start", "player_view1_end" );
  28.  
  29. // Main menu's buttons:
  30. bWeapons_a = newRadialButton( "main", "Primary Weapon", "radial_weapons_primary", ::action_weapons_primary );
  31. bWeapons_b = newRadialButton( "main", "Secondary Weapon", "radial_weapons_secondary", ::action_weapons_secondary );
  32. bGears = newRadialButton( "main", "Gears", "radial_gears", ::action_gears );
  33. bKillStreaks= newRadialButton( "main", "Kill Streaks", "radial_killstreaks", ::action_killstreak );
  34. bLeadboards = newRadialButton( "main", "Leaderboards", "radial_leaderboards", ::action_leaderboards );
  35. //
  36.  
  37. newRadialButtonGroup( "gears", "player_view2_start", "player_view2_end" );
  38. newRadialButtonGroup( "weapons_primary", "player_view3_start", "player_view3_end" );
  39. newRadialButtonGroup( "weapons_secondary", "player_view3_start", "player_view3_end" );
  40. newRadialButtonGroup( "killstreak", "player_view4_start", "player_view4_end" );
  41. newRadialButtonGroup( "leaderboards", "player_view5_start", "player_view5_end" );
  42. }
  43.  
  44.  
  45. radial_init()
  46. {
  47. // calculate start & end angles of all buttons for range selection
  48. foreach ( button_group in level.radial_button_group )
  49. {
  50. // sort buttons by angle so we can calculate mid angles in sequence
  51. sort_buttons_by_angle( button_group );
  52.  
  53. for ( i = 0; i < button_group.size; i ++ )
  54. {
  55. if ( isdefined( button_group[ i + 1 ] ) )
  56. {
  57. mid_angle = getMidAngle( button_group[ i ].pos_angle, button_group[ i + 1 ].pos_angle );
  58. button_group[ i ].end_angle = mid_angle;
  59. button_group[ i + 1 ].start_angle = mid_angle;
  60. }
  61. else
  62. {
  63. mid_angle = getMidAngle( button_group[ i ].pos_angle, button_group[ 0 ].pos_angle ) + 180; // +180 to mirror angle
  64. if ( mid_angle > 360 )
  65. mid_angle -= 360;
  66.  
  67. button_group[ i ].end_angle = mid_angle;
  68. button_group[ 0 ].start_angle = mid_angle;
  69. }
  70. }
  71. }
  72.  
  73. // monitors
  74. thread updateSelectedButton();
  75. thread watchSelectButtonPress();
  76. thread watchBackButtonPress();
  77. thread debug_toggle();
  78. }
  79.  
  80.  
  81. debug_toggle()
  82. {
  83. level endon( "game_ended" );
  84. level.crib_debug = 1;
  85.  
  86. while ( 1 )
  87. {
  88. if ( !isdefined( level.observer ) )
  89. {
  90. wait 0.05;
  91. continue;
  92. }
  93.  
  94. button_reset = true;
  95. while ( !( level.observer buttonPressed( "BUTTON_Y" ) ) )
  96. wait 0.05;
  97.  
  98. level.observer playsound("mouse_click");
  99.  
  100. if ( button_reset )
  101. {
  102. level.crib_debug *= -1;
  103. button_reset = false;
  104. }
  105.  
  106. while ( level.observer buttonPressed( "BUTTON_Y" ) )
  107. wait 0.05;
  108. }
  109. }
  110.  
  111.  
  112. player_init()
  113. {
  114. level thread onPlayerConnect();
  115. level thread return_hud();
  116. }
  117.  
  118.  
  119. return_hud()
  120. {
  121. level waittill( "game_ended" );
  122. setdvar( "cg_draw2d", 1 );
  123. }
  124.  
  125.  
  126. onPlayerConnect()
  127. {
  128. level waittill("connected", player);
  129.  
  130. player thread readyPlayer();
  131. player waittill( "spawned_player" );
  132.  
  133. wait 1;
  134.  
  135. player takeallweapons();
  136. setdvar( "cg_draw2d", 0 );
  137.  
  138. if ( !isdefined( player ) )
  139. return;
  140. else
  141. level.observer = player;
  142.  
  143. player thread get_right_stick_angle();
  144.  
  145. zoom_to_radial_menu( "main" ); // fly to the first radial menu
  146. }
  147.  
  148.  
  149. readyPlayer()
  150. {
  151. self endon( "disconnect" );
  152.  
  153. team = "autoassign";
  154.  
  155. while(!isdefined(self.pers["team"]))
  156. wait .05;
  157.  
  158. self notify("menuresponse", game["menu_team"], team);
  159. wait 0.5;
  160.  
  161. classes = getArrayKeys( level.classMap );
  162. okclasses = [];
  163. for ( i = 0; i < classes.size; i++ )
  164. {
  165. if ( !isSubStr( classes[i], "custom" ) )
  166. okclasses[ okclasses.size ] = classes[i];
  167. }
  168.  
  169. assert( okclasses.size );
  170.  
  171. while( 1 )
  172. {
  173. class = okclasses[ 0 ];
  174. self notify("menuresponse", "changeclass", class);
  175.  
  176. self waittill( "spawned_player" );
  177. wait ( 0.10 );
  178. }
  179. }
  180.  
  181. // ====================================================================================
  182. // == Radial Mechanics ==
  183. // ====================================================================================
  184.  
  185. get_right_stick_angle()
  186. {
  187. // self is user
  188. level endon( "game_ended" );
  189. self endon( "disconnect" );
  190.  
  191. while ( 1 )
  192. {
  193. rs_vec = self GetNormalizedMovement();
  194. rs_angles = vectortoangles( rs_vec );
  195. level.rs_angle = int( rs_angles[1] );
  196.  
  197. wait 0.05; // update rate
  198. }
  199. }
  200.  
  201.  
  202. newRadialButtonGroup( group_name, view_start, view_end )
  203. {
  204. if ( isdefined( level.radial_button_group ) && level.radial_button_group.size )
  205. assertex( !isdefined( level.radial_button_group[ group_name ] ), "Radial button group: " + group_name + " is already defined." );
  206.  
  207. player_view_ent = getent( view_end, "targetname" );
  208. assertex( isdefined( player_view_ent ), "Missing player view entity, can not setup radial menu in space" );
  209.  
  210. extruded_vec = vector_multiply( VectorNormalize( AnglesToForward( player_view_ent.angles ) ), CONST_radial_center_extrude_dist );
  211.  
  212. level.radial_button_group[ group_name ] = [];
  213. level.radial_button_group_info[ group_name ][ "view_start" ] = view_start;
  214. level.radial_button_group_info[ group_name ][ "view_pos" ] = player_view_ent.origin + extruded_vec;
  215. level.radial_button_group_info[ group_name ][ "player_view_pos" ] = player_view_ent.origin;
  216. level.radial_button_group_info[ group_name ][ "view_angles" ] = player_view_ent.angles;
  217. }
  218.  
  219.  
  220. newRadialButton( button_group, button_label, button_ent_name, action_func )
  221. {
  222. assertex( isdefined( level.radial_button_group[ button_group ] ), "Radial button group: " + button_group + " does not exist." );
  223.  
  224. ent = getent( button_ent_name, "targetname" );
  225. new_button_angle = getRadialAngleFromEnt( button_group, ent );
  226.  
  227. button = spawnstruct();
  228. button.pos = ent.origin;
  229. button.label = button_label;
  230. button.font_size = 1;
  231. button.font_color = ( 0.5, 0.5, 1 );
  232. button.pos_angle = new_button_angle;
  233. button.action_func = action_func;
  234. button.radius_pos = CONST_default_radial_radius;
  235.  
  236. level.radial_button_group[ button_group ][ level.radial_button_group[ button_group ].size ] = button;
  237. return button;
  238. }
  239.  
  240.  
  241. updateSelectedButton()
  242. {
  243. level endon( "game_ended" );
  244.  
  245. while ( 1 )
  246. {
  247. if ( !isdefined( level.radial_button_current_group ) )
  248. {
  249. wait 0.05;
  250. continue;
  251. }
  252.  
  253. last_active_button = level.active_button;
  254.  
  255. foreach ( button in level.radial_button_group[ level.radial_button_current_group ] )
  256. {
  257. if ( isInRange( button.start_angle, button.end_angle ) )
  258. level.active_button = button;
  259. else
  260. button.font_color = ( 0.5, 0.5, 1 );
  261. }
  262.  
  263. if ( isdefined ( level.active_button ) )
  264. {
  265. level.active_button.font_color = ( 1, 1, 0.5 );
  266.  
  267. if ( isdefined( last_active_button ) && last_active_button != level.active_button )
  268. level.observer playsound("mouse_over");
  269. }
  270.  
  271. wait 0.05;
  272. }
  273. }
  274.  
  275.  
  276. watchSelectButtonPress()
  277. {
  278. level endon( "game_ended" );
  279.  
  280. while ( 1 )
  281. {
  282. if ( !isdefined( level.observer ) )
  283. {
  284. wait 0.05;
  285. continue;
  286. }
  287.  
  288. button_reset = true;
  289. while ( !( level.observer buttonPressed( "BUTTON_A" ) ) )
  290. wait 0.05;
  291.  
  292. level.observer playsound("mouse_click");
  293.  
  294. if ( isdefined( level.active_button ) && button_reset )
  295. {
  296. level.active_button notify( "select_button_pressed" );
  297. [[level.active_button.action_func]]();
  298. button_reset = false;
  299. }
  300.  
  301. while ( level.observer buttonPressed( "BUTTON_A" ) )
  302. wait 0.05;
  303. }
  304. }
  305.  
  306.  
  307. watchBackButtonPress()
  308. {
  309. level endon( "game_ended" );
  310.  
  311. while ( 1 )
  312. {
  313. if ( !isdefined( level.observer ) )
  314. {
  315. wait 0.05;
  316. continue;
  317. }
  318.  
  319. button_reset = true;
  320. while ( !( level.observer buttonPressed( "BUTTON_X" ) ) )
  321. wait 0.05;
  322.  
  323. level.observer playsound("mouse_click");
  324.  
  325. if ( button_reset )
  326. {
  327. action_back();
  328. button_reset = false;
  329. }
  330.  
  331. while ( level.observer buttonPressed( "BUTTON_X" ) )
  332. wait 0.05;
  333. }
  334. }
  335.  
  336.  
  337. sort_buttons_by_angle( button_group )
  338. {
  339. // button_group is actual array
  340. // bubble sort buttons
  341. for ( i = 0; i < button_group.size - 1; i++ )
  342. {
  343. for ( j = 0; j < button_group.size - 1 - i; j++ )
  344. {
  345. if ( button_group[ j + 1 ].pos_angle < button_group[ j ].pos_angle )
  346. button_switch( button_group[ j ], button_group[ j + 1 ] );
  347. }
  348. }
  349. }
  350.  
  351.  
  352. button_switch( button1, button2 )
  353. {
  354. temp_pos = button1.pos;
  355. temp_label = button1.label;
  356. temp_pos_angle = button1.pos_angle;
  357. temp_action_func = button1.action_func;
  358. temp_radius_pos = button1.radius_pos;
  359.  
  360. button1.pos = button2.pos;
  361. button1.label = button2.label;
  362. button1.pos_angle = button2.pos_angle;
  363. button1.action_func = button2.action_func;
  364. button1.radius_pos = button2.radius_pos;
  365.  
  366. button2.pos = temp_pos;
  367. button2.label = temp_label;
  368. button2.pos_angle = temp_pos_angle;
  369. button2.action_func = temp_action_func;
  370. button2.radius_pos = temp_radius_pos;
  371. }
  372.  
  373.  
  374. draw_radial_buttons( button_group )
  375. {
  376. foreach ( button in level.radial_button_group[ button_group ] )
  377. button thread draw_radial_button( button_group );
  378. }
  379.  
  380.  
  381. //print3d(<origin>, <text>, <color>, <alpha>, <scale>, <duration> )
  382. draw_radial_button( button_group )
  383. {
  384. level endon( "game_ended" );
  385. self endon( "remove_button" );
  386.  
  387. floating_origin = level.radial_button_group_info[ button_group ][ "view_pos" ];
  388. button_radial_pos = floating_origin + radial_angle_to_vector( self.pos_angle, 4 );
  389.  
  390. while ( 1 )
  391. {
  392. //line( level.radial_button_group_info[ button_group ][ "view_pos" ], self.pos, ( 0, 1, 0 ), 0.05, false );
  393.  
  394. range_color = ( 1, 0, 0 );
  395. if ( isInRange( self.start_angle, self.end_angle ) )
  396. range_color = ( 1, 1, 0 );
  397.  
  398. print3d( self.pos, self.label, self.font_color, 0.75, self.font_size, 1 );
  399.  
  400. if ( isdefined( level.crib_debug ) && level.crib_debug > 0 )
  401. {
  402. print3d( button_radial_pos, ".("+int(self.pos_angle)+")", range_color, 0.75, 0.05, 1 );
  403.  
  404. line( floating_origin, floating_origin + radial_angle_to_vector( self.start_angle, 2 ), range_color, 0.05 );
  405. line( floating_origin + radial_angle_to_vector( self.start_angle, 2 ), floating_origin + radial_angle_to_vector( self.end_angle, 2 ), range_color, 0.05 );
  406.  
  407. // right stick debug ling
  408. r_radial_pos = floating_origin + radial_angle_to_vector( level.rs_angle, 2 );
  409. line( floating_origin, r_radial_pos, ( 1, 1, 1 ), 0.05 );
  410.  
  411.  
  412. }
  413. print3d( floating_origin - ( 0, 0, 4.5 ), "(A)=Select (X)=Back", (1, 1, 1), 0.5, 0.05, 1 );
  414.  
  415. wait 0.05;
  416. }
  417. }
  418.  
  419.  
  420. Zoom_To_Radial_Menu( button_group, reverse )
  421. {
  422. level.active_button = undefined;
  423.  
  424. assertex( isdefined( level.observer ), "Missing observer (connected player), can not attach player to view path" );
  425.  
  426. if ( isdefined( level.radial_button_current_group ) && level.radial_button_current_group != "" )
  427. {
  428. level.radial_button_previous_group = level.radial_button_current_group;
  429. }
  430. else
  431. {
  432. level.radial_button_previous_group = "main";
  433. level.radial_button_current_group = "main";
  434. }
  435.  
  436. foreach ( button in level.radial_button_group[ level.radial_button_previous_group ] )
  437. button notify( "remove_button" );
  438.  
  439. //iPrintLnBold( "flying to: " + button_group );
  440.  
  441. if ( isdefined( reverse ) && reverse )
  442. level.observer go_path_by_targetname_reverse( level.radial_button_group_info[ level.radial_button_previous_group ][ "view_start" ], button_group );
  443. else
  444. level.observer go_path_by_targetname( level.radial_button_group_info[ button_group ][ "view_start" ] );
  445.  
  446. level thread draw_radial_buttons( button_group );
  447. level.radial_button_current_group = button_group;
  448. }
  449.  
  450.  
  451. // ====================================================================================
  452. // == Radial menu - math ==
  453. // ====================================================================================
  454.  
  455. // edit function with care, returns orientation-sensistive angles
  456. getRadialAngleFromEnt( button_group, ent )
  457. {
  458. assertex( isdefined( level.radial_button_group[ button_group ] ), "getRadialAngleFromEnt: Radial button group does not exist." );
  459. assertex( isdefined( ent ), "getRadialAngleFromEnt: Missing entity to be measured." );
  460.  
  461. rAngle = level.radial_button_group_info[ button_group ][ "view_angles" ];
  462. rPos = level.radial_button_group_info[ button_group ][ "view_pos" ];
  463. rPos += vector_multiply( VectorNormalize( AnglesToForward( rAngle ) ), CONST_radial_center_extrude_dist );
  464. rForward = AnglesToForward( rAngle );
  465. rUpwardNorm = VectorNormalize( AnglesToUp( rAngle ) );
  466.  
  467. eAngle = ent.angles;
  468. ePos = ent.origin;
  469.  
  470. projNorm = VectorNormalize( VectorFromLineToPoint( rPos, ( rPos + rForward ), ePos ) );
  471. radial_angle = Acos( VectorDot( projNorm, rUpwardNorm ) );
  472.  
  473. // vector mirroring
  474. if ( VectorDot( AnglesToRight( rAngle ), projNorm ) < 0 )
  475. radial_angle = 360 - radial_angle;
  476.  
  477. return radial_angle;
  478. }
  479.  
  480.  
  481. // converts projected angle into player's view plane into a vector
  482. radial_angle_to_vector( angle, scaler )
  483. {
  484. b_angles = ( 270 - ( angle ), 0 , 0 ); // 270 degrees offset to face the player
  485. b_vec = AnglesToForward( b_angles );
  486. b_vec_norm = VectorNormalize( b_vec );
  487. b_vec_final = vector_multiply( b_vec_norm, scaler );
  488.  
  489. return b_vec_final;
  490. }
  491.  
  492.  
  493. getMidAngle( a1, a2 )
  494. {
  495. // 0 -> 360 domain
  496. mid_angle = ( ( a1 + a2 + 720 ) / 2 ) - 360;
  497. return mid_angle;
  498. }
  499.  
  500.  
  501. isInRange( start_angle, end_angle )
  502. {
  503. inside_big_angle = ( level.rs_angle > start_angle && level.rs_angle < 360 );
  504. inside_small_angle = ( level.rs_angle > 0 && level.rs_angle < end_angle );
  505.  
  506. if ( start_angle > end_angle )
  507. in_range = ( inside_big_angle || inside_small_angle );
  508. else
  509. in_range = ( level.rs_angle > start_angle && level.rs_angle < end_angle );
  510.  
  511. return in_range;
  512. }
  513.  
  514. // ====================================================================================
  515. // == Button action functions ==
  516. // ====================================================================================
  517.  
  518. // close radial buttons
  519. action_back()
  520. {
  521. //if ( isdefined( level.radial_button_previous_group ) && level.radial_button_previous_group != "" )
  522. // zoom_to_radial_menu( level.radial_button_previous_group );
  523. /*else*/ if ( isdefined( level.radial_button_current_group ) && level.radial_button_current_group != "main" )
  524. zoom_to_radial_menu( "main", true );
  525. else
  526. return;
  527. }
  528.  
  529.  
  530. // ==== main ====
  531. action_weapons_primary()
  532. {
  533. iPrintLnBold( "action_weapons_primary" );
  534. zoom_to_radial_menu( "weapons_primary" );
  535. }
  536.  
  537.  
  538. action_weapons_secondary()
  539. {
  540. iPrintLnBold( "action_weapons_secondary" );
  541. zoom_to_radial_menu( "weapons_secondary" );
  542. }
  543.  
  544. action_gears()
  545. {
  546. iPrintLnBold( "action_gears" );
  547. zoom_to_radial_menu( "gears" );
  548. }
  549.  
  550.  
  551. action_killstreak()
  552. {
  553. iPrintLnBold( "action_killstreak" );
  554. zoom_to_radial_menu( "killstreak" );
  555. }
  556.  
  557.  
  558. action_leaderboards()
  559. {
  560. iPrintLnBold( "action_leaderboards" );
  561. zoom_to_radial_menu( "leaderboards" );
  562. }
  563.  
  564. // ====================================================================================
  565. // == Pathing functions ==
  566. // ====================================================================================
  567.  
  568. view_path_setup()
  569. {
  570. // setup all paths
  571. level.view_paths = [];
  572.  
  573. // build paths
  574. build_path_by_targetname( "player_view1_start" );
  575. build_path_by_targetname( "player_view2_start" );
  576. build_path_by_targetname( "player_view3_start" );
  577. build_path_by_targetname( "player_view4_start" );
  578. build_path_by_targetname( "player_view5_start" );
  579. }
  580.  
  581.  
  582. build_path_by_targetname( path_name )
  583. {
  584. level.view_paths[ path_name ] = [];
  585.  
  586. path_node = getent( path_name, "targetname" );
  587. level.view_paths[ path_name ][ level.view_paths[ path_name ].size ] = path_node;
  588.  
  589. while( isdefined( path_node ) && isdefined( path_node.target ) )
  590. {
  591. next_node = getent( path_node.target, "targetname" );
  592. level.view_paths[ path_name ][ level.view_paths[ path_name ].size ] = next_node;
  593. path_node = next_node;
  594. }
  595. }
  596.  
  597.  
  598. go_path_by_targetname( path_name )
  599. {
  600. // self is player
  601. if ( !isdefined( level.dummy_mover ) )
  602. {
  603. start_node = level.view_paths[ path_name ][ 0 ];
  604. level.dummy_mover = spawn( "script_model", start_node.origin );
  605. level.dummy_mover.angles = start_node.angles;
  606. //self AllowedStances( "stand" );
  607. self setOrigin( level.dummy_mover.origin - ( 0, 0, 65 ) );
  608. self linkTo( level.dummy_mover );
  609. wait 0.05;
  610. self setplayerangles ( level.dummy_mover.angles );
  611.  
  612. self thread force_player_angles();
  613. }
  614.  
  615. /*
  616. travel_time = 1;
  617. dist = 0;
  618. foreach ( idx, node in level.view_paths[ path_name ] )
  619. {
  620. if ( isdefined( level.view_paths[ path_name ][ idx + 1 ] ) )
  621. dist += abs( distance( level.view_paths[ path_name ][ idx ].origin, level.view_paths[ path_name ][ idx + 1 ].origin ) );
  622. }*/
  623.  
  624. travel_speed = CONST_view_travel_unit_time;
  625. total_distance = abs( distance( level.dummy_mover.origin, level.view_paths[ path_name ][ level.view_paths[ path_name ].size - 1 ].origin ) );
  626. travel_speed *= total_distance / CONST_view_travel_unit_dist;
  627. travel_speed = max( travel_speed, 0.1 ); // due to repeated button presses, the travel distance can be cut to 0 travel speed at times.
  628.  
  629. blur_time = travel_speed;
  630. if ( !CONST_direct_travel )
  631. blur_time *= travel_speed * ( level.view_paths[ path_name ].size + 1 );
  632. self thread blur_sine( CONST_blur_strength, blur_time );
  633.  
  634. foreach ( idx, node in level.view_paths[ path_name ] )
  635. {
  636. //travel_speed = travel_time * ( abs( distance( level.dummy_mover.origin, node.origin ) ) / dist );
  637. //travel_speed += 0.05;
  638.  
  639. if ( CONST_direct_travel )
  640. {
  641. if ( idx != level.view_paths[ path_name ].size - 1 )
  642. continue;
  643. }
  644.  
  645. //level.dummy_mover MoveTo( node.origin, travel_speed );
  646. level.dummy_mover MoveTo( node.origin, travel_speed, travel_speed * 0.5, 0 );
  647. level.dummy_mover RotateTo( node.angles, travel_speed, travel_speed * 0.5, 0);
  648. wait travel_speed;
  649. }
  650. }
  651.  
  652.  
  653. go_path_by_targetname_reverse( path_name, back_to_button_group )
  654. {
  655. assertex( isdefined( level.dummy_mover ), "go_path_by_targetname_reverse called before go_path_by_targetname" );
  656.  
  657. travel_speed = CONST_view_travel_unit_time;
  658. total_distance = abs( distance( level.dummy_mover.origin, level.radial_button_group_info[ back_to_button_group ][ "player_view_pos" ] ) );
  659. travel_speed *= total_distance / CONST_view_travel_unit_dist;
  660. travel_speed = max( travel_speed, 0.1 ); // due to repeated button presses, the travel distance can be cut to 0 travel speed at times.
  661.  
  662. blur_time = travel_speed;
  663. if ( !CONST_direct_travel )
  664. blur_time *= travel_speed * ( level.view_paths[ path_name ].size + 1 );
  665. self thread blur_sine( CONST_blur_strength, blur_time );
  666.  
  667. if ( !CONST_direct_travel )
  668. {
  669. for ( idx = level.view_paths[ path_name ].size - 1; idx >= 0; idx-- )
  670. {
  671. node = level.view_paths[ path_name ][ idx ];
  672. level.dummy_mover MoveTo( node.origin, travel_speed );
  673. level.dummy_mover RotateTo( node.angles, travel_speed );
  674.  
  675. //self thread travel_view_fx( travel_speed );
  676. wait travel_speed;
  677. }
  678. }
  679.  
  680. self thread blur_sine( CONST_blur_strength, travel_speed );
  681.  
  682. pos = level.radial_button_group_info[ back_to_button_group ][ "player_view_pos" ];
  683. angle = level.radial_button_group_info[ back_to_button_group ][ "view_angles" ];
  684.  
  685. level.dummy_mover MoveTo( pos, travel_speed, travel_speed * 0.5, 0 );
  686. level.dummy_mover RotateTo( angle, travel_speed, travel_speed * 0.5, 0 );
  687. wait travel_speed;
  688. }
  689.  
  690.  
  691. travel_view_fx( time )
  692. {
  693. self setblurforplayer( 20, ( time + 0.2 )/2 );
  694. self setblurforplayer( 0, ( time + 0.2 )/2 );
  695. self shellshock( "frag_grenade_mp", time + 0.2 );
  696. }
  697.  
  698.  
  699. blur_sine( strength, time )
  700. {
  701. time_scaled = int( time/0.05 );
  702.  
  703. for( i = 0; i < time_scaled; i ++ )
  704. {
  705. fraction = ( i / ( time_scaled ) );
  706. cos_fraction= sin( 180 * fraction );
  707. blur_amount = strength * cos_fraction;
  708.  
  709. setdvar( "r_blur", blur_amount );
  710. wait 0.05;
  711. }
  712. setdvar( "r_blur", 0 );
  713. }
  714.  
  715.  
  716. force_player_angles()
  717. {
  718. level endon( "game_ended" );
  719. self endon( "disconnect" );
  720. level.dummy_mover endon( "remove_dummy" );
  721.  
  722. while ( 1 )
  723. {
  724. self setplayerangles ( level.dummy_mover.angles );
  725. wait 0.05;
  726. }
  727. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement