Add support for Bus Depot to spawn mechz.

Add forever solo game for all maps. Fix emps affecting bosses. Fix electric trap and lava affecting bosses.
This commit is contained in:
JezuzLizard 2024-02-20 00:21:27 -08:00
parent cc5da3d56e
commit 97c880e8b7
11 changed files with 275 additions and 24 deletions

View File

@ -14,8 +14,12 @@ precache()
#using_animtree("mechz_claw");
init_animtree()
{
if ( getDvar( "mapname" ) != "zm_tomb" )
{
wait 0.05;
}
scriptmodelsuseanimtree( #animtree );
}
@ -48,7 +52,7 @@ main()
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" ) )
if ( getDvar( "mapname" ) != "zm_buried" && getDvar( "g_gametype" ) != "zclassic" )
{
registerclientfield( "actor", "anim_rate", 14000, 2, "float", undefined, 0 );
setupclientfieldanimspeedcallbacks( "actor", 1, "anim_rate" );
@ -222,7 +226,7 @@ cleanup_fx( localclientnum, index, bnewent, binitialsnap, fieldname, bwasdemojum
mechz_handle_fx_alt( new_val, old_val )
{
newval = int( new_val );
oldval = int( old_val );
oldval = old_val != "" ? int( old_val ) : 0;
for ( i = 0; i < level.mechz_clientside_fx.size; i++ )
{
set_in_new = ( newval & 1 << i ) != 0;
@ -320,7 +324,7 @@ mechz_screen_shake_loop( localclientnum )
mechz_claw_callback_alt( new_val, old_val )
{
oldval = int( old_val );
oldval = old_val != "" ? int( old_val ) : 0;
newval = int( new_val );
if ( oldval == 1 && newval == 0 )
{

View File

@ -54683,3 +54683,67 @@
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_town zgrief_town"
}
{
"targetname" "zone_pri_spawners"
"script_noteworthy" "mechz_location"
"origin" "-6587 5366 -55"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_transit zgrief_transit"
}
{
"targetname" "zone_station_ext_spawners"
"script_noteworthy" "mechz_location"
"origin" "-5935 5280 -52"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_transit zgrief_transit"
}
{
"targetname" "zone_station_ext_spawners"
"script_noteworthy" "mechz_location"
"origin" "-6222 4594 -63"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_transit zgrief_transit"
}
{
"targetname" "zone_station_ext_spawners"
"script_noteworthy" "mechz_location"
"origin" "-7141 4763 -63"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_transit zgrief_transit"
}
{
"targetname" "zone_trans_2b_spawners"
"script_noteworthy" "mechz_location"
"origin" "-7868 4832 -57"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_transit zgrief_transit"
}
{
"targetname" "zone_far_ext_spawners"
"script_noteworthy" "mechz_location"
"origin" "7906 -5698 10"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_farm zgrief_farm"
}
{
"targetname" "zone_brn_spawners"
"script_noteworthy" "mechz_location"
"origin" "8177 -4678 264"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_farm zgrief_farm"
}
{
"targetname" "zone_brn_spawners"
"script_noteworthy" "mechz_location"
"origin" "8214 -5498 40"
"classname" "script_struct"
"angles" "0 0 0"
"script_string" "zclassic_transit zstandard_farm zgrief_farm"
}

View File

@ -394,6 +394,9 @@ brutus_spawn( starting_health, has_helmet, helmet_hits, explosive_dmg_taken, zon
}
self setphysparams( width, 0, 60 );
self.immune_to_slowgun = true;
self.ignore_inert = true;
self.ignore_lava_damage = true;
self.ignore_electric_trap = true;
self.zombie_init_done = 1;
self notify( "zombie_init_done" );
self.allowpain = 0;

View File

@ -407,7 +407,7 @@ dog_init()
self.gibbed = 0;
self.head_gibbed = 0;
self.default_goalheight = 40;
self.ignore_inert = 1;
self.ignore_inert = true;
self.grenadeawareness = 0;
self.badplaceawareness = 0;
self.ignoresuppression = 1;

View File

@ -622,6 +622,9 @@ prespawn()
self endon( "death" );
level endon( "intermission" );
self.immune_to_slowgun = true;
self.ignore_inert = true;
self.ignore_lava_damage = true;
self.ignore_electric_trap = true;
self maps\mp\zombies\_zm_ai_ghost_ffotd::prespawn_start();
self.startinglocation = self.origin;
self.animname = "ghost_zombie";

View File

@ -615,6 +615,9 @@ mechz_spawn()
level notify( "sam_clue_mechz", self );
self.closest_player_override = maps\mp\zombies\_zm_ai_mechz::get_favorite_enemy;
self.immune_to_slowgun = true;
self.ignore_inert = true;
self.ignore_lava_damage = true;
self.ignore_electric_trap = true;
self.animname = "mechz_zombie";
self.has_legs = 1;
self.no_gib = 1;

View File

@ -13,10 +13,18 @@ execute_clientfield_alt_callback_internal( data, last_data, field_type, field_na
get_data_from_payload( payload )
{
struct = spawnStruct();
if ( payload != "" )
{
tokens = strTok( payload, " " );
struct.entnum = int( tokens[ 0 ] );
struct.value = tokens[ 1 ];
}
else
{
struct.entnum = -1;
struct.value = "";
}
return struct;
}
@ -39,6 +47,12 @@ handle_clientfield_alt_callbacks( dvar_name, field_type, field_name )
dvar_value = getDvar( dvar_name );
if ( dvar_value != old_dvar_value )
{
if ( getDvarInt( "clientfield_alt_debug" ) )
{
print( "handle_clientfield_alt_callbacks( " + dvar_name + ", " + field_type + ", " + field_name + " )" );
print( "handle_clientfield_alt_callbacks() dvar_value: \"" + dvar_value + "\" old_dvar_value: \"" + old_dvar_value + "\"" );
}
level execute_clientfield_alt_callback( dvar_value, old_dvar_value, field_type, field_name );
old_dvar_value = dvar_value;
}

View File

@ -0,0 +1,75 @@
main()
{
level thread watch_say_notify_dvar();
level thread command_thread();
}
watch_say_notify_dvar()
{
setDvar( "say_notify", "" );
old_dvar_value = getdvar( "say_notify" );
for (;;)
{
dvar_value = getdvar( "say_notify" );
if ( dvar_value != old_dvar_value )
{
level notify( "say", dvar_value );
setDvar( "say_notify", "" );
}
wait 0.01;
}
}
command_thread()
{
for (;;)
{
level waittill( "say", message );
args = strTok( message, " " );
switch ( args[ 0 ] )
{
case "printentities":
level thread print_entities();
break;
}
}
}
print_ent_field( message, field )
{
if ( isDefined( field ) )
{
print( message + field );
}
else
{
print( message + "none" );
}
}
print_entities()
{
ents = getEntArray( 0 );
print( "******CLIENT ENTITIES******" );
print( "Listing " + ents.size + " entities" );
foreach ( ent in ents )
{
entnum = ent getEntityNumber();
print( "***ENT " + entnum + "***" );
print_ent_field( "Classname: ", ent.classname );
print_ent_field( "Origin: ", ent.origin );
print_ent_field( "Angles: ", ent.angles );
print_ent_field( "Target: ", ent.target );
print_ent_field( "Targetname: ", ent.targetname );
print_ent_field( "Script_noteworthy: ", ent.script_noteworthy );
print_ent_field( "Model: ", ent.model );
print_ent_field( "Team: ", ent.team );
print( "**************" );
}
print( "Listed " + ents.size + " entities" );
}

View File

@ -32,26 +32,58 @@ command_thread()
{
level waittill( "say", message, player, is_hidden );
if ( message == "print" )
args = strTok( message, " " );
is_server = args[ 0 ] == "s";
is_client = args[ 0 ] == "c";
if ( is_server )
{
if ( !isDefined( args[ 1 ] ) )
{
player iPrintLn( "Missing second argument" );
continue;
}
switch ( args[ 1 ] )
{
case "print":
player iPrintLn( player.origin );
}
else if ( message == "points" )
{
break;
case "points":
player.score = 1000000;
}
else if ( message == "setdoground" )
{
break;
case "setdoground":
level.next_dog_round = level.round_number + 1;
}
else if ( message == "spawnmechz" )
{
break;
case "spawnmechz":
level.mechz_left_to_spawn = 1;
level notify( "spawn_mechz" );
}
else if ( message == "spawnbrutus" )
{
break;
case "spawnbrutus":
level notify( "spawn_brutus", 1 );
break;
case "printentities":
level thread print_entities();
break;
}
}
else if ( is_client )
{
if ( !isDefined( args[ 1 ] ) )
{
player iPrintLn( "Missing second argument" );
continue;
}
switch ( args[ 1 ] )
{
case "printentities":
player setClientDvar( "say_notify", "printentities" );
break;
}
}
else
{
player iPrintLn( "First argument must be s or c" );
}
}
}
@ -413,3 +445,39 @@ draw_nodes()
wait 0.05;
}
}
print_ent_field( message, field )
{
if ( isDefined( field ) )
{
print( message + field );
}
else
{
print( message + "none" );
}
}
print_entities()
{
ents = getEntArray();
print( "******SERVER ENTITIES******" );
print( "Listing " + ents.size + " entities" );
foreach ( ent in ents )
{
entnum = ent getEntityNumber();
print( "***ENT " + entnum + "***" );
print_ent_field( "Classname: ", ent.classname );
print_ent_field( "Origin: ", ent.origin );
print_ent_field( "Angles: ", ent.angles );
print_ent_field( "Target: ", ent.target );
print_ent_field( "Targetname: ", ent.targetname );
print_ent_field( "Script_noteworthy: ", ent.script_noteworthy );
print_ent_field( "Model: ", ent.model );
print_ent_field( "Team: ", ent.team );
print( "**************" );
}
print( "Listed " + ents.size + " entities" );
}

View File

@ -54,6 +54,10 @@ main()
level [[ level.ai_data[ keys[ i ] ].main ]]();
}
}
if ( level.script != "zm_tomb" && level.script != "zm_prison" )
{
level thread check_solo_status();
}
}
init()
@ -312,3 +316,15 @@ watch_crash_trigger_override()
}
}
}
check_solo_status()
{
if ( getnumexpectedplayers() == 1 && ( !sessionmodeisonlinegame() || !sessionmodeisprivate() ) )
{
level.is_forever_solo_game = 1;
}
else
{
level.is_forever_solo_game = 0;
}
}

View File

@ -56,6 +56,7 @@ script,clientscripts/mp/zombies/_zm_ai_avogadro.csc
script,maps/mp/zombies/_zm_ai_screecher.gsc
script,clientscripts/mp/zombies/_zm_ai_screecher.csc
script,scripts/zm/zm_ai_pack_mod_debug_main.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