mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 02:37:59 -05:00
_zm_gump.gsc is now accepting connections from clients. _zm_tombstone had a simple syntax error that needed fixing. _zm_pers_upgrades, and _zm_pers_upgrades_system both have no known errors. Finally _zm_pers_upgrades_functions hangs on server launch, most likely an infinite loop.
503 lines
12 KiB
Plaintext
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;
|
|
}
|
|
|
|
|
|
|