From 3ceec870a7b0337b8f04ceb09289dc3841982f41 Mon Sep 17 00:00:00 2001 From: JezuzLizard Date: Sun, 18 Feb 2024 19:40:14 -0800 Subject: [PATCH] Add experimental alternative to clientfields. --- .../mp/zombies/_zm_ai_brutus.csc | 14 +- .../clientscripts/mp/zombies/_zm_ai_mechz.csc | 142 +++++++++++++++--- zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc | 16 +- zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc | 86 +++++++++-- .../maps/mp/zombies/_zm_ai_mechz_booster.gsc | 20 ++- .../maps/mp/zombies/_zm_ai_mechz_claw.gsc | 46 +++++- .../maps/mp/zombies/_zm_ai_mechz_ft.gsc | 11 +- zm_ai_pack/scripts/zm/clientfield_alt_sys.csc | 81 ++++++++++ zm_ai_pack/scripts/zm/clientfield_alt_sys.gsc | 15 ++ zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc | 2 - zm_ai_pack/zone_source/mod.zone | 4 +- 11 files changed, 381 insertions(+), 56 deletions(-) create mode 100644 zm_ai_pack/scripts/zm/clientfield_alt_sys.csc create mode 100644 zm_ai_pack/scripts/zm/clientfield_alt_sys.gsc diff --git a/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_brutus.csc b/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_brutus.csc index 0129bf0..f1886fe 100644 --- a/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_brutus.csc +++ b/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_brutus.csc @@ -3,6 +3,8 @@ #include clientscripts\mp\_utility; #include clientscripts\mp\zombies\_zm_utility; +#include scripts\zm\clientfield_alt_sys; + precache() { @@ -17,8 +19,9 @@ init() main() { - registerclientfield( "actor", "helmet_off", 9000, 1, "int", ::brutus_helmet_launch_cb ); - registerclientfield( "actor", "brutus_lock_down", 9000, 1, "int", ::brutus_lock_down_effects_cb ); + //registerclientfield( "actor", "helmet_off", 9000, 1, "int", ::brutus_helmet_launch_cb ); + //registerclientfield( "actor", "brutus_lock_down", 9000, 1, "int", ::brutus_lock_down_effects_cb ); + register_clientfield_alt( "actor", "brutus_lock_down", "int", ::brutus_lock_down_effects_cb_alt ); registerbrutusfootstepcb( "zm_alcatraz_brutus", ::brutusfootstepcbfunc ); } @@ -34,6 +37,13 @@ brutus_helmet_launch_cb( localclientnum, oldval, newval, bnewent, binitialsnap, } } +brutus_lock_down_effects_cb_alt( new_val, old_val ) +{ + player = getlocalplayer( 0 ); + player earthquake( 0.7, 1, self.origin, 1500 ); + playrumbleonposition( 0, "explosion_generic", self.origin ); +} + brutus_lock_down_effects_cb( localclientnum, oldval, newval, bnewent, binitialsnap, fieldname, bwasdemojump ) { if ( bwasdemojump ) diff --git a/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_mechz.csc b/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_mechz.csc index fba75d0..7877657 100644 --- a/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_mechz.csc +++ b/zm_ai_pack/clientscripts/mp/zombies/_zm_ai_mechz.csc @@ -3,6 +3,9 @@ #include clientscripts\mp\_utility; #include clientscripts\mp\zombies\_zm_utility; +#include scripts\zm\zm_ai_pack_mod_main; +#include scripts\zm\clientfield_alt_sys; + precache() { @@ -40,10 +43,15 @@ add_fx_element( index, fx_element, tag_name, min_freq, max_freq ) main() { - registerclientfield( "actor", "mechz_fx", 14000, 12, "int", ::mechz_handle_fx ); - registerclientfield( "toplayer", "mechz_grab", 14000, 1, "int", ::mechz_claw_callback ); - registerclientfield( "actor", "anim_rate", 14000, 2, "float", undefined, 0 ); - setupclientfieldanimspeedcallbacks( "actor", 1, "anim_rate" ); + register_clientfield_alt( "toplayer", "mechz_grab", "int", ::mechz_claw_callback_alt ); + register_clientfield_alt( "actor", "mechz_fx", "int", ::mechz_handle_fx_alt ); + //registerclientfield( "actor", "mechz_fx", 14000, 12, "int", ::mechz_handle_fx ); + //registerclientfield( "toplayer", "mechz_grab", 14000, 1, "int", ::mechz_claw_callback ); + if ( getDvar( "mapname" ) != "zm_buried" && getDvar( "g_gametype" != "zclassic" ) ) + { + registerclientfield( "actor", "anim_rate", 14000, 2, "float", undefined, 0 ); + setupclientfieldanimspeedcallbacks( "actor", 1, "anim_rate" ); + } add_fx_element( 0, "maps/zombie_tomb/fx_tomb_mech_dmg_armor", "J_Knee_Attach_LE" ); add_fx_element( 0, "maps/zombie_tomb/fx_tomb_mech_dmg_sparks", "J_Knee_Attach_LE", 0.25, 0.75 ); add_fx_element( 0, "maps/zombie_tomb/fx_tomb_mech_dmg_steam", "J_Knee_Attach_LE", 0.1, 0.3 ); @@ -120,32 +128,77 @@ init() init_animtree(); } +setup_fx_alt( index ) +{ + if ( !is_true( self.fx_initialized ) ) + { + self.fx_initialized = 1; + self.smoke_fx = playfxontag( 0, level._effect["mech_exhaust_smoke"], self, "tag_back_exhaust_FX" ); + self setsoundentcontext( "f35", "interior" ); + } + + if ( index == 10 ) + self setsoundentcontext( "f35", "exterior" ); + + for ( i = 0; i < level.mechz_clientside_fx[index].size; i++ ) + { + fx_struct = level.mechz_clientside_fx[index][i]; + unique_script_id = "kill_fx_" + index + "_" + self getentitynumber(); + self thread sndplayfxloops( 0, index, fx_struct.tag_name ); + + if ( isdefined( fx_struct.min_freq ) ) + { + self thread mechz_do_manual_looping_fx( 0, unique_script_id, fx_struct.tag_name, fx_struct.fx_element, fx_struct.min_freq, fx_struct.max_freq ); + continue; + } + + self thread mechz_do_auto_looping_fx( 0, index, fx_struct.tag_name, fx_struct.fx_element ); + } +} + setup_fx( localclientnum, index, bnewent, binitialsnap, fieldname, bwasdemojump ) { - if ( !is_true( self.fx_initialized ) ) - { - self.fx_initialized = 1; - self.smoke_fx = playfxontag( localclientnum, level._effect["mech_exhaust_smoke"], self, "tag_back_exhaust_FX" ); - self setsoundentcontext( "f35", "interior" ); - } + if ( !is_true( self.fx_initialized ) ) + { + self.fx_initialized = 1; + self.smoke_fx = playfxontag( localclientnum, level._effect["mech_exhaust_smoke"], self, "tag_back_exhaust_FX" ); + self setsoundentcontext( "f35", "interior" ); + } - if ( index == 10 ) - self setsoundentcontext( "f35", "exterior" ); + if ( index == 10 ) + self setsoundentcontext( "f35", "exterior" ); - for ( i = 0; i < level.mechz_clientside_fx[index].size; i++ ) - { - fx_struct = level.mechz_clientside_fx[index][i]; - unique_script_id = "kill_fx_" + index + "_" + self getentitynumber(); - self thread sndplayfxloops( localclientnum, index, fx_struct.tag_name ); + for ( i = 0; i < level.mechz_clientside_fx[index].size; i++ ) + { + fx_struct = level.mechz_clientside_fx[index][i]; + unique_script_id = "kill_fx_" + index + "_" + self getentitynumber(); + self thread sndplayfxloops( localclientnum, index, fx_struct.tag_name ); - if ( isdefined( fx_struct.min_freq ) ) - { - self thread mechz_do_manual_looping_fx( localclientnum, unique_script_id, fx_struct.tag_name, fx_struct.fx_element, fx_struct.min_freq, fx_struct.max_freq ); - continue; - } + if ( isdefined( fx_struct.min_freq ) ) + { + self thread mechz_do_manual_looping_fx( localclientnum, unique_script_id, fx_struct.tag_name, fx_struct.fx_element, fx_struct.min_freq, fx_struct.max_freq ); + continue; + } - self thread mechz_do_auto_looping_fx( localclientnum, index, fx_struct.tag_name, fx_struct.fx_element ); - } + self thread mechz_do_auto_looping_fx( localclientnum, index, fx_struct.tag_name, fx_struct.fx_element ); + } +} + +cleanup_fx_alt( index ) +{ + unique_script_id = "kill_fx_" + index + "_" + self getentitynumber(); + fx_array = level.mechz_clientside_fx_inst[index]; + + if ( isdefined( fx_array ) && fx_array.size > 0 ) + { + for ( i = fx_array.size - 1; i >= 0; i-- ) + { + stopfx( 0, fx_array[i] ); + fx_array[i] = undefined; + } + } + + self notify( unique_script_id ); } cleanup_fx( localclientnum, index, bnewent, binitialsnap, fieldname, bwasdemojump ) @@ -165,6 +218,34 @@ cleanup_fx( localclientnum, index, bnewent, binitialsnap, fieldname, bwasdemojum self notify( unique_script_id ); } +mechz_handle_fx_alt( new_val, old_val ) +{ + newval = int( new_val ); + oldval = int( old_val ); + for ( i = 0; i < level.mechz_clientside_fx.size; i++ ) + { + set_in_new = ( newval & 1 << i ) != 0; + set_in_old = ( oldval & 1 << i ) != 0; + + if ( set_in_new && !set_in_old ) + { + self thread setup_fx_alt( i ); + continue; + } + + if ( !set_in_new && set_in_old ) + self thread cleanup_fx_alt( i ); + } + + if ( !newval && is_true( self.fx_initialized ) ) + { + self.fx_initialized = 0; + + if ( isdefined( self.smoke_fx ) ) + deletefx( 0, self.smoke_fx ); + } +} + mechz_handle_fx( localclientnum, oldval, newval, bnewent, binitialsnap, fieldname, bwasdemojump ) { for ( i = 0; i < level.mechz_clientside_fx.size; i++ ) @@ -236,6 +317,19 @@ mechz_screen_shake_loop( localclientnum ) } } +mechz_claw_callback_alt( new_val, old_val ) +{ + oldval = int( old_val ); + newval = int( new_val ); + if ( oldval == 1 && newval == 0 ) + { + self stoprumble( 0, "mechz_footsteps" ); + self notify( "kill_screen_shake" ); + } + else if ( newval == 1 ) + self thread mechz_screen_shake_loop( 0 ); +} + mechz_claw_callback( localclientnum, oldval, newval, bnewent, binitialsnap, fieldname, bwasdemojump ) { if ( oldval == 1 && newval == 0 ) diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc index aafb2e7..5946dae 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_brutus.gsc @@ -19,6 +19,8 @@ #include maps\mp\animscripts\zm_death; #include maps\mp\zombies\_zm_perks; +#include scripts\zm\clientfield_alt_sys; + precache() { level._effect["brutus_flashlight"] = loadfx( "maps/zombie_alcatraz/fx_alcatraz_brut_light" ); @@ -62,8 +64,8 @@ main() precachestring( &"ZOMBIE_LOCKED_COST_6000" ); flag_init( "brutus_setup_complete" ); setdvar( "zombie_double_wide_checks", 1 ); - registerclientfield( "actor", "helmet_off", 9000, 1, "int" ); - registerclientfield( "actor", "brutus_lock_down", 9000, 1, "int" ); + //registerclientfield( "actor", "helmet_off", 9000, 1, "int" ); + //registerclientfield( "actor", "brutus_lock_down", 9000, 1, "int" ); if ( !isdefined( level.vsmgr_prio_zm_brutus_teargas ) ) level.vsmgr_prio_overlay_zm_ai_screecher_blur = 50; @@ -2448,15 +2450,15 @@ brutus_lockdown_client_effects( delay ) if ( isdefined( delay ) ) wait( delay ); - if ( self.brutus_lockdown_state ) + self.brutus_lockdown_state = !self.brutus_lockdown_state; + + if ( level.script == "zm_tomb" ) { - self.brutus_lockdown_state = 0; - self setclientfield( "brutus_lock_down", 0 ); + self setclientfield( "brutus_lock_down", self.brutus_lockdown_state ); } else { - self.brutus_lockdown_state = 1; - self setclientfield( "brutus_lock_down", 1 ); + set_clientfield_alt_allplayers( "actor", "brutus_lock_down", self, self.brutus_lockdown_state ); } } diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc index 0c0b651..6c19179 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz.gsc @@ -22,6 +22,8 @@ //#include maps\mp\zm_tomb_chamber; #include maps\mp\zombies\_zm_ai_basic; +#include scripts\zm\clientfield_alt_sys; + precache() { level thread mechz_setup_armor_pieces(); @@ -47,9 +49,12 @@ precache() register_clientfields() { - registerclientfield( "actor", "mechz_fx", 14000, 12, "int" ); - registerclientfield( "toplayer", "mechz_grab", 14000, 1, "int" ); - registerclientfield( "actor", "anim_rate", 14000, 2, "float" ); + //registerclientfield( "actor", "mechz_fx", 14000, 12, "int" ); + //registerclientfield( "toplayer", "mechz_grab", 14000, 1, "int" ); + if ( getDvar( "mapname" ) != "zm_buried" ) + { + registerclientfield( "actor", "anim_rate", 14000, 2, "float" ); + } } register_burn_overlay() @@ -210,7 +215,14 @@ clear_one_off_fx( fx_id ) self endon( "death" ); wait 10; self.fx_field = self.fx_field & ~fx_id; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } } traversal_booster_fx_watcher() @@ -233,8 +245,14 @@ traversal_booster_fx_watcher() self.sndloopent playsound( "zmb_ai_mechz_rocket_stop" ); self.sndloopent stoploopsound( 1 ); } - - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } } } @@ -271,8 +289,14 @@ booster_fx_watcher() self thread clear_one_off_fx( 512 ); } - - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } } } @@ -289,14 +313,28 @@ flamethrower_fx_watcher() else if ( notetrack == "stop_ft" ) self.fx_field = self.fx_field & ~64; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } } } fx_cleanup() { self.fx_field = 0; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } wait_network_frame(); } @@ -576,6 +614,7 @@ mechz_spawn() self.melee_anim_func = ::melee_anim_func; self.meleedamage = 75; self.custom_item_dmg = 2000; + self.ignore_distance_tracking = true; recalc_zombie_array(); width = 15; if ( level.script == "zm_tomb" ) @@ -757,7 +796,14 @@ mechz_death() self mechz_claw_detach(); self release_flamethrower_trigger(); self.fx_field = 0; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow_stop(); self mechz_interrupt(); @@ -1507,7 +1553,14 @@ mechz_launch_armor_piece() self detach( self.armor_state[self.next_armor_piece].model, self.armor_state[self.next_armor_piece].tag ); self.fx_field = self.fx_field | 1 << self.armor_state[self.next_armor_piece].index; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } if ( sndmechzisnetworksafe( "destruction" ) ) self playsound( "zmb_ai_mechz_destruction" ); @@ -1637,7 +1690,14 @@ mechz_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, self.fx_field = self.fx_field | 1024; self.fx_field = self.fx_field & ~2048; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } if ( !( isdefined( self.not_interruptable ) && self.not_interruptable ) && !( isdefined( self.is_traversing ) && self.is_traversing ) ) { diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_booster.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_booster.gsc index 41818c4..6f24395 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_booster.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_booster.gsc @@ -12,6 +12,8 @@ #include maps\mp\animscripts\zm_shared; #include maps\mp\zombies\_zm_spawner; +#include scripts\zm\clientfield_alt_sys; + mechz_in_range_for_jump() { if ( !isdefined( self.jump_pos ) ) @@ -272,7 +274,14 @@ mechz_do_jump( wait_for_stationary_tank ) self show(); self.fx_field = self.fx_field_old; self.fx_field_old = undefined; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self thread maps\mp\zombies\_zm_spawner::zombie_eye_glow(); if ( isdefined( self.m_claw ) ) @@ -298,7 +307,14 @@ mechz_kill_jump_watcher() mechz_jump_cleanup() { self.fx_field = self.fx_field & ~128; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self stopanimscripted(); self notify( "jump_complete" ); } diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_claw.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_claw.gsc index 1e04230..6735db0 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_claw.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_claw.gsc @@ -15,6 +15,8 @@ #include maps\mp\zombies\_zm_laststand; //#include maps\mp\zombies\_zm_weap_riotshield_tomb; +#include scripts\zm\clientfield_alt_sys; + #using_animtree("mechz_claw"); mechz_claw_detach() @@ -48,6 +50,14 @@ mechz_claw_release( bopenclaw ) { if ( isplayer( self.e_grabbed ) ) { + if ( level.script == "zm_tomb" ) + { + self.e_grabbed setclientfieldtoplayer( "mechz_grab", 0 ); + } + else + { + self.e_grabbed set_clientfield_alt_toplayer( "toplayer", "mechz_grab", self.e_grabbed, 0 ); + } self.e_grabbed setclientfieldtoplayer( "mechz_grab", 0 ); self.e_grabbed allowcrouch( 1 ); self.e_grabbed allowprone( 1 ); @@ -163,7 +173,14 @@ claw_grapple() v_claw_origin = self gettagorigin( "tag_claw" ); v_claw_angles = vectortoangles( self.origin - self.favoriteenemy.origin ); self.fx_field = self.fx_field | 256; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self.m_claw setanim( %ai_zombie_mech_grapple_arm_open_idle, 1, 0, 1 ); self.m_claw unlink(); self.m_claw.fx_ent = spawn( "script_model", self.m_claw gettagorigin( "tag_claw" ) ); @@ -211,7 +228,14 @@ claw_grapple() else { self.e_grabbed = player; - self.e_grabbed setclientfieldtoplayer( "mechz_grab", 1 ); + if ( level.script == "zm_tomb" ) + { + self.e_grabbed setclientfieldtoplayer( "mechz_grab", 1 ); + } + else + { + self.e_grabbed set_clientfield_alt_toplayer( "toplayer", "mechz_grab", self.e_grabbed, 1 ); + } self.e_grabbed playerlinktodelta( self.m_claw, "tag_attach_player" ); self.e_grabbed setplayerangles( vectortoangles( self.origin - self.e_grabbed.origin ) ); self.e_grabbed playsound( "zmb_ai_mechz_claw_grab" ); @@ -285,7 +309,14 @@ claw_grapple() self.m_claw.fx_ent delete(); self.m_claw.fx_ent = undefined; self.fx_field = self.fx_field & ~256; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } flag_clear( "mechz_launching_claw" ); if ( isdefined( self.e_grabbed ) ) @@ -558,7 +589,14 @@ mechz_claw_cleanup() { self.fx_field = self.fx_field & ~256; self.fx_field = self.fx_field & ~64; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self mechz_claw_release(); if ( isdefined( self.m_claw ) ) diff --git a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc index f864470..a552a95 100644 --- a/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc +++ b/zm_ai_pack/maps/mp/zombies/_zm_ai_mechz_ft.gsc @@ -12,6 +12,8 @@ #include maps\mp\animscripts\zm_shared; #include maps\mp\_visionset_mgr; +#include scripts\zm\clientfield_alt_sys; + init_flamethrower_triggers() { if ( level.script != "zm_tomb" ) @@ -611,7 +613,14 @@ mechz_kill_flamethrower_watcher() mechz_flamethrower_cleanup() { self.fx_field = self.fx_field & ~64; - self setclientfield( "mechz_fx", self.fx_field ); + if ( level.script == "zm_tomb" ) + { + self setclientfield( "mechz_fx", self.fx_field ); + } + else + { + set_clientfield_alt_allplayers( "actor", "mechz_fx", self, self.fx_field ); + } self.firing = 0; self.doing_tank_sweep = 0; self.cant_melee = 0; diff --git a/zm_ai_pack/scripts/zm/clientfield_alt_sys.csc b/zm_ai_pack/scripts/zm/clientfield_alt_sys.csc new file mode 100644 index 0000000..2ea1039 --- /dev/null +++ b/zm_ai_pack/scripts/zm/clientfield_alt_sys.csc @@ -0,0 +1,81 @@ +execute_clientfield_alt_callback_internal( data, last_data, field_type, field_name ) +{ + entnum = data.entnum; + last_entnum = last_data.entnum; + ent = undefined; + field_data = level.clientfield_alts[ field_type ][ field_name ]; + switch ( field_type ) + { + case "actor": + assert( entnum >= 22 && entnum < 54, "Entnum " + entnum + " out of range for actor" ); + ent = getEntByNum( 0, entnum ); + break; + // case "toplayer": + // default: + // assertMsg( "Unhandled field type " + field_type ); + // break; + } + + assert( isDefined( ent ) ); + + ent thread [[ field_data.callback ]]( data.value, last_data.value ); +} + +get_data_from_payload( payload ) +{ + struct = spawnStruct(); + tokens = strTok( payload, " " ); + + struct.entnum = int( tokens[ 0 ] ); + struct.value = tokens[ 1 ]; + + return struct; +} + +execute_clientfield_alt_callback( payload, last_payload, field_type, field_name ) +{ + data = get_data_from_payload( payload ); + last_data = get_data_from_payload( last_payload ); + + execute_clientfield_alt_callback_internal( data, last_data, field_type, field_name ); +} + +handle_clientfield_alt_callbacks( dvar_name, field_type, field_name ) +{ + level endon( "disconnect" ); + + old_dvar_value = getDvar( dvar_name ); + for (;;) + { + dvar_value = getDvar( dvar_name ); + if ( dvar_value != old_dvar_value ) + { + level execute_clientfield_alt_callback( dvar_value, old_dvar_value, field_type, field_name ); + old_dvar_value = dvar_value; + } + + wait 0.01; + } +} + +register_clientfield_alt( field_type, field_name, field_value_type, field_callback ) +{ + if ( !isDefined( level.clientfield_alts ) ) + { + level.clientfield_alts = []; + } + if ( !isDefined( level.clientfield_alts[ field_type ] ) ) + { + level.clientfield_alts[ field_type ] = []; + } + + struct = spawnStruct(); + struct.value_type = field_value_type; + struct.callback = field_callback; + level.clientfield_alts[ field_type ][ field_name ] = struct; + + dvar_name = field_type + "." + field_name; + setDvar( dvar_name, "" ); + + level thread handle_clientfield_alt_callbacks( dvar_name, field_type, field_name ); +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/clientfield_alt_sys.gsc b/zm_ai_pack/scripts/zm/clientfield_alt_sys.gsc new file mode 100644 index 0000000..3ad21cd --- /dev/null +++ b/zm_ai_pack/scripts/zm/clientfield_alt_sys.gsc @@ -0,0 +1,15 @@ + +set_clientfield_alt_toplayer( field_type, field_name, ent, value ) +{ + entnum = ent getEntityNumber(); + self setClientDvar( field_type + "." + field_name, entnum + " " + value ); +} + +set_clientfield_alt_allplayers( field_type, field_name, ent, value ) +{ + foreach ( player in level.players ) + { + entnum = ent getEntityNumber(); + player setClientDvar( field_type + "." + field_name, entnum + " " + value ); + } +} \ No newline at end of file diff --git a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc index 843bc85..37b3d56 100644 --- a/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc +++ b/zm_ai_pack/scripts/zm/zm_ai_pack_mod_main.gsc @@ -47,8 +47,6 @@ main() // level.ai_data[ "zombie_dog" ].init = maps\mp\zombies\_zm_ai_dogs::enable_dog_rounds; // level.ai_data[ "zombie_dog" ].should_execute = !( level.gametype == "zstandard" && getGametypeSetting( "allowDogs" ) == 1 ); - - keys = getArrayKeys( level.ai_data ); for ( i = 0; i < keys.size; i++ ) { diff --git a/zm_ai_pack/zone_source/mod.zone b/zm_ai_pack/zone_source/mod.zone index d1f47dc..2ac8b85 100644 --- a/zm_ai_pack/zone_source/mod.zone +++ b/zm_ai_pack/zone_source/mod.zone @@ -56,4 +56,6 @@ script,clientscripts/mp/zombies/_zm_ai_screecher.csc script,scripts/zm/zm_ai_pack_mod_debug_main.gsc script,scripts/zm/zm_ai_pack_mod_main.csc -script,scripts/zm/zm_ai_pack_mod_main.gsc \ No newline at end of file +script,scripts/zm/zm_ai_pack_mod_main.gsc +script,scripts/zm/clientfield_alt_sys.csc +script,scripts/zm/clientfield_alt_sys.gsc \ No newline at end of file