added more files and fixed more files

This commit is contained in:
JezuzLizard 2020-03-27 04:08:14 -07:00
parent 81f75225f6
commit 8021494436
7 changed files with 9084 additions and 78 deletions

File diff suppressed because it is too large Load Diff

View File

@ -21,11 +21,12 @@
init()
{
//level.player_out_of_playable_area_monitor = 1;
//level.player_too_many_weapons_monitor = 1;
//level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor;
//level.player_too_many_players_check = 1;
//level.player_too_many_players_check_func = ::player_too_many_players_check;
level.player_out_of_playable_area_monitor = 1;
level.player_too_many_weapons_monitor = 1;
level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor;
level.player_too_many_players_check = 1;
level.player_too_many_players_check_func = ::player_too_many_players_check;
level._use_choke_weapon_hints = 1;
level._use_choke_blockers = 1;
level.passed_introscreen = 0;
@ -120,11 +121,8 @@ init()
}
register_offhand_weapons_for_level_defaults();
level thread drive_client_connected_notifies();
/*
/#
maps/mp/zombies/_zm_devgui::init();
#/
*/
//not the cause of the minidump
maps/mp/zombies/_zm_zonemgr::init();
maps/mp/zombies/_zm_unitrigger::init();
maps/mp/zombies/_zm_audio::init();
@ -136,15 +134,24 @@ init()
maps/mp/zombies/_zm_laststand::init();
maps/mp/zombies/_zm_magicbox::init();
maps/mp/zombies/_zm_perks::init();
maps/mp/zombies/_zm_playerhealth::init();
//causes the server to minidump
//maps/mp/zombies/_zm_playerhealth::init();
//ok
maps/mp/zombies/_zm_power::init();
maps/mp/zombies/_zm_powerups::init();
maps/mp/zombies/_zm_score::init();
maps/mp/zombies/_zm_spawner::init();
maps/mp/zombies/_zm_gump::init();
maps/mp/zombies/_zm_timer::init();
//causes the server to minidump
//maps/mp/zombies/_zm_timer::init();
//ok
maps/mp/zombies/_zm_traps::init();
maps/mp/zombies/_zm_weapons::init();
init_function_overrides();
level thread last_stand_pistol_rank_init();
level thread maps/mp/zombies/_zm_tombstone::init();
@ -177,6 +184,7 @@ init()
level thread onallplayersready();
level thread startunitriggers();
level thread maps/mp/gametypes_zm/_zm_gametype::post_init_gametype();
}
post_main()
@ -1450,7 +1458,7 @@ onplayerspawned()
self.zmbdialogactive = 0;
self.zmbdialoggroups = [];
self.zmbdialoggroup = "";
/*
if ( isDefined( level.player_out_of_playable_area_monitor ) && level.player_out_of_playable_area_monitor )
{
self thread player_out_of_playable_area_monitor();
@ -1463,7 +1471,6 @@ onplayerspawned()
{
level thread [[ level.player_too_many_players_check_func ]]();
}
*/
self.disabled_perks = [];
if ( isDefined( self.player_initialized ) )
{
@ -1586,7 +1593,7 @@ in_enabled_playable_area()
}
return 0;
}
/*
get_player_out_of_playable_area_monitor_wait_time()
{
@ -1599,8 +1606,7 @@ get_player_out_of_playable_area_monitor_wait_time()
return 3;
}
*/
/*
player_out_of_playable_area_monitor()
{
self notify( "stop_player_out_of_playable_area_monitor" );
@ -1638,7 +1644,7 @@ player_out_of_playable_area_monitor()
wait get_player_out_of_playable_area_monitor_wait_time();
#/
}
*/
self maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_out_of_playable" );
self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_out_of_playable", 0 );
self maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 );
@ -1743,7 +1749,7 @@ player_too_many_weapons_monitor()
wait get_player_too_many_weapons_monitor_wait_time();
#/
}
*/
weapon_limit = get_player_weapon_limit( self );
primaryweapons = self getweaponslistprimaries();
if ( primaryweapons.size > weapon_limit )
@ -1775,7 +1781,7 @@ player_too_many_weapons_monitor()
wait get_player_too_many_weapons_monitor_wait_time();
}
}
*/
player_monitor_travel_dist()
{
self endon( "disconnect" );
@ -6067,7 +6073,7 @@ update_quick_revive( solo_mode )
level.quick_revive_machine thread maps/mp/zombies/_zm_perks::reenable_quickrevive( clip, solo_mode );
}
/*
player_too_many_players_check()
{
max_players = 4;
@ -6081,6 +6087,7 @@ player_too_many_players_check()
level notify( "end_game" );
}
}
*/

View File

@ -26,12 +26,9 @@ init()
{
return;
}
if ( getDvarIntDefault( "_zm_perks_return_early", "0" ) == "1" )
{
return;
}
initialize_custom_perk_arrays();
perk_machine_spawn_init();
vending_weapon_upgrade_trigger = [];
vending_triggers = getentarray( "zombie_vending", "targetname" );
i = 0;
@ -75,6 +72,7 @@ init()
set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 190 );
array_thread( vending_triggers, ::vending_trigger_think );
array_thread( vending_triggers, ::electric_perks_dialog );
if ( isDefined( level.zombiemode_using_doubletap_perk ) && level.zombiemode_using_doubletap_perk )
{
level thread turn_doubletap_on();
@ -137,6 +135,7 @@ init()
[[ level.quantum_bomb_register_result_func ]]( "give_nearest_perk", ::quantum_bomb_give_nearest_perk_result, 10, ::quantum_bomb_give_nearest_perk_validation );
}
level thread perk_hostmigration();
}
default_vending_precaching()
@ -3091,19 +3090,19 @@ perk_machine_spawn_init()
{
match_string = "";
location = level.scr_zm_map_start_location;
if ( location != "default" && location == "" && isDefined( level.default_start_location ) )
if(location == "default" || location == "" && isdefined(level.default_start_location))
{
location = level.default_start_location;
}
match_string = ( level.scr_zm_ui_gametype + "_perks_" ) + location;
match_string = level.scr_zm_ui_gametype + "_perks_" + location;
pos = [];
if ( isDefined( level.override_perk_targetname ) )
if(isdefined(level.override_perk_targetname))
{
structs = getstructarray( level.override_perk_targetname, "targetname" );
structs = getstructarray(level.override_perk_targetname, "targetname");
}
else
{
structs = getstructarray( "zm_perk_machine", "targetname" );
structs = getstructarray("zm_perk_machine", "targetname");
}
_a3578 = structs;
_k3578 = getFirstArrayKey( _a3578 );
@ -3128,60 +3127,59 @@ perk_machine_spawn_init()
else pos[ pos.size ] = struct;
_k3578 = getNextArrayKey( _a3578, _k3578 );
}
if ( !isDefined( pos ) || pos.size == 0 )
if(!isdefined(pos) || pos.size == 0)
{
return;
}
precachemodel( "zm_collision_perks1" );
i = 0;
while ( i < pos.size )
precachemodel("zm_collision_perks1");
for(i = 0; i < pos.size; i++)
{
perk = pos[ i ].script_noteworthy;
if ( isDefined( perk ) && isDefined( pos[ i ].model ) )
perk = pos[i].script_noteworthy;
if(isdefined(perk) && isdefined(pos[i].model))
{
use_trigger = spawn( "trigger_radius_use", pos[ i ].origin + vectorScale( ( 0, -1, 0 ), 30 ), 0, 40, 70 );
use_trigger = spawn("trigger_radius_use", pos[i].origin + VectorScale( 0, 0, 1, 30), 0, 40, 70);
use_trigger.targetname = "zombie_vending";
use_trigger.script_noteworthy = perk;
use_trigger triggerignoreteam();
perk_machine = spawn( "script_model", pos[ i ].origin );
perk_machine.angles = pos[ i ].angles;
perk_machine setmodel( pos[ i ].model );
if ( isDefined( level._no_vending_machine_bump_trigs ) && level._no_vending_machine_bump_trigs )
perk_machine = spawn("script_model", pos[i].origin);
perk_machine.angles = pos[i].angles;
perk_machine setmodel(pos[i].model);
if(isdefined(level._no_vending_machine_bump_trigs) && level._no_vending_machine_bump_trigs)
{
bump_trigger = undefined;
}
else
{
bump_trigger = spawn( "trigger_radius", pos[ i ].origin, 0, 35, 64 );
bump_trigger = spawn("trigger_radius", pos[i].origin, 0, 35, 64);
bump_trigger.script_activated = 1;
bump_trigger.script_sound = "zmb_perks_bump_bottle";
bump_trigger.targetname = "audio_bump_trigger";
if ( perk != "specialty_weapupgrade" )
if(perk != "specialty_weapupgrade")
{
bump_trigger thread thread_bump_trigger();
}
}
collision = spawn( "script_model", pos[ i ].origin, 1 );
collision.angles = pos[ i ].angles;
collision setmodel( "zm_collision_perks1" );
collision = spawn("script_model", pos[i].origin, 1);
collision.angles = pos[i].angles;
collision setmodel("zm_collision_perks1");
collision.script_noteworthy = "clip";
collision disconnectpaths();
use_trigger.clip = collision;
use_trigger.machine = perk_machine;
use_trigger.bump = bump_trigger;
if ( isDefined( pos[ i ].blocker_model ) )
if(isdefined(pos[i].blocker_model))
{
use_trigger.blocker_model = pos[ i ].blocker_model;
use_trigger.blocker_model = pos[i].blocker_model;
}
if ( isDefined( pos[ i ].script_int ) )
if(isdefined(pos[i].script_int))
{
perk_machine.script_int = pos[ i ].script_int;
perk_machine.script_int = pos[i].script_int;
}
if ( isDefined( pos[ i ].turn_on_notify ) )
if(isdefined(pos[i].turn_on_notify))
{
perk_machine.turn_on_notify = pos[ i ].turn_on_notify;
perk_machine.turn_on_notify = pos[i].turn_on_notify;
}
switch( perk )
switch(perk)
{
case "specialty_quickrevive":
case "specialty_quickrevive_upgrade":
@ -3191,7 +3189,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_revive";
perk_machine.script_string = "revive_perk";
perk_machine.targetname = "vending_revive";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "revive_perk";
}
@ -3204,7 +3202,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_sleight";
perk_machine.script_string = "speedcola_perk";
perk_machine.targetname = "vending_sleight";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "speedcola_perk";
}
@ -3217,7 +3215,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_marathon";
perk_machine.script_string = "marathon_perk";
perk_machine.targetname = "vending_marathon";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "marathon_perk";
}
@ -3231,7 +3229,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_jugg";
perk_machine.script_string = "jugg_perk";
perk_machine.targetname = "vending_jugg";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "jugg_perk";
}
@ -3244,7 +3242,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_tombstone";
perk_machine.script_string = "tombstone_perk";
perk_machine.targetname = "vending_tombstone";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "tombstone_perk";
}
@ -3257,7 +3255,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_doubletap";
perk_machine.script_string = "tap_perk";
perk_machine.targetname = "vending_doubletap";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "tap_perk";
}
@ -3270,7 +3268,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_chugabud";
perk_machine.script_string = "tap_perk";
perk_machine.targetname = "vending_chugabud";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "tap_perk";
}
@ -3283,7 +3281,7 @@ perk_machine_spawn_init()
use_trigger.target = "vending_additionalprimaryweapon";
perk_machine.script_string = "tap_perk";
perk_machine.targetname = "vending_additionalprimaryweapon";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "tap_perk";
}
@ -3294,16 +3292,16 @@ perk_machine_spawn_init()
use_trigger.script_label = "mus_perks_packa_sting";
use_trigger.longjinglewait = 1;
perk_machine.targetname = "vending_packapunch";
flag_pos = getstruct( pos[ i ].target, "targetname" );
if ( isDefined( flag_pos ) )
flag_pos = getstruct(pos[i].target, "targetname");
if(isdefined(flag_pos))
{
perk_machine_flag = spawn( "script_model", flag_pos.origin );
perk_machine_flag = spawn("script_model", flag_pos.origin);
perk_machine_flag.angles = flag_pos.angles;
perk_machine_flag setmodel( flag_pos.model );
perk_machine_flag setmodel(flag_pos.model);
perk_machine_flag.targetname = "pack_flag";
perk_machine.target = "pack_flag";
}
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "perks_rattle";
}
@ -3316,30 +3314,29 @@ perk_machine_spawn_init()
use_trigger.target = "vending_deadshot";
perk_machine.script_string = "deadshot_vending";
perk_machine.targetname = "vending_deadshot_model";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "deadshot_vending";
}
break;
default:
case default:
use_trigger.script_sound = "mus_perks_speed_jingle";
use_trigger.script_string = "speedcola_perk";
use_trigger.script_label = "mus_perks_speed_sting";
use_trigger.target = "vending_sleight";
perk_machine.script_string = "speedcola_perk";
perk_machine.targetname = "vending_sleight";
if ( isDefined( bump_trigger ) )
if(isdefined(bump_trigger))
{
bump_trigger.script_string = "speedcola_perk";
}
break;
}
if ( isDefined( level._custom_perks[ perk ] ) && isDefined( level._custom_perks[ perk ].perk_machine_set_kvps ) )
if(isdefined(level._custom_perks[perk]) && isdefined(level._custom_perks[perk].perk_machine_set_kvps))
{
[[ level._custom_perks[ perk ].perk_machine_set_kvps ]]( use_trigger, perk_machine, bump_trigger, collision );
[[level._custom_perks[perk].perk_machine_set_kvps]](use_trigger, perk_machine, bump_trigger, collision);
}
}
i++;
}
}
@ -4163,3 +4160,4 @@ _register_undefined_perk( str_perk )
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,7 @@ patch_zm/maps/mp/zombies/_zm_hackables_packapunch.gsc
patch_zm/maps/mp/zombies/_zm_hackables_perks.gsc
patch_zm/maps/mp/zombies/_zm_hackables_powerups.gsc
patch_zm/maps/mp/zombies/_zm_hackables_wallbuys.gsc
patch_zm/maps/mp/zombies/_zm_perk_electric_cherry.gsc
patch_zm/maps/mp/zombies/_zm_pers_upgrades.gsc
patch_zm/maps/mp/zombies/_zm_pers_upgrades_functions.gsc
patch_zm/maps/mp/zombies/_zm_pers_upgrades_system.gsc
@ -31,22 +32,32 @@ zm_transit_patch/maps/mp/zm_transit_utility.gsc
zm_transit_patch/maps/mp/gametypes_zm/zgrief.gsc
```
### The following scripts compile and run successfully with major errors:
```
patch_zm/maps/mp/zombies/_zm_magicbox.gsc
patch_zm/maps/mp/zombies/_zm_perks.gsc
patch_zm/maps/mp/zombies/_zm_powerups.gsc
patch_zm/maps/mp/zombies/_zm_weapons.gsc
```
```
patch_zm/maps/mp/gametypes_zm/_zm_gametype.gsc
```
```
zm_transit_patch/maps/mp/zombies/_zm_weap_jetgun.gsc
```
```
zm_highrise_patch/maps/mp/zombies/_zm_weap_slipgun.gsc
```
### The following scripts compile and run serverside but clients cannot join due to exe_client_field_mismatch
```
patch_zm/maps/mp/zombies/_zm_weapons.gsc
patch_zm/maps/mp/zombies/_zm.gsc
patch_zm/maps/mp/zombies/_zm_gump.gsc
patch_zm/maps/mp/zombies/_zm_equipment.gsc
patch_zm/maps/mp/zombies/_zm_perks.gsc
```
### The following scripts compile but cause a minidump or other severe error:
```
patch_zm/maps/mp/zombies/_load.gsc
patch_zm/maps/mp/zombies/_zm.gsc
patch_zm/maps/mp/zombies/_zm_powerups.gsc
patch_zm/maps/mp/zombies/_zm_magicbox.gsc
```
### notes:

View File

@ -0,0 +1,891 @@
#include maps/mp/zombies/_zm_audio;
#include maps/mp/zombies/_zm_powerups;
#include maps/mp/zombies/_zm_ai_basic;
#include maps/mp/animscripts/zm_shared;
#include maps/mp/animscripts/zm_utility;
#include maps/mp/zombies/_zm;
#include maps/mp/zombies/_zm_spawner;
#include maps/mp/gametypes_zm/_weaponobjects;
#include maps/mp/zombies/_zm_equipment;
#include maps/mp/zombies/_zm_weapons;
#include maps/mp/zombies/_zm_utility;
#include maps/mp/_utility;
#include common_scripts/utility;
set_zombie_var_once( var, value, is_float, column, is_team_based )
{
if ( !isDefined( level.zombie_vars ) || !isDefined( level.zombie_vars[ var ] ) )
{
set_zombie_var( var, value, is_float, column, is_team_based );
}
}
init()
{
if ( !maps/mp/zombies/_zm_weapons::is_weapon_included( "slipgun_zm" ) )
{
return;
}
precachemodel( "t5_weapon_crossbow_bolt" );
precacheitem( "slip_bolt_zm" );
precacheitem( "slip_bolt_upgraded_zm" );
if ( is_true( level.slipgun_as_equipment ) )
{
maps/mp/zombies/_zm_equipment::register_equipment( "slipgun_zm", &"ZM_HIGHRISE_EQUIP_SLIPGUN_PICKUP_HINT_STRING", &"ZM_HIGHRISE_EQUIP_SLIPGUN_HOWTO", "jetgun_zm_icon", "slipgun", ::slipgun_activation_watcher_thread, ::transferslipgun, ::dropslipgun, ::pickupslipgun );
maps/mp/zombies/_zm_equipment::enemies_ignore_equipment( "slipgun_zm" );
maps/mp/gametypes_zm/_weaponobjects::createretrievablehint( "slipgun", &"ZM_HIGHRISE_EQUIP_SLIPGUN_PICKUP_HINT_STRING" );
}
set_zombie_var_once( "slipgun_reslip_max_spots", 8 );
set_zombie_var_once( "slipgun_reslip_rate", 6 );
set_zombie_var_once( "slipgun_max_kill_chain_depth", 16 );
set_zombie_var_once( "slipgun_max_kill_round", 100 );
set_zombie_var_once( "slipgun_chain_radius", 120 );
set_zombie_var_once( "slipgun_chain_wait_min", 0.75, 1 );
set_zombie_var_once( "slipgun_chain_wait_max", 1.5, 1 );
level.slippery_spot_count = 0;
level.sliquifier_distance_checks = 0;
maps/mp/zombies/_zm_spawner::register_zombie_damage_callback( ::slipgun_zombie_damage_response );
maps/mp/zombies/_zm_spawner::register_zombie_death_animscript_callback( ::slipgun_zombie_death_response );
level._effect[ "slipgun_explode" ] = loadfx( "weapon/liquifier/fx_liquifier_goo_explo" );
level._effect[ "slipgun_splatter" ] = loadfx( "maps/zombie/fx_zmb_goo_splat" );
level._effect[ "slipgun_simmer" ] = loadfx( "weapon/liquifier/fx_liquifier_goo_sizzle" );
level._effect[ "slipgun_viewmodel_eject" ] = loadfx( "weapon/liquifier/fx_liquifier_clip_eject" );
level._effect[ "slipgun_viewmodel_reload" ] = loadfx( "weapon/liquifier/fx_liquifier_reload_steam" );
onplayerconnect_callback( ::slipgun_player_connect );
thread wait_init_damage();
}
wait_init_damage()
{
while ( !isDefined( level.zombie_vars ) || !isDefined( level.zombie_vars[ "zombie_health_start" ] ) )
{
wait 1;
}
wait 1;
level.slipgun_damage = maps/mp/zombies/_zm::ai_zombie_health( level.zombie_vars[ "slipgun_max_kill_round" ] );
level.slipgun_damage_mod = "MOD_PROJECTILE_SPLASH";
}
slipgun_player_connect()
{
self thread watch_for_slip_bolt();
}
watch_for_slip_bolt()
{
self endon( "death" );
self endon( "disconnect" );
for ( ;; )
{
self waittill( "grenade_fire", grenade, weaponname, parent );
self.num_sliquifier_kills = 0;
switch( weaponname )
{
case "slip_bolt_zm":
grenade thread slip_bolt( self, 0 );
break;
continue;
case "slip_bolt_upgraded_zm":
grenade thread slip_bolt( self, 1 );
break;
continue;
}
}
}
slip_bolt( player, upgraded )
{
startpos = player getweaponmuzzlepoint();
self waittill( "explode", position );
duration = 24;
if ( upgraded )
{
duration = 36;
}
thread add_slippery_spot( position, duration, startpos );
}
dropslipgun()
{
item = self maps/mp/zombies/_zm_equipment::placed_equipment_think( "t6_wpn_zmb_slipgun_world", "slipgun_zm", self.origin + vectorScale( ( 0, 0, 1 ), 30 ), self.angles );
if ( isDefined( item ) )
{
item.original_owner = self;
item.owner = undefined;
item.name = "slipgun_zm";
item.requires_pickup = 1;
item.clipammo = self getweaponammoclip( item.name );
item.stockammo = self getweaponammostock( item.name );
}
self takeweapon( "slipgun_zm" );
return item;
}
pickupslipgun( item )
{
item.owner = self;
self giveweapon( item.name );
if ( isDefined( item.clipammo ) && isDefined( item.stockammo ) )
{
self setweaponammoclip( item.name, item.clipammo );
self setweaponammostock( item.name, item.stockammo );
item.clipammo = undefined;
item.stockammo = undefined;
}
}
transferslipgun( fromplayer, toplayer )
{
toplayer notify( "slipgun_zm_taken" );
fromplayer notify( "slipgun_zm_taken" );
}
slipgun_activation_watcher_thread()
{
self endon( "zombified" );
self endon( "disconnect" );
self endon( "slipgun_zm_taken" );
while ( 1 )
{
self waittill_either( "slipgun_zm_activate", "slipgun_zm_deactivate" );
}
}
slipgun_debug_circle( origin, radius, seconds, onslope, parent, start )
{
/*
/#
if ( getDvarInt( #"6136A815" ) )
{
frames = int( 20 * seconds );
if ( isDefined( parent ) )
{
time = seconds;
frames = 1;
while ( time > 0 )
{
morigin = origin + ( parent.origin - start );
if ( isDefined( onslope ) && onslope )
{
circle( morigin, radius, ( 0, 0, 1 ), 0, 1, frames );
}
else
{
circle( morigin, radius, ( 0, 0, 1 ), 0, 1, frames );
}
time -= 0,05;
wait 0,05;
}
}
else if ( isDefined( onslope ) && onslope )
{
circle( origin, radius, ( 0, 0, 1 ), 0, 1, frames );
return;
}
else
{
circle( origin, radius, ( 0, 0, 1 ), 0, 1, frames );
#/
}
}
*/
}
slipgun_debug_line( start, end, color, seconds )
{
/*
/#
if ( getDvarInt( #"6136A815" ) )
{
frames = int( 20 * seconds );
line( start, end, color, 1, 0, frames );
#/
}
*/
}
canzombieongoofall()
{
if ( is_true( self.is_inert ) )
{
return 0;
}
if ( is_true( self.is_traversing ) )
{
return 0;
}
if ( is_true( self.barricade_enter ) )
{
return 0;
}
if ( randomint( 100 ) < 20 )
{
trace = groundtrace( self.origin + vectorScale( ( 0, 0, 1 ), 5 ), self.origin + vectorScale( ( 0, 0, 1 ), 300 ), 0, undefined );
origin = trace[ "position" ];
groundnormal = trace[ "normal" ];
if ( distancesquared( self.origin, origin ) > 256 )
{
return 0;
}
dot = vectordot( ( 0, 0, 1 ), groundnormal );
if ( dot < 0.9 )
{
return 0;
}
trace_origin = self.origin + vectorScale( anglesToForward( self.angles ), 200 );
trace = groundtrace( trace_origin + vectorScale( ( 0, 0, 1 ), 5 ), self.origin + vectorScale( ( 0, 0, 1 ), 300 ), 0, undefined );
origin = trace[ "position" ];
groundnormal = trace[ "normal" ];
if ( distancesquared( trace_origin, origin ) > 256 )
{
return 0;
}
dot = vectordot( ( 0, 0, 1 ), groundnormal );
if ( dot < 0.9 )
{
return 0;
}
return 1;
}
return 0;
}
zombiemoveongoo()
{
self endon( "death" );
self endon( "removed" );
level endon( "intermission" );
if ( is_true( self.sliding_on_goo ) )
{
return;
}
self notify( "endOnGoo" );
self endon( "endOnGoo" );
self notify( "stop_zombie_goto_entrance" );
self notify( "stop_find_flesh" );
self notify( "zombie_acquire_enemy" );
self.goo_last_vel = self getvelocity();
self.goo_last_pos = self.origin;
slide_direction = anglesToForward( self.angles );
self animmode( "slide" );
self orientmode( "face enemy" );
self.forcemovementscriptstate = 1;
self.ai_state = "zombieMoveOnGoo";
self maps/mp/zombies/_zm_spawner::zombie_history( "zombieMoveOnGoo " + getTime() );
self.sliding_on_goo = 0;
self thread zombiemoveongoo_on_killanimscript();
for ( ;; )
{
while ( 1 )
{
if ( isDefined( self.is_on_goo ) )
{
self_on_goo = self.is_on_goo;
}
velocity = self getvelocity();
velocitylength = length( self getvelocity() );
if ( isDefined( self.has_legs ) )
{
iscrawler = !self.has_legs;
}
isleaper = self is_leaper();
while ( is_true( self.is_leaping ) )
{
wait 0.1;
}
if ( !self_on_goo )
{
self animcustom( ::zombie_moveongoo_animcustom_recover );
self waittill( "zombie_MoveOnGoo_animCustom_recover_done" );
break;
}
else
{
if ( velocitylength <= 0.2 )
{
self animmode( "normal" );
wait 0.1;
self animmode( "slide" );
}
if ( !self.sliding_on_goo || !issubstr( self.zombie_move_speed, "slide" ) )
{
if ( !iscrawler && !isleaper && !isDefined( self.fell_while_sliding ) && canzombieongoofall() )
{
self animcustom( ::zombie_moveongoo_animcustom_fall );
self waittill( "zombie_MoveOnGoo_animCustom_fall_done" );
}
}
else self.sliding_on_goo = 1;
if ( velocitylength <= 0.2 )
{
wait 0.1;
}
self animmode( "slide" );
self orientmode( "face enemy" );
if ( self.zombie_move_speed == "sprint" )
{
if ( !isDefined( self.zombie_move_speed ) || isDefined( self.zombie_move_speed ) && self.zombie_move_speed != "sprint_slide" )
{
animstatedef = self maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "sprint_slide" );
self set_zombie_run_cycle( animstatedef );
}
break;
}
else if ( self.zombie_move_speed == "run" )
{
if ( !isDefined( self.zombie_move_speed ) || isDefined( self.zombie_move_speed ) && self.zombie_move_speed != "run_slide" )
{
animstatedef = self maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "run_slide" );
self set_zombie_run_cycle( animstatedef );
}
break;
}
else
{
if ( !isDefined( self.zombie_move_speed ) || isDefined( self.zombie_move_speed ) && self.zombie_move_speed != "walk_slide" )
{
animstatedef = self maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "walk_slide" );
self set_zombie_run_cycle( animstatedef );
}
}
}
wait 0.05;
}
}
zombiemoveongoo_gobacktonormal();
}
zombie_moveongoo_animcustom_fall()
{
self endon( "death" );
self endon( "removed" );
level endon( "intermission" );
self.fell_while_sliding = 1;
self animmode( "normal" );
self orientmode( "face angle", self.angles[ 1 ] );
fallanimstatedef = "zm_move_slide_fall";
self setanimstatefromasd( fallanimstatedef );
maps/mp/animscripts/zm_shared::donotetracks( "slide_fall_anim" );
self notify( "zombie_MoveOnGoo_animCustom_fall_done" );
}
zombie_moveongoo_animcustom_recover()
{
self endon( "death" );
self endon( "removed" );
level endon( "intermission" );
self.recovering_from_goo = 1;
if ( randomint( 100 ) < 50 )
{
animstatedef = maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_move_slide_recover" );
self setanimstatefromasd( animstatedef );
maps/mp/animscripts/zm_shared::donotetracks( "slide_recover_anim" );
}
self.recovering_from_goo = 0;
zombiemoveongoo_gobacktonormal();
self notify( "zombie_MoveOnGoo_animCustom_recover_done" );
}
zombiemoveongoo_on_killanimscript()
{
self endon( "death" );
self endon( "removed" );
level endon( "intermission" );
self notify( "zombieMoveOnGoo_on_killAnimScript_thread" );
self endon( "zombieMoveOnGoo_on_killAnimScript_thread" );
self waittill_any( "endOnGoo", "killanimscript" );
zombiemoveongoo_gobacktonormal();
}
zombiemoveongoo_gobacktonormal()
{
self animmode( "normal" );
self set_zombie_run_cycle();
self.sliding_on_goo = 0;
self.fell_while_sliding = undefined;
self notify( "zombieMoveOnGoo_on_killAnimScript_thread" );
self notify( "endOnGoo" );
self.forcemovementscriptstate = 0;
if ( !is_true( self.completed_emerging_into_playable_area ) )
{
/*
/#
assert( isDefined( self.first_node ) );
#/
*/
self maps/mp/zombies/_zm_spawner::reset_attack_spot();
self orientmode( "face default" );
self thread maps/mp/zombies/_zm_spawner::zombie_goto_entrance( self.first_node );
}
else
{
self orientmode( "face enemy" );
self thread maps/mp/zombies/_zm_ai_basic::find_flesh();
}
}
zombie_can_slip()
{
if ( is_true( self.barricade_enter ) )
{
return 0;
}
if ( is_true( self.is_traversing ) )
{
return 0;
}
if ( !is_true( self.completed_emerging_into_playable_area ) && !isDefined( self.first_node ) )
{
return 0;
}
if ( is_true( self.is_leaping ) )
{
return 0;
}
return 1;
}
zombie_set_slipping( onoff )
{
if ( isDefined( self ) )
{
self.is_on_goo = onoff;
if ( onoff )
{
self thread zombiemoveongoo();
}
}
}
slippery_spot_choke( lifetime )
{
level.sliquifier_distance_checks++;
if ( level.sliquifier_distance_checks >= 32 )
{
level.sliquifier_distance_checks = 0;
lifetime -= 0.05;
wait 0.05;
}
return lifetime;
}
add_slippery_spot( origin, duration, startpos )
{
wait 0.5;
level.slippery_spot_count++;
hit_norm = vectornormalize( startpos - origin );
hit_from = 6 * hit_norm;
trace_height = 120;
trace = bullettrace( origin + hit_from, origin + hit_from + ( 0, 0, trace_height * -1 ), 0, undefined );
if ( isDefined( trace[ "entity" ] ) )
{
parent = trace[ "entity" ];
if ( is_true( parent.can_move ) )
{
return;
}
}
fxorigin = origin + hit_from;
/*
/#
red = ( 0, 0, 1 );
green = ( 0, 0, 1 );
dkgreen = vectorScale( ( 0, 0, 1 ), 0,15 );
blue = ( 0, 0, 1 );
grey = vectorScale( ( 0, 0, 1 ), 0,3 );
black = ( 0, 0, 1 );
slipgun_debug_line( origin, origin + hit_from, red, duration );
if ( trace[ "fraction" ] == 1 )
{
slipgun_debug_line( origin + hit_from, origin + hit_from + ( 0, 0, trace_height * -1 ), grey, duration );
}
else
{
slipgun_debug_line( origin + hit_from, trace[ "position" ], green, duration );
slipgun_debug_line( trace[ "position" ], origin + hit_from + ( 0, 0, trace_height * -1 ), dkgreen, duration );
#/
}
*/
if ( trace[ "fraction" ] == 1 )
{
return;
}
moving_parent = undefined;
moving_parent_start = ( 0, 0, 1 );
if ( isDefined( trace[ "entity" ] ) )
{
parent = trace[ "entity" ];
if ( is_true( parent.can_move ) )
{
return;
}
}
origin = trace[ "position" ];
thread pool_of_goo( fxorigin, duration );
if ( !isDefined( level.slippery_spots ) )
{
level.slippery_spots = [];
}
level.slippery_spots[ level.slippery_spots.size ] = origin;
radius = 60;
height = 48;
/*
/#
thread slipgun_debug_circle( origin, radius, duration, 0, moving_parent, moving_parent_start );
#/
*/
slicked_players = [];
slicked_zombies = [];
lifetime = duration;
radius2 = radius * radius;
while ( lifetime > 0 )
{
oldlifetime = lifetime;
_a612 = get_players();
_k612 = getFirstArrayKey( _a612 );
while ( isDefined( _k612 ) )
{
player = _a612[ _k612 ];
num = player getentitynumber();
morigin = origin;
if ( isDefined( moving_parent ) )
{
morigin = origin + ( moving_parent.origin - moving_parent_start );
}
if ( distance2dsquared( player.origin, morigin ) < radius2 )
{
should_be_slick = abs( player.origin[ 2 ] - morigin[ 2 ] ) < height;
}
is_slick = isDefined( slicked_players[ num ] );
if ( should_be_slick != is_slick )
{
if ( !isDefined( player.slick_count ) )
{
player.slick_count = 0;
}
if ( should_be_slick )
{
player.slick_count++;
slicked_players[ num ] = player;
}
else
{
player.slick_count--;
/*
/#
assert( player.slick_count >= 0 );
#/
*/
}
player forceslick( player.slick_count );
}
lifetime = slippery_spot_choke( lifetime );
_k612 = getNextArrayKey( _a612, _k612 );
}
zombies = get_round_enemy_array();
while ( isDefined( zombies ) )
{
_a645 = zombies;
_k645 = getFirstArrayKey( _a645 );
while ( isDefined( _k645 ) )
{
zombie = _a645[ _k645 ];
if ( isDefined( zombie ) )
{
num = zombie getentitynumber();
morigin = origin;
if ( isDefined( moving_parent ) )
{
morigin = origin + ( moving_parent.origin - moving_parent_start );
}
if ( distance2dsquared( zombie.origin, morigin ) < radius2 )
{
should_be_slick = abs( zombie.origin[ 2 ] - morigin[ 2 ] ) < height;
}
if ( should_be_slick && !zombie zombie_can_slip() )
{
should_be_slick = 0;
}
is_slick = isDefined( slicked_zombies[ num ] );
if ( should_be_slick != is_slick )
{
if ( !isDefined( zombie.slick_count ) )
{
zombie.slick_count = 0;
}
if ( should_be_slick )
{
zombie.slick_count++;
slicked_zombies[ num ] = zombie;
}
else
{
if ( zombie.slick_count > 0 )
{
zombie.slick_count--;
}
}
zombie zombie_set_slipping( zombie.slick_count > 0 );
}
lifetime = slippery_spot_choke( lifetime );
}
_k645 = getNextArrayKey( _a645, _k645 );
}
}
if ( oldlifetime == lifetime )
{
lifetime -= 0.05;
wait 0.05;
}
}
_a684 = slicked_players;
_k684 = getFirstArrayKey( _a684 );
while ( isDefined( _k684 ) )
{
player = _a684[ _k684 ];
player.slick_count--;
/*
/#
assert( player.slick_count >= 0 );
#/
*/
player forceslick( player.slick_count );
_k684 = getNextArrayKey( _a684, _k684 );
}
_a690 = slicked_zombies;
_k690 = getFirstArrayKey( _a690 );
while ( isDefined( _k690 ) )
{
zombie = _a690[ _k690 ];
if ( isDefined( zombie ) )
{
if ( zombie.slick_count > 0 )
{
zombie.slick_count--;
}
zombie zombie_set_slipping( zombie.slick_count > 0 );
}
_k690 = getNextArrayKey( _a690, _k690 );
}
arrayremovevalue( level.slippery_spots, origin, 0 );
level.slippery_spot_count--;
}
pool_of_goo( origin, duration )
{
effect_life = 24;
if ( duration > effect_life )
{
pool_of_goo( origin, duration - effect_life );
duration = effect_life;
}
if ( isDefined( level._effect[ "slipgun_splatter" ] ) )
{
playfx( level._effect[ "slipgun_splatter" ], origin );
}
wait duration;
}
explode_into_goo( player, chain_depth )
{
if ( isDefined( self.marked_for_insta_upgraded_death ) )
{
return;
}
tag = "J_SpineLower";
if ( is_true( self.isdog ) )
{
tag = "tag_origin";
}
self.guts_explosion = 1;
self playsound( "wpn_slipgun_zombie_explode" );
if ( isDefined( level._effect[ "slipgun_explode" ] ) )
{
playfx( level._effect[ "slipgun_explode" ], self gettagorigin( tag ) );
}
if ( !is_true( self.isdog ) )
{
wait 0.1;
}
self ghost();
if ( !isDefined( self.goo_chain_depth ) )
{
self.goo_chain_depth = chain_depth;
}
chain_radius = level.zombie_vars[ "slipgun_chain_radius" ];
level thread explode_to_near_zombies( player, self.origin, chain_radius, self.goo_chain_depth );
}
explode_to_near_zombies( player, origin, radius, chain_depth )
{
if ( level.zombie_vars[ "slipgun_max_kill_chain_depth" ] > 0 && chain_depth > level.zombie_vars[ "slipgun_max_kill_chain_depth" ] )
{
return;
}
enemies = get_round_enemy_array();
enemies = get_array_of_closest( origin, enemies );
minchainwait = level.zombie_vars[ "slipgun_chain_wait_min" ];
maxchainwait = level.zombie_vars[ "slipgun_chain_wait_max" ];
rsquared = radius * radius;
tag = "J_Head";
marked_zombies = [];
while ( isDefined( enemies ) && enemies.size )
{
index = 0;
enemy = enemies[ index ];
while ( distancesquared( enemy.origin, origin ) < rsquared )
{
if ( isalive( enemy ) && !is_true( enemy.guts_explosion ) && !is_true( enemy.nuked ) && !isDefined( enemy.slipgun_sizzle ) )
{
trace = bullettrace( origin + vectorScale( ( 0, 0, 1 ), 50 ), enemy.origin + vectorScale( ( 0, 0, 1 ), 50 ), 0, undefined, 1 );
if ( isDefined( trace[ "fraction" ] ) && trace[ "fraction" ] == 1 )
{
enemy.slipgun_sizzle = playfxontag( level._effect[ "slipgun_simmer" ], enemy, tag );
marked_zombies[ marked_zombies.size ] = enemy;
}
}
index++;
if ( index >= enemies.size )
{
break;
}
else
{
enemy = enemies[ index ];
}
}
}
while ( isDefined( marked_zombies ) && marked_zombies.size )
{
_a799 = marked_zombies;
_k799 = getFirstArrayKey( _a799 );
while ( isDefined( _k799 ) )
{
enemy = _a799[ _k799 ];
if ( isalive( enemy ) && !is_true( enemy.guts_explosion ) && !is_true( enemy.nuked ) )
{
wait randomfloatrange( minchainwait, maxchainwait );
if ( isalive( enemy ) && !is_true( enemy.guts_explosion ) && !is_true( enemy.nuked ) )
{
if ( !isDefined( enemy.goo_chain_depth ) )
{
enemy.goo_chain_depth = chain_depth;
}
if ( enemy.health > 0 )
{
if ( player maps/mp/zombies/_zm_powerups::is_insta_kill_active() )
{
enemy.health = 1;
}
enemy dodamage( level.slipgun_damage, origin, player, player, "none", level.slipgun_damage_mod, 0, "slip_goo_zm" );
}
if ( level.slippery_spot_count < level.zombie_vars[ "slipgun_reslip_max_spots" ] )
{
if ( isDefined( enemy.slick_count ) && enemy.slick_count == 0 && enemy.health <= 0 )
{
if ( level.zombie_vars[ "slipgun_reslip_rate" ] > 0 && randomint( level.zombie_vars[ "slipgun_reslip_rate" ] ) == 0 )
{
startpos = origin;
duration = 24;
thread add_slippery_spot( enemy.origin, duration, startpos );
}
}
}
}
}
_k799 = getNextArrayKey( _a799, _k799 );
}
}
}
slipgun_zombie_1st_hit_response( upgraded, player )
{
self notify( "stop_find_flesh" );
self notify( "zombie_acquire_enemy" );
self orientmode( "face default" );
self.ignoreall = 1;
self.gibbed = 1;
if ( isalive( self ) )
{
if ( !isDefined( self.goo_chain_depth ) )
{
self.goo_chain_depth = 0;
}
if ( self.health > 0 )
{
if ( player maps/mp/zombies/_zm_powerups::is_insta_kill_active() )
{
self.health = 1;
}
self dodamage( level.slipgun_damage, self.origin, player, player, "none", level.slipgun_damage_mod, 0, "slip_goo_zm" );
}
}
}
slipgun_zombie_hit_response_internal( mod, damageweapon, player )
{
if ( !self is_slipgun_damage( mod, damageweapon ) && !is_slipgun_explosive_damage( mod, damageweapon ) )
{
return 0;
}
self playsound( "wpn_slipgun_zombie_impact" );
upgraded = damageweapon == "slipgun_upgraded_zm";
self thread slipgun_zombie_1st_hit_response( upgraded, player );
if ( isDefined( player ) && isplayer( player ) )
{
player thread slipgun_play_zombie_hit_vox();
}
return 1;
}
slipgun_zombie_damage_response( mod, hit_location, hit_origin, player, amount )
{
return slipgun_zombie_hit_response_internal( mod, self.damageweapon, player );
}
slipgun_zombie_death_response()
{
if ( !self is_slipgun_damage( self.damagemod, self.damageweapon ) && !is_slipgun_explosive_damage( self.damagemod, self.damageweapon ) )
{
return 0;
}
level maps/mp/zombies/_zm_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self );
self explode_into_goo( self.attacker, 0 );
return 1;
}
is_slipgun_explosive_damage( mod, weapon )
{
if ( isDefined( weapon ) )
{
if ( weapon != "slip_goo_zm" && weapon != "slip_bolt_zm" )
{
return weapon == "slip_bolt_upgraded_zm";
}
}
}
is_slipgun_damage( mod, weapon )
{
if ( isDefined( weapon ) )
{
if ( weapon != "slipgun_zm" )
{
return weapon == "slipgun_upgraded_zm";
}
}
}
slipgun_play_zombie_hit_vox()
{
rand = randomintrange( 0, 101 );
if ( rand >= 20 )
{
self maps/mp/zombies/_zm_audio::create_and_play_dialog( "kill", "human" );
}
}