



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!// WARDOGSK93 Anim Start
// Electric Cherry
bo2_cherry_stun_0
bo2_cherry_stun_1
bo2_cherry_stun_2
bo2_cherry_stun_3
bo2_cherry_stun_4
// Whos Who Anims
pb_laststand_idle
pb_stand_alert
// WARDOGSK93 Anim End
/********************WARDOGSK93 PERK CODE********************/
if(maps\wardog\_wardog_util::is_coop_game() && self maps\wardog\perks\_wardog_perks_util::has_perk("tomb"))
self thread maps\wardog\perks\_wardog_perks_bo2::tombstone_spawn();
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
if(self maps\wardog\perks\_wardog_perks_util::has_perk("cherry"))
self thread maps\wardog\perks\_wardog_perks_bo2::electric_cherry_laststand();
if(self maps\wardog\perks\_wardog_perks_util::has_perk("whos"))
{
self thread maps\wardog\perks\_wardog_perks_bo2::chugabud_laststand();
return;
}
/********************WARDOGSK93 PERK CODE********************/
if( level.intermission )
{
level waittill( "forever" );
}
self.intermission = true;
self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime );
self player_fake_death();
if( count == players.size )
{
level notify( "end_game" );
}
else
{
self maps\_callbackglobal::finishPlayerDamageWrapper( eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime );
}
/********************WARDOGSK93 PERK CODE********************/
self.intermission = true;
self thread maps\_laststand::PlayerLastStand(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime);
if(maps\wardog\_wardog_util::is_solo_game() && self maps\wardog\perks\_wardog_perks_util::has_perk("revive"))
{
self thread maps\wardog\perks\_wardog_perks_waw::revive_solo_revive_think();
return;
}
else
self player_fake_death();
if(count == players.size)
level notify("end_game");
else
self maps\_callbackglobal::finishPlayerDamageWrapper(eInflictor, eAttacker, finalDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime);
/********************WARDOGSK93 PERK CODE********************/
if ( revive_success )
{
self thread revive_success( reviver );
return;
}
/********************WARDOGSK93 PERK CODE********************/
if(revive_success)
{
if(IsPlayer(self))
self thread revive_success(reviver);
else
self notify("player_revived", reviver);
return;
}
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
auto_revive(reviver, dont_enable_weapons)
{
self.revivetrigger.auto_revive = true;
if(self.revivetrigger.beingRevived == 1)
{
for(;;)
{
if(self.revivetrigger.beingRevived == 0)
break;
wait_network_frame();
}
}
self notify("player_revived", self);
self RevivePlayer();
self.revives++;
self.stats["revives"] = self.revives;
self thread maps\_arcademode::arcadeMode_player_revive();
if(IsDefined(level.missionCallbacks))
{
maps\_challenges_coop::doMissionCallback("playerRevived", self);
}
setClientSysState("lsm", "0", self);
self.revivetrigger Delete();
self.revivetrigger = undefined;
if(!IsDefined(dont_enable_weapons) || !dont_enable_weapons)
{
self laststand_giveback_player_weapons();
}
self.ignoreme = false;
self thread maps\_laststand::say_revived_vo();
}
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
if(self maps\wardog\perks\_wardog_perks_util::has_perk("phd") && (sMeansOfDeath == "MOD_GRENADE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_EXPLOSIVE" || sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_BURNED" || sMeansOfDeath == "MOD_FALLING"))
{
health = self.health;
self RevivePlayer();
self.health = health;
if(self maps\wardog\perks\_wardog_perks_util::has_perk("jugg"))
self maps\wardog\_wardog_callback::callback("give_perk", "jugg");
else
{
self.maxhealth = 100;
if(self.health > 100)
self.health = 100;
}
return;
}
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
treasure_chest_give_weapon(weapon)
{
self maps\wardog\perks\_wardog_perks_bo1::mule_weapon_give(weapon, true);
}
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
weapon_give(weapon, is_upgrade)
{
self maps\wardog\perks\_wardog_perks_bo1::mule_weapon_give(weapon, false);
}
/********************WARDOGSK93 PERK CODE********************/
tesla_pvp_thread()
{
self endon( "disconnect" );
self endon( "death" );
self waittill( "spawned_player" );
for( ;; )
{
self waittill( "weapon_pvp_attack", attacker, weapon, damage, mod );
if( self maps\_laststand::player_is_in_laststand() )
{
continue;
}
if ( weapon != "tesla_gun" && weapon != "tesla_gun_upgraded" )
{
continue;
}
if ( mod != "MOD_PROJECTILE" && mod != "MOD_PROJECTILE_SPLASH" )
{
continue;
}
self shellshock( "electrocution", 1.0 );
self playsound( "tesla_bounce" );
}
}
/********************WARDOGSK93 PERK CODE********************/
self maps\wardog\_wardog_callback::callback("on_zombie_spawned");
/********************WARDOGSK93 PERK CODE********************/
/********************WARDOGSK93 PERK CODE********************/
powerup thread maps\wardog\perks\_wardog_perks_bo2::vulture_powerup_glow();
/********************WARDOGSK93 PERK CODE********************/
#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;
pre_init()
{
PrecacheItem("zombie_knuckle_crack");
PrecacheModel("zombie_vending_packapunch_on");
PrecacheString(&"ZOMBIE_PERK_PACKAPUNCH");
level._effect["packapunch_fx"] = LoadFX("maps/zombie/fx_zombie_packapunch");
level.packa_jingle = 0;
set_zombie_var("zombie_perk_cost", 2000);
set_zombie_var("zombie_perk_juggernaut_health", 160);
}
init()
{
vending_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname");
if(vending_upgrade_trigger.size >= 1)
array_thread(vending_upgrade_trigger, ::vending_upgrade);
if(!IsDefined(level.packapunch_timeout))
level.packapunch_timeout = 15;
level thread turn_PackAPunch_on();
level thread machine_watcher();
}
third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine )
{
forward = anglesToForward( angles );
interact_pos = origin + (forward*-25);
worldgun = spawn( "script_model", interact_pos );
worldgun.angles = self.angles;
worldgun setModel( GetWeaponModel( current_weapon ) );
PlayFx( level._effect["packapunch_fx"], origin+(0,1,-34), forward );
worldgun rotateto( angles+(0,90,0), 0.35, 0, 0 );
wait( 0.5 );
worldgun moveto( origin, 0.5, 0, 0 );
packa_rollers playsound( "packa_weap_upgrade" );
if( isDefined( perk_machine.wait_flag ) )
{
perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles+(179, 0, 0), 0.25, 0, 0 );
}
wait( 0.35 );
worldgun delete();
wait( 3 );
packa_rollers playsound( "packa_weap_ready" );
worldgun = spawn( "script_model", origin );
worldgun.angles = angles+(0,90,0);
worldgun setModel( GetWeaponModel( current_weapon+"_upgraded" ) );
worldgun moveto( interact_pos, 0.5, 0, 0 );
if( isDefined( perk_machine.wait_flag ) )
{
perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles-(179, 0, 0), 0.25, 0, 0 );
}
wait( 0.5 );
worldgun moveto( origin, level.packapunch_timeout, 0, 0);
return worldgun;
}
vending_upgrade()
{
perk_machine = GetEnt( self.target, "targetname" );
if( isDefined( perk_machine.target ) )
{
perk_machine.wait_flag = GetEnt( perk_machine.target, "targetname" );
}
self UseTriggerRequireLookAt();
self SetHintString( &"ZOMBIE_FLAMES_UNAVAILABLE" );
self SetCursorHint( "HINT_NOICON" );
level waittill("Pack_A_Punch_on");
self thread maps\_zombiemode_weapons::decide_hide_show_hint();
packa_rollers = spawn("script_origin", self.origin);
packa_timer = spawn("script_origin", self.origin);
packa_rollers playloopsound("packa_rollers_loop");
self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH" );
cost = level.zombie_vars["zombie_perk_cost"];
for( ;; )
{
self waittill( "trigger", player );
index = maps\_zombiemode_weapons::get_player_index(player);
cost = 5000;
plr = "plr_" + index + "_";
if( !player maps\_zombiemode_weapons::can_buy_weapon() )
{
wait( 0.1 );
continue;
}
if (player maps\_laststand::player_is_in_laststand() )
{
wait( 0.1 );
continue;
}
if( player isThrowingGrenade() )
{
wait( 0.1 );
continue;
}
if( player isSwitchingWeapons() )
{
wait(0.1);
continue;
}
current_weapon = player getCurrentWeapon();
if( !IsDefined( level.zombie_include_weapons[current_weapon] ) || !IsDefined( level.zombie_include_weapons[current_weapon + "_upgraded"] ) )
{
continue;
}
if ( player.score < cost )
{
//player iprintln( "Not enough points to buy Perk: " + perk );
self playsound("deny");
player thread play_no_money_perk_dialog();
continue;
}
player maps\_zombiemode_score::minus_to_player_score( cost );
self achievement_notify("perk_used");
sound = "bottle_dispense3d";
playsoundatposition(sound, self.origin);
rand = randomintrange(1,100);
if( rand <= 8 )
{
player thread play_packa_wait_dialog(plr);
}
self thread play_vendor_stings("mx_packa_sting");
origin = self.origin;
angles = self.angles;
if( isDefined(perk_machine))
{
origin = perk_machine.origin+(0,0,35);
angles = perk_machine.angles+(0,90,0);
}
self disable_trigger();
player thread do_knuckle_crack();
// Remember what weapon we have. This is needed to check unique weapon counts.
self.current_weapon = current_weapon;
weaponmodel = player third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine );
self enable_trigger();
self SetHintString( &"ZOMBIE_GET_UPGRADED" );
self setvisibletoplayer( player );
self thread wait_for_player_to_take( player, current_weapon, packa_timer );
self thread wait_for_timeout( packa_timer );
self waittill_either( "pap_timeout", "pap_taken" );
self.current_weapon = "";
weaponmodel delete();
self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH" );
self setvisibletoall();
}
}
wait_for_player_to_take( player, weapon, packa_timer )
{
index = maps\_zombiemode_weapons::get_player_index(player);
plr = "plr_" + index + "_";
self endon( "pap_timeout" );
while( true )
{
packa_timer playloopsound( "ticktock_loop" );
self waittill( "trigger", trigger_player );
packa_timer stoploopsound(.05);
if( trigger_player == player )
{
if( !player maps\_laststand::player_is_in_laststand() )
{
self notify( "pap_taken" );
primaries = player GetWeaponsListPrimaries();
if( isDefined( primaries ) && primaries.size >= 2 )
{
player maps\_zombiemode_weapons::weapon_give( weapon+"_upgraded" );
}
else
{
player GiveWeapon( weapon+"_upgraded" );
player GiveMaxAmmo( weapon+"_upgraded" );
}
player SwitchToWeapon( weapon+"_upgraded" );
player achievement_notify( "DLC3_ZOMBIE_PAP_ONCE" );
player achievement_notify( "DLC3_ZOMBIE_TWO_UPGRADED" );
player thread play_packa_get_dialog(plr);
return;
}
}
wait( 0.05 );
}
}
wait_for_timeout( packa_timer )
{
self endon( "pap_taken" );
wait( level.packapunch_timeout );
self notify( "pap_timeout" );
packa_timer stoploopsound(.05);
packa_timer playsound( "packa_deny" );
}
do_knuckle_crack()
{
gun = self upgrade_knuckle_crack_begin();
self.is_drinking = 1;
self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
self upgrade_knuckle_crack_end( gun );
self.is_drinking = undefined;
}
upgrade_knuckle_crack_begin()
{
self DisableOffhandWeapons();
self DisableWeaponCycling();
self AllowLean( false );
self AllowAds( false );
self AllowSprint( false );
self AllowProne( false );
self AllowMelee( false );
if ( self GetStance() == "prone" )
{
self SetStance( "crouch" );
}
primaries = self GetWeaponsListPrimaries();
gun = self GetCurrentWeapon();
weapon = "zombie_knuckle_crack";
if ( gun != "none" && gun != "mine_bouncing_betty" )
{
self TakeWeapon( gun );
}
else
{
return;
}
if( primaries.size <= 1 )
{
self GiveWeapon( "zombie_colt" );
}
self GiveWeapon( weapon );
self SwitchToWeapon( weapon );
return gun;
}
upgrade_knuckle_crack_end( gun )
{
assert( gun != "zombie_perk_bottle_doubletap" );
assert( gun != "zombie_perk_bottle_revive" );
assert( gun != "zombie_perk_bottle_jugg" );
assert( gun != "zombie_perk_bottle_sleight" );
assert( gun != "syrette" );
self EnableOffhandWeapons();
self EnableWeaponCycling();
self AllowLean( true );
self AllowAds( true );
self AllowSprint( true );
self AllowProne( true );
self AllowMelee( true );
weapon = "zombie_knuckle_crack";
// TODO: race condition?
if ( self maps\_laststand::player_is_in_laststand() )
{
self TakeWeapon(weapon);
return;
}
self TakeWeapon(weapon);
primaries = self GetWeaponsListPrimaries();
if( isDefined( primaries ) && primaries.size > 0 )
{
self SwitchToWeapon( primaries[0] );
}
else
{
self SwitchToWeapon( "zombie_colt" );
}
}
// PI_CHANGE_BEGIN
// JMA - in order to have multiple Pack-A-Punch machines in a map we're going to have
// to run a thread on each on.
// NOTE: In the .map, you'll have to make sure that each Pack-A-Punch machine has a unique targetname
turn_PackAPunch_on()
{
level waittill("Pack_A_Punch_on");
vending_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname");
for(i=0; i<vending_upgrade_trigger.size; i++ )
{
perk = getent(vending_upgrade_trigger[i].target, "targetname");
if(isDefined(perk))
{
perk thread activate_PackAPunch();
}
}
}
activate_PackAPunch()
{
self setmodel("zombie_vending_packapunch_on");
self playsound("perks_power_on");
self vibrate((0,-100,0), 0.3, 0.4, 3);
/*
self.flag = spawn( "script_model", machine GetTagOrigin( "tag_flag" ) );
self.angles = machine GetTagAngles( "tag_flag" );
self.flag setModel( "zombie_sign_please_wait" );
self.flag linkto( machine );
self.flag.origin = (0, 40, 40);
self.flag.angles = (0, 0, 0);
*/
timer = 0;
duration = 0.05;
level notify( "Carpenter_On" );
}
// PI_CHANGE_END
play_no_money_perk_dialog()
{
index = maps\_zombiemode_weapons::get_player_index(self);
player_index = "plr_" + index + "_";
if(!IsDefined (self.vox_nomoney_perk))
{
num_variants = maps\_zombiemode_spawner::get_number_variants(player_index + "vox_nomoney_perk");
self.vox_nomoney_perk = [];
for(i=0;i<num_variants;i++)
{
self.vox_nomoney_perk[self.vox_nomoney_perk.size] = "vox_nomoney_perk_" + i;
}
self.vox_nomoney_perk_available = self.vox_nomoney_perk;
}
sound_to_play = random(self.vox_nomoney_perk_available);
self.vox_nomoney_perk_available = array_remove(self.vox_nomoney_perk_available,sound_to_play);
if (self.vox_nomoney_perk_available.size < 1 )
{
self.vox_nomoney_perk_available = self.vox_nomoney_perk;
}
self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, 0.25);
}
machine_watcher()
{
//PI ESM - support for two level switches for Factory
if (isDefined(level.script) && level.script == "nazi_zombie_factory" || level.script == "nazi_zombie_paris" || level.script == "nazi_zombie_coast")
{
level thread machine_watcher_factory("Pack_A_Punch_on");
}
else
{
level waittill("master_switch_activated");
//array_thread(getentarray( "zombie_vending", "targetname" ), ::perks_a_cola_jingle);
}
}
//PI ESM - added for support for two switches in factory
machine_watcher_factory(vending_name)
{
level waittill(vending_name);
switch(vending_name)
{
case "Pack_A_Punch_on":
temp_script_sound = "mx_packa_jingle";
break;
default:
temp_script_sound = "mx_jugger_jingle";
break;
}
temp_machines = getstructarray("perksacola", "targetname");
for (x = 0; x < temp_machines.size; x++)
{
if (temp_machines[x].script_sound == temp_script_sound)
temp_machines[x] thread perks_a_cola_jingle();
}
}
play_vendor_stings(sound)
{
if(!IsDefined (level.packa_jingle))
{
level.packa_jingle = 0;
}
if(!IsDefined (level.eggs))
{
level.eggs = 0;
}
if (level.eggs == 0)
{
if(sound == "mx_packa_sting" && level.packa_jingle == 0)
{
level.packa_jingle = 1;
// iprintlnbold("stinger packapunch:" + level.packa_jingle);
temp_org_pack_s = spawn("script_origin", self.origin);
temp_org_pack_s playsound (sound, "sound_done");
temp_org_pack_s waittill("sound_done");
level.packa_jingle = 0;
temp_org_pack_s delete();
// iprintlnbold("stinger packapunch:" + level.packa_jingle);
}
}
}
perks_a_cola_jingle()
{
self thread play_random_broken_sounds();
if(!IsDefined(self.perk_jingle_playing))
{
self.perk_jingle_playing = 0;
}
if (!IsDefined (level.eggs))
{
level.eggs = 0;
}
while(1)
{
//wait(randomfloatrange(60, 120));
wait(randomfloatrange(31,45));
if(randomint(100) < 15 && level.eggs == 0)
{
level notify ("jingle_playing");
//playfx (level._effect["electric_short_oneshot"], self.origin);
playsoundatposition ("electrical_surge", self.origin);
if(self.script_sound == "mx_packa_jingle" && level.packa_jingle == 0)
{
level.packa_jingle = 1;
temp_org_packa = spawn("script_origin", self.origin);
temp_org_packa playsound (self.script_sound, "sound_done");
temp_org_packa waittill("sound_done");
level.packa_jingle = 0;
temp_org_packa delete();
}
self thread play_random_broken_sounds();
}
}
}
play_random_broken_sounds()
{
level endon ("jingle_playing");
if (!isdefined (self.script_sound))
{
self.script_sound = "null";
}
if (self.script_sound == "mx_revive_jingle")
{
while(1)
{
wait(randomfloatrange(7, 18));
playsoundatposition ("broken_random_jingle", self.origin);
//playfx (level._effect["electric_short_oneshot"], self.origin);
playsoundatposition ("electrical_surge", self.origin);
}
}
else
{
while(1)
{
wait(randomfloatrange(7, 18));
// playfx (level._effect["electric_short_oneshot"], self.origin);
playsoundatposition ("electrical_surge", self.origin);
}
}
}
play_packa_wait_dialog(player_index)
{
waittime = 0.05;
if(!IsDefined (self.vox_perk_packa_wait))
{
num_variants = maps\_zombiemode_spawner::get_number_variants(player_index + "vox_perk_packa_wait");
self.vox_perk_packa_wait = [];
for(i=0;i<num_variants;i++)
{
self.vox_perk_packa_wait[self.vox_perk_packa_wait.size] = "vox_perk_packa_wait_" + i;
}
self.vox_perk_packa_wait_available = self.vox_perk_packa_wait;
}
if(!isdefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}
sound_to_play = random(self.vox_perk_packa_wait_available);
self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, waittime);
self.vox_perk_packa_wait_available = array_remove(self.vox_perk_packa_wait_available,sound_to_play);
if (self.vox_perk_packa_wait_available.size < 1 )
{
self.vox_perk_packa_wait_available = self.vox_perk_packa_wait;
}
}
play_packa_get_dialog(player_index)
{
waittime = 0.05;
if(!IsDefined (self.vox_perk_packa_get))
{
num_variants = maps\_zombiemode_spawner::get_number_variants(player_index + "vox_perk_packa_get");
self.vox_perk_packa_get = [];
for(i=0;i<num_variants;i++)
{
self.vox_perk_packa_get[self.vox_perk_packa_get.size] = "vox_perk_packa_get_" + i;
}
self.vox_perk_packa_get_available = self.vox_perk_packa_get;
}
if(!isdefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}
sound_to_play = random(self.vox_perk_packa_get_available);
self maps\_zombiemode_spawner::do_player_playdialog(player_index, sound_to_play, waittime);
self.vox_perk_packa_get_available = array_remove(self.vox_perk_packa_get_available,sound_to_play);
if (self.vox_perk_packa_get_available.size < 1 )
{
self.vox_perk_packa_get_available = self.vox_perk_packa_get;
}
}
Add 'clientscripts\sanchez\_xS78_fx_system::init();' Above 'thread clientscripts\_audio::audio_init(0);'
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() UGX V.I.P. | |
![]() | Has released one or more maps to the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
Who made those extra VA shaders?
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() UGX V.I.P. | |
![]() | Has released one or more maps to the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
Sanchez made the fx but the dds images are from buried's ipak
Thats why I said extra, so Whos Who, Flopper and such
as for deadshot and a few others they are modified versions of the other perks


![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
Error: 'animation' pb_stand_alert' not defined in anim tree 'generic_human' : (file 'maps/wardog/_wardog_clone.gsc', line 116)
I got this when I tried to start a map with your premade scripts.
Not sure if that's something with my map but I'm gonna look into changing it just thought I'd mention my map wouldn't load with your perk system but that's the only error so should be an easy fix.
-Update:
added missing step from install (You need to add afew anim names to generic_human.atr)
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() UGX V.I.P. | |
![]() | Has released one or more maps to the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
Very good, nice and 95% full, only double tap it isn´t the imagen with the perk Vulture, greetings...


7 Harm Street, Lowood

Please give me beta access, I would LOVE to test CO-OP
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() | Has permission to post map review topics in the Custom Map Reviews section of the forum. |