Fix panzer errors.

This commit is contained in:
JezuzLizard 2024-02-08 02:00:17 -08:00
parent 7c043cee57
commit 6a8fdc0e93
9 changed files with 248 additions and 58 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@
*.iwd *.iwd
*.sabl *.sabl
*.sabs *.sabs
*.zip

View File

@ -73,6 +73,16 @@ main()
level._effect["mech_footstep_steam"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_foot_step_steam" ); level._effect["mech_footstep_steam"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_foot_step_steam" );
level._effect["mech_exhaust_smoke"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_exhaust_smoke" ); level._effect["mech_exhaust_smoke"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_exhaust_smoke" );
init_animtree(); init_animtree();
scripts\zm\zm_ai_pack_mod_main::add_visionset_callback( ::register_burn_overlay );
}
register_burn_overlay()
{
if ( getDvar( "mapname" ) == "zm_transit" || getDvar( "mapname" ) == "zm_tomb" )
{
return;
}
clientscripts\mp\_visionset_mgr::vsmgr_register_overlay_info_style_burn( "zm_transit_burn", 14000, 15, 2 );
} }
init() init()

View File

@ -44,6 +44,7 @@ precache()
main() main()
{ {
precacherumble( "brutus_footsteps" );
level._effect["brutus_flashlight"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_light" ); level._effect["brutus_flashlight"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_light" );
level._effect["brutus_spawn"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_spawn" ); level._effect["brutus_spawn"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_spawn" );
level._effect["brutus_death"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_spawn" ); level._effect["brutus_death"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_spawn" );
@ -899,7 +900,6 @@ wait_on_box_alarm()
while ( true ) while ( true )
{ {
self.zbarrier waittill( "randomization_done" ); self.zbarrier waittill( "randomization_done" );
level notify( "spawn_brutus", 1 );
level.num_pulls_since_brutus_spawn++; level.num_pulls_since_brutus_spawn++;
if ( level.brutus_in_grief ) if ( level.brutus_in_grief )

View File

@ -52,10 +52,31 @@ register_clientfields()
registerclientfield( "actor", "anim_rate", 14000, 2, "float" ); registerclientfield( "actor", "anim_rate", 14000, 2, "float" );
} }
register_burn_overlay()
{
if ( getDvar( "mapname" ) == "zm_tomb" || getDvar( "mapname" ) == "zm_transit" )
{
return;
}
level.zm_transit_burn_max_duration = 2;
if ( !isdefined( level.vsmgr_prio_overlay_zm_transit_burn ) )
level.vsmgr_prio_overlay_zm_transit_burn = 20;
maps\mp\_visionset_mgr::vsmgr_register_info( "overlay", "zm_transit_burn", 14000, level.vsmgr_prio_overlay_zm_transit_burn, 15, 1, maps\mp\_visionset_mgr::vsmgr_duration_lerp_thread_per_player, 0 );
}
main() main()
{ {
register_clientfields(); register_clientfields();
level._effect["mechz_death"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_death" );
level._effect["mechz_sparks"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_dmg_sparks" );
level._effect["mechz_steam"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_dmg_steam" );
level._effect["mechz_claw"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_wpn_claw" );
level._effect["mechz_claw_arm"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_wpn_source" );
level._effect["mech_booster_landing"] = loadfx( "maps/zombie_tomb/fx_tomb_mech_jump_landing" );
precache(); precache();
scripts\zm\zm_ai_pack_mod_main::add_visionset_callback( ::register_burn_overlay );
} }
#using_animtree("mechz_claw"); #using_animtree("mechz_claw");
@ -335,7 +356,7 @@ mechz_round_tracker()
while ( !isdefined( level.zombie_mechz_locations ) ) while ( !isdefined( level.zombie_mechz_locations ) )
wait 0.05; wait 0.05;
if ( getDvar( "mapname" == "zm_tomb" ) ) if ( getDvar( "mapname" ) == "zm_tomb" )
{ {
flag_wait( "activate_zone_nml" ); flag_wait( "activate_zone_nml" );
} }

View File

@ -31,7 +31,7 @@ mechz_flamethrower_initial_setup()
self.flamethrower_trigger = get_flamethrower_trigger(); self.flamethrower_trigger = get_flamethrower_trigger();
if ( !isdefined( self.flamethrower_trigger ) ) if ( !isdefined( self.flamethrower_trigger ) && getDvar( "mapname" ) == "zm_tomb" )
{ {
/# /#
println( "Error: No free flamethrower triggers! Make sure you haven't spawned more than 4 mech zombies" ); println( "Error: No free flamethrower triggers! Make sure you haven't spawned more than 4 mech zombies" );
@ -39,9 +39,13 @@ mechz_flamethrower_initial_setup()
return; return;
} }
if ( getDvar( "mapname" ) == "zm_tomb" )
{
self.flamethrower_trigger.origin = self gettagorigin( "tag_flamethrower_FX" ); self.flamethrower_trigger.origin = self gettagorigin( "tag_flamethrower_FX" );
self.flamethrower_trigger.angles = self gettagangles( "tag_flamethrower_FX" ); self.flamethrower_trigger.angles = self gettagangles( "tag_flamethrower_FX" );
self.flamethrower_trigger linkto( self, "tag_flamethrower_FX" ); self.flamethrower_trigger linkto( self, "tag_flamethrower_FX" );
}
self thread mechz_watch_for_flamethrower_damage(); self thread mechz_watch_for_flamethrower_damage();
} }
@ -188,10 +192,56 @@ mechz_stop_firing_watcher()
self.firing = 0; self.firing = 0;
} }
// credit to shippuden1592 for the original code
hit_by_flamethrower( mechz )
{
dist = distance(self.origin, mechz.origin);
dirTo = self.origin - mechz.flamethrower_fx.origin;
dirTo = vectornormalize(dirTo);
mechDir = anglestoforward(mechz.flamethrower_fx.angles + (180,0,0));
dot = vectordot(dirTo, mechDir);
if ( isDefined( self.is_zombie ) && self.is_zombie )
{
if ( dot < -0.85 && dist < 300 )
{
return true;
}
}
else if ( dot < -0.85 && is_player_valid( self ) && BulletTracePassed( mechz GetEye(), self GetEye(), false, undefined) && dist < 300 )
{
return true;
}
return false;
}
mech_flamethrower_fx()
{
self.flamethrower_fx = spawn("script_model", self GetTagOrigin("tag_flamethrower_FX"));
self.flamethrower_fx setmodel("tag_origin");
self.flamethrower_fx.angles = self GetTagAngles("tag_flamethrower_FX");
self.flamethrower_fx linkto(self, "tag_flamethrower_FX");
ft = self.flamethrower_fx;
self waittill( "death" );
if ( isDefined( ft ) )
{
ft unlink();
ft delete();
}
}
mechz_watch_for_flamethrower_damage() mechz_watch_for_flamethrower_damage()
{ {
self endon( "death" ); self endon( "death" );
if ( level.script != "zm_tomb" )
{
self thread mech_flamethrower_fx();
}
entity_on_tank_func = getFunction( "maps/mp/zm_tomb_tank", "entity_on_tank" ); entity_on_tank_func = getFunction( "maps/mp/zm_tomb_tank", "entity_on_tank" );
while ( true ) while ( true )
@ -209,10 +259,13 @@ mechz_watch_for_flamethrower_damage()
{ {
if ( !( isdefined( players[i].is_burning ) && players[i].is_burning ) ) if ( !( isdefined( players[i].is_burning ) && players[i].is_burning ) )
{ {
if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && players[i] [[ entity_on_tank_func ]]() || players[i] istouching( self.flamethrower_trigger ) ) if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && players[i] [[ entity_on_tank_func ]]()
|| isDefined( self.flamethrower_trigger ) && players[i] istouching( self.flamethrower_trigger ) || level.script != "zm_tomb" && players[ i ] hit_by_flamethrower( self ) )
{
players[i] thread player_flame_damage(); players[i] thread player_flame_damage();
} }
} }
}
zombies = getaispeciesarray( "axis", "all" ); zombies = getaispeciesarray( "axis", "all" );
@ -224,7 +277,8 @@ mechz_watch_for_flamethrower_damage()
if ( isdefined( zombies[i].on_fire ) && zombies[i].on_fire ) if ( isdefined( zombies[i].on_fire ) && zombies[i].on_fire )
continue; continue;
if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && zombies[i] [[ entity_on_tank_func ]]() || zombies[i] istouching( self.flamethrower_trigger ) ) if ( isDefined( entity_on_tank_func ) && do_tank_sweep_auto_damage && zombies[i] [[ entity_on_tank_func ]]()
|| isDefined( self.flamethrower_trigger ) && zombies[i] istouching( self.flamethrower_trigger ) || level.script != "zm_tomb" && zombies[ i ] hit_by_flamethrower( self ) )
{ {
zombies[i].on_fire = 1; zombies[i].on_fire = 1;
zombies[i] promote_to_explosive(); zombies[i] promote_to_explosive();
@ -492,7 +546,7 @@ mechz_do_flamethrower_attack( tank_sweep )
self.last_flamethrower_time = gettime(); self.last_flamethrower_time = gettime();
self thread mechz_kill_flamethrower_watcher(); self thread mechz_kill_flamethrower_watcher();
if ( !isdefined( self.flamethrower_trigger ) ) if ( !isdefined( self.flamethrower_trigger ) && !isDefined( self.flamethrower_fx ) )
self mechz_flamethrower_initial_setup(); self mechz_flamethrower_initial_setup();
n_nearby_enemies = 0; n_nearby_enemies = 0;

View File

@ -1,19 +1,25 @@
#include clientscripts\mp\zombies\_zm_ai_avogadro;
#include clientscripts\mp\zombies\_zm_ai_screecher;
#include clientscripts\mp\zombies\_zm_ai_ghost;
#include clientscripts\mp\zombies\_zm_ai_brutus;
#include clientscripts\mp\zombies\_zm_ai_mechz;
main() main()
{ {
replaceFunc( clientscripts\mp\_visionset_mgr::init, ::visionset_mgr_init_override );
level.script = toLower( getDvar( "mapname" ) ); level.script = toLower( getDvar( "mapname" ) );
level.gametype = toLower( getDvar( "g_gametype" ) ); level.gametype = toLower( getDvar( "g_gametype" ) );
level.ai_data = []; level.ai_data = [];
level.ai_data[ "avogadro" ] = spawnStruct(); // level.ai_data[ "avogadro" ] = spawnStruct();
level.ai_data[ "avogadro" ].main = clientscripts\mp\zombies\_zm_ai_avogadro::main; // level.ai_data[ "avogadro" ].main = clientscripts\mp\zombies\_zm_ai_avogadro::main;
level.ai_data[ "avogadro" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" ); // level.ai_data[ "avogadro" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" );
level.ai_data[ "screecher" ] = spawnStruct(); // level.ai_data[ "screecher" ] = spawnStruct();
level.ai_data[ "screecher" ].main = clientscripts\mp\zombies\_zm_ai_screecher::main; // level.ai_data[ "screecher" ].main = clientscripts\mp\zombies\_zm_ai_screecher::main;
level.ai_data[ "screecher" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" ); // level.ai_data[ "screecher" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" );
level.ai_data[ "ghost" ] = spawnStruct(); // level.ai_data[ "ghost" ] = spawnStruct();
level.ai_data[ "ghost" ].main = clientscripts\mp\zombies\_zm_ai_ghost::main; // level.ai_data[ "ghost" ].main = clientscripts\mp\zombies\_zm_ai_ghost::main;
level.ai_data[ "ghost" ].should_execute = !( level.script == "zm_buried" && level.gametype == "zclassic" ); // level.ai_data[ "ghost" ].should_execute = !( level.script == "zm_buried" && level.gametype == "zclassic" );
level.ai_data[ "brutus" ] = spawnStruct(); level.ai_data[ "brutus" ] = spawnStruct();
level.ai_data[ "brutus" ].main = clientscripts\mp\zombies\_zm_ai_brutus::main; level.ai_data[ "brutus" ].main = clientscripts\mp\zombies\_zm_ai_brutus::main;
level.ai_data[ "brutus" ].should_execute = level.script != "zm_prison"; level.ai_data[ "brutus" ].should_execute = level.script != "zm_prison";
@ -22,12 +28,12 @@ main()
level.ai_data[ "mechz" ].should_execute = level.script != "zm_tomb"; level.ai_data[ "mechz" ].should_execute = level.script != "zm_tomb";
keys = getArrayKeys( level.ai_data ); keys = getArrayKeys( level.ai_data );
for ( j = 0; j < keys2.size; j++ ) for ( i = 0; i < keys.size; i++ )
{ {
if ( isDefined( level.ai_data[ keys[ j ] ].main ) && isDefined( level.ai_data[ keys[ j ] ].should_execute ) if ( isDefined( level.ai_data[ keys[ i ] ].main ) && isDefined( level.ai_data[ keys[ i ] ].should_execute )
&& level.ai_data[ keys[ j ] ].should_execute ) && level.ai_data[ keys[ i ] ].should_execute )
{ {
level [[ level.ai_data[ keys[ j ] ].main ]](); level [[ level.ai_data[ keys[ i ] ].main ]]();
} }
} }
} }
@ -36,3 +42,44 @@ init()
{ {
} }
add_visionset_callback( func )
{
if ( !isDefined( level.visionset_mgr_callbacks ) )
{
level.visionset_mgr_callbacks = [];
}
level.visionset_mgr_callbacks[ level.visionset_mgr_callbacks.size ] = func;
}
run_visionset_callbacks()
{
if ( !isDefined( level.visionset_mgr_callbacks ) )
{
return;
}
for ( i = 0; i < level.visionset_mgr_callbacks.size; i++ )
{
[[ level.visionset_mgr_callbacks[ i ] ]]();
}
}
visionset_mgr_init_override()
{
if ( isDefined( level.createfx_enabled ) && level.createfx_enabled )
return;
level.vsmgr_initializing = 1;
level.vsmgr_default_info_name = "none";
level.vsmgr = [];
level.vsmgr_states_inited = [];
level.vsmgr_filter_custom_enable = [];
level thread register_type( "visionset", ::visionset_slot_cb, ::visionset_lerp_cb, ::visionset_update_cb );
vsmgr_register_visionset_info( level.vsmgr_default_info_name, 1, 1, "undefined", "undefined" );
level thread register_type( "overlay", ::overlay_slot_cb, ::overlay_lerp_cb, ::overlay_update_cb );
vsmgr_register_overlay_info_style_none( level.vsmgr_default_info_name, 1, 1 );
level.vsmgr_is_type_currently_default_func = ::vsmgr_is_type_currently_default;
[[ level.on_finalize_initialization_callback ]]( ::finalize_clientfields );
level thread monitor();
run_visionset_callbacks();
}

View File

@ -1,43 +1,55 @@
#include maps\mp\zombies\_zm_utility;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_ai_avogadro;
#include maps\mp\zombies\_zm_ai_screecher;
#include maps\mp\zombies\_zm_ai_ghost;
#include maps\mp\zombies\_zm_ai_brutus;
#include maps\mp\zombies\_zm_ai_mechz;
#include maps\mp\zombies\_zm_ai_dogs;
main() main()
{ {
replaceFunc( maps\mp\_visionset_mgr::init, ::visionset_mgr_init_override );
level.script = toLower( getDvar( "mapname" ) ); level.script = toLower( getDvar( "mapname" ) );
level.gametype = toLower( getDvar( "g_gametype" ) ); level.gametype = toLower( getDvar( "g_gametype" ) );
level.ai_home_maps = []; level.ai_data = [];
level.ai_home_maps[ "avogadro" ] = spawnStruct(); // level.ai_data[ "avogadro" ] = spawnStruct();
level.ai_home_maps[ "avogadro" ].main = maps\mp\zombies\_zm_ai_avogadro::main; // level.ai_data[ "avogadro" ].main = maps\mp\zombies\_zm_ai_avogadro::main;
level.ai_home_maps[ "avogadro" ].init = maps\mp\zombies\_zm_ai_avogadro::init; // level.ai_data[ "avogadro" ].init = maps\mp\zombies\_zm_ai_avogadro::init;
level.ai_home_maps[ "avogadro" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" ); // level.ai_data[ "avogadro" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" );
level.ai_home_maps[ "screecher" ] = spawnStruct(); // level.ai_data[ "screecher" ] = spawnStruct();
level.ai_home_maps[ "screecher" ].main = maps\mp\zombies\_zm_ai_screecher::main; // level.ai_data[ "screecher" ].main = maps\mp\zombies\_zm_ai_screecher::main;
level.ai_home_maps[ "screecher" ].init = maps\mp\zombies\_zm_ai_screecher::init; // level.ai_data[ "screecher" ].init = maps\mp\zombies\_zm_ai_screecher::init;
level.ai_home_maps[ "screecher" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" ); // level.ai_data[ "screecher" ].should_execute = !( level.script == "zm_transit" && level.gametype == "zclassic" );
level.ai_home_maps[ "ghost" ] = spawnStruct(); // level.ai_data[ "ghost" ] = spawnStruct();
level.ai_home_maps[ "ghost" ].main = maps\mp\zombies\_zm_ai_ghost::main; // level.ai_data[ "ghost" ].main = maps\mp\zombies\_zm_ai_ghost::main;
level.ai_home_maps[ "ghost" ].should_execute = !( level.script == "zm_buried" && level.gametype == "zclassic" ); // level.ai_data[ "ghost" ].should_execute = !( level.script == "zm_buried" && level.gametype == "zclassic" );
level.ai_home_maps[ "brutus" ] = spawnStruct(); level.ai_data[ "brutus" ] = spawnStruct();
level.ai_home_maps[ "brutus" ].main = maps\mp\zombies\_zm_ai_brutus::main; level.ai_data[ "brutus" ].main = maps\mp\zombies\_zm_ai_brutus::main;
level.ai_home_maps[ "brutus" ].should_execute = level.script != "zm_prison"; level.ai_data[ "brutus" ].should_execute = level.script != "zm_prison";
level.ai_home_maps[ "mechz" ] = spawnStruct(); level.ai_data[ "mechz" ] = spawnStruct();
level.ai_home_maps[ "mechz" ].main = maps\mp\zombies\_zm_ai_mechz::main; level.ai_data[ "mechz" ].main = maps\mp\zombies\_zm_ai_mechz::main;
level.ai_home_maps[ "mechz" ].init = maps\mp\zombies\_zm_ai_mechz::init; level.ai_data[ "mechz" ].init = maps\mp\zombies\_zm_ai_mechz::init;
level.ai_home_maps[ "mechz" ].should_execute = level.script != "zm_tomb"; level.ai_data[ "mechz" ].should_execute = level.script != "zm_tomb";
level.ai_home_maps[ "zombie_dog" ] = spawnStruct(); // level.ai_data[ "zombie_dog" ] = spawnStruct();
level.ai_home_maps[ "zombie_dog" ].main = maps\mp\zombies\_zm_ai_dogs::init; // level.ai_data[ "zombie_dog" ].main = maps\mp\zombies\_zm_ai_dogs::init;
level.ai_home_maps[ "zombie_dog" ].init = maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds; // level.ai_data[ "zombie_dog" ].init = maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds;
level.ai_home_maps[ "zombie_dog" ].should_execute = !( level.gametype == "zstandard" && getGametypeSetting( "allowDogs" ) == 1 ); // level.ai_data[ "zombie_dog" ].should_execute = !( level.gametype == "zstandard" && getGametypeSetting( "allowDogs" ) == 1 );
keys = getArrayKeys( level.ai_data ); keys = getArrayKeys( level.ai_data );
for ( j = 0; j < keys2.size; j++ ) for ( i = 0; i < keys.size; i++ )
{ {
if ( isDefined( level.ai_data[ keys[ j ] ].main ) && isDefined( level.ai_data[ keys[ j ] ].should_execute ) if ( isDefined( level.ai_data[ keys[ i ] ].main ) && isDefined( level.ai_data[ keys[ i ] ].should_execute )
&& level.ai_data[ keys[ j ] ].should_execute ) && level.ai_data[ keys[ i ] ].should_execute )
{ {
level [[ level.ai_data[ keys[ j ] ].main ]](); level [[ level.ai_data[ keys[ i ] ].main ]]();
} }
} }
level thread command_thread(); level thread command_thread();
level thread on_player_connect(); level thread on_player_connect();
} }
@ -45,16 +57,53 @@ main()
init() init()
{ {
keys = getArrayKeys( level.ai_data ); keys = getArrayKeys( level.ai_data );
for ( j = 0; j < keys2.size; j++ ) for ( i = 0; i < keys.size; i++ )
{ {
if ( isDefined( level.ai_data[ keys[ j ] ].init ) && isDefined( level.ai_data[ keys[ j ] ].should_execute ) if ( isDefined( level.ai_data[ keys[ i ] ].init ) && isDefined( level.ai_data[ keys[ i ] ].should_execute )
&& level.ai_data[ keys[ j ] ].should_execute ) && level.ai_data[ keys[ i ] ].should_execute )
{ {
level [[ level.ai_data[ keys[ j ] ].init ]](); level [[ level.ai_data[ keys[ i ] ].init ]]();
} }
} }
} }
add_visionset_callback( func )
{
if ( !isDefined( level.visionset_mgr_callbacks ) )
{
level.visionset_mgr_callbacks = [];
}
level.visionset_mgr_callbacks[ level.visionset_mgr_callbacks.size ] = func;
}
run_visionset_callbacks()
{
if ( !isDefined( level.visionset_mgr_callbacks ) )
{
return;
}
for ( i = 0; i < level.visionset_mgr_callbacks.size; i++ )
{
[[ level.visionset_mgr_callbacks[ i ] ]]();
}
}
visionset_mgr_init_override()
{
if ( isDefined( level.createfx_enabled ) && level.createfx_enabled )
return;
level.vsmgr_initializing = 1;
level.vsmgr_default_info_name = "none";
level.vsmgr = [];
level thread register_type( "visionset" );
level thread register_type( "overlay" );
onfinalizeinitialization_callback( ::finalize_clientfields );
level thread monitor();
level thread onplayerconnect();
run_visionset_callbacks();
}
command_thread() command_thread()
{ {
for (;;) for (;;)
@ -73,6 +122,15 @@ command_thread()
{ {
level.next_dog_round = level.round_number + 1; level.next_dog_round = level.round_number + 1;
} }
else if ( message == "spawnmechz" )
{
level.mechz_left_to_spawn = 1;
level notify( "spawn_mechz" );
}
else if ( message == "spawnbrutus" )
{
level notify( "spawn_brutus", 1 );
}
} }
} }

View File

@ -31,7 +31,7 @@ include,transit/zm_transit_basic_no_anims
include,transit/zm_transit_screecher include,transit/zm_transit_screecher
include,transit/zombie_dog include,transit/zombie_dog
soundbank,mod.all //soundbank,mod.all
script,maps/mp/zombies/_zm_ai_ghost.gsc script,maps/mp/zombies/_zm_ai_ghost.gsc
script,maps/mp/zombies/_zm_ai_ghost_ffotd.gsc script,maps/mp/zombies/_zm_ai_ghost_ffotd.gsc

View File

@ -158,4 +158,3 @@ xmodel,c_zom_mech_armor_shoulder_right
rawfile,rumble/mechz_footsteps rawfile,rumble/mechz_footsteps
rawfile,animtrees/mechz_claw.atr rawfile,animtrees/mechz_claw.atr
footsteptable,fly_step_mechz footsteptable,fly_step_mechz