mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-07 17:37:50 -05:00
reorganized files and added more scripts
This commit is contained in:
parent
1b9b26edb6
commit
12522c527c
847
patch_zm/maps/mp/zombies/MajorErrors/_zm_chugabud.gsc
Normal file
847
patch_zm/maps/mp/zombies/MajorErrors/_zm_chugabud.gsc
Normal file
@ -0,0 +1,847 @@
|
||||
#include maps/mp/_visionset_mgr;
|
||||
#include maps/mp/zombies/_zm;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
|
||||
#include maps/mp/zombies/_zm_weapons;
|
||||
#include maps/mp/zombies/_zm_clone;
|
||||
#include maps/mp/zombies/_zm_chugabud;
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/zombies/_zm_perks;
|
||||
|
||||
init()
|
||||
{
|
||||
level.chugabud_laststand_func = ::chugabud_laststand;
|
||||
level thread chugabud_hostmigration();
|
||||
level._effect[ "chugabud_revive_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" );
|
||||
level._effect[ "chugabud_bleedout_fx" ] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" );
|
||||
add_custom_limited_weapon_check( ::is_weapon_available_in_chugabud_corpse );
|
||||
}
|
||||
|
||||
chugabug_precache()
|
||||
{
|
||||
}
|
||||
|
||||
chugabud_player_init()
|
||||
{
|
||||
}
|
||||
|
||||
chugabud_laststand()
|
||||
{
|
||||
self endon( "player_suicide" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "chugabud_bleedout" );
|
||||
self maps/mp/zombies/_zm_laststand::increment_downed_stat();
|
||||
self.ignore_insta_kill = 1;
|
||||
self.health = self.maxhealth;
|
||||
self maps/mp/zombies/_zm_chugabud::chugabud_save_loadout();
|
||||
self maps/mp/zombies/_zm_chugabud::chugabud_fake_death();
|
||||
wait 3;
|
||||
if ( isDefined( self.insta_killed ) || self.insta_killed && isDefined( self.disable_chugabud_corpse ) )
|
||||
{
|
||||
create_corpse = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
create_corpse = 1;
|
||||
}
|
||||
if ( create_corpse == 1 )
|
||||
{
|
||||
if ( isDefined( level._chugabug_reject_corpse_override_func ) )
|
||||
{
|
||||
reject_corpse = self [[ level._chugabug_reject_corpse_override_func ]]( self.origin );
|
||||
if ( reject_corpse )
|
||||
{
|
||||
create_corpse = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( create_corpse == 1 )
|
||||
{
|
||||
self thread activate_chugabud_effects_and_audio();
|
||||
corpse = self chugabud_spawn_corpse();
|
||||
corpse thread chugabud_corpse_revive_icon( self );
|
||||
self.e_chugabud_corpse = corpse;
|
||||
corpse thread chugabud_corpse_cleanup_on_spectator( self );
|
||||
if ( isDefined( level.whos_who_client_setup ) )
|
||||
{
|
||||
corpse setclientfield( "clientfield_whos_who_clone_glow_shader", 1 );
|
||||
}
|
||||
}
|
||||
self chugabud_fake_revive();
|
||||
wait 0.1;
|
||||
self.ignore_insta_kill = undefined;
|
||||
self.disable_chugabud_corpse = undefined;
|
||||
if ( create_corpse == 0 )
|
||||
{
|
||||
self notify( "chugabud_effects_cleanup" );
|
||||
return;
|
||||
}
|
||||
bleedout_time = getDvarFloat( "player_lastStandBleedoutTime" );
|
||||
self thread chugabud_bleed_timeout( bleedout_time, corpse );
|
||||
self thread chugabud_handle_multiple_instances( corpse );
|
||||
corpse waittill( "player_revived", e_reviver );
|
||||
if ( isDefined( e_reviver ) && e_reviver == self )
|
||||
{
|
||||
self notify( "whos_who_self_revive" );
|
||||
}
|
||||
self perk_abort_drinking( 0.1 );
|
||||
self maps/mp/zombies/_zm_perks::perk_set_max_health_if_jugg( "health_reboot", 1, 0 );
|
||||
self setorigin( corpse.origin );
|
||||
self setplayerangles( corpse.angles );
|
||||
if ( self player_is_in_laststand() )
|
||||
{
|
||||
self thread chugabud_laststand_cleanup( corpse, "player_revived" );
|
||||
self enableweaponcycling();
|
||||
self enableoffhandweapons();
|
||||
self auto_revive( self, 1 );
|
||||
return;
|
||||
}
|
||||
self chugabud_laststand_cleanup( corpse, undefined );
|
||||
}
|
||||
|
||||
chugabud_laststand_cleanup( corpse, str_notify )
|
||||
{
|
||||
if ( isDefined( str_notify ) )
|
||||
{
|
||||
self waittill( str_notify );
|
||||
}
|
||||
self chugabud_give_loadout();
|
||||
self chugabud_corpse_cleanup( corpse, 1 );
|
||||
}
|
||||
|
||||
chugabud_bleed_timeout( delay, corpse )
|
||||
{
|
||||
self endon( "player_suicide" );
|
||||
self endon( "disconnect" );
|
||||
corpse endon( "death" );
|
||||
wait delay;
|
||||
while ( isDefined( corpse.revivetrigger ) )
|
||||
{
|
||||
while ( corpse.revivetrigger.beingrevived )
|
||||
{
|
||||
wait 0.01;
|
||||
}
|
||||
}
|
||||
while ( isDefined( self.loadout.perks ) && flag( "solo_game" ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < self.loadout.perks.size )
|
||||
{
|
||||
perk = self.loadout.perks[ i ];
|
||||
if ( perk == "specialty_quickrevive" )
|
||||
{
|
||||
arrayremovevalue( self.loadout.perks, self.loadout.perks[ i ] );
|
||||
corpse notify( "player_revived" );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
self chugabud_corpse_cleanup( corpse, 0 );
|
||||
}
|
||||
|
||||
chugabud_corpse_cleanup( corpse, was_revived )
|
||||
{
|
||||
self notify( "chugabud_effects_cleanup" );
|
||||
if ( was_revived )
|
||||
{
|
||||
playsoundatposition( "evt_ww_appear", corpse.origin );
|
||||
playfx( level._effect[ "chugabud_revive_fx" ], corpse.origin );
|
||||
}
|
||||
else
|
||||
{
|
||||
playsoundatposition( "evt_ww_disappear", corpse.origin );
|
||||
playfx( level._effect[ "chugabud_bleedout_fx" ], corpse.origin );
|
||||
self notify( "chugabud_bleedout" );
|
||||
}
|
||||
if ( isDefined( corpse.revivetrigger ) )
|
||||
{
|
||||
corpse notify( "stop_revive_trigger" );
|
||||
corpse.revivetrigger delete();
|
||||
corpse.revivetrigger = undefined;
|
||||
}
|
||||
if ( isDefined( corpse.revive_hud_elem ) )
|
||||
{
|
||||
corpse.revive_hud_elem destroy();
|
||||
corpse.revive_hud_elem = undefined;
|
||||
}
|
||||
self.loadout = undefined;
|
||||
wait 0.1;
|
||||
corpse delete();
|
||||
self.e_chugabud_corpse = undefined;
|
||||
}
|
||||
|
||||
chugabud_handle_multiple_instances( corpse )
|
||||
{
|
||||
corpse endon( "death" );
|
||||
self waittill( "perk_chugabud_activated" );
|
||||
self chugabud_corpse_cleanup( corpse, 0 );
|
||||
}
|
||||
|
||||
chugabud_spawn_corpse()
|
||||
{
|
||||
corpse = maps/mp/zombies/_zm_clone::spawn_player_clone( self, self.origin, undefined, self.whos_who_shader );
|
||||
corpse.angles = self.angles;
|
||||
corpse maps/mp/zombies/_zm_clone::clone_give_weapon( "m1911_zm" );
|
||||
corpse maps/mp/zombies/_zm_clone::clone_animate( "laststand" );
|
||||
corpse.revive_hud = self chugabud_revive_hud_create();
|
||||
corpse thread maps/mp/zombies/_zm_laststand::revive_trigger_spawn();
|
||||
return corpse;
|
||||
}
|
||||
|
||||
chugabud_revive_hud_create()
|
||||
{
|
||||
self.revive_hud = newclienthudelem( self );
|
||||
self.revive_hud.alignx = "center";
|
||||
self.revive_hud.aligny = "middle";
|
||||
self.revive_hud.horzalign = "center";
|
||||
self.revive_hud.vertalign = "bottom";
|
||||
self.revive_hud.y = -50;
|
||||
self.revive_hud.foreground = 1;
|
||||
self.revive_hud.font = "default";
|
||||
self.revive_hud.fontscale = 1.5;
|
||||
self.revive_hud.alpha = 0;
|
||||
self.revive_hud.color = ( 1, 1, 1 );
|
||||
self.revive_hud settext( "" );
|
||||
return self.revive_hud;
|
||||
}
|
||||
|
||||
chugabud_save_loadout()
|
||||
{
|
||||
primaries = self getweaponslistprimaries();
|
||||
currentweapon = self getcurrentweapon();
|
||||
self.loadout = spawnstruct();
|
||||
self.loadout.player = self;
|
||||
self.loadout.weapons = [];
|
||||
self.loadout.score = self.score;
|
||||
self.loadout.current_weapon = -1;
|
||||
_a376 = primaries;
|
||||
index = getFirstArrayKey( _a376 );
|
||||
while ( isDefined( index ) )
|
||||
{
|
||||
weapon = _a376[ index ];
|
||||
self.loadout.weapons[ index ] = maps/mp/zombies/_zm_weapons::get_player_weapondata( self, weapon );
|
||||
if ( weapon == currentweapon || self.loadout.weapons[ index ][ "alt_name" ] == currentweapon )
|
||||
{
|
||||
self.loadout.current_weapon = index;
|
||||
}
|
||||
index = getNextArrayKey( _a376, index );
|
||||
}
|
||||
self.loadout.equipment = self get_player_equipment();
|
||||
if ( isDefined( self.loadout.equipment ) )
|
||||
{
|
||||
self equipment_take( self.loadout.equipment );
|
||||
}
|
||||
self.loadout save_weapons_for_chugabud( self );
|
||||
if ( self hasweapon( "claymore_zm" ) )
|
||||
{
|
||||
self.loadout.hasclaymore = 1;
|
||||
self.loadout.claymoreclip = self getweaponammoclip( "claymore_zm" );
|
||||
}
|
||||
self.loadout.perks = chugabud_save_perks( self );
|
||||
self chugabud_save_grenades();
|
||||
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
||||
{
|
||||
self.loadout.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" );
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_save_grenades()
|
||||
{
|
||||
if ( self hasweapon( "emp_grenade_zm" ) )
|
||||
{
|
||||
self.loadout.hasemp = 1;
|
||||
self.loadout.empclip = self getweaponammoclip( "emp_grenade_zm" );
|
||||
}
|
||||
lethal_grenade = self get_player_lethal_grenade();
|
||||
if ( self hasweapon( lethal_grenade ) )
|
||||
{
|
||||
self.loadout.lethal_grenade = lethal_grenade;
|
||||
self.loadout.lethal_grenade_count = self getweaponammoclip( lethal_grenade );
|
||||
}
|
||||
else
|
||||
{
|
||||
self.loadout.lethal_grenade = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_give_loadout()
|
||||
{
|
||||
self takeallweapons();
|
||||
loadout = self.loadout;
|
||||
primaries = self getweaponslistprimaries();
|
||||
while ( loadout.weapons.size > 1 || primaries.size > 1 )
|
||||
{
|
||||
_a458 = primaries;
|
||||
_k458 = getFirstArrayKey( _a458 );
|
||||
while ( isDefined( _k458 ) )
|
||||
{
|
||||
weapon = _a458[ _k458 ];
|
||||
self takeweapon( weapon );
|
||||
_k458 = getNextArrayKey( _a458, _k458 );
|
||||
}
|
||||
}
|
||||
i = 0;
|
||||
while ( i < loadout.weapons.size )
|
||||
{
|
||||
if ( !isDefined( loadout.weapons[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( loadout.weapons[ i ][ "name" ] == "none" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
self maps/mp/zombies/_zm_weapons::weapondata_give( loadout.weapons[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if ( loadout.current_weapon >= 0 && isDefined( loadout.weapons[ loadout.current_weapon ][ "name" ] ) )
|
||||
{
|
||||
self switchtoweapon( loadout.weapons[ loadout.current_weapon ][ "name" ] );
|
||||
}
|
||||
self giveweapon( "knife_zm" );
|
||||
self maps/mp/zombies/_zm_equipment::equipment_give( self.loadout.equipment );
|
||||
loadout restore_weapons_for_chugabud( self );
|
||||
self chugabud_restore_claymore();
|
||||
self.score = loadout.score;
|
||||
self.pers[ "score" ] = loadout.score;
|
||||
perk_array = maps/mp/zombies/_zm_perks::get_perk_array( 1 );
|
||||
i = 0;
|
||||
while ( i < perk_array.size )
|
||||
{
|
||||
perk = perk_array[ i ];
|
||||
self unsetperk( perk );
|
||||
self.num_perks--;
|
||||
|
||||
self set_perk_clientfield( perk, 0 );
|
||||
i++;
|
||||
}
|
||||
while ( isDefined( loadout.perks ) && loadout.perks.size > 0 )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < loadout.perks.size )
|
||||
{
|
||||
if ( self hasperk( loadout.perks[ i ] ) )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( loadout.perks[ i ] == "specialty_quickrevive" && flag( "solo_game" ) )
|
||||
{
|
||||
level.solo_game_free_player_quickrevive = 1;
|
||||
}
|
||||
if ( loadout.perks[ i ] == "specialty_finalstand" )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
maps/mp/zombies/_zm_perks::give_perk( loadout.perks[ i ] );
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
self chugabud_restore_grenades();
|
||||
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
|
||||
{
|
||||
if ( loadout.zombie_cymbal_monkey_count )
|
||||
{
|
||||
self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey();
|
||||
self setweaponammoclip( "cymbal_monkey_zm", loadout.zombie_cymbal_monkey_count );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_restore_grenades()
|
||||
{
|
||||
if ( isDefined( self.loadout.hasemp ) && self.loadout.hasemp )
|
||||
{
|
||||
self giveweapon( "emp_grenade_zm" );
|
||||
self setweaponammoclip( "emp_grenade_zm", self.loadout.empclip );
|
||||
}
|
||||
if ( isDefined( self.loadout.lethal_grenade ) )
|
||||
{
|
||||
self giveweapon( self.loadout.lethal_grenade );
|
||||
self setweaponammoclip( self.loadout.lethal_grenade, self.loadout.lethal_grenade_count );
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_restore_claymore()
|
||||
{
|
||||
if ( isDefined( self.loadout.hasclaymore ) && self.loadout.hasclaymore && !self hasweapon( "claymore_zm" ) )
|
||||
{
|
||||
self giveweapon( "claymore_zm" );
|
||||
self set_player_placeable_mine( "claymore_zm" );
|
||||
self setactionslot( 4, "weapon", "claymore_zm" );
|
||||
self setweaponammoclip( "claymore_zm", self.loadout.claymoreclip );
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_fake_death()
|
||||
{
|
||||
level notify( "fake_death" );
|
||||
self notify( "fake_death" );
|
||||
self takeallweapons();
|
||||
self allowstand( 0 );
|
||||
self allowcrouch( 0 );
|
||||
self allowprone( 1 );
|
||||
self.ignoreme = 1;
|
||||
self enableinvulnerability();
|
||||
wait 0.1;
|
||||
self freezecontrols( 1 );
|
||||
wait 0.9;
|
||||
}
|
||||
|
||||
chugabud_fake_revive()
|
||||
{
|
||||
level notify( "fake_revive" );
|
||||
self notify( "fake_revive" );
|
||||
playsoundatposition( "evt_ww_disappear", self.origin );
|
||||
playfx( level._effect[ "chugabud_revive_fx" ], self.origin );
|
||||
spawnpoint = chugabud_get_spawnpoint();
|
||||
if ( isDefined( level._chugabud_post_respawn_override_func ) )
|
||||
{
|
||||
self [[ level._chugabud_post_respawn_override_func ]]( spawnpoint.origin );
|
||||
}
|
||||
if ( isDefined( level.chugabud_force_corpse_position ) )
|
||||
{
|
||||
if ( isDefined( self.e_chugabud_corpse ) )
|
||||
{
|
||||
self.e_chugabud_corpse forceteleport( level.chugabud_force_corpse_position );
|
||||
}
|
||||
level.chugabud_force_corpse_position = undefined;
|
||||
}
|
||||
if ( isDefined( level.chugabud_force_player_position ) )
|
||||
{
|
||||
spawnpoint.origin = level.chugabud_force_player_position;
|
||||
level.chugabud_force_player_position = undefined;
|
||||
}
|
||||
self setorigin( spawnpoint.origin );
|
||||
self setplayerangles( spawnpoint.angles );
|
||||
playsoundatposition( "evt_ww_appear", spawnpoint.origin );
|
||||
playfx( level._effect[ "chugabud_revive_fx" ], spawnpoint.origin );
|
||||
self allowstand( 1 );
|
||||
self allowcrouch( 1 );
|
||||
self allowprone( 1 );
|
||||
self.ignoreme = 0;
|
||||
self setstance( "stand" );
|
||||
self freezecontrols( 0 );
|
||||
self giveweapon( "knife_zm" );
|
||||
self give_start_weapon( 1 );
|
||||
self.score = self.loadout.score;
|
||||
self.pers[ "score" ] = self.loadout.score;
|
||||
self giveweapon( "frag_grenade_zm" );
|
||||
self setweaponammoclip( "frag_grenade_zm", 2 );
|
||||
self chugabud_restore_claymore();
|
||||
wait 1;
|
||||
self disableinvulnerability();
|
||||
}
|
||||
|
||||
chugabud_get_spawnpoint()
|
||||
{
|
||||
spawnpoint = undefined;
|
||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 500, 700, 64, 1 ) )
|
||||
{
|
||||
spawnpoint = level.chugabud_spawn_struct;
|
||||
}
|
||||
if ( !isDefined( spawnpoint ) )
|
||||
{
|
||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 100, 400, 64, 1 ) )
|
||||
{
|
||||
spawnpoint = level.chugabud_spawn_struct;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( spawnpoint ) )
|
||||
{
|
||||
if ( get_chugabug_spawn_point_from_nodes( self.origin, 50, 400, 256, 0 ) )
|
||||
{
|
||||
spawnpoint = level.chugabud_spawn_struct;
|
||||
}
|
||||
}
|
||||
if ( !isDefined( spawnpoint ) )
|
||||
{
|
||||
spawnpoint = maps/mp/zombies/_zm::check_for_valid_spawn_near_team( self, 1 );
|
||||
}
|
||||
if ( !isDefined( spawnpoint ) )
|
||||
{
|
||||
match_string = "";
|
||||
location = level.scr_zm_map_start_location;
|
||||
if ( location != "default" && location == "" && isDefined( level.default_start_location ) )
|
||||
{
|
||||
location = level.default_start_location;
|
||||
}
|
||||
match_string = ( level.scr_zm_ui_gametype + "_" ) + location;
|
||||
spawnpoints = [];
|
||||
structs = getstructarray( "initial_spawn", "script_noteworthy" );
|
||||
while ( isDefined( structs ) )
|
||||
{
|
||||
_a744 = structs;
|
||||
_k744 = getFirstArrayKey( _a744 );
|
||||
while ( isDefined( _k744 ) )
|
||||
{
|
||||
struct = _a744[ _k744 ];
|
||||
while ( isDefined( struct.script_string ) )
|
||||
{
|
||||
tokens = strtok( struct.script_string, " " );
|
||||
_a750 = tokens;
|
||||
_k750 = getFirstArrayKey( _a750 );
|
||||
while ( isDefined( _k750 ) )
|
||||
{
|
||||
token = _a750[ _k750 ];
|
||||
if ( token == match_string )
|
||||
{
|
||||
spawnpoints[ spawnpoints.size ] = struct;
|
||||
}
|
||||
_k750 = getNextArrayKey( _a750, _k750 );
|
||||
}
|
||||
}
|
||||
_k744 = getNextArrayKey( _a744, _k744 );
|
||||
}
|
||||
}
|
||||
if ( !isDefined( spawnpoints ) || spawnpoints.size == 0 )
|
||||
{
|
||||
spawnpoints = getstructarray( "initial_spawn_points", "targetname" );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( spawnpoints ), "Could not find initial spawn points!" );
|
||||
#/
|
||||
*/
|
||||
spawnpoint = maps/mp/zombies/_zm::getfreespawnpoint( spawnpoints, self );
|
||||
}
|
||||
return spawnpoint;
|
||||
}
|
||||
|
||||
get_chugabug_spawn_point_from_nodes( v_origin, min_radius, max_radius, max_height, ignore_targetted_nodes )
|
||||
{
|
||||
if ( !isDefined( level.chugabud_spawn_struct ) )
|
||||
{
|
||||
level.chugabud_spawn_struct = spawnstruct();
|
||||
}
|
||||
found_node = undefined;
|
||||
a_nodes = getnodesinradiussorted( v_origin, max_radius, min_radius, max_height, "pathnodes" );
|
||||
while ( isDefined( a_nodes ) && a_nodes.size > 0 )
|
||||
{
|
||||
a_player_volumes = getentarray( "player_volume", "script_noteworthy" );
|
||||
index = a_nodes.size - 1;
|
||||
i = index;
|
||||
while ( i >= 0 )
|
||||
{
|
||||
n_node = a_nodes[ i ];
|
||||
if ( ignore_targetted_nodes == 1 )
|
||||
{
|
||||
if ( isDefined( n_node.target ) )
|
||||
{
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if ( !positionwouldtelefrag( n_node.origin ) )
|
||||
{
|
||||
if ( maps/mp/zombies/_zm_utility::check_point_in_enabled_zone( n_node.origin, 1, a_player_volumes ) )
|
||||
{
|
||||
v_start = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] + 30 );
|
||||
v_end = ( n_node.origin[ 0 ], n_node.origin[ 1 ], n_node.origin[ 2 ] - 30 );
|
||||
trace = bullettrace( v_start, v_end, 0, undefined );
|
||||
if ( trace[ "fraction" ] < 1 )
|
||||
{
|
||||
override_abort = 0;
|
||||
if ( isDefined( level._chugabud_reject_node_override_func ) )
|
||||
{
|
||||
override_abort = [[ level._chugabud_reject_node_override_func ]]( v_origin, n_node );
|
||||
}
|
||||
if ( !override_abort )
|
||||
{
|
||||
found_node = n_node;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
i--;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( found_node ) )
|
||||
{
|
||||
level.chugabud_spawn_struct.origin = found_node.origin;
|
||||
v_dir = vectornormalize( v_origin - level.chugabud_spawn_struct.origin );
|
||||
level.chugabud_spawn_struct.angles = vectorToAngles( v_dir );
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
force_corpse_respawn_position( forced_corpse_position )
|
||||
{
|
||||
level.chugabud_force_corpse_position = forced_corpse_position;
|
||||
}
|
||||
|
||||
force_player_respawn_position( forced_player_position )
|
||||
{
|
||||
level.chugabud_force_player_position = forced_player_position;
|
||||
}
|
||||
|
||||
save_weapons_for_chugabud( player )
|
||||
{
|
||||
self.chugabud_melee_weapons = [];
|
||||
i = 0;
|
||||
while ( i < level._melee_weapons.size )
|
||||
{
|
||||
self save_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
save_weapon_for_chugabud( player, weapon_name )
|
||||
{
|
||||
if ( player hasweapon( weapon_name ) )
|
||||
{
|
||||
self.chugabud_melee_weapons[ weapon_name ] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
restore_weapons_for_chugabud( player )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < level._melee_weapons.size )
|
||||
{
|
||||
self restore_weapon_for_chugabud( player, level._melee_weapons[ i ].weapon_name );
|
||||
i++;
|
||||
}
|
||||
self.chugabud_melee_weapons = undefined;
|
||||
}
|
||||
|
||||
restore_weapon_for_chugabud( player, weapon_name )
|
||||
{
|
||||
if ( isDefined( weapon_name ) || !isDefined( self.chugabud_melee_weapons ) && !isDefined( self.chugabud_melee_weapons[ weapon_name ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.chugabud_melee_weapons[ weapon_name ] ) && self.chugabud_melee_weapons[ weapon_name ] )
|
||||
{
|
||||
player giveweapon( weapon_name );
|
||||
player set_player_melee_weapon( weapon_name );
|
||||
self.chugabud_melee_weapons[ weapon_name ] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
chugabud_save_perks( ent )
|
||||
{
|
||||
perk_array = ent get_perk_array( 1 );
|
||||
_a941 = perk_array;
|
||||
_k941 = getFirstArrayKey( _a941 );
|
||||
while ( isDefined( _k941 ) )
|
||||
{
|
||||
perk = _a941[ _k941 ];
|
||||
ent unsetperk( perk );
|
||||
_k941 = getNextArrayKey( _a941, _k941 );
|
||||
}
|
||||
return perk_array;
|
||||
}
|
||||
|
||||
playchugabudtimeraudio()
|
||||
{
|
||||
self endon( "chugabud_grabbed" );
|
||||
self endon( "chugabud_timedout" );
|
||||
player = self.player;
|
||||
self thread playchugabudtimerout( player );
|
||||
while ( 1 )
|
||||
{
|
||||
player playsoundtoplayer( "zmb_chugabud_timer_count", player );
|
||||
wait 1;
|
||||
}
|
||||
}
|
||||
|
||||
playchugabudtimerout( player )
|
||||
{
|
||||
self endon( "chugabud_grabbed" );
|
||||
self waittill( "chugabud_timedout" );
|
||||
player playsoundtoplayer( "zmb_chugabud_timer_out", player );
|
||||
}
|
||||
|
||||
chugabud_hostmigration()
|
||||
{
|
||||
level endon( "end_game" );
|
||||
level notify( "chugabud_hostmigration" );
|
||||
level endon( "chugabud_hostmigration" );
|
||||
while ( 1 )
|
||||
{
|
||||
level waittill( "host_migration_end" );
|
||||
chugabuds = getentarray( "player_chugabud_model", "script_noteworthy" );
|
||||
_a1000 = chugabuds;
|
||||
_k1000 = getFirstArrayKey( _a1000 );
|
||||
while ( isDefined( _k1000 ) )
|
||||
{
|
||||
model = _a1000[ _k1000 ];
|
||||
playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" );
|
||||
_k1000 = getNextArrayKey( _a1000, _k1000 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
player_revived_cleanup_chugabud_corpse()
|
||||
{
|
||||
}
|
||||
|
||||
player_has_chugabud_corpse()
|
||||
{
|
||||
if ( isDefined( self.e_chugabud_corpse ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
is_weapon_available_in_chugabud_corpse( weapon, player_to_check )
|
||||
{
|
||||
count = 0;
|
||||
upgradedweapon = weapon;
|
||||
if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) )
|
||||
{
|
||||
upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name;
|
||||
}
|
||||
players = getplayers();
|
||||
while ( isDefined( players ) )
|
||||
{
|
||||
player_index = 0;
|
||||
while ( player_index < players.size )
|
||||
{
|
||||
player = players[ player_index ];
|
||||
if ( isDefined( player_to_check ) && player != player_to_check )
|
||||
{
|
||||
player_index++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( player player_has_chugabud_corpse() )
|
||||
{
|
||||
while ( isDefined( player.loadout ) && isDefined( player.loadout.weapons ) )
|
||||
{
|
||||
i = 0;
|
||||
while ( i < player.loadout.weapons.size )
|
||||
{
|
||||
chugabud_weapon = player.loadout.weapons[ i ];
|
||||
if ( isDefined( chugabud_weapon ) || chugabud_weapon[ "name" ] == weapon && chugabud_weapon[ "name" ] == upgradedweapon )
|
||||
{
|
||||
count++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
player_index++;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
chugabud_corpse_cleanup_on_spectator( player )
|
||||
{
|
||||
self endon( "death" );
|
||||
player endon( "disconnect" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( player.sessionstate == "spectator" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0.01;
|
||||
}
|
||||
}
|
||||
player chugabud_corpse_cleanup( self, 0 );
|
||||
}
|
||||
|
||||
chugabud_corpse_revive_icon( player )
|
||||
{
|
||||
self endon( "death" );
|
||||
height_offset = 30;
|
||||
index = player.clientid;
|
||||
hud_elem = newhudelem();
|
||||
self.revive_hud_elem = hud_elem;
|
||||
hud_elem.x = self.origin[ 0 ];
|
||||
hud_elem.y = self.origin[ 1 ];
|
||||
hud_elem.z = self.origin[ 2 ] + height_offset;
|
||||
hud_elem.alpha = 1;
|
||||
hud_elem.archived = 1;
|
||||
hud_elem setshader( "waypoint_revive", 5, 5 );
|
||||
hud_elem setwaypoint( 1 );
|
||||
hud_elem.hidewheninmenu = 1;
|
||||
hud_elem.immunetodemogamehudsettings = 1;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( !isDefined( self.revive_hud_elem ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
hud_elem.x = self.origin[ 0 ];
|
||||
hud_elem.y = self.origin[ 1 ];
|
||||
hud_elem.z = self.origin[ 2 ] + height_offset;
|
||||
wait 0.01;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
activate_chugabud_effects_and_audio()
|
||||
{
|
||||
if ( isDefined( level.whos_who_client_setup ) )
|
||||
{
|
||||
if ( !isDefined( self.whos_who_effects_active ) )
|
||||
{
|
||||
if ( isDefined( level.chugabud_shellshock ) )
|
||||
{
|
||||
self shellshock( "whoswho", 60 );
|
||||
}
|
||||
if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) )
|
||||
{
|
||||
maps/mp/_visionset_mgr::vsmgr_activate( "visionset", "zm_whos_who", self );
|
||||
}
|
||||
self setclientfieldtoplayer( "clientfield_whos_who_audio", 1 );
|
||||
self setclientfieldtoplayer( "clientfield_whos_who_filter", 1 );
|
||||
self.whos_who_effects_active = 1;
|
||||
self thread deactivate_chugabud_effects_and_audio();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
deactivate_chugabud_effects_and_audio()
|
||||
{
|
||||
self waittill_any( "death", "chugabud_effects_cleanup" );
|
||||
if ( isDefined( level.whos_who_client_setup ) )
|
||||
{
|
||||
if ( isDefined( self.whos_who_effects_active ) && self.whos_who_effects_active == 1 )
|
||||
{
|
||||
if ( isDefined( level.chugabud_shellshock ) )
|
||||
{
|
||||
self stopshellshock();
|
||||
}
|
||||
if ( isDefined( level.vsmgr_prio_visionset_zm_whos_who ) )
|
||||
{
|
||||
maps/mp/_visionset_mgr::vsmgr_deactivate( "visionset", "zm_whos_who", self );
|
||||
}
|
||||
self setclientfieldtoplayer( "clientfield_whos_who_audio", 0 );
|
||||
self setclientfieldtoplayer( "clientfield_whos_who_filter", 0 );
|
||||
}
|
||||
self.whos_who_effects_active = undefined;
|
||||
}
|
||||
}
|
||||
|
||||
|
143
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_clone.gsc
Normal file
143
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_clone.gsc
Normal file
@ -0,0 +1,143 @@
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
//#using_animtree( "zm_ally" );
|
||||
|
||||
init()
|
||||
{
|
||||
init_mover_tree();
|
||||
}
|
||||
|
||||
spawn_player_clone( player, origin, forceweapon, forcemodel )
|
||||
{
|
||||
if ( !isDefined( origin ) )
|
||||
{
|
||||
origin = player.origin;
|
||||
}
|
||||
primaryweapons = player getweaponslistprimaries();
|
||||
if ( isDefined( forceweapon ) )
|
||||
{
|
||||
weapon = forceweapon;
|
||||
}
|
||||
else if ( primaryweapons.size )
|
||||
{
|
||||
weapon = primaryweapons[ 0 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
weapon = player getcurrentweapon();
|
||||
}
|
||||
weaponmodel = getweaponmodel( weapon );
|
||||
spawner = getent( "fake_player_spawner", "targetname" );
|
||||
if ( isDefined( spawner ) )
|
||||
{
|
||||
clone = spawner spawnactor();
|
||||
clone.origin = origin;
|
||||
clone.isactor = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
clone = spawn( "script_model", origin );
|
||||
clone.isactor = 0;
|
||||
}
|
||||
if ( isDefined( forcemodel ) )
|
||||
{
|
||||
clone setmodel( forcemodel );
|
||||
}
|
||||
else
|
||||
{
|
||||
clone setmodel( self.model );
|
||||
if ( isDefined( player.headmodel ) )
|
||||
{
|
||||
clone.headmodel = player.headmodel;
|
||||
clone attach( clone.headmodel, "", 1 );
|
||||
}
|
||||
}
|
||||
if ( weaponmodel != "" && weaponmodel != "none" )
|
||||
{
|
||||
clone attach( weaponmodel, "tag_weapon_right" );
|
||||
}
|
||||
clone.team = player.team;
|
||||
clone.is_inert = 1;
|
||||
clone.zombie_move_speed = "walk";
|
||||
clone.script_noteworthy = "corpse_clone";
|
||||
clone.actor_damage_func = ::clone_damage_func;
|
||||
return clone;
|
||||
}
|
||||
|
||||
clone_damage_func( einflictor, eattacker, idamage, idflags, smeansofdeath, sweapon, vpoint, vdir, shitloc, psoffsettime, boneindex )
|
||||
{
|
||||
idamage = 0;
|
||||
if ( sweapon != "knife_ballistic_upgraded_zm" && sweapon != "knife_ballistic_bowie_upgraded_zm" || sweapon == "knife_ballistic_no_melee_upgraded_zm" && sweapon == "knife_ballistic_sickle_upgraded_zm" )
|
||||
{
|
||||
self notify( "player_revived" );
|
||||
}
|
||||
return idamage;
|
||||
}
|
||||
|
||||
clone_give_weapon( weapon )
|
||||
{
|
||||
weaponmodel = getweaponmodel( weapon );
|
||||
if ( weaponmodel != "" && weaponmodel != "none" )
|
||||
{
|
||||
self attach( weaponmodel, "tag_weapon_right" );
|
||||
}
|
||||
}
|
||||
|
||||
clone_animate( animtype )
|
||||
{
|
||||
if ( self.isactor )
|
||||
{
|
||||
self thread clone_actor_animate( animtype );
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread clone_mover_animate( animtype );
|
||||
}
|
||||
}
|
||||
|
||||
clone_actor_animate( animtype )
|
||||
{
|
||||
wait 0.1;
|
||||
switch( animtype )
|
||||
{
|
||||
case "laststand":
|
||||
self setanimstatefromasd( "laststand" );
|
||||
break;
|
||||
case "idle":
|
||||
default:
|
||||
self setanimstatefromasd( "idle" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
init_mover_tree()
|
||||
{
|
||||
scriptmodelsuseanimtree( -1 );
|
||||
}
|
||||
|
||||
clone_mover_animate( animtype )
|
||||
{
|
||||
self useanimtree( -1 );
|
||||
switch( animtype )
|
||||
{
|
||||
case "laststand":
|
||||
self setanim( %pb_laststand_idle );
|
||||
break;
|
||||
case "afterlife":
|
||||
self setanim( %pb_afterlife_laststand_idle );
|
||||
break;
|
||||
case "chair":
|
||||
self setanim( %ai_actor_elec_chair_idle );
|
||||
break;
|
||||
case "falling":
|
||||
self setanim( %pb_falling_loop );
|
||||
break;
|
||||
case "idle":
|
||||
default:
|
||||
self setanim( %pb_stand_alert );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
201
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_equip_gasmask.gsc
Normal file
201
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_equip_gasmask.gsc
Normal file
@ -0,0 +1,201 @@
|
||||
#include maps/mp/zombies/_zm_laststand;
|
||||
#include maps/mp/zombies/_zm_equipment;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
init()
|
||||
{
|
||||
if ( !maps/mp/zombies/_zm_equipment::is_equipment_included( "equip_gasmask_zm" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
registerclientfield( "toplayer", "gasmaskoverlay", 16000, 1, "int" );
|
||||
maps/mp/zombies/_zm_equipment::register_equipment( "equip_gasmask_zm", &"ZOMBIE_EQUIP_GASMASK_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_GASMASK_HOWTO", undefined, "gasmask", ::gasmask_activation_watcher_thread );
|
||||
level.deathcard_spawn_func = ::remove_gasmask_on_player_bleedout;
|
||||
precacheitem( "lower_equip_gasmask_zm" );
|
||||
onplayerconnect_callback( ::gasmask_on_player_connect );
|
||||
}
|
||||
|
||||
gasmask_on_player_connect()
|
||||
{
|
||||
}
|
||||
|
||||
gasmask_removed_watcher_thread()
|
||||
{
|
||||
self notify( "only_one_gasmask_removed_thread" );
|
||||
self endon( "only_one_gasmask_removed_thread" );
|
||||
self endon( "disconnect" );
|
||||
self waittill( "equip_gasmask_zm_taken" );
|
||||
if ( isDefined( level.zombiemode_gasmask_reset_player_model ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_reset_player_model ]]( ent_num );
|
||||
}
|
||||
if ( isDefined( level.zombiemode_gasmask_reset_player_viewmodel ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_reset_player_viewmodel ]]( ent_num );
|
||||
}
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 0 );
|
||||
}
|
||||
|
||||
gasmask_activation_watcher_thread()
|
||||
{
|
||||
self endon( "zombified" );
|
||||
self endon( "disconnect" );
|
||||
self endon( "equip_gasmask_zm_taken" );
|
||||
self thread gasmask_removed_watcher_thread();
|
||||
self thread remove_gasmask_on_game_over();
|
||||
if ( isDefined( level.zombiemode_gasmask_set_player_model ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_set_player_model ]]( ent_num );
|
||||
}
|
||||
if ( isDefined( level.zombiemode_gasmask_set_player_viewmodel ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_set_player_viewmodel ]]( ent_num );
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill_either( "equip_gasmask_zm_activate", "equip_gasmask_zm_deactivate" );
|
||||
if ( self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_gasmask_zm" ) )
|
||||
{
|
||||
self increment_is_drinking();
|
||||
self setactionslot( 1, "" );
|
||||
if ( isDefined( level.zombiemode_gasmask_set_player_model ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 1 );
|
||||
}
|
||||
clientnotify( "gmsk2" );
|
||||
self waittill( "weapon_change_complete" );
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self increment_is_drinking();
|
||||
self setactionslot( 1, "" );
|
||||
if ( isDefined( level.zombiemode_gasmask_set_player_model ) )
|
||||
{
|
||||
ent_num = self.characterindex;
|
||||
if ( isDefined( self.zm_random_char ) )
|
||||
{
|
||||
ent_num = self.zm_random_char;
|
||||
}
|
||||
self [[ level.zombiemode_gasmask_change_player_headmodel ]]( ent_num, 0 );
|
||||
}
|
||||
self takeweapon( "equip_gasmask_zm" );
|
||||
self giveweapon( "lower_equip_gasmask_zm" );
|
||||
self switchtoweapon( "lower_equip_gasmask_zm" );
|
||||
wait 0.05;
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 0 );
|
||||
self waittill( "weapon_change_complete" );
|
||||
self takeweapon( "lower_equip_gasmask_zm" );
|
||||
self giveweapon( "equip_gasmask_zm" );
|
||||
}
|
||||
if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() )
|
||||
{
|
||||
if ( self is_multiple_drinking() )
|
||||
{
|
||||
self decrement_is_drinking();
|
||||
self setactionslot( 1, "weapon", "equip_gasmask_zm" );
|
||||
self notify( "equipment_select_response_done" );
|
||||
}
|
||||
}
|
||||
else if ( isDefined( self.prev_weapon_before_equipment_change ) && self hasweapon( self.prev_weapon_before_equipment_change ) )
|
||||
{
|
||||
if ( self.prev_weapon_before_equipment_change != self getcurrentweapon() )
|
||||
{
|
||||
self switchtoweapon( self.prev_weapon_before_equipment_change );
|
||||
self waittill( "weapon_change_complete" );
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
primaryweapons = self getweaponslistprimaries();
|
||||
if ( isDefined( primaryweapons ) && primaryweapons.size > 0 )
|
||||
{
|
||||
if ( primaryweapons[ 0 ] != self getcurrentweapon() )
|
||||
{
|
||||
self switchtoweapon( primaryweapons[ 0 ] );
|
||||
self waittill( "weapon_change_complete" );
|
||||
}
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self switchtoweapon( get_player_melee_weapon() );
|
||||
}
|
||||
}
|
||||
}
|
||||
self setactionslot( 1, "weapon", "equip_gasmask_zm" );
|
||||
if ( !self maps/mp/zombies/_zm_laststand::player_is_in_laststand() && isDefined( self.intermission ) && !self.intermission )
|
||||
{
|
||||
self decrement_is_drinking();
|
||||
}
|
||||
self notify( "equipment_select_response_done" );
|
||||
}
|
||||
}
|
||||
|
||||
remove_gasmask_on_player_bleedout()
|
||||
{
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 0 );
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 1 );
|
||||
}
|
||||
|
||||
remove_gasmask_on_game_over()
|
||||
{
|
||||
self endon( "equip_gasmask_zm_taken" );
|
||||
level waittill( "pre_end_game" );
|
||||
self setclientfieldtoplayer( "gasmaskoverlay", 0 );
|
||||
}
|
||||
|
||||
gasmask_active()
|
||||
{
|
||||
return self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_gasmask_zm" );
|
||||
}
|
||||
|
||||
gasmask_debug_print( msg, color )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
if ( !getDvarInt( #"4D1BCA99" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( !isDefined( color ) )
|
||||
{
|
||||
color = ( 0, 0, 1 );
|
||||
}
|
||||
print3d( self.origin + vectorScale( ( 0, 0, 1 ), 60 ), msg, color, 1, 1, 40 );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
238
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ffotd.gsc
Normal file
238
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ffotd.gsc
Normal file
@ -0,0 +1,238 @@
|
||||
#include maps/mp/zombies/_zm_stats;
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main_start()
|
||||
{
|
||||
mapname = tolower( getDvar( "mapname" ) );
|
||||
gametype = getDvar( "ui_gametype" );
|
||||
if ( tolower( getDvar( "mapname" ) ) == "zm_transit" && getDvar( "ui_gametype" ) == "zclassic" )
|
||||
{
|
||||
level thread transit_navcomputer_remove_card_on_success();
|
||||
}
|
||||
if ( tolower( getDvar( "mapname" ) ) == "zm_prison" && getDvar( "ui_gametype" ) == "zgrief" )
|
||||
{
|
||||
level.zbarrier_script_string_sets_collision = 1;
|
||||
}
|
||||
if ( mapname != "zm_transit" && mapname == "zm_highrise" && gametype == "zclassic" )
|
||||
{
|
||||
level.pers_upgrade_sniper = 1;
|
||||
level.pers_upgrade_pistol_points = 1;
|
||||
level.pers_upgrade_perk_lose = 1;
|
||||
level.pers_upgrade_double_points = 1;
|
||||
level.pers_upgrade_nube = 1;
|
||||
}
|
||||
}
|
||||
|
||||
main_end()
|
||||
{
|
||||
onfinalizeinitialization_callback( ::force_navcomputer_trigger_think );
|
||||
level.original_melee_miss_func = level.melee_miss_func;
|
||||
level.melee_miss_func = ::ffotd_melee_miss_func;
|
||||
}
|
||||
|
||||
force_navcomputer_trigger_think()
|
||||
{
|
||||
if ( !isDefined( level.zombie_include_buildables ) || !level.zombie_include_buildables.size )
|
||||
{
|
||||
return;
|
||||
}
|
||||
_a52 = level.zombie_include_buildables;
|
||||
_k52 = getFirstArrayKey( _a52 );
|
||||
while ( isDefined( _k52 ) )
|
||||
{
|
||||
buildable = _a52[ _k52 ];
|
||||
if ( buildable.name == "sq_common" )
|
||||
{
|
||||
if ( isDefined( buildable.triggerthink ) )
|
||||
{
|
||||
level [[ buildable.triggerthink ]]();
|
||||
trigger_think_func = buildable.triggerthink;
|
||||
buildable.triggerthink = undefined;
|
||||
level waittill( "buildables_setup" );
|
||||
buildable.triggerthink = trigger_think_func;
|
||||
return;
|
||||
}
|
||||
}
|
||||
_k52 = getNextArrayKey( _a52, _k52 );
|
||||
}
|
||||
}
|
||||
|
||||
transit_navcomputer_remove_card_on_success()
|
||||
{
|
||||
wait_for_buildable( "sq_common" );
|
||||
wait_network_frame();
|
||||
trig_pos = getstruct( "sq_common_key", "targetname" );
|
||||
trigs = getentarray( "trigger_radius_use", "classname" );
|
||||
nav_trig = undefined;
|
||||
_a81 = trigs;
|
||||
_k81 = getFirstArrayKey( _a81 );
|
||||
while ( isDefined( _k81 ) )
|
||||
{
|
||||
trig = _a81[ _k81 ];
|
||||
if ( trig.origin == trig_pos.origin )
|
||||
{
|
||||
nav_trig = trig;
|
||||
}
|
||||
_k81 = getNextArrayKey( _a81, _k81 );
|
||||
}
|
||||
if ( isDefined( nav_trig ) )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
nav_trig waittill( "trigger", who );
|
||||
if ( isplayer( who ) && is_player_valid( who ) && does_player_have_correct_navcard( who ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
players = get_players();
|
||||
_a101 = players;
|
||||
_k101 = getFirstArrayKey( _a101 );
|
||||
while ( isDefined( _k101 ) )
|
||||
{
|
||||
player = _a101[ _k101 ];
|
||||
player maps/mp/zombies/_zm_stats::set_global_stat( level.navcard_needed, 0 );
|
||||
_k101 = getNextArrayKey( _a101, _k101 );
|
||||
}
|
||||
level thread sq_refresh_player_navcard_hud();
|
||||
}
|
||||
}
|
||||
|
||||
sq_refresh_player_navcard_hud()
|
||||
{
|
||||
if ( !isDefined( level.navcards ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
players = get_players();
|
||||
_a116 = players;
|
||||
_k116 = getFirstArrayKey( _a116 );
|
||||
while ( isDefined( _k116 ) )
|
||||
{
|
||||
player = _a116[ _k116 ];
|
||||
navcard_bits = 0;
|
||||
i = 0;
|
||||
while ( i < level.navcards.size )
|
||||
{
|
||||
hasit = player maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] );
|
||||
if ( isDefined( player.navcard_grabbed ) && player.navcard_grabbed == level.navcards[ i ] )
|
||||
{
|
||||
hasit = 1;
|
||||
}
|
||||
if ( hasit )
|
||||
{
|
||||
navcard_bits = navcard_bits + 1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
wait_network_frame();
|
||||
player setclientfield( "navcard_held", 0 );
|
||||
if ( navcard_bits > 0 )
|
||||
{
|
||||
wait_network_frame();
|
||||
player setclientfield( "navcard_held", navcard_bits );
|
||||
}
|
||||
_k116 = getNextArrayKey( _a116, _k116 );
|
||||
}
|
||||
}
|
||||
|
||||
player_in_exploit_area( player_trigger_origin, player_trigger_radius )
|
||||
{
|
||||
if ( distancesquared( player_trigger_origin, self.origin ) < ( player_trigger_radius * player_trigger_radius ) )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
iprintlnbold( "player exploit detectect" );
|
||||
#/
|
||||
*/
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
path_exploit_fix( zombie_trigger_origin, zombie_trigger_radius, zombie_trigger_height, player_trigger_origin, player_trigger_radius, zombie_goto_point )
|
||||
{
|
||||
spawnflags = 9;
|
||||
zombie_trigger = spawn( "trigger_radius", zombie_trigger_origin, spawnflags, zombie_trigger_radius, zombie_trigger_height );
|
||||
zombie_trigger setteamfortrigger( level.zombie_team );
|
||||
/*
|
||||
/#
|
||||
thread debug_exploit( zombie_trigger_origin, zombie_trigger_radius, player_trigger_origin, player_trigger_radius, zombie_goto_point );
|
||||
#/
|
||||
*/
|
||||
while ( 1 )
|
||||
{
|
||||
zombie_trigger waittill( "trigger", who );
|
||||
if ( !is_true( who.reroute ) )
|
||||
{
|
||||
who thread exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exploit_reroute( zombie_trigger, player_trigger_origin, player_trigger_radius, zombie_goto_point )
|
||||
{
|
||||
self endon( "death" );
|
||||
self.reroute = 1;
|
||||
while ( 1 )
|
||||
{
|
||||
if ( self istouching( zombie_trigger ) )
|
||||
{
|
||||
player = self.favoriteenemy;
|
||||
if ( isDefined( player ) && player player_in_exploit_area( player_trigger_origin, player_trigger_radius ) )
|
||||
{
|
||||
self.reroute_origin = zombie_goto_point;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
wait 0.2;
|
||||
}
|
||||
self.reroute = 0;
|
||||
}
|
||||
|
||||
debug_exploit( player_origin, player_radius, enemy_origin, enemy_radius, zombie_goto_point )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
while ( isDefined( self ) )
|
||||
{
|
||||
circle( player_origin, player_radius, ( 1, 1, 0 ), 0, 1, 1 );
|
||||
circle( enemy_origin, enemy_radius, ( 1, 1, 0 ), 0, 1, 1 );
|
||||
line( player_origin, enemy_origin, ( 1, 1, 0 ), 1 );
|
||||
line( enemy_origin, zombie_goto_point, ( 1, 1, 0 ), 1 );
|
||||
wait 0.05;
|
||||
#/
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
ffotd_melee_miss_func()
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
if ( isplayer( self.enemy ) && self.enemy getcurrentweapon() == "claymore_zm" )
|
||||
{
|
||||
dist_sq = distancesquared( self.enemy.origin, self.origin );
|
||||
melee_dist_sq = self.meleeattackdist * self.meleeattackdist;
|
||||
if ( dist_sq < melee_dist_sq )
|
||||
{
|
||||
self.enemy dodamage( self.meleedamage, self.origin, self, self, "none", "MOD_MELEE" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.original_melee_miss_func ) )
|
||||
{
|
||||
self [[ level.original_melee_miss_func ]]();
|
||||
}
|
||||
}
|
||||
|
105
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_net.gsc
Normal file
105
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_net.gsc
Normal file
@ -0,0 +1,105 @@
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
network_choke_init( id, max )
|
||||
{
|
||||
if ( !isDefined( level.zombie_network_choke_ids_max ) )
|
||||
{
|
||||
level.zombie_network_choke_ids_max = [];
|
||||
level.zombie_network_choke_ids_count = [];
|
||||
}
|
||||
level.zombie_network_choke_ids_max[ id ] = max;
|
||||
level.zombie_network_choke_ids_count[ id ] = 0;
|
||||
level thread network_choke_thread( id );
|
||||
}
|
||||
|
||||
network_choke_thread( id )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
wait_network_frame();
|
||||
wait_network_frame();
|
||||
level.zombie_network_choke_ids_count[ id ] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
network_choke_safe( id )
|
||||
{
|
||||
return level.zombie_network_choke_ids_count[ id ] < level.zombie_network_choke_ids_max[ id ];
|
||||
}
|
||||
|
||||
network_choke_action( id, choke_action, arg1, arg2, arg3 )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.zombie_network_choke_ids_max[ id ] ), "Network Choke: " + id + " undefined" );
|
||||
#/
|
||||
*/
|
||||
while ( !network_choke_safe( id ) )
|
||||
{
|
||||
wait 0.05;
|
||||
}
|
||||
level.zombie_network_choke_ids_count[ id ]++;
|
||||
if ( !isDefined( arg1 ) )
|
||||
{
|
||||
return [[ choke_action ]]();
|
||||
}
|
||||
if ( !isDefined( arg2 ) )
|
||||
{
|
||||
return [[ choke_action ]]( arg1 );
|
||||
}
|
||||
if ( !isDefined( arg3 ) )
|
||||
{
|
||||
return [[ choke_action ]]( arg1, arg2 );
|
||||
}
|
||||
return [[ choke_action ]]( arg1, arg2, arg3 );
|
||||
}
|
||||
|
||||
network_entity_valid( entity )
|
||||
{
|
||||
if ( !isDefined( entity ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
network_safe_init( id, max )
|
||||
{
|
||||
if ( !isDefined( level.zombie_network_choke_ids_max ) || !isDefined( level.zombie_network_choke_ids_max[ id ] ) )
|
||||
{
|
||||
network_choke_init( id, max );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( max == level.zombie_network_choke_ids_max[ id ] );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
||||
_network_safe_spawn( classname, origin )
|
||||
{
|
||||
return spawn( classname, origin );
|
||||
}
|
||||
|
||||
network_safe_spawn( id, max, classname, origin )
|
||||
{
|
||||
network_safe_init( id, max );
|
||||
return network_choke_action( id, ::_network_safe_spawn, classname, origin );
|
||||
}
|
||||
|
||||
_network_safe_play_fx_on_tag( fx, entity, tag )
|
||||
{
|
||||
if ( network_entity_valid( entity ) )
|
||||
{
|
||||
playfxontag( fx, entity, tag );
|
||||
}
|
||||
}
|
||||
|
||||
network_safe_play_fx_on_tag( id, max, fx, entity, tag )
|
||||
{
|
||||
network_safe_init( id, max );
|
||||
network_choke_action( id, ::_network_safe_play_fx_on_tag, fx, entity, tag );
|
||||
}
|
||||
|
100
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_server_throttle.gsc
Normal file
100
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_server_throttle.gsc
Normal file
@ -0,0 +1,100 @@
|
||||
#include maps/mp/zombies/_zm_utility;
|
||||
#include maps/mp/_utility;
|
||||
|
||||
server_choke_init( id, max )
|
||||
{
|
||||
if ( !isDefined( level.zombie_server_choke_ids_max ) )
|
||||
{
|
||||
level.zombie_server_choke_ids_max = [];
|
||||
level.zombie_server_choke_ids_count = [];
|
||||
}
|
||||
level.zombie_server_choke_ids_max[ id ] = max;
|
||||
level.zombie_server_choke_ids_count[ id ] = 0;
|
||||
level thread server_choke_thread( id );
|
||||
}
|
||||
|
||||
server_choke_thread( id )
|
||||
{
|
||||
while ( 1 )
|
||||
{
|
||||
wait 0.05;
|
||||
level.zombie_server_choke_ids_count[ id ] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
server_choke_safe( id )
|
||||
{
|
||||
return level.zombie_server_choke_ids_count[ id ] < level.zombie_server_choke_ids_max[ id ];
|
||||
}
|
||||
|
||||
server_choke_action( id, choke_action, arg1, arg2, arg3 )
|
||||
{
|
||||
/*
|
||||
/#
|
||||
assert( isDefined( level.zombie_server_choke_ids_max[ id ] ), "server Choke: " + id + " undefined" );
|
||||
#/
|
||||
*/
|
||||
while ( !server_choke_safe( id ) )
|
||||
{
|
||||
wait 0.05;
|
||||
}
|
||||
level.zombie_server_choke_ids_count[ id ]++;
|
||||
if ( !isDefined( arg1 ) )
|
||||
{
|
||||
return [[ choke_action ]]();
|
||||
}
|
||||
if ( !isDefined( arg2 ) )
|
||||
{
|
||||
return [[ choke_action ]]( arg1 );
|
||||
}
|
||||
if ( !isDefined( arg3 ) )
|
||||
{
|
||||
return [[ choke_action ]]( arg1, arg2 );
|
||||
}
|
||||
return [[ choke_action ]]( arg1, arg2, arg3 );
|
||||
}
|
||||
|
||||
server_entity_valid( entity )
|
||||
{
|
||||
if ( !isDefined( entity ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
server_safe_init( id, max )
|
||||
{
|
||||
if ( !isDefined( level.zombie_server_choke_ids_max ) || !isDefined( level.zombie_server_choke_ids_max[ id ] ) )
|
||||
{
|
||||
server_choke_init( id, max );
|
||||
}
|
||||
/*
|
||||
/#
|
||||
assert( max == level.zombie_server_choke_ids_max[ id ] );
|
||||
#/
|
||||
*/
|
||||
}
|
||||
|
||||
_server_safe_ground_trace( pos )
|
||||
{
|
||||
return groundpos( pos );
|
||||
}
|
||||
|
||||
server_safe_ground_trace( id, max, origin )
|
||||
{
|
||||
server_safe_init( id, max );
|
||||
return server_choke_action( id, ::_server_safe_ground_trace, origin );
|
||||
}
|
||||
|
||||
_server_safe_ground_trace_ignore_water( pos )
|
||||
{
|
||||
return groundpos_ignore_water( pos );
|
||||
}
|
||||
|
||||
server_safe_ground_trace_ignore_water( id, max, origin )
|
||||
{
|
||||
server_safe_init( id, max );
|
||||
return server_choke_action( id, ::_server_safe_ground_trace_ignore_water, origin );
|
||||
}
|
||||
|
1953
patch_zm/maps/mp/zombies/exe_client_field_mismatch/_zm_equipment.gsc
Normal file
1953
patch_zm/maps/mp/zombies/exe_client_field_mismatch/_zm_equipment.gsc
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,7 @@
|
||||
### The following gscs compile and run successfully with no known errors:
|
||||
```
|
||||
patch_zm/maps/mp/gametypes_zm/NoKnownErrors/_clientids.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/NoKnownErrors/_globalentities.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/NoKnownErrors/_scoreboard.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/NoKnownErrors/_shellshock.gsc
|
||||
patch_zm/maps/mp/gametypes_zm/NoKnownErrors/zclassic.gsc
|
||||
@ -7,7 +9,10 @@ patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ai_basic.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ai_dogs.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ai_faller.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_bot.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_clone.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_equip_hacker.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_equip_gasmask.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_ffotd.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_boards.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_box.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_doors.gsc
|
||||
@ -15,10 +20,12 @@ patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_packapunch.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_perks.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_powerups.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_hackables_wallbuys.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_net.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_perk_electric_cherry.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_pers_upgrades.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_pers_upgrades_functions.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_pers_upgrades_system.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_server_throttle.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_score.gsc
|
||||
patch_zm/maps/mp/zombies/NoKnownErrors/_zm_tombstone.gsc
|
||||
```
|
||||
@ -29,6 +36,7 @@ patch_zm/maps/mp/zombies/MinorErorrs/_zm_timer.gsc
|
||||
### The following scripts compile and run successfully with major errors:
|
||||
```
|
||||
patch_zm/maps/mp/gametypes_zm/MajorErrors/_zm_gametype.gsc
|
||||
patch_zm/maps/mp/zombies/MajorErrors/_zm_chugabud.gsc
|
||||
patch_zm/maps/mp/zombies/MajorErrors/_zm_magicbox.gsc
|
||||
patch_zm/maps/mp/zombies/MajorErrors/_zm_perks.gsc
|
||||
patch_zm/maps/mp/zombies/MajorErrors/_zm_powerups.gsc
|
||||
|
Loading…
x
Reference in New Issue
Block a user