mirror of
https://github.com/JezuzLizard/BO2-Reimagined.git
synced 2025-06-10 15:17:57 -05:00
345 lines
8.8 KiB
Plaintext
345 lines
8.8 KiB
Plaintext
#include maps\mp\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\mp\zombies\_zm_utility;
|
|
|
|
#include maps\mp\zombies\_zm_game_module_meat_utility;
|
|
|
|
item_meat_watch_trigger( meat_id, trigger, callback, playersoundonuse, npcsoundonuse )
|
|
{
|
|
self endon( "death" );
|
|
self thread maps\mp\gametypes_zm\zmeat::item_quick_trigger( meat_id, trigger );
|
|
while ( 1 )
|
|
{
|
|
trigger waittill( "usetrigger", player );
|
|
if ( !isalive( player ) )
|
|
{
|
|
continue;
|
|
}
|
|
if ( !is_player_valid( player ) )
|
|
{
|
|
continue;
|
|
}
|
|
if ( player has_powerup_weapon() )
|
|
{
|
|
continue;
|
|
}
|
|
if ( player maps\mp\zombies\_zm_laststand::is_reviving_any() )
|
|
{
|
|
continue;
|
|
}
|
|
volley = 0;
|
|
if ( self.meat_is_flying )
|
|
{
|
|
if ( player isMeleeing() )
|
|
{
|
|
volley = 1;
|
|
}
|
|
}
|
|
player.volley_meat = volley;
|
|
if ( is_true( self._fake_meat ) )
|
|
{
|
|
maps\mp\gametypes_zm\zmeat::add_meat_event( "player_fake_take", player, self );
|
|
}
|
|
else if ( volley )
|
|
{
|
|
maps\mp\gametypes_zm\zmeat::add_meat_event( "player_volley", player, self );
|
|
}
|
|
else if ( self.meat_is_moving )
|
|
{
|
|
maps\mp\gametypes_zm\zmeat::add_meat_event( "player_catch", player, self );
|
|
}
|
|
else
|
|
{
|
|
maps\mp\gametypes_zm\zmeat::add_meat_event( "player_take", player, self );
|
|
}
|
|
if ( is_true( self._fake_meat ) )
|
|
{
|
|
player playlocalsound( level.zmb_laugh_alias );
|
|
wait_network_frame();
|
|
if ( !isDefined( self ) )
|
|
{
|
|
return;
|
|
}
|
|
self maps\mp\gametypes_zm\zmeat::cleanup_meat();
|
|
return;
|
|
}
|
|
curr_weap = player getcurrentweapon();
|
|
if ( !maps\mp\gametypes_zm\zmeat::is_meat( curr_weap ) )
|
|
{
|
|
player.pre_meat_weapon = curr_weap;
|
|
}
|
|
if ( self.meat_is_moving )
|
|
{
|
|
if ( volley )
|
|
{
|
|
self maps\mp\gametypes_zm\zmeat::item_meat_volley( player );
|
|
}
|
|
else
|
|
{
|
|
self maps\mp\gametypes_zm\zmeat::item_meat_caught( player, self.meat_is_flying );
|
|
}
|
|
}
|
|
self maps\mp\gametypes_zm\zmeat::item_meat_pickup();
|
|
if ( isDefined( playersoundonuse ) )
|
|
{
|
|
player playlocalsound( playersoundonuse );
|
|
}
|
|
if ( isDefined( npcsoundonuse ) )
|
|
{
|
|
player playsound( npcsoundonuse );
|
|
}
|
|
if ( volley )
|
|
{
|
|
player thread spike_the_meat( self );
|
|
}
|
|
else
|
|
{
|
|
self thread [[ callback ]]( player );
|
|
if ( !isDefined( player._meat_hint_shown ) )
|
|
{
|
|
player thread maps\mp\gametypes_zm\zmeat::show_meat_throw_hint();
|
|
player._meat_hint_shown = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
spike_the_meat( meat )
|
|
{
|
|
if ( is_true( self._kicking_meat ) )
|
|
{
|
|
return;
|
|
}
|
|
fake_meat = 0;
|
|
self._kicking_meat = 1;
|
|
self._spawning_meat = 1;
|
|
org = self getweaponmuzzlepoint();
|
|
vel = meat getvelocity();
|
|
if ( !is_true( meat._fake_meat ) )
|
|
{
|
|
meat maps\mp\gametypes_zm\zmeat::cleanup_meat();
|
|
level._last_person_to_throw_meat = self;
|
|
level._last_person_to_throw_meat_time = getTime();
|
|
level._meat_splitter_activated = 0;
|
|
}
|
|
else
|
|
{
|
|
fake_meat = 1;
|
|
meat maps\mp\gametypes_zm\zmeat::cleanup_meat();
|
|
}
|
|
kickangles = self.angles;
|
|
launchdir = anglesToForward( kickangles );
|
|
speed = length( vel );
|
|
launchvel = vectorScale( launchdir, speed );
|
|
grenade = self magicgrenadetype( get_gamemode_var( "item_meat_name" ), org, ( launchvel[ 0 ], launchvel[ 1 ], 120 ) );
|
|
grenade playsound( "zmb_meat_meat_tossed" );
|
|
grenade thread maps\mp\gametypes_zm\zmeat::waittill_loopstart();
|
|
if ( fake_meat )
|
|
{
|
|
grenade._fake_meat = 1;
|
|
grenade thread maps\mp\gametypes_zm\zmeat::delete_on_real_meat_pickup();
|
|
level._kicked_meat = grenade;
|
|
}
|
|
wait 0.1;
|
|
self._spawning_meat = 0;
|
|
self._kicking_meat = 0;
|
|
if ( !fake_meat )
|
|
{
|
|
level notify( "meat_thrown", self );
|
|
level notify( "meat_kicked" );
|
|
}
|
|
}
|
|
|
|
create_item_meat_watcher()
|
|
{
|
|
wait 0.05;
|
|
watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher( "item_meat", get_gamemode_var( "item_meat_name" ), self.team );
|
|
watcher.pickup = ::item_meat_on_pickup;
|
|
watcher.onspawn = ::item_meat_spawned;
|
|
watcher.onspawnretrievetriggers = ::play_item_meat_on_spawn_retrieve_trigger;
|
|
watcher.headicon = 0;
|
|
}
|
|
|
|
item_meat_on_spawn_retrieve_trigger( watcher, player, weaponname )
|
|
{
|
|
self endon( "death" );
|
|
add_meat_event( "meat_spawn", self );
|
|
|
|
while ( isdefined( level.splitting_meat ) && level.splitting_meat )
|
|
wait 0.15;
|
|
|
|
if ( isdefined( player ) )
|
|
{
|
|
self setowner( player );
|
|
self setteam( player.pers["team"] );
|
|
self.owner = player;
|
|
self.oldangles = self.angles;
|
|
|
|
if ( player hasweapon( weaponname ) )
|
|
{
|
|
if ( !( isdefined( self._fake_meat ) && self._fake_meat ) )
|
|
player thread player_wait_take_meat( weaponname );
|
|
else
|
|
{
|
|
player takeweapon( weaponname );
|
|
player decrement_is_drinking();
|
|
}
|
|
}
|
|
|
|
if ( !( isdefined( self._fake_meat ) && self._fake_meat ) )
|
|
{
|
|
if ( !( isdefined( self._respawned_meat ) && self._respawned_meat ) )
|
|
{
|
|
level notify( "meat_thrown", player );
|
|
level._last_person_to_throw_meat = player;
|
|
level._last_person_to_throw_meat_time = gettime();
|
|
}
|
|
}
|
|
}
|
|
|
|
level.meat_player = undefined;
|
|
|
|
player setMoveSpeedScale(1);
|
|
|
|
if (is_true(self.meat_weapons_disabled))
|
|
{
|
|
self.meat_weapons_disabled = undefined;
|
|
self enableWeapons();
|
|
}
|
|
|
|
if (level.scr_zm_ui_gametype_obj == "zmeat")
|
|
{
|
|
player.player_waypoint.alpha = 1;
|
|
}
|
|
|
|
players = get_players();
|
|
foreach (other_player in players)
|
|
{
|
|
other_player thread maps\mp\gametypes_zm\zgrief::meat_stink_player_cleanup();
|
|
|
|
if (is_player_valid(other_player) && !is_true(other_player.spawn_protection) && !is_true(other_player.revive_protection))
|
|
{
|
|
other_player.ignoreme = 0;
|
|
}
|
|
|
|
if (level.scr_zm_ui_gametype_obj == "zmeat")
|
|
{
|
|
other_player thread scripts\zm\zgrief\zgrief_reimagined::show_grief_hud_msg("Meat thrown!");
|
|
}
|
|
}
|
|
|
|
if ( !( isdefined( self._fake_meat ) && self._fake_meat ) )
|
|
{
|
|
level._meat_moving = 1;
|
|
|
|
if ( isdefined( level.item_meat ) && level.item_meat != self )
|
|
level.item_meat cleanup_meat();
|
|
|
|
level.item_meat = self;
|
|
}
|
|
|
|
self thread item_meat_watch_stationary();
|
|
self thread item_meat_watch_bounce();
|
|
self.item_meat_pick_up_trigger = spawn( "trigger_radius_use", self.origin, 0, 36, 72 );
|
|
self.item_meat_pick_up_trigger setcursorhint( "HINT_NOICON" );
|
|
self.item_meat_pick_up_trigger sethintstring( &"ZOMBIE_MEAT_PICKUP" );
|
|
self.item_meat_pick_up_trigger enablelinkto();
|
|
self.item_meat_pick_up_trigger linkto( self );
|
|
self.item_meat_pick_up_trigger triggerignoreteam();
|
|
level.item_meat_pick_up_trigger = self.item_meat_pick_up_trigger;
|
|
self thread item_meat_watch_shutdown();
|
|
self.meat_id = indexinarray( level._fake_meats, self );
|
|
|
|
if ( !isdefined( self.meat_id ) )
|
|
self.meat_id = 0;
|
|
|
|
if ( isdefined( level.dont_allow_meat_interaction ) && level.dont_allow_meat_interaction )
|
|
self.item_meat_pick_up_trigger setinvisibletoall();
|
|
else
|
|
{
|
|
self thread item_meat_watch_trigger( self.meat_id, self.item_meat_pick_up_trigger, ::item_meat_on_pickup, level.meat_pickupsoundplayer, level.meat_pickupsound );
|
|
self thread kick_meat_monitor();
|
|
self thread last_stand_meat_nudge();
|
|
}
|
|
|
|
self._respawned_meat = undefined;
|
|
}
|
|
|
|
item_meat_watch_bounce()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "picked_up" );
|
|
self.meat_is_flying = 1;
|
|
|
|
while (1)
|
|
{
|
|
self waittill( "grenade_bounce", pos, normal, ent );
|
|
|
|
playfxontag( level._effect["meat_marker"], self, "tag_origin" );
|
|
|
|
if ( isdefined( level.meat_bounce_override ) )
|
|
{
|
|
self thread [[ level.meat_bounce_override ]]( pos, normal, ent, true );
|
|
}
|
|
}
|
|
|
|
self.meat_is_flying = 0;
|
|
}
|
|
|
|
item_meat_watch_stationary()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "picked_up" );
|
|
self.meat_is_moving = 1;
|
|
|
|
self waittill( "stationary", pos, normal );
|
|
|
|
if ( isdefined( level.meat_bounce_override ) )
|
|
{
|
|
self thread [[ level.meat_bounce_override ]]( pos, normal, undefined, false );
|
|
}
|
|
|
|
self.meat_is_moving = 0;
|
|
|
|
self delete();
|
|
}
|
|
|
|
player_wait_take_meat( meat_name )
|
|
{
|
|
self.dont_touch_the_meat = 1;
|
|
|
|
if ( isdefined( self.pre_meat_weapon ) && self hasweapon( self.pre_meat_weapon ) )
|
|
self switchtoweapon( self.pre_meat_weapon );
|
|
else
|
|
{
|
|
primaryweapons = self getweaponslistprimaries();
|
|
|
|
if ( isdefined( primaryweapons ) && primaryweapons.size > 0 )
|
|
self switchtoweapon( primaryweapons[0] );
|
|
else
|
|
{
|
|
assert( 0, "Player has no weapon" );
|
|
self maps\mp\zombies\_zm_weapons::give_fallback_weapon();
|
|
}
|
|
}
|
|
|
|
self waittill_notify_or_timeout( "weapon_change", 3 );
|
|
|
|
self takeweapon( meat_name );
|
|
self.pre_meat_weapon = undefined;
|
|
|
|
if ( self.is_drinking )
|
|
self decrement_is_drinking();
|
|
|
|
self.dont_touch_the_meat = 0;
|
|
}
|
|
|
|
kick_meat_monitor()
|
|
{
|
|
// no kick
|
|
}
|
|
|
|
last_stand_meat_nudge()
|
|
{
|
|
// no kick
|
|
} |