Files
Recompilable-gscs-for-BO2-z…/patch_zm/maps/mp/zombies/_zm_tombstone.gsc
JezuzLizard 3b86338236 see description
Added several new scripts to the no known errors category, but also moved some scripts to improper debug methods category. Added new scripts that need debugging which includes the remainder of the zombies class of scripts in patch_zm. Updated the debugging script and readme with more exact instructions to its usage.
Will work on many of the remaining zombies scripts and eventually move to gametypes_zm scripts.
2020-04-24 10:21:48 -07:00

503 lines
12 KiB
Plaintext

#include maps/mp/zombies/_zm_perks;
#include maps/mp/zombies/_zm_equipment;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_weap_cymbal_monkey;
#include maps/mp/zombies/_zm_melee_weapon;
#include maps/mp/zombies/_zm_utility;
#include common_scripts/utility;
#include maps/mp/_utility;
init() //checked matches cerberus output
{
onplayerconnect_callback( ::tombstone_player_init );
level.tombstone_laststand_func = ::tombstone_laststand;
level.tombstone_spawn_func = ::tombstone_spawn;
level thread tombstone_hostmigration();
if ( isDefined( level.zombiemode_using_tombstone_perk ) && level.zombiemode_using_tombstone_perk )
{
add_custom_limited_weapon_check( ::is_weapon_available_in_tombstone );
}
}
tombstone_player_init() //checked matches cerberus output
{
while ( !isDefined( self.tombstone_index ) )
{
wait 0.1;
}
level.tombstones[ self.tombstone_index ] = spawnstruct();
}
tombstone_spawn() //checked matches cerberus output
{
dc = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
dc.angles = self.angles;
dc setmodel( "tag_origin" );
dc_icon = spawn( "script_model", self.origin + vectorScale( ( 0, 0, 1 ), 40 ) );
dc_icon.angles = self.angles;
dc_icon setmodel( "ch_tombstone1" );
dc_icon linkto( dc );
dc.icon = dc_icon;
dc.script_noteworthy = "player_tombstone_model";
dc.player = self;
self thread tombstone_clear();
dc thread tombstone_wobble();
dc thread tombstone_revived( self );
result = self waittill_any_return( "player_revived", "spawned_player", "disconnect" );
if ( result == "player_revived" || result == "disconnect" )
{
dc notify( "tombstone_timedout" );
dc_icon unlink();
dc_icon delete();
dc delete();
return;
}
dc thread tombstone_timeout();
dc thread tombstone_grab();
}
tombstone_clear() //checked matches cerberus output
{
result = self waittill_any_return( "tombstone_timedout", "tombstone_grabbed" );
level.tombstones[ self.tombstone_index ] = spawnstruct();
}
tombstone_revived( player ) //checked changed to match cerberus output
{
self endon( "tombstone_timedout" );
player endon( "disconnect" );
shown = 1;
while ( isDefined( self ) && isDefined( player ) )
{
if ( isDefined( player.revivetrigger ) && isDefined( player.revivetrigger.beingrevived ) && player.revivetrigger.beingrevived )
{
if ( shown )
{
shown = 0;
self.icon hide();
}
}
else if ( !shown )
{
shown = 1;
self.icon show();
}
wait 0.05;
}
}
tombstone_laststand() //checked changed to match cerberus output
{
primaries = self getweaponslistprimaries();
currentweapon = self getcurrentweapon();
dc = level.tombstones[ self.tombstone_index ];
dc.player = self;
dc.weapon = [];
dc.current_weapon = -1;
foreach ( weapon in primaries )
{
dc.weapon[ index ] = weapon;
dc.stockcount[ index ] = self getweaponammostock( weapon );
if ( weapon == currentweapon )
{
dc.current_weapon = index;
}
}
if ( isDefined( self.hasriotshield ) && self.hasriotshield )
{
dc.hasriotshield = 1;
}
dc save_weapons_for_tombstone( self );
if ( self hasweapon( "claymore_zm" ) )
{
dc.hasclaymore = 1;
dc.claymoreclip = self getweaponammoclip( "claymore_zm" );
}
if ( self hasweapon( "emp_grenade_zm" ) )
{
dc.hasemp = 1;
dc.empclip = self getweaponammoclip( "emp_grenade_zm" );
}
dc.perk = tombstone_save_perks( self );
lethal_grenade = self get_player_lethal_grenade();
if ( self hasweapon( lethal_grenade ) )
{
dc.grenade = self getweaponammoclip( lethal_grenade );
}
else
{
dc.grenade = 0;
}
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() )
{
dc.zombie_cymbal_monkey_count = self getweaponammoclip( "cymbal_monkey_zm" );
}
}
tombstone_save_perks( ent ) //checked matches cerberus output
{
perk_array = [];
if ( ent hasperk( "specialty_armorvest" ) )
{
perk_array[ perk_array.size ] = "specialty_armorvest";
}
if ( ent hasperk( "specialty_deadshot" ) )
{
perk_array[ perk_array.size ] = "specialty_deadshot";
}
if ( ent hasperk( "specialty_fastreload" ) )
{
perk_array[ perk_array.size ] = "specialty_fastreload";
}
if ( ent hasperk( "specialty_flakjacket" ) )
{
perk_array[ perk_array.size ] = "specialty_flakjacket";
}
if ( ent hasperk( "specialty_longersprint" ) )
{
perk_array[ perk_array.size ] = "specialty_longersprint";
}
if ( ent hasperk( "specialty_quickrevive" ) )
{
perk_array[ perk_array.size ] = "specialty_quickrevive";
}
if ( ent hasperk( "specialty_rof" ) )
{
perk_array[ perk_array.size ] = "specialty_rof";
}
return perk_array;
}
tombstone_grab() //checked partially changed to match cerberus output
{
self endon( "tombstone_timedout" );
wait 1;
while ( isDefined( self ) )
{
players = get_players();
i = 0;
while ( i < players.size )
{
if ( players[ i ].is_zombie )
{
i++;
continue;
}
if ( isDefined( self.player ) && players[ i ] == self.player )
{
tombstone_machine_triggers = getentarray( "specialty_scavenger", "script_noteworthy" );
istombstonepowered = 0;
foreach ( trigger in tombstone_machine_triggers )
{
if ( isdefined( trigger.power_on ) && trigger.power_on || isdefined( trigger.turbine_power_on ) && trigger.turbine_power_on )
{
istombstonepowered = 1;
}
}
if ( istombstonepowered )
{
dist = distance( players[ i ].origin, self.origin );
if ( dist < 64 )
{
playfx( level._effect[ "powerup_grabbed" ], self.origin );
playfx( level._effect[ "powerup_grabbed_wave" ], self.origin );
players[ i ] tombstone_give();
wait 0.1;
playsoundatposition( "zmb_tombstone_grab", self.origin );
self stoploopsound();
self.icon unlink();
self.icon delete();
self delete();
self notify( "tombstone_grabbed" );
players[ i ] clientnotify( "dc0" );
players[ i ] notify( "dance_on_my_grave" );
}
}
}
i++;
}
wait_network_frame();
}
}
tombstone_give() //checked partially changed to match cerberus output
{
dc = level.tombstones[ self.tombstone_index ];
if ( !flag( "solo_game" ) )
{
primaries = self getweaponslistprimaries();
if ( dc.weapon.size > 1 || primaries.size > 1 )
{
foreach ( weapon in primaries )
{
self takeweapon( weapon );
}
}
i = 0;
while ( i < dc.weapon.size )
{
if ( !isDefined( dc.weapon[ i ] ) )
{
i++;
continue;
}
if ( dc.weapon[ i ] == "none" )
{
i++;
continue;
}
weapon = dc.weapon[ i ];
stock = dc.stockcount[ i ];
if ( !self hasweapon( weapon ) )
{
self giveweapon( weapon, 0, self maps/mp/zombies/_zm_weapons::get_pack_a_punch_weapon_options( weapon ) );
self setweaponammoclip( weapon, weaponclipsize( weapon ) );
self setweaponammostock( weapon, stock );
if ( i == dc.current_weapon )
{
self switchtoweapon( weapon );
}
}
i++;
}
}
if ( isDefined( dc.hasriotshield ) && dc.hasriotshield )
{
self maps/mp/zombies/_zm_equipment::equipment_give( "riotshield_zm" );
if ( isDefined( self.player_shield_reset_health ) )
{
self [[ self.player_shield_reset_health ]]();
}
}
dc restore_weapons_for_tombstone( self );
if ( isDefined( dc.hasclaymore ) && dc.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", dc.claymoreclip );
}
if ( isDefined( dc.hasemp ) && dc.hasemp )
{
self giveweapon( "emp_grenade_zm" );
self setweaponammoclip( "emp_grenade_zm", dc.empclip );
}
if ( isDefined( dc.perk ) && dc.perk.size > 0 )
{
i = 0;
while ( i < dc.perk.size )
{
if ( self hasperk( dc.perk[ i ] ) )
{
i++;
continue;
}
if ( dc.perk[ i ] == "specialty_quickrevive" && flag( "solo_game" ) )
{
i++;
continue;
}
maps/mp/zombies/_zm_perks::give_perk( dc.perk[ i ] );
i++;
}
}
else if ( dc.grenade > 0 && !flag( "solo_game" ) )
{
curgrenadecount = 0;
if ( self hasweapon( self get_player_lethal_grenade() ) )
{
self getweaponammoclip( self get_player_lethal_grenade() );
}
else
{
self giveweapon( self get_player_lethal_grenade() );
}
self setweaponammoclip( self get_player_lethal_grenade(), dc.grenade + curgrenadecount );
}
if ( maps/mp/zombies/_zm_weap_cymbal_monkey::cymbal_monkey_exists() && !flag( "solo_game" ) )
{
if ( dc.zombie_cymbal_monkey_count )
{
self maps/mp/zombies/_zm_weap_cymbal_monkey::player_give_cymbal_monkey();
self setweaponammoclip( "cymbal_monkey_zm", dc.zombie_cymbal_monkey_count );
}
}
}
tombstone_wobble() //checked matches cerberus output
{
self endon( "tombstone_grabbed" );
self endon( "tombstone_timedout" );
if ( isDefined( self ) )
{
wait 1;
playfxontag( level._effect[ "powerup_on" ], self, "tag_origin" );
self playsound( "zmb_tombstone_spawn" );
self playloopsound( "zmb_tombstone_looper" );
}
while ( isDefined( self ) )
{
self rotateyaw( 360, 3 );
wait 2.9;
}
}
tombstone_timeout() //checked partially changed to match cerberus output
{
self endon( "tombstone_grabbed" );
self thread playtombstonetimeraudio();
wait 48.5;
i = 0;
while ( i < 40 )
{
if ( i % 2 )
{
self.icon ghost();
}
else
{
self.icon show();
}
if ( i < 15 )
{
wait 0.5;
i++;
continue;
}
if ( i < 25 )
{
wait 0.25;
i++;
continue;
}
wait 0.1;
i++;
}
self notify( "tombstone_timedout" );
self.icon unlink();
self.icon delete();
self delete();
}
playtombstonetimeraudio() //checked matches cerberus output
{
self endon( "tombstone_grabbed" );
self endon( "tombstone_timedout" );
player = self.player;
self thread playtombstonetimerout( player );
while ( 1 )
{
player playsoundtoplayer( "zmb_tombstone_timer_count", player );
wait 1;
}
}
playtombstonetimerout( player ) //checked matches cerberus output
{
self endon( "tombstone_grabbed" );
self waittill( "tombstone_timedout" );
player playsoundtoplayer( "zmb_tombstone_timer_out", player );
}
save_weapons_for_tombstone( player ) //checked changed to match cerberus output
{
self.tombstone_melee_weapons = [];
for ( i = 0; i < level._melee_weapons.size; i++; )
{
self save_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name );
}
}
save_weapon_for_tombstone( player, weapon_name ) //checked matches cerberus output
{
if ( player hasweapon( weapon_name ) )
{
self.tombstone_melee_weapons[ weapon_name ] = 1;
}
}
restore_weapons_for_tombstone( player )
{
for ( i = 0; i < level._melee_weapons.size; i++ )
{
self restore_weapon_for_tombstone( player, level._melee_weapons[ i ].weapon_name );
}
self.tombstone_melee_weapons = undefined;
}
restore_weapon_for_tombstone( player, weapon_name ) //checked changed to match cerberus output
{
if ( !isDefined( weapon_name ) || !isDefined( self.tombstone_melee_weapons ) || !isDefined( self.tombstone_melee_weapons[ weapon_name ] ) )
{
return;
}
if ( isDefined( self.tombstone_melee_weapons[ weapon_name ] ) && self.tombstone_melee_weapons[ weapon_name ] )
{
player giveweapon( weapon_name );
player change_melee_weapon( weapon_name, "none" );
self.tombstone_melee_weapons[ weapon_name ] = 0;
}
}
tombstone_hostmigration() //checked changed to match cerberus output
{
level endon( "end_game" );
level notify( "tombstone_hostmigration" );
level endon( "tombstone_hostmigration" );
while ( 1 )
{
level waittill( "host_migration_end" );
tombstones = getentarray( "player_tombstone_model", "script_noteworthy" );
foreach ( model in tombstones )
{
playfxontag( level._effect[ "powerup_on" ], model, "tag_origin" );
}
}
}
is_weapon_available_in_tombstone( weapon, player_to_check ) //checked partially changed to match cerberus output
{
count = 0;
upgradedweapon = weapon;
if ( isDefined( level.zombie_weapons[ weapon ] ) && isDefined( level.zombie_weapons[ weapon ].upgrade_name ) )
{
upgradedweapon = level.zombie_weapons[ weapon ].upgrade_name;
}
tombstone_index = 0;
while ( tombstone_index < level.tombstones.size )
{
dc = level.tombstones[ tombstone_index ];
if ( !isDefined( dc.weapon ) )
{
tombstone_index++;
continue;
}
if ( isDefined( player_to_check ) && dc.player != player_to_check )
{
tombstone_index++;
continue;
}
weapon_index = 0;
while ( weapon_index < dc.weapon.size )
{
if ( !isDefined( dc.weapon[ weapon_index ] ) )
{
weapon_index++;
continue;
}
tombstone_weapon = dc.weapon[ weapon_index ];
if ( tombstone_weapon == weapon || tombstone_weapon == upgradedweapon )
{
count++;
}
weapon_index++;
}
tombstone_index++;
}
return count;
}