burc_2004

_zm_equip_subwoofer.gsc

Oct 22nd, 2015
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 27.04 KB | None | 0 0
  1. #include maps/mp/animscripts/zm_shared;
  2. #include maps/mp/animscripts/zm_death;
  3. #include maps/mp/zombies/_zm_audio;
  4. #include maps/mp/zombies/_zm_buildables;
  5. #include maps/mp/zombies/_zm_power;
  6. #include maps/mp/zombies/_zm_unitrigger;
  7. #include maps/mp/zombies/_zm;
  8. #include maps/mp/gametypes_zm/_weaponobjects;
  9. #include maps/mp/zombies/_zm_equipment;
  10. #include maps/mp/zombies/_zm_utility;
  11. #include maps/mp/_utility;
  12. #include common_scripts/utility;
  13.  
  14. init( pickupstring, howtostring )
  15. {
  16.     if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_subwoofer_zm" ) )
  17.     {
  18.         return;
  19.     }
  20.     level.subwoofer_name = "equip_subwoofer_zm";
  21.     precacherumble( "subwoofer_light" );
  22.     precacherumble( "subwoofer_medium" );
  23.     precacherumble( "subwoofer_heavy" );
  24.     init_animtree();
  25.     maps/mp/zombies/_zm_equipment::register_equipment( level.subwoofer_name, pickupstring, howtostring, "zom_hud_subwoofer_complete", "subwoofer", undefined, ::transfersubwoofer, ::dropsubwoofer, ::pickupsubwoofer, ::placesubwoofer );
  26.     maps/mp/zombies/_zm_equipment::add_placeable_equipment( level.subwoofer_name, "t6_wpn_turret_zmb_subwoofer_view" );
  27.     level thread onplayerconnect();
  28.     maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "equip_subwoofer", pickupstring );
  29.     level._effect[ "subwoofer_on" ] = loadfx( "maps/zombie_highrise/fx_highrise_trmpl_steam_os" );
  30.     level._effect[ "subwoofer_audio_wave" ] = loadfx( "maps/zombie_buried/fx_buried_subwoofer_blast" );
  31.     level._effect[ "subwoofer_knockdown_ground" ] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" );
  32.     level._effect[ "subwoofer_disappear" ] = loadfx( "maps/zombie/fx_zmb_tranzit_turbine_explo" );
  33.     level.subwoofer_gib_refs = [];
  34.     level.subwoofer_gib_refs[ level.subwoofer_gib_refs.size ] = "guts";
  35.     level.subwoofer_gib_refs[ level.subwoofer_gib_refs.size ] = "right_arm";
  36.     level.subwoofer_gib_refs[ level.subwoofer_gib_refs.size ] = "left_arm";
  37.     registerclientfield( "actor", "subwoofer_flings_zombie", 12000, 1, "int" );
  38.     thread wait_init_damage();
  39. }
  40.  
  41. wait_init_damage()
  42. {
  43.     while ( !isDefined( level.zombie_vars ) || !isDefined( level.zombie_vars[ "zombie_health_start" ] ) )
  44.     {
  45.         wait 1;
  46.     }
  47.     level.subwoofer_damage = maps/mp/zombies/_zm::ai_zombie_health( 50 );
  48. }
  49.  
  50. onplayerconnect()
  51. {
  52.     for ( ;; )
  53.     {
  54.         level waittill( "connecting", player );
  55.         player thread onplayerspawned();
  56.     }
  57. }
  58.  
  59. onplayerspawned()
  60. {
  61.     self endon( "disconnect" );
  62.     self thread setupwatchers();
  63.     for ( ;; )
  64.     {
  65.         self waittill( "spawned_player" );
  66.         self thread watchsubwooferuse();
  67.     }
  68. }
  69.  
  70. setupwatchers()
  71. {
  72.     self waittill( "weapon_watchers_created" );
  73.     watcher = maps/mp/gametypes_zm/_weaponobjects::getweaponobjectwatcher( "equip_subwoofer" );
  74.     watcher.onspawnretrievetriggers = ::maps/mp/zombies/_zm_equipment::equipment_onspawnretrievableweaponobject;
  75. }
  76.  
  77. watchsubwooferuse()
  78. {
  79.     self notify( "watchSubwooferUse" );
  80.     self endon( "watchSubwooferUse" );
  81.     self endon( "death" );
  82.     self endon( "disconnect" );
  83.     for ( ;; )
  84.     {
  85.         self waittill( "equipment_placed", weapon, weapname );
  86.         if ( weapname == level.subwoofer_name )
  87.         {
  88.             self cleanupoldsubwoofer();
  89.             self.buildablesubwoofer = weapon;
  90.             self thread startsubwooferdeploy( weapon );
  91.         }
  92.     }
  93. }
  94.  
  95. cleanupoldsubwoofer( preserve_state )
  96. {
  97.     if ( isDefined( self.buildablesubwoofer ) )
  98.     {
  99.         if ( isDefined( self.buildablesubwoofer.stub ) )
  100.         {
  101.             thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildablesubwoofer.stub );
  102.             self.buildablesubwoofer.stub = undefined;
  103.         }
  104.         self.buildablesubwoofer delete();
  105.         self.subwoofer_kills = undefined;
  106.         if ( isDefined( preserve_state ) && !preserve_state )
  107.         {
  108.             self.subwoofer_health = undefined;
  109.             self.subwoofer_emped = undefined;
  110.             self.subwoofer_emp_time = undefined;
  111.         }
  112.     }
  113.     if ( isDefined( level.subwoofer_sound_ent ) )
  114.     {
  115.         level.subwoofer_sound_ent delete();
  116.         level.subwoofer_sound_ent = undefined;
  117.     }
  118. }
  119.  
  120. watchforcleanup()
  121. {
  122.     self notify( "subwoofer_cleanup" );
  123.     self endon( "subwoofer_cleanup" );
  124.     evt = self waittill_any_return( "death_or_disconnect", "equip_subwoofer_zm_taken", "equip_subwoofer_zm_pickup" );
  125.     if ( isDefined( self ) )
  126.     {
  127.         self cleanupoldsubwoofer( evt == "equip_subwoofer_zm_pickup" );
  128.     }
  129. }
  130.  
  131. placesubwoofer( origin, angles )
  132. {
  133.     item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "t6_wpn_zmb_subwoofer", level.subwoofer_name, origin, angles, 32, 0 );
  134.     if ( isDefined( item ) )
  135.     {
  136.         item.subwoofer_kills = self.subwoofer_kills;
  137.         item.requires_pickup = 1;
  138.     }
  139.     self.subwoofer_kills = undefined;
  140.     return item;
  141. }
  142.  
  143. dropsubwoofer()
  144. {
  145.     item = self maps/mp/zombies/_zm_equipment::dropped_equipment_think( "t6_wpn_zmb_subwoofer", level.subwoofer_name, self.origin, self.angles, 32, 0 );
  146.     if ( isDefined( item ) )
  147.     {
  148.         item.subwoofer_kills = self.subwoofer_kills;
  149.         item.requires_pickup = 1;
  150.         item.subwoofer_power_on = self.subwoofer_power_on;
  151.         item.subwoofer_power_level = self.subwoofer_power_level;
  152.         item.subwoofer_round_start = self.subwoofer_round_start;
  153.         item.subwoofer_health = self.subwoofer_health;
  154.         item.subwoofer_emped = self.subwoofer_emped;
  155.         item.subwoofer_emp_time = self.subwoofer_emp_time;
  156.     }
  157.     self.subwoofer_kills = undefined;
  158.     self.subwoofer_is_powering_on = undefined;
  159.     self.subwoofer_power_on = undefined;
  160.     self.subwoofer_power_level = undefined;
  161.     self.subwoofer_round_start = undefined;
  162.     self.subwoofer_health = undefined;
  163.     self.subwoofer_emped = undefined;
  164.     self.subwoofer_emp_time = undefined;
  165.     return item;
  166. }
  167.  
  168. pickupsubwoofer( item )
  169. {
  170.     self.subwoofer_kills = item.subwoofer_kills;
  171.     item.subwoofer_kills = undefined;
  172. }
  173.  
  174. transfersubwoofer( fromplayer, toplayer )
  175. {
  176.     buildablesubwoofer = toplayer.buildablesubwoofer;
  177.     toarmed = 0;
  178.     if ( isDefined( buildablesubwoofer ) )
  179.     {
  180.         if ( isDefined( buildablesubwoofer.is_armed ) )
  181.         {
  182.             toarmed = buildablesubwoofer.is_armed;
  183.         }
  184.     }
  185.     subwoofer_kills = toplayer.subwoofer_kills;
  186.     fromarmed = 0;
  187.     if ( isDefined( fromplayer.buildablesubwoofer ) )
  188.     {
  189.         if ( isDefined( fromplayer.buildablesubwoofer.is_armed ) )
  190.         {
  191.             fromarmed = fromplayer.buildablesubwoofer.is_armed;
  192.         }
  193.     }
  194.     toplayer.buildablesubwoofer = fromplayer.buildablesubwoofer;
  195.     subwoofer_power_on = toplayer.subwoofer_power_on;
  196.     subwoofer_power_level = toplayer.subwoofer_power_level;
  197.     subwoofer_round_start = toplayer.subwoofer_round_start;
  198.     subwoofer_health = toplayer.subwoofer_health;
  199.     subwoofer_emped = toplayer.subwoofer_emped;
  200.     subwoofer_emp_time = toplayer.subwoofer_emp_time;
  201.     toplayer.buildablesubwoofer = fromplayer.buildablesubwoofer;
  202.     fromplayer.buildablesubwoofer = buildablesubwoofer;
  203.     toplayer.subwoofer_emped = fromplayer.subwoofer_emped;
  204.     fromplayer.subwoofer_emped = subwoofer_emped;
  205.     toplayer.subwoofer_emp_time = fromplayer.subwoofer_emp_time;
  206.     fromplayer.subwoofer_emp_time = subwoofer_emp_time;
  207.     toplayer.subwoofer_is_powering_on = undefined;
  208.     fromplayer.subwoofer_is_powering_on = undefined;
  209.     toplayer.subwoofer_power_on = fromplayer.subwoofer_power_on;
  210.     fromplayer.subwoofer_power_on = subwoofer_power_on;
  211.     toplayer.subwoofer_power_level = fromplayer.subwoofer_power_level;
  212.     toplayer.subwoofer_round_start = fromplayer.subwoofer_round_start;
  213.     fromplayer.subwoofer_power_level = subwoofer_power_level;
  214.     fromplayer.subwoofer_round_start = subwoofer_round_start;
  215.     toplayer.subwoofer_health = fromplayer.subwoofer_health;
  216.     fromplayer.subwoofer_health = subwoofer_health;
  217.     toplayer.buildablesubwoofer.original_owner = toplayer;
  218.     toplayer.buildablesubwoofer.owner = toplayer;
  219.     toplayer notify( "equip_subwoofer_zm_taken" );
  220.     toplayer.subwoofer_kills = fromplayer.subwoofer_kills;
  221.     toplayer thread startsubwooferdeploy( toplayer.buildablesubwoofer, fromarmed );
  222.     fromplayer.subwoofer_kills = subwoofer_kills;
  223.     fromplayer notify( "equip_subwoofer_zm_taken" );
  224.     if ( isDefined( fromplayer.buildablesubwoofer ) )
  225.     {
  226.         fromplayer thread startsubwooferdeploy( fromplayer.buildablesubwoofer, toarmed );
  227.         fromplayer.buildablesubwoofer.original_owner = fromplayer;
  228.         fromplayer.buildablesubwoofer.owner = fromplayer;
  229.     }
  230.     else
  231.     {
  232.         fromplayer maps/mp/zombies/_zm_equipment::equipment_release( level.subwoofer_name );
  233.     }
  234. }
  235.  
  236. subwoofer_in_range( delta, origin, radius )
  237. {
  238.     if ( distancesquared( self.target.origin, origin ) < ( radius * radius ) )
  239.     {
  240.         return 1;
  241.     }
  242.     return 0;
  243. }
  244.  
  245. subwoofer_power_on( origin, radius )
  246. {
  247. /#
  248.     println( "^1ZM POWER: trap on\n" );
  249. #/
  250.     if ( !isDefined( self.target ) )
  251.     {
  252.         return;
  253.     }
  254.     self.target.power_on = 1;
  255.     self.target.power_on_time = getTime();
  256.     self.target.owner thread subwooferthink( self.target );
  257. }
  258.  
  259. subwoofer_power_off( origin, radius )
  260. {
  261. /#
  262.     println( "^1ZM POWER: trap off\n" );
  263. #/
  264.     if ( !isDefined( self.target ) )
  265.     {
  266.         return;
  267.     }
  268.     self.target.power_on = 0;
  269. }
  270.  
  271. subwoofer_cost()
  272. {
  273.     return maps/mp/zombies/_zm_power::cost_high() / 2;
  274. }
  275.  
  276. startsubwooferdeploy( weapon, armed )
  277. {
  278.     self endon( "death" );
  279.     self endon( "disconnect" );
  280.     self endon( "equip_subwoofer_zm_taken" );
  281.     self thread watchforcleanup();
  282.     if ( isDefined( self.subwoofer_kills ) )
  283.     {
  284.         weapon.subwoofer_kills = self.subwoofer_kills;
  285.         self.subwoofer_kills = undefined;
  286.     }
  287.     if ( !isDefined( weapon.subwoofer_kills ) )
  288.     {
  289.         weapon.subwoofer_kills = 0;
  290.     }
  291.     if ( !isDefined( self.subwoofer_health ) )
  292.     {
  293.         self.subwoofer_health = 60;
  294.         self.subwoofer_power_level = 4;
  295.     }
  296.     if ( isDefined( weapon ) )
  297.     {
  298. /#
  299.         self thread debugsubwoofer();
  300. #/
  301.         if ( isDefined( level.equipment_subwoofer_needs_power ) && level.equipment_subwoofer_needs_power )
  302.         {
  303.             weapon.power_on = 0;
  304.             maps/mp/zombies/_zm_power::add_temp_powered_item( ::subwoofer_power_on, ::subwoofer_power_off, ::subwoofer_in_range, ::subwoofer_cost, 1, weapon.power_on, weapon );
  305.         }
  306.         else
  307.         {
  308.             weapon.power_on = 1;
  309.         }
  310.         if ( weapon.power_on )
  311.         {
  312.             self thread subwooferthink( weapon, armed );
  313.         }
  314.         else
  315.         {
  316.             self iprintlnbold( &"ZOMBIE_NEED_LOCAL_POWER" );
  317.         }
  318.         if ( isDefined( level.equipment_subwoofer_needs_power ) && !level.equipment_subwoofer_needs_power )
  319.         {
  320.             self thread startsubwooferdecay( weapon );
  321.         }
  322.         self thread maps/mp/zombies/_zm_buildables::delete_on_disconnect( weapon );
  323.         weapon waittill( "death" );
  324.         if ( isDefined( level.subwoofer_sound_ent ) )
  325.         {
  326.             level.subwoofer_sound_ent playsound( "wpn_zmb_electrap_stop" );
  327.             level.subwoofer_sound_ent delete();
  328.             level.subwoofer_sound_ent = undefined;
  329.         }
  330.         self notify( "subwoofer_cleanup" );
  331.     }
  332. }
  333.  
  334. startsubwooferdecay( weapon )
  335. {
  336.     self notify( "subwooferDecay" );
  337.     self endon( "subwooferDecay" );
  338.     self endon( "death" );
  339.     self endon( "disconnect" );
  340.     self endon( "equip_subwoofer_zm_taken" );
  341.     weapon endon( "death" );
  342.     roundlives = 4;
  343.     if ( !isDefined( self.subwoofer_power_level ) )
  344.     {
  345.         self.subwoofer_power_level = roundlives;
  346.     }
  347.     while ( weapon.subwoofer_kills < 45 )
  348.     {
  349.         old_power_level = self.subwoofer_power_level;
  350.         if ( isDefined( self.subwoofer_emped ) && self.subwoofer_emped && isDefined( self.subwoofer_is_powering_on ) && !self.subwoofer_is_powering_on )
  351.         {
  352.             emp_time = level.zombie_vars[ "emp_perk_off_time" ];
  353.             now = getTime();
  354.             emp_time_left = emp_time - ( ( now - self.subwoofer_emp_time ) / 1000 );
  355.             if ( emp_time_left <= 0 )
  356.             {
  357.                 self.subwoofer_emped = undefined;
  358.                 self.subwoofer_emp_time = undefined;
  359.                 old_power_level = -1;
  360.             }
  361.         }
  362.         if ( isDefined( self.subwoofer_emped ) && self.subwoofer_emped )
  363.         {
  364.             self.subwoofer_power_level = 0;
  365.         }
  366.         cost = 1;
  367.         if ( weapon.subwoofer_kills > 30 )
  368.         {
  369.             self.subwoofer_power_level = 1;
  370.             if ( isDefined( weapon.low_health_sparks ) && !weapon.low_health_sparks )
  371.             {
  372.                 weapon.low_health_sparks = 1;
  373.                 playfxontag( level._effect[ "switch_sparks" ], weapon, "tag_origin" );
  374.             }
  375.         }
  376.         else if ( weapon.subwoofer_kills > 15 )
  377.         {
  378.             self.subwoofer_power_level = 2;
  379.         }
  380.         else
  381.         {
  382.             self.subwoofer_power_level = 4;
  383.         }
  384.         if ( old_power_level != self.subwoofer_power_level )
  385.         {
  386.             self notify( "subwoofer_power_change" );
  387.         }
  388.         wait 1;
  389.     }
  390.     if ( isDefined( weapon ) )
  391.     {
  392.         self destroy_placed_subwoofer();
  393.         subwoofer_disappear_fx( weapon );
  394.     }
  395.     self thread wait_and_take_equipment();
  396.     self.subwoofer_health = undefined;
  397.     self.subwoofer_power_level = undefined;
  398.     self.subwoofer_round_start = undefined;
  399.     self.subwoofer_power_on = undefined;
  400.     self.subwoofer_emped = undefined;
  401.     self.subwoofer_emp_time = undefined;
  402.     self cleanupoldsubwoofer();
  403. }
  404.  
  405. destroy_placed_subwoofer()
  406. {
  407.     if ( isDefined( self.buildablesubwoofer ) )
  408.     {
  409.         if ( isDefined( self.buildablesubwoofer.dying ) && self.buildablesubwoofer.dying )
  410.         {
  411.             while ( isDefined( self.buildablesubwoofer ) )
  412.             {
  413.                 wait 0,05;
  414.             }
  415.             return;
  416.         }
  417.         if ( isDefined( self.buildablesubwoofer.stub ) )
  418.         {
  419.             thread maps/mp/zombies/_zm_unitrigger::unregister_unitrigger( self.buildablesubwoofer.stub );
  420.         }
  421.         thread subwoofer_disappear_fx( self.buildablesubwoofer, 0,75 );
  422.         self.buildablesubwoofer.dying = 1;
  423.     }
  424. }
  425.  
  426. wait_and_take_equipment()
  427. {
  428.     wait 0,05;
  429.     self thread maps/mp/zombies/_zm_equipment::equipment_release( level.subwoofer_name );
  430. }
  431.  
  432. init_animtree()
  433. {
  434. }
  435.  
  436. subwoofer_fx( weapon )
  437. {
  438.     weapon endon( "death" );
  439.     self endon( "equip_subwoofer_zm_taken" );
  440.     while ( isDefined( weapon ) )
  441.     {
  442.         wait 1;
  443.     }
  444. }
  445.  
  446. subwoofer_disappear_fx( weapon, waittime )
  447. {
  448.     if ( isDefined( waittime ) && waittime > 0 )
  449.     {
  450.         wait waittime;
  451.     }
  452.     if ( isDefined( weapon ) )
  453.     {
  454.         playfx( level._effect[ "subwoofer_disappear" ], weapon.origin );
  455.     }
  456. }
  457.  
  458. subwoofer_choke()
  459. {
  460.     while ( 1 )
  461.     {
  462.         level._subwoofer_choke = 0;
  463.         wait_network_frame();
  464.     }
  465. }
  466.  
  467. subwooferthink( weapon, armed )
  468. {
  469.     self endon( "death" );
  470.     self endon( "disconnect" );
  471.     self endon( "equip_subwoofer_zm_taken" );
  472.     weapon notify( "subwooferthink" );
  473.     weapon endon( "subwooferthink" );
  474.     weapon endon( "death" );
  475.     direction_forward = anglesToForward( flat_angle( weapon.angles ) + vectorScale( ( 0, 0, 1 ), 30 ) );
  476.     direction_vector = vectorScale( direction_forward, 512 );
  477.     direction_origin = weapon.origin + direction_vector;
  478.     original_angles = weapon.angles;
  479.     original_origin = weapon.origin;
  480.     tag_spin_origin = weapon gettagorigin( "tag_spin" );
  481.     wait 0,05;
  482.     while ( 1 )
  483.     {
  484.         while ( isDefined( weapon.power_on ) && !weapon.power_on )
  485.         {
  486.             wait 1;
  487.         }
  488.         wait 2;
  489.         if ( isDefined( weapon.power_on ) && !weapon.power_on )
  490.         {
  491.             continue;
  492.         }
  493.         if ( !isDefined( level._subwoofer_choke ) )
  494.         {
  495.             level thread subwoofer_choke();
  496.         }
  497.         while ( level._subwoofer_choke )
  498.         {
  499.             wait 0,05;
  500.         }
  501.         level._subwoofer_choke++;
  502.         weapon.subwoofer_network_choke_count = 0;
  503.         weapon thread maps/mp/zombies/_zm_equipment::signal_equipment_activated( 1 );
  504.         vibrateamplitude = 4;
  505.         if ( self.subwoofer_power_level == 3 )
  506.         {
  507.             vibrateamplitude = 8;
  508.         }
  509.         else
  510.         {
  511.             if ( self.subwoofer_power_level == 2 )
  512.             {
  513.                 vibrateamplitude = 13;
  514.             }
  515.         }
  516.         if ( self.subwoofer_power_level == 1 )
  517.         {
  518.             vibrateamplitude = 17;
  519.         }
  520.         weapon vibrate( vectorScale( ( 0, 0, 1 ), 100 ), vibrateamplitude, 0,2, 0,3 );
  521.         zombies = get_array_of_closest( weapon.origin, get_round_enemy_array(), undefined, undefined, 1200 );
  522.         players = get_array_of_closest( weapon.origin, get_players(), undefined, undefined, 1200 );
  523.         props = get_array_of_closest( weapon.origin, getentarray( "subwoofer_target", "script_noteworthy" ), undefined, undefined, 1200 );
  524.         entities = arraycombine( zombies, players, 0, 0 );
  525.         entities = arraycombine( entities, props, 0, 0 );
  526.         _a681 = entities;
  527.         _k681 = getFirstArrayKey( _a681 );
  528.         while ( isDefined( _k681 ) )
  529.         {
  530.             ent = _a681[ _k681 ];
  531.             if ( !isDefined( ent ) || !isplayer( ent ) && isai( ent ) && !isalive( ent ) )
  532.             {
  533.             }
  534.             else
  535.             {
  536.                 if ( isDefined( ent.ignore_subwoofer ) && ent.ignore_subwoofer )
  537.                 {
  538.                     break;
  539.                 }
  540.                 else
  541.                 {
  542.                     distanceentityandsubwoofer = distance2dsquared( original_origin, ent.origin );
  543.                     onlydamage = 0;
  544.                     action = undefined;
  545.                     if ( distanceentityandsubwoofer <= 32400 )
  546.                     {
  547.                         action = "burst";
  548.                     }
  549.                     else if ( distanceentityandsubwoofer <= 230400 )
  550.                     {
  551.                         action = "fling";
  552.                     }
  553.                     else if ( distanceentityandsubwoofer <= 1440000 )
  554.                     {
  555.                         action = "stumble";
  556.                     }
  557.                     else
  558.                     {
  559.                     }
  560.                     if ( !within_fov( original_origin, original_angles, ent.origin, cos( 45 ) ) )
  561.                     {
  562.                         if ( isplayer( ent ) )
  563.                         {
  564.                             ent hit_player( action, 0 );
  565.                         }
  566.                         break;
  567.                     }
  568.                     else weapon subwoofer_network_choke();
  569.                     ent_trace_origin = ent.origin;
  570.                     if ( isai( ent ) || isplayer( ent ) )
  571.                     {
  572.                         ent_trace_origin = ent geteye();
  573.                     }
  574.                     if ( isDefined( ent.script_noteworthy ) && ent.script_noteworthy == "subwoofer_target" )
  575.                     {
  576.                         ent_trace_origin += vectorScale( ( 0, 0, 1 ), 48 );
  577.                     }
  578.                     if ( !sighttracepassed( tag_spin_origin, ent_trace_origin, 1, weapon ) )
  579.                     {
  580.                         break;
  581.                     }
  582.                     else if ( isDefined( ent.script_noteworthy ) && ent.script_noteworthy == "subwoofer_target" )
  583.                     {
  584.                         ent notify( "damaged_by_subwoofer" );
  585.                         break;
  586.                     }
  587.                     else
  588.                     {
  589.                         if ( isDefined( ent.in_the_ground ) && !ent.in_the_ground && isDefined( ent.in_the_ceiling ) && !ent.in_the_ceiling && isDefined( ent.ai_state ) || ent.ai_state == "zombie_goto_entrance" && isDefined( ent.completed_emerging_into_playable_area ) && !ent.completed_emerging_into_playable_area )
  590.                         {
  591.                             onlydamage = 1;
  592.                         }
  593.                         if ( isplayer( ent ) )
  594.                         {
  595.                             ent notify( "player_" + action );
  596.                             ent hit_player( action, 1 );
  597.                             break;
  598.                         }
  599.                         else if ( isDefined( ent ) )
  600.                         {
  601.                             ent notify( "zombie_" + action );
  602. /#
  603.                             ent thread subwoofer_debug_print( action, ( 0, 0, 1 ) );
  604. #/
  605.                             shouldgib = distanceentityandsubwoofer <= 810000;
  606.                             if ( action == "fling" )
  607.                             {
  608.                                 ent thread fling_zombie( weapon, direction_vector / 4, self, onlydamage );
  609.                                 weapon.subwoofer_kills++;
  610.                                 self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "subwoofer" );
  611.                                 break;
  612.                             }
  613.                             else if ( action == "burst" )
  614.                             {
  615.                                 ent thread burst_zombie( weapon, self );
  616.                                 weapon.subwoofer_kills++;
  617.                                 self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "subwoofer" );
  618.                                 break;
  619.                             }
  620.                             else
  621.                             {
  622.                                 if ( action == "stumble" )
  623.                                 {
  624.                                     ent thread knockdown_zombie( weapon, shouldgib, onlydamage );
  625.                                 }
  626.                             }
  627.                         }
  628.                     }
  629.                 }
  630.             }
  631.             _k681 = getNextArrayKey( _a681, _k681 );
  632.         }
  633.         if ( weapon.subwoofer_kills >= 45 )
  634.         {
  635.             self thread subwoofer_expired( weapon );
  636.         }
  637.     }
  638. }
  639.  
  640. subwoofer_expired( weapon )
  641. {
  642.     weapon maps/mp/zombies/_zm_equipment::dropped_equipment_destroy( 1 );
  643.     self maps/mp/zombies/_zm_equipment::equipment_release( level.subwoofer_name );
  644.     self.subwoofer_kills = 0;
  645. }
  646.  
  647. hit_player( action, doshellshock )
  648. {
  649.     if ( action == "burst" )
  650.     {
  651.         self playrumbleonentity( "subwoofer_heavy" );
  652.         if ( isDefined( doshellshock ) && doshellshock )
  653.         {
  654.             self shellshock( "frag_grenade_mp", 1,5 );
  655.         }
  656.     }
  657.     else if ( action == "fling" )
  658.     {
  659.         self playrumbleonentity( "subwoofer_medium" );
  660.         if ( isDefined( doshellshock ) && doshellshock )
  661.         {
  662.             self shellshock( "frag_grenade_mp", 0,5 );
  663.         }
  664.     }
  665.     else
  666.     {
  667.         if ( action == "stumble" )
  668.         {
  669.             if ( isDefined( doshellshock ) && doshellshock )
  670.             {
  671.                 self playrumbleonentity( "subwoofer_light" );
  672.                 self shellshock( "frag_grenade_mp", 0,13 );
  673.             }
  674.         }
  675.     }
  676. }
  677.  
  678. burst_zombie( weapon, player )
  679. {
  680.     if ( !isDefined( self ) || !isalive( self ) )
  681.     {
  682.         return;
  683.     }
  684.     if ( isDefined( self.subwoofer_burst_func ) )
  685.     {
  686.         self thread [[ self.subwoofer_burst_func ]]( weapon );
  687.         return;
  688.     }
  689.     self dodamage( self.health + 666, weapon.origin );
  690.     player notify( "zombie_subwoofer_kill" );
  691.     if ( isDefined( self.guts_explosion ) && !self.guts_explosion )
  692.     {
  693.         self.guts_explosion = 1;
  694.         self setclientfield( "zombie_gut_explosion", 1 );
  695.         if ( isDefined( self.isdog ) && !self.isdog )
  696.         {
  697.             wait 0,1;
  698.         }
  699.         self ghost();
  700.     }
  701. }
  702.  
  703. fling_zombie( weapon, fling_vec, player, onlydamage )
  704. {
  705.     if ( !isDefined( self ) || !isalive( self ) )
  706.     {
  707.         return;
  708.     }
  709.     if ( isDefined( self.subwoofer_fling_func ) )
  710.     {
  711.         self thread [[ self.subwoofer_fling_func ]]( weapon, fling_vec );
  712.         player notify( "zombie_subwoofer_kill" );
  713.         return;
  714.     }
  715.     self dodamage( self.health + 666, weapon.origin );
  716.     player notify( "zombie_subwoofer_kill" );
  717.     if ( self.health <= 0 )
  718.     {
  719.         if ( isDefined( onlydamage ) && !onlydamage )
  720.         {
  721.             self startragdoll();
  722.             self setclientfield( "subwoofer_flings_zombie", 1 );
  723.         }
  724.         self.subwoofer_death = 1;
  725.     }
  726. }
  727.  
  728. knockdown_zombie( weapon, gib, onlydamage )
  729. {
  730.     self endon( "death" );
  731.     if ( isDefined( self.is_knocked_down ) && self.is_knocked_down )
  732.     {
  733.         return;
  734.     }
  735.     if ( !isDefined( self ) || !isalive( self ) )
  736.     {
  737.         return;
  738.     }
  739.     if ( isDefined( self.subwoofer_knockdown_func ) )
  740.     {
  741.         self thread [[ self.subwoofer_knockdown_func ]]( weapon, gib );
  742.         return;
  743.     }
  744.     if ( isDefined( onlydamage ) && onlydamage )
  745.     {
  746.         self thread knockdown_zombie_damage( weapon );
  747.         return;
  748.     }
  749.     if ( gib && isDefined( self.gibbed ) && !self.gibbed )
  750.     {
  751.         self thread knockdown_zombie_damage( weapon );
  752.         self.a.gib_ref = random( level.subwoofer_gib_refs );
  753.         self thread maps/mp/animscripts/zm_death::do_gib();
  754.     }
  755.     self.subwoofer_handle_pain_notetracks = ::handle_subwoofer_pain_notetracks;
  756.     self thread knockdown_zombie_damage( weapon );
  757.     self animcustom( ::knockdown_zombie_animate );
  758. }
  759.  
  760. knockdown_zombie_damage( weapon )
  761. {
  762.     if ( self.health <= 15 )
  763.     {
  764.         weapon.subwoofer_kills++;
  765.         self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "subwoofer" );
  766.     }
  767.     self dodamage( 15, weapon.origin );
  768. }
  769.  
  770. handle_subwoofer_pain_notetracks( note )
  771. {
  772.     if ( note == "zombie_knockdown_ground_impact" )
  773.     {
  774.         playfx( level._effect[ "subwoofer_knockdown_ground" ], self.origin, anglesToForward( self.angles ), anglesToUp( self.angles ) );
  775.     }
  776. }
  777.  
  778. knockdown_zombie_animate()
  779. {
  780.     self notify( "end_play_subwoofer_pain_anim" );
  781.     self endon( "killanimscript" );
  782.     self endon( "death" );
  783.     self endon( "end_play_subwoofer_pain_anim" );
  784.     if ( isDefined( self.marked_for_death ) && self.marked_for_death )
  785.     {
  786.         return;
  787.     }
  788.     if ( isDefined( self.has_legs ) && !self.has_legs )
  789.     {
  790.         return;
  791.     }
  792.     if ( isDefined( self.barricade_enter ) && self.barricade_enter )
  793.     {
  794.         return;
  795.     }
  796.     if ( !issubstr( self.animstatedef, "buried" ) )
  797.     {
  798.         return;
  799.     }
  800.     animation_direction = undefined;
  801.     animation_side = undefined;
  802.     animation_duration = "_default";
  803.     if ( self.damageyaw <= -135 || self.damageyaw >= 135 )
  804.     {
  805.         animation_direction = "back";
  806.         animation_side = "back";
  807.     }
  808.     else
  809.     {
  810.         if ( self.damageyaw > -135 && self.damageyaw < -45 )
  811.         {
  812.             animation_direction = "left";
  813.             animation_side = "back";
  814.         }
  815.         else
  816.         {
  817.             if ( self.damageyaw > 45 && self.damageyaw < 135 )
  818.             {
  819.                 animation_direction = "right";
  820.                 animation_side = "belly";
  821.             }
  822.             else
  823.             {
  824.                 animation_direction = "front";
  825.                 animation_side = "belly";
  826.             }
  827.         }
  828.     }
  829.     wait randomfloatrange( 0,05, 0,35 );
  830.     self thread knockdown_zombie_animate_state();
  831. /#
  832.     self thread subwoofer_debug_animation_print( animation_direction, animation_side );
  833. #/
  834.     self setanimstatefromasd( "zm_subwoofer_fall_" + animation_direction );
  835.     self maps/mp/animscripts/zm_shared::donotetracks( "subwoofer_fall_anim", self.subwoofer_handle_pain_notetracks );
  836.     if ( isDefined( self ) && isalive( self ) && isDefined( self.has_legs ) || !self.has_legs && isDefined( self.marked_for_death ) && self.marked_for_death )
  837.     {
  838.         return;
  839.     }
  840.     if ( isDefined( self.a.gib_ref ) )
  841.     {
  842.         if ( self.a.gib_ref != "no_legs" && self.a.gib_ref != "no_arms" && self.a.gib_ref != "left_leg" && self.a.gib_ref == "right_leg" || randomint( 100 ) > 25 && self.a.gib_ref != "left_arm" && self.a.gib_ref == "right_arm" && randomint( 100 ) > 75 )
  843.         {
  844.             animation_duration = "_late";
  845.         }
  846.         else
  847.         {
  848.             if ( randomint( 100 ) > 75 )
  849.             {
  850.                 animation_duration = "_early";
  851.             }
  852.         }
  853.     }
  854.     else
  855.     {
  856.         if ( randomint( 100 ) > 25 )
  857.         {
  858.             animation_duration = "_early";
  859.         }
  860.     }
  861.     self setanimstatefromasd( "zm_subwoofer_getup_" + animation_side + animation_duration );
  862.     self maps/mp/animscripts/zm_shared::donotetracks( "subwoofer_getup_anim" );
  863.     self notify( "back_up" );
  864. }
  865.  
  866. knockdown_zombie_animate_state()
  867. {
  868.     self endon( "death" );
  869.     self.is_knocked_down = 1;
  870.     self waittill_any( "damage", "back_up" );
  871.     self.is_knocked_down = 0;
  872. }
  873.  
  874. subwoofer_network_choke()
  875. {
  876.     self.subwoofer_network_choke_count++;
  877.     if ( self.subwoofer_network_choke_count % 10 )
  878.     {
  879.         wait_network_frame();
  880.     }
  881. }
  882.  
  883. enemy_killed_by_subwoofer()
  884. {
  885.     if ( isDefined( self.subwoofer_death ) )
  886.     {
  887.         return self.subwoofer_death;
  888.     }
  889. }
  890.  
  891. debugsubwoofer()
  892. {
  893. /#
  894.     self endon( "death" );
  895.     self endon( "disconnect" );
  896.     self endon( "equip_subwoofer_zm_taken" );
  897.     self.buildablesubwoofer endon( "death" );
  898.     red = ( 0, 0, 1 );
  899.     green = ( 0, 0, 1 );
  900.     blue = ( 0, 0, 1 );
  901.     yellow = vectorScale( ( 0, 0, 1 ), 0,65 );
  902.     while ( isDefined( self.buildablesubwoofer ) )
  903.     {
  904.         if ( getDvarInt( #"EB512CB7" ) )
  905.         {
  906.             row = 1;
  907.             health_color = green;
  908.             if ( self.subwoofer_power_level <= 1 )
  909.             {
  910.                 health_color = red;
  911.             }
  912.             else
  913.             {
  914.                 if ( self.subwoofer_power_level <= 3 )
  915.                 {
  916.                     health_color = yellow;
  917.                 }
  918.             }
  919.             if ( isDefined( self.buildablesubwoofer.subwoofer_kills ) )
  920.             {
  921.                 row = self debugsubwooferprint3d( row, "Kills: " + self.buildablesubwoofer.subwoofer_kills, health_color );
  922.             }
  923.             if ( isDefined( self.subwoofer_health ) )
  924.             {
  925.                 row = self debugsubwooferprint3d( row, "Use Time: " + self.subwoofer_health, health_color );
  926.             }
  927.             if ( isDefined( self.buildablesubwoofer.original_owner ) )
  928.             {
  929.                 row = self debugsubwooferprint3d( row, "Original Owner: " + self.buildablesubwoofer.original_owner.name, green );
  930.             }
  931.             if ( isDefined( self.buildablesubwoofer.owner ) )
  932.             {
  933.                 row = self debugsubwooferprint3d( row, "Current Owner: " + self.buildablesubwoofer.owner.name, green );
  934.             }
  935.         }
  936.         wait 0,05;
  937. #/
  938.     }
  939. }
  940.  
  941. debugsubwooferprint3d( row, text, color )
  942. {
  943. /#
  944.     self endon( "death" );
  945.     self endon( "disconnect" );
  946.     self endon( "equip_subwoofer_zm_taken" );
  947.     self.buildablesubwoofer endon( "death" );
  948.     print3dspace = vectorScale( ( 0, 0, 1 ), 10 );
  949.     print3d( self.buildablesubwoofer.origin + vectorScale( ( 0, 0, 1 ), 30 ) + ( print3dspace * row ), text, color, 1, 0,5, 1 );
  950.     row++;
  951.     return row;
  952. #/
  953. }
  954.  
  955. subwoofer_debug_print( msg, color, offset )
  956. {
  957. /#
  958.     if ( !getDvarInt( #"EB512CB7" ) )
  959.     {
  960.         return;
  961.     }
  962.     if ( !isDefined( color ) )
  963.     {
  964.         color = ( 0, 0, 1 );
  965.     }
  966.     if ( !isDefined( offset ) )
  967.     {
  968.         offset = ( 0, 0, 1 );
  969.     }
  970.     print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ) + offset, msg, color, 1, 1, 40 );
  971. #/
  972. }
  973.  
  974. subwoofer_debug_animation_print( msg1, msg2 )
  975. {
  976. /#
  977.     if ( getDvarInt( #"EB512CB7" ) != 1 )
  978.     {
  979.         return;
  980.     }
  981.     self endon( "death" );
  982.     self endon( "damage" );
  983.     self endon( "back_up" );
  984.     color = ( 0, 0, 1 );
  985.     while ( 1 )
  986.     {
  987.         print3d( self.origin + vectorScale( ( 0, 0, 1 ), 50 ), "FallDown: " + msg1, color, 1, 0,75 );
  988.         print3d( self.origin + vectorScale( ( 0, 0, 1 ), 40 ), "GetUp: " + msg2, color, 1, 0,75 );
  989.         wait 0,05;
  990. #/
  991.     }
  992. }
Advertisement
Add Comment
Please, Sign In to add comment