

Login Issues
Forgot password?Activate Issues
Account activation email not received? Wrong account activation email used?Other Problems?
Contact Support - Help Center Get help on the UGX Discord. Join it now!![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() | Has released one or more maps to the UGX-Mods community. |



![]() | Has released one or more maps to the UGX-Mods community. |
#include common_scripts\utility;
#include maps\_utility;
//--------------------------------------------------------------
// Checks to see if a player is in a zone_name volume
//--------------------------------------------------------------
player_in_zone( zone_name )
{
// If the zone hasn't been activated, don't even bother checking
if ( !IsDefined(level.zones[ zone_name ]) )
{
return false;
}
zone = level.zones[ zone_name ];
// Okay check to see if a player is in one of the zone volumes
players = get_players();
{
for (i = 0; i < zone.volumes.size; i++)
{
for (j = 0; j < players.size; j++)
{
if ( players[j] IsTouching(zone.volumes[i]) )
return true;
}
}
}
return false;
}
//
// Disable exterior_goals that have a script_noteworthy. This can prevent zombies from
// pathing to a goal that the zombie can't path towards the player after entering.
// It is assumed these will be activated later, when the zone gets initialized.
deactivate_initial_barrier_goals()
{
special_goals = getstructarray("exterior_goal", "targetname");
for (i = 0; i < special_goals.size; i++)
{
if (IsDefined(special_goals[i].script_noteworthy))
{
special_goals[i].is_active = undefined;
special_goals[i] trigger_off();
}
}
}
//
// Allows zombies to path to the specified barriers.
// All barriers with a script_noteworthy should initially triggered off by
// deactivate_barrier_goals
//
activate_barrier_goals(barrier_name, key)
{
//
entry_points = getstructarray(barrier_name, key);
for(i=0;i<entry_points.size;i++)
{
entry_points[i].is_active = 1;
entry_points[i] trigger_on();
}
}
//--------------------------------------------------------------
// Call this when you want to allow zombies to spawn from a zone
// - Must have at least one info_volume with targetname = (name of the zone)
// - Have the info_volumes target the zone's spawners
//--------------------------------------------------------------
zone_init( zone_name )
{
if ( IsDefined( level.zones[ zone_name ] ) )
{
// It's already been activated
return;
}
// Add this to the list of active zones
level.zones[ zone_name ] = spawnstruct();
level.zones[ zone_name ].is_enabled = false; // Does the zone need to be evaluated?
level.zones[ zone_name ].is_occupied = false; // Is the zone occupied by a player?
level.zones[ zone_name ].is_active = false; // Are the spawners currently enabled for spawning?
level.zones[ zone_name ].adjacent_zones = []; // NOTE: These must be defined in a separate level-specific initialization
level.zones[ zone_name ].volumes = GetEntArray( zone_name, "targetname" );
/*iprintLn("^5~~~~~~~~~~~~Zone '" + zone_name + "' initialized~~~~~~~~~~~");
if(level.zones[ zone_name ].volumes.size <= 0) iprintLn("^1Error: No volumes found for zone!");
else iprintLn("^2[OK] Volumes in " + zone_name + ": " + level.zones[ zone_name ].volumes.size);*/
//assertEx( IsDefined( level.zones[ zone_name ].volumes[0] ), "zone_init: No volumes found for zone: "+zone_name );
if ( IsDefined( level.zones[ zone_name ].volumes[0].target ) )
{
// Grab all of the zombie and dog spawners and sort them into two arrays
level.zones[ zone_name ].spawners = [];
level.zones[ zone_name ].dog_spawners = [];
spawners = GetEntArray( level.zones[ zone_name ].volumes[0].target, "targetname" );
/*if(isDefined(spawners) && spawners.size > 0)
iprintLn("^2[OK] " + zone_name + " has " + spawners.size + " linked spawners.");
else
iprintLn("^1Error: " + zone_name + " has no linked spawners! This MUST be fixed , otherwise the zone is useless and will cause a script_runtime error.");*/
for (i = 0; i < spawners.size; i++)
{
if ( issubstr(spawners[i].classname, "dog") )
{
level.zones[ zone_name ].dog_spawners = add_to_array( level.zones[ zone_name ].dog_spawners, spawners[i] );
}
else
{
level.zones[ zone_name ].spawners = add_to_array( level.zones[ zone_name ].spawners, spawners[i] );
}
}
level.zones[ zone_name ].dog_locations = GetStructArray(level.zones[ zone_name ].volumes[0].target + "_dog", "targetname");
// grab all zombie rise locations for the zone
level.zones[ zone_name ].rise_locations = GetStructArray(level.zones[ zone_name ].volumes[0].target + "_rise", "targetname");
}
}
//
// Turn on the zone
enable_zone( zone_name )
{
level.zones[ zone_name ].is_enabled = true;
//iprintLn("^5Info: All spawners in " + zone_name + " have been enabled.");
// activate any player spawn points
spawn_points = getstructarray("player_respawn_point", "targetname");
for( i = 0; i < spawn_points.size; i++ )
{
if ( spawn_points[i].script_noteworthy == zone_name )
{
spawn_points[i].locked = false;
}
}
activate_barrier_goals( zone_name+"_barriers", "script_noteworthy" );
}
//
// Makes zone_a connected to zone_b. If one_way is false, zone_b is also made "adjacent" to zone_a
add_adjacent_zone( zone_name_a, zone_name_b, flag_name, one_way )
{
if ( !IsDefined( one_way ) )
{
one_way = false;
}
// If it's not already activated, it will activate the zone
// If it's already activated, it won't do anything.
zone_init( zone_name_a );
zone_init( zone_name_b );
// B becomes an adjacent zone of A
if ( !IsDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) )
{
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = SpawnStruct();
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = false;
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags_do_or_check = false;
if ( IsArray( flag_name ) )
{
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags = flag_name;
}
else
{
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags[0] = flag_name;
}
}
else
{
// we've already defined a link condition, but we need to add another one and treat
// it as an "OR" condition
assertEx( !IsArray( flag_name ), "add_adjacent_zone: can't mix single and arrays of flags" );
size = level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags.size;
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags[ size ] = flag_name;
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].flags_do_or_check = true;
}
if ( !one_way )
{
if ( !IsDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) )
{
// A becomes an adjacent zone of B
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = SpawnStruct();
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = false;
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags_do_or_check = false;
if ( IsArray( flag_name ) )
{
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags = flag_name;
}
else
{
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags[0] = flag_name;
}
}
else
{
// we've already defined a link condition, but we need to add another one and treat
// it as an "OR" condition
assertEx( !IsArray( flag_name ), "add_adjacent_zone: can't mix single and arrays of flags" );
size = level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags.size;
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags[ size ] = flag_name;
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].flags_do_or_check = true;
}
}
}
//--------------------------------------------------------------
// Gathers all flags that need to be evaluated and sets up waits for them
//--------------------------------------------------------------
setup_zone_flag_waits()
{
flags = [];
for( z=0; z<level.zones.size; z++ )
{
zkeys = GetArrayKeys( level.zones );
for ( az = 0; az<level.zones[ zkeys[z] ].adjacent_zones.size; az++ )
{
azkeys = GetArrayKeys( level.zones[ zkeys[z] ].adjacent_zones );
for ( f = 0; f< level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags.size; f++ )
{
no_dupes = array_check_for_dupes( flags, level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags[f] );
if( no_dupes )
{
flags = add_to_array(flags, level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags[f] );
}
}
}
}
for( i=0; i<flags.size; i++ )
{
level thread zone_flag_wait( flags[i] );
}
}
//
// Wait for a zone flag to be set and then update zones
//
zone_flag_wait( flag_name )
{
if ( !IsDefined( level.flag[ flag_name ] ) )
{
flag_init( flag_name );
}
flag_wait( flag_name );
// Enable adjacent zones if all flags are set for a connection
for( z=0; z<level.zones.size; z++ )
{
zkeys = GetArrayKeys( level.zones );
for ( az = 0; az<level.zones[ zkeys[z] ].adjacent_zones.size; az++ )
{
azkeys = GetArrayKeys( level.zones[ zkeys[z] ].adjacent_zones );
if ( !level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].is_connected )
{
if ( level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags_do_or_check )
{
// If ANY flag is set, then connect zones
flags_set = false;
for ( f = 0; f< level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags.size; f++ )
{
if ( flag( level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags[f] ) )
{
flags_set = true;
break;
}
}
if ( flags_set )
{
level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].is_connected = true;
if ( !level.zones[ azkeys[az] ].is_enabled )
{
enable_zone( azkeys[az] );
}
}
}
else
{
// See if ALL the flags have been set, otherwise, move on
flags_set = true;
for ( f = 0; f< level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags.size; f++ )
{
if ( !flag( level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].flags[f] ) )
{
flags_set = false;
}
}
if ( flags_set )
{
level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].is_connected = true;
if ( !level.zones[ azkeys[az] ].is_enabled )
{
enable_zone( azkeys[az] );
}
}
}
}
}
}
}
//--------------------------------------------------------------
// This needs to be called when new zones open up via doors
//--------------------------------------------------------------
connect_zones( zone_name_a, zone_name_b, one_way )
{
if ( !IsDefined( one_way ) )
{
one_way = false;
}
// If it's not already activated, it will activate the zone
// If it's already activated, it won't do anything.
zone_init( zone_name_a );
zone_init( zone_name_b );
enable_zone( zone_name_a );
enable_zone( zone_name_b );
// B becomes an adjacent zone of A
if ( !IsDefined( level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] ) )
{
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ] = SpawnStruct();
level.zones[ zone_name_a ].adjacent_zones[ zone_name_b ].is_connected = true;
}
if ( !one_way )
{
// A becomes an adjacent zone of B
if ( !IsDefined( level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] ) )
{
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ] = SpawnStruct();
level.zones[ zone_name_b ].adjacent_zones[ zone_name_a ].is_connected = true;
}
}
}
//--------------------------------------------------------------
// This one function will handle managing all zones in your map
// to turn them on/off - probably the best way to handle this
//--------------------------------------------------------------
manage_zones( initial_zone )
{
assertEx( IsDefined( initial_zone ), "You must specify an initial zone to manage" );
deactivate_initial_barrier_goals(); // Must be called before zone_init
level.zones = [];
// Setup zone connections
if ( IsDefined( level.zone_manager_init_func ) )
{
[[ level.zone_manager_init_func ]]();
}
if ( IsArray( initial_zone ) )
{
for ( i = 0; i < initial_zone.size; i++ )
{
zone_init( initial_zone[i] );
enable_zone( initial_zone[i] );
}
}
else
{
zone_init( initial_zone );
enable_zone( initial_zone );
}
setup_zone_flag_waits();
// Now iterate through the active zones and see if we need to activate spawners
while(getdvarint("noclip") == 0 || getdvarint("notarget") != 0 )
{
zkeys = GetArrayKeys( level.zones );
// clear out active zone flags
for( z=0; z<zkeys.size; z++ )
{
level.zones[ zkeys[z] ].is_active = false;
level.zones[ zkeys[z] ].is_occupied = false;
}
// Figure out which zones are active
// If a player occupies a zone, then that zone and any of its enabled adjacent zones will activate
a_zone_is_active = false; // let's us know if an active zone is found
for( z=0; z<zkeys.size; z++ )
{
if ( !level.zones[ zkeys[z] ].is_enabled )
{
continue;
}
level.zones[ zkeys[z] ].is_occupied = player_in_zone( zkeys[z] );
if ( level.zones[ zkeys[z] ].is_occupied )
{
level.zones[ zkeys[z] ].is_active = true;
a_zone_is_active = true;
for ( az=0; az<level.zones[ zkeys[z] ].adjacent_zones.size; az++ )
{
azkeys = GetArrayKeys( level.zones[ zkeys[z] ].adjacent_zones );
if ( level.zones[ zkeys[z] ].adjacent_zones[ azkeys[az] ].is_connected )
{
level.zones[ azkeys[ az ] ].is_active = true;
}
}
}
}
// MM - Special logic for empty spawner list
if ( !a_zone_is_active )
{
if(isDefined(level.zones[ "receiver_zone" ])) //UGX
{
level.zones[ "receiver_zone" ].is_active = true;
level.zones[ "receiver_zone" ].is_occupied = true;
}
}
// Okay now we can modify the spawner list
for( z=0; z<zkeys.size; z++ )
{
zone_name = zkeys[z];
if ( !level.zones[ zkeys[z] ].is_enabled )
{
continue;
}
if ( level.zones[ zone_name ].is_active )
{
// Making an assumption that if one of the zone's spawners is in the array, then all of them are in the array
if ( level.zones[ zone_name ].spawners.size > 0 )
{
no_dupes = array_check_for_dupes( level.enemy_spawns, level.zones[ zone_name ].spawners[0] );
if( no_dupes )
{
for(x=0;x<level.zones[ zone_name ].spawners.size;x++)
{
level.zones[ zone_name ].spawners[x].locked_spawner = false;
level.enemy_spawns = add_to_array(level.enemy_spawns, level.zones[ zone_name ].spawners[x]);
}
}
}
// Making an assumption that if one of the zone's spawners is in the array, then all of them are in the array
if ( level.zones[ zone_name ].dog_spawners.size > 0 )
{
no_dupes = array_check_for_dupes( level.enemy_dog_spawns, level.zones[ zone_name ].dog_spawners[0] );
if( no_dupes )
{
for(x=0;x<level.zones[ zone_name ].dog_spawners.size;x++)
{
level.enemy_dog_spawns = add_to_array(level.enemy_dog_spawns, level.zones[ zone_name ].dog_spawners[x]);
}
}
}
// activate any associated dog_spawn locations
if ( level.zones[ zone_name ].dog_locations.size > 0 )
{
// Making an assumption that if one of the structs
// is in the array, then all of them are in the array
no_dupes = array_check_for_dupes(level.enemy_dog_locations, level.zones[ zone_name ].dog_locations[0]);
if( no_dupes )
{
for(x=0; x<level.zones[ zone_name ].dog_locations.size; x++)
{
level.zones[ zone_name ].dog_locations[x].locked_spawner = false;
level.enemy_dog_locations = add_to_array(level.enemy_dog_locations, level.zones[ zone_name ].dog_locations[x]);
}
}
}
// activate any associated zombie_rise locations
if ( level.zones[ zone_name ].rise_locations.size > 0 )
{
// Making an assumption that if one of the zone's spawners
// is in the array, then all of them are in the array
no_dupes = array_check_for_dupes(level.zombie_rise_spawners, level.zones[ zone_name ].rise_locations[0]);
if( no_dupes )
{
for(x=0; x<level.zones[ zone_name ].rise_locations.size; x++)
{
level.zones[ zone_name ].rise_locations[x].locked_spawner = false;
level.zombie_rise_spawners = add_to_array(level.zombie_rise_spawners, level.zones[ zone_name ].rise_locations[x]);
}
}
}
}
// The zone is not active so disable the spawners
else
{
// Making an assumption that if one of the zone's spawners
// is in the array, then all of them are in the array
if ( level.zones[ zone_name ].spawners.size > 0 )
{
no_dupes = array_check_for_dupes( level.enemy_spawns, level.zones[ zone_name ].spawners[0] );
if( !no_dupes )
{
for(x=0;x<level.zones[ zone_name ].spawners.size;x++)
{
level.zones[ zone_name ].spawners[x].locked_spawner = true;
level.enemy_spawns = array_remove_nokeys(level.enemy_spawns, level.zones[ zone_name ].spawners[x]);
}
}
}
// Making an assumption that if one of the zone's spawners is in the array, then all of them are in the array
if ( level.zones[ zone_name ].dog_spawners.size > 0 )
{
no_dupes = array_check_for_dupes( level.enemy_dog_spawns, level.zones[ zone_name ].dog_spawners[0] );
if( !no_dupes )
{
for(x=0;x<level.zones[ zone_name ].dog_spawners.size;x++)
{
level.enemy_dog_spawns = array_remove_nokeys(level.enemy_dog_spawns, level.zones[ zone_name ].dog_spawners[x]);
}
}
}
// deactivate any associated dog spawn locations
if ( level.zones[ zone_name ].dog_locations.size > 0 )
{
/*if(level.zones[ zone_name ].dog_locations.size == 1)
iPrintLn("^3[Warning] You have placed exactly 1 dog struct in this zone (" + zone_name + "). This will cause a script_runtime error unless you have installed the UGX Modtools Patch or place at least one additional riser struct for this zone.");*/
// Making an assumption that if one of the structs is in the array, then all of them are in the array
no_dupes = array_check_for_dupes(level.enemy_dog_locations, level.zones[ zone_name ].dog_locations[0]);
if( !no_dupes )
{
for(x=0; x<level.zones[ zone_name ].dog_locations.size; x++)
{
level.zones[ zone_name ].dog_locations[x].locked_spawner = false;
level.enemy_dog_locations = array_remove_nokeys(level.enemy_dog_locations, level.zones[ zone_name ].dog_locations[x]);
}
}
}
// deactivate any associated zombie_rise locations
if ( level.zones[ zone_name ].rise_locations.size > 0 )
{
// Making an assumption that if one of the zone's spawners
// is in the array, then all of them are in the array
/*if(level.zones[ zone_name ].rise_locations.size == 1)
iPrintLn("^3[Warning] You have placed exactly 1 riser struct in this zone (" + zone_name + "). This will cause a script_runtime error unless you have installed the UGX Modtools Patch or place at least one additional riser struct for this zone.");*/
no_dupes = array_check_for_dupes(level.zombie_rise_spawners, level.zones[ zone_name ].rise_locations[0]);
if( !no_dupes )
{
for(x=0; x<level.zones[ zone_name ].rise_locations.size; x++)
{
level.zones[ zone_name ].rise_locations[x].locked_spawner = false;
level.zombie_rise_spawners = array_remove_nokeys(level.zombie_rise_spawners, level.zones[ zone_name ].rise_locations[x]);
}
}
}
}
}
//wait a second before another check
wait(1);
}
}
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() | Has released one or more maps to the UGX-Mods community. |