

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. |
![]() Banned Elite |
#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;
init()
{
vending_triggers = GetEntArray( "zombie_vending_black_ops", "targetname" );
if ( vending_triggers.size < 1 )
{
return;
}
// this map uses atleast 1 perk machine
PrecacheItem( "zombie_perk_bottle_doubletap" );
PrecacheItem( "zombie_perk_bottle_jugg" );
PrecacheItem( "zombie_perk_bottle_revive" );
PrecacheItem( "zombie_perk_bottle_sleight" );
PrecacheItem( "t6_wpn_zmb_perk_bottle_cherry_view" );
PrecacheShader( "vending_phd_shader" );
PrecacheShader( "vending_staminup_shader" );
PrecacheShader( "vending_mule_kick_shader" );
PrecacheShader( "vending_deadshot_shader" );
PrecacheShader( "vending_electric_cherry_shader" );
level._effect["sleight_light"] = loadfx("misc/fx_zombie_cola_on");
level._effect["doubletap_light"] = loadfx("misc/fx_zombie_cola_dtap_on");
level._effect["jugger_light"] = loadfx("misc/fx_zombie_cola_jugg_on");
level._effect["revive_light"] = loadfx("misc/fx_zombie_cola_revive_on");
level._effect["packapunch_fx"] = loadfx("maps/zombie/fx_zombie_packapunch");
//level._effect["sleight_light"] = loadfx("misc/fx_zombie_cola_on");
set_zombie_var( "zombie_perk_cost", 2000 );
set_zombie_var( "zombie_perk_juggernaut_health", 320 );
// this map uses atleast 1 perk machine
array_thread( vending_triggers, ::vending_trigger_think );
//array_thread( vending_triggers, :: electric_perks_dialog);
}
bo_perks_thread()
{
players = getplayers();
for(i=0;i<players.size;i++)
{
players[i] thread staminup();
players[i] thread deadshot();
players[i] thread mulekick();
}
}
vending_trigger_think()
{
//self thread turn_cola_off();
perk = self.script_noteworthy;
self SetHintString( &"ZOMBIE_FLAMES_UNAVAILABLE" );
self SetCursorHint( "HINT_NOICON" );
self UseTriggerRequireLookAt();
notify_name = perk + "_power_on";
flag_wait("electricity_on");
//level waittill( notify_name );
perk_hum = spawn("script_origin", self.origin);
perk_hum playloopsound("perks_machine_loop");
self thread check_player_has_perk(perk);
self vending_set_hintstring(perk);
for( ;; )
{
self waittill( "trigger", player );
index = maps\_zombiemode_weapons::get_player_index(player);
cost = level.zombie_vars["zombie_perk_cost"];
switch( perk )
{
case "specialty_fireproof": //cherry
cost = 3000;
break;
case "specialty_detectexplosive": //phd flopper
cost = 2000;
break;
case "specialty_longersprint": //staminup
cost = 2000;
break;
case "specialty_extraammo": //mule kick
cost = 4000;
break;
case "specialty_bulletaccuracy": //deadshot
cost = 1500;
break;
}
if (player maps\_laststand::player_is_in_laststand() )
{
continue;
}
if(player in_revive_trigger())
{
continue;
}
if( player isThrowingGrenade() )
{
wait( 0.1 );
continue;
}
if( player isSwitchingWeapons() )
{
wait(0.1);
continue;
}
if ( player HasPerk( perk ) )
{
cheat = false;
/#
if ( GetDVarInt( "zombie_cheat" ) >= 5 )
{
cheat = true;
}
#/
}
if ( player.score < cost )
{
//player iprintln( "Not enough points to buy Perk: " + perk );
self playsound("deny");
player thread play_no_money_perk_dialog();
continue;
}
sound = "bottle_dispense3d";
player achievement_notify( "perk_used" );
playsoundatposition(sound, self.origin);
player maps\_zombiemode_score::minus_to_player_score( cost );
///bottle_dispense
switch( perk )
{
case "specialty_detectexplosive":
sound = "mx_jugger_sting";
default:
sound = "mx_jugger_sting";
break;
}
//self thread play_vendor_stings(sound);
//self waittill("sound_done");
// do the drink animation
gun = player perk_give_bottle_begin(perk);
player.is_drinking = 1;
player waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" );
// restore player controls and movement
player perk_give_bottle_end( gun, perk);
player.is_drinking = undefined;
// TODO: race condition?
if ( player maps\_laststand::player_is_in_laststand() )
{
continue;
}
player SetPerk( perk );
//player thread perk_vo("specialty_armorvest");
player setblur( 4, 0.1 );
wait(0.1);
player setblur(0, 0.1);
//earthquake (0.4, 0.2, self.origin, 100);
if(perk == "specialty_armorvest")
{
player.maxhealth = level.zombie_vars["zombie_perk_juggernaut_health"];
player.health = level.zombie_vars["zombie_perk_juggernaut_health"];
player.health = 320;
}
player perk_hud_create( perk );
//stat tracking
player.stats["perks"]++;
//player iprintln( "Bought Perk: " + perk );
bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type perk",
player.playername, player.score, level.round_number, cost, perk, self.origin );
player thread perk_think( perk );
}
}
vending_set_hintstring( perk )
{
switch( perk )
{
case "specialty_fireproof":
self SetHintString( "Press & hold &&1 to buy Electric Cherry [Cost: 3000]" );
break;
case "specialty_detectexplosive":
self SetHintString( "Press & hold &&1 to buy PHD-Flopper [Cost: 2000]" );
break;
case "specialty_longersprint":
self SetHintString( "Press & hold &&1 to buy Stamin-up [Cost: 3000]" );
break;
case "specialty_extraammo":
self SetHintString( "Press & hold &&1 to buy Mule Kick [Cost: 4000]" );
break;
case "specialty_bulletaccuracy":
self SetHintString( "Press & hold &&1 to buy DeadShot Daquiri [Cost: 1500]" );
break;
default:
self SetHintString( perk + " Cost: " + level.zombie_vars["zombie_perk_cost"] );
break;
}
}
perk_think( perk )
{
self waittill_any( "fake_death", "death", "player_downed" );
self UnsetPerk( "specialty_detectexplosive" );
self UnsetPerk( "specialty_longersprint" );
self UnsetPerk( "specialty_extraammo" );
self UnsetPerk( "specialty_bulletaccuracy" );
self.maxhealth = 100;
self perk_hud_destroy( perk );
//self iprintln( "Perk Lost: " + perk );
}
perk_hud_create( perk )
{
if ( !IsDefined( self.perk_hud ) )
{
self.perk_hud = [];
}
shader = "";
switch( perk )
{
case "specialty_fireproof":
shader = "vending_electric_cherry_shader";
break;
case "specialty_detectexplosive":
shader = "vending_phd_shader";
break;
case "specialty_longersprint":
shader = "vending_staminup_shader";
break;
case "specialty_extraammo":
shader = "vending_mule_kick_shader";
break;
case "specialty_bulletaccuracy":
shader = "vending_deadshot_shader";
break;
case "specialty_armorvest":
shader = "specialty_juggernaut_zombies";
break;
case "specialty_quickrevive":
shader = "specialty_quickrevive_zombies";
break;
case "specialty_fastreload":
shader = "specialty_fastreload_zombies";
break;
case "specialty_rof":
shader = "specialty_doubletap_zombies";
break;
default:
shader = "";
break;
}
hud = create_simple_hud( self );
hud.foreground = true;
hud.sort = 1;
hud.hidewheninmenu = false;
hud.alignX = "left";
hud.alignY = "bottom";
hud.horzAlign = "left";
hud.vertAlign = "bottom";
hud.x = self.perk_hud.size * 30;
hud.y = hud.y - 70;
hud.alpha = 1;
hud SetShader( shader, 24, 24 );
self.perk_hud[ perk ] = hud;
}
perk_hud_destroy( perk )
{
self.perk_hud[ perk ] destroy_hud();
self.perk_hud[ perk ] = undefined;
}
perk_give_bottle_end( gun, perk )
{
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 = "";
switch( perk )
{
case "specialty_fireproof":
//weapon = "t6_wpn_zmb_perk_bottle_cherry_view";
weapon = "zombie_perk_bottle_revive";
break;
case "specialty_detectexplosive":
weapon = "zombie_perk_bottle_revive";
break;
case "specialty_longersprint":
weapon = "zombie_perk_bottle_doubletap";
break;
case "specialty_extraammo":
weapon = "zombie_perk_bottle_sleight";
break;
case "specialty_bulletaccuracy":
weapon = "zombie_perk_bottle_doubletap";
break;
}
// TODO: race condition?
if ( self maps\_laststand::player_is_in_laststand() )
{
self TakeWeapon(weapon);
return;
}
if ( gun != "none" && gun != "mine_bouncing_betty" )
{
self SwitchToWeapon( gun );
}
else
{
// try to switch to first primary weapon
primaryWeapons = self GetWeaponsListPrimaries();
if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
{
self SwitchToWeapon( primaryWeapons[0] );
}
}
self TakeWeapon(weapon);
}
perk_vo(type)
{
self endon("death");
self endon("disconnect");
index = maps\_zombiemode_weapons::get_player_index(self);
sound = undefined;
if(!isdefined (level.player_is_speaking))
{
level.player_is_speaking = 0;
}
player_index = "plr_" + index + "_";
//wait(randomfloatrange(1,2));
//TUEY We need to eventually store the dialog in an array so you can add multiple variants...but we only have 1 now anyway.
switch(type)
{
case "specialty_armorvest":
sound_to_play = "vox_perk_jugga_0";
break;
case "specialty_fastreload":
sound_to_play = "vox_perk_speed_0";
break;
case "specialty_quickrevive":
sound_to_play = "vox_perk_revive_0";
break;
case "specialty_rof":
sound_to_play = "vox_perk_doubletap_0";
break;
default:
sound_to_play = "vox_perk_jugga_0";
break;
}
wait(1.0);
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.DLC3.perksNeedPowerOn) && level.DLC3.perksNeedPowerOn)
{
level thread machine_watcher_factory("juggernog_on");
level thread machine_watcher_factory("sleight_on");
level thread machine_watcher_factory("doubletap_on");
level thread machine_watcher_factory("revive_on");
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 "juggernog_on":
temp_script_sound = "mx_jugger_jingle";
break;
case "sleight_on":
temp_script_sound = "mx_speed_jingle";
break;
case "doubletap_on":
temp_script_sound = "mx_doubletap_jingle";
break;
case "revive_on":
temp_script_sound = "mx_revive_jingle";
break;
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.speed_jingle))
{
level.speed_jingle = 0;
}
if(!IsDefined (level.revive_jingle))
{
level.revive_jingle = 0;
}
if(!IsDefined (level.doubletap_jingle))
{
level.doubletap_jingle = 0;
}
if(!IsDefined (level.jugger_jingle))
{
level.jugger_jingle = 0;
}
if(!IsDefined (level.packa_jingle))
{
level.packa_jingle = 0;
}
if(!IsDefined (level.eggs))
{
level.eggs = 0;
}
if (level.eggs == 0)
{
if(sound == "mx_speed_sting" && level.speed_jingle == 0 )
{
// iprintlnbold("stinger speed:" + level.speed_jingle);
level.speed_jingle = 1;
temp_org_speed_s = spawn("script_origin", self.origin);
temp_org_speed_s playsound (sound, "sound_done");
temp_org_speed_s waittill("sound_done");
level.speed_jingle = 0;
temp_org_speed_s delete();
// iprintlnbold("stinger speed:" + level.speed_jingle);
}
else if(sound == "mx_revive_sting" && level.revive_jingle == 0)
{
level.revive_jingle = 1;
// iprintlnbold("stinger revive:" + level.revive_jingle);
temp_org_revive_s = spawn("script_origin", self.origin);
temp_org_revive_s playsound (sound, "sound_done");
temp_org_revive_s waittill("sound_done");
level.revive_jingle = 0;
temp_org_revive_s delete();
// iprintlnbold("stinger revive:" + level.revive_jingle);
}
else if(sound == "mx_doubletap_sting" && level.doubletap_jingle == 0)
{
level.doubletap_jingle = 1;
// iprintlnbold("stinger double:" + level.doubletap_jingle);
temp_org_dp_s = spawn("script_origin", self.origin);
temp_org_dp_s playsound (sound, "sound_done");
temp_org_dp_s waittill("sound_done");
level.doubletap_jingle = 0;
temp_org_dp_s delete();
// iprintlnbold("stinger double:" + level.doubletap_jingle);
}
else if(sound == "mx_jugger_sting" && level.jugger_jingle == 0)
{
level.jugger_jingle = 1;
// iprintlnbold("stinger juggernog" + level.jugger_jingle);
temp_org_jugs_s = spawn("script_origin", self.origin);
temp_org_jugs_s playsound (sound, "sound_done");
temp_org_jugs_s waittill("sound_done");
level.jugger_jingle = 0;
temp_org_jugs_s delete();
// iprintlnbold("stinger juggernog:" + level.jugger_jingle);
}
else 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_speed_jingle" && level.speed_jingle == 0)
{
level.speed_jingle = 1;
temp_org_speed = spawn("script_origin", self.origin);
wait(0.05);
temp_org_speed playsound (self.script_sound, "sound_done");
temp_org_speed waittill("sound_done");
level.speed_jingle = 0;
temp_org_speed delete();
}
if(self.script_sound == "mx_revive_jingle" && level.revive_jingle == 0)
{
level.revive_jingle = 1;
temp_org_revive = spawn("script_origin", self.origin);
wait(0.05);
temp_org_revive playsound (self.script_sound, "sound_done");
temp_org_revive waittill("sound_done");
level.revive_jingle = 0;
temp_org_revive delete();
}
if(self.script_sound == "mx_doubletap_jingle" && level.doubletap_jingle == 0)
{
level.doubletap_jingle = 1;
temp_org_doubletap = spawn("script_origin", self.origin);
wait(0.05);
temp_org_doubletap playsound (self.script_sound, "sound_done");
temp_org_doubletap waittill("sound_done");
level.doubletap_jingle = 0;
temp_org_doubletap delete();
}
if(self.script_sound == "mx_jugger_jingle" && level.jugger_jingle == 0)
{
level.jugger_jingle = 1;
temp_org_jugger = spawn("script_origin", self.origin);
wait(0.05);
temp_org_jugger playsound (self.script_sound, "sound_done");
temp_org_jugger waittill("sound_done");
level.jugger_jingle = 0;
temp_org_jugger delete();
}
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;
}
}
perk_give_bottle_begin( perk )
{
self DisableOffhandWeapons();
self DisableWeaponCycling();
self AllowLean( false );
self AllowAds( false );
self AllowSprint( false );
self AllowProne( false );
self AllowMelee( false );
wait( 0.05 );
if ( self GetStance() == "prone" )
{
self SetStance( "crouch" );
}
gun = self GetCurrentWeapon();
weapon = "";
switch( perk )
{
case "specialty_fireproof":
weapon = "zombie_perk_bottle_revive";
break;
case "specialty_detectexplosive":
weapon = "zombie_perk_bottle_revive";
break;
case "specialty_longersprint":
weapon = "zombie_perk_bottle_doubletap";
break;
case "specialty_extraammo":
weapon = "zombie_perk_bottle_sleight";
break;
case "specialty_bulletaccuracy":
weapon = "zombie_perk_bottle_doubletap";
break;
}
self GiveWeapon( weapon );
self SwitchToWeapon( weapon );
return gun;
}
electric_perks_dialog()
{
self endon ("warning_dialog");
level endon("switch_flipped");
timer =0;
while(1)
{
wait(0.5);
players = get_players();
for(i = 0; i < players.size; i++)
{
dist = distancesquared(players[i].origin, self.origin );
if(dist > 70*70)
{
timer = 0;
continue;
}
if(dist < 70*70 && timer < 3)
{
wait(0.5);
timer ++;
}
if(dist < 70*70 && timer == 3)
{
players[i] thread do_player_vo("vox_start", 5);
wait(3);
self notify ("warning_dialog");
iprintlnbold("warning_given");
}
}
}
}
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);
}
check_player_has_perk(perk)
{
/#
if ( GetDVarInt( "zombie_cheat" ) >= 5 )
{
return;
}
#/
dist = 128 * 128;
while(true)
{
players = get_players();
for( i = 0; i < players.size; i++ )
{
if(DistanceSquared( players[i].origin, self.origin ) < dist)
{
if(!players[i] hasperk(perk) && !(players[i] in_revive_trigger()))
{
//PI CHANGE: this change makes it so that if there are multiple players within the trigger for the perk machine, the hint string is still
// visible to all of them, rather than the last player this check is done for
if (IsDefined(level.script) && level.script == "nazi_zombie_theater")
self setinvisibletoplayer(players[i], false);
else
self setvisibletoplayer(players[i]);
//END PI CHANGE
//iprintlnbold("turn it off to player");
}
else
{
self SetInvisibleToPlayer(players[i]);
//iprintlnbold(players[i].health);
}
}
}
wait(0.1);
}
}
staminup()
{
while(1)
{
if(self hasperk("specialty_longersprint"))
self setmovespeedscale(1.3);
else
self setmovespeedscale(1);
wait .5;
}
}
deadshot()
{
while(1)
{
if(self hasperk("specialty_bulletaccuracy"))
self setClientDvar( "cg_laserForceOn", 1 );
else
self setClientDvar( "cg_laserForceOn", 0 );
wait .1;
}
}
mulekick()
{
while(1)
{
if(self hasperk("specialty_extraammo"))
self.inventorySize = 3;
else
self.inventorySize = 2;
wait .1;
}
}#include maps\_utility;
#include maps\_hud_util;
init()
{
PrecacheItem( "syrette" );
PrecacheItem( "colt_dirty_harry" );
precachestring( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
precachestring( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED" );
precachestring( &"GAME_PLAYER_IS_REVIVING_YOU" );
precachestring( &"GAME_REVIVING" );
if( !IsDefined( level.laststandpistol ) )
{
level.laststandpistol = "colt";
PrecacheItem( level.laststandpistol );
}
//CODER_MOD: TOMMYK 07/13/2008 - Revive text
if( !arcadeMode() )
{
level thread revive_hud_think();
}
level.primaryProgressBarX = 0;
level.primaryProgressBarY = 110;
level.primaryProgressBarHeight = 4;
level.primaryProgressBarWidth = 120;
if ( IsSplitScreen() )
{
level.primaryProgressBarY = 280;
}
if( GetDvar( "revive_trigger_radius" ) == "" )
{
SetDvar( "revive_trigger_radius", "40" );
}
}
player_is_in_laststand()
{
return ( IsDefined( self.revivetrigger ) );
}
player_num_in_laststand()
{
num = 0;
players = get_players();
for ( i = 0; i < players.size; i++ )
{
if ( players[i] player_is_in_laststand() )
num++;
}
return num;
}
player_all_players_in_laststand()
{
return ( player_num_in_laststand() == get_players().size );
}
player_any_player_in_laststand()
{
return ( player_num_in_laststand() > 0 );
}
PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
primaryWeapons = self GetWeaponsListPrimaries();
if(primaryWeapons.size == 3) // he has three weapons
{
current_weapon = self getCurrentWeapon(); // get his current weapon
player_load = self GetWeaponsListPrimaries();
if (current_weapon == primaryWeapons[2])
{
self.take_weapon = player_load[1];
self takeweapon(self.take_weapon);
}
else
{
self.take_weapon = player_load[2];
self takeweapon(self.take_weapon);
}
}
if( sMeansOfDeath == "MOD_CRUSH" ) // if getting run over by a tank then kill the guy even if in laststand
{
if( self player_is_in_laststand() )
{
self mission_failed_during_laststand( self );
}
return;
}
if( self player_is_in_laststand() )
{
return;
}
//CODER_MOD: TOMMYK 06/26/2008 - For coop scoreboards
self.downs++;
//stat tracking
self.stats["downs"] = self.downs;
dvarName = "player" + self GetEntityNumber() + "downs";
setdvar( dvarName, self.downs );
//PI CHANGE: player shouldn't be able to jump while in last stand mode (only was a problem in water) - specifically disallow this
if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
self AllowJump(false);
//END PI CHANGE
if( IsDefined( level.playerlaststand_func ) )
{
[[level.playerlaststand_func]]();
}
//CODER_MOD: Jay (6/18/2008): callback to challenge system
maps\_challenges_coop::doMissionCallback( "playerDied", self );
if ( !laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc ) )
{
self mission_failed_during_laststand( self );
return;
}
// check for all players being in last stand
if ( player_all_players_in_laststand() )
{
self mission_failed_during_laststand( self );
return;
}
// vision set
self VisionSetLastStand( "laststand", 1 );
self.health = 1;
self thread maps\_arcademode::arcadeMode_player_laststand();
// revive trigger
self revive_trigger_spawn();
// laststand weapons
self laststand_take_player_weapons();
self laststand_give_pistol();
self thread laststand_give_grenade();
// AI
self.ignoreme = true;
// bleed out timer
self thread laststand_bleedout( GetDvarFloat( "player_lastStandBleedoutTime" ) );
self notify( "player_downed" );
}
laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc )
{
//MOD TK, loads of stuff will now send u into laststand
if ( sMeansOfDeath != "MOD_PISTOL_BULLET"
&& sMeansOfDeath != "MOD_RIFLE_BULLET"
&& sMeansOfDeath != "MOD_HEAD_SHOT"
&& sMeansOfDeath != "MOD_MELEE"
&& sMeansOfDeath != "MOD_BAYONET"
&& sMeansOfDeath != "MOD_GRENADE"
&& sMeansOfDeath != "MOD_GRENADE_SPLASH"
&& sMeansOfDeath != "MOD_PROJECTILE"
&& sMeansOfDeath != "MOD_PROJECTILE_SPLASH"
&& sMeansOfDeath != "MOD_EXPLOSIVE"
&& sMeansOfDeath != "MOD_BURNED")
{
return false;
}
if( level.laststandpistol == "none" )
{
return false;
}
return true;
}
// self = a player
laststand_take_player_weapons()
{
self.weaponInventory = self GetWeaponsList();
self.lastActiveWeapon = self GetCurrentWeapon();
self.laststandpistol = undefined;
//ASSERTEX( self.lastActiveWeapon != "none", "Last active weapon is 'none,' an unexpected result." );
self.weaponAmmo = [];
for( i = 0; i < self.weaponInventory.size; i++ )
{
weapon = self.weaponInventory[i];
if ( WeaponClass( weapon ) == "pistol" && !IsDefined( self.laststandpistol ) )
{
self.laststandpistol = weapon;
}
switch( weapon )
{
// this player was killed while reviving another player
case "syrette":
// player was killed drinking perks-a-cola
case "zombie_perk_bottle_doubletap":
case "zombie_perk_bottle_revive":
case "zombie_perk_bottle_jugg":
case "zombie_perk_bottle_sleight":
case "zombie_bowie_flourish":
case "zombie_knuckle_crack":
self.lastActiveWeapon = "none";
continue;
}
self.weaponAmmo[weapon]["clip"] = self GetWeaponAmmoClip( weapon );
self.weaponAmmo[weapon]["stock"] = self GetWeaponAmmoStock( weapon );
}
self TakeAllWeapons();
if ( !IsDefined( self.laststandpistol ) )
{
self.laststandpistol = level.laststandpistol;
}
if ( maps\_collectibles::has_collectible( "collectible_dirtyharry" ) )
{
self.laststandpistol = "colt_dirty_harry";
}
}
// self = a player
laststand_giveback_player_weapons()
{
ASSERTEX( IsDefined( self.weaponInventory ), "player.weaponInventory is not defined - did you run laststand_take_player_weapons() first?" );
self TakeAllWeapons();
for( i = 0; i < self.weaponInventory.size; i++ )
{
weapon = self.weaponInventory[i];
switch( weapon )
{
// this player was killed while reviving another player
case "syrette":
// player was killed drinking perks-a-cola
case "zombie_perk_bottle_doubletap":
case "zombie_perk_bottle_revive":
case "zombie_perk_bottle_jugg":
case "zombie_perk_bottle_sleight":
case "zombie_bowie_flourish":
case "zombie_knuckle_crack":
continue;
}
self GiveWeapon( weapon );
self SetWeaponAmmoClip( weapon, self.weaponAmmo[weapon]["clip"] );
if ( WeaponType( weapon ) != "grenade" )
self SetWeaponAmmoStock( weapon, self.weaponAmmo[weapon]["stock"] );
}
// if we can't figure out what the last active weapon was, try to switch a primary weapon
//CHRIS_P: - don't try to give the player back the mortar_round weapon ( this is if the player killed himself with a mortar round)
if( self.lastActiveWeapon != "none" && self.lastActiveWeapon != "mortar_round" && self.lastActiveWeapon != "mine_bouncing_betty" )
{
self SwitchToWeapon( self.lastActiveWeapon );
}
else
{
primaryWeapons = self GetWeaponsListPrimaries();
if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
{
self SwitchToWeapon( primaryWeapons[0] );
}
}
}
laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun )
{
reviveTrigger = playerBeingRevived.revivetrigger;
playerBeingRevived waittill("disconnect");
if( isdefined( reviveTrigger ) )
{
reviveTrigger delete();
}
if( isdefined( self.reviveProgressBar ) )
{
self.reviveProgressBar destroyElem();
}
if( isdefined( self.reviveTextHud ) )
{
self.reviveTextHud destroy();
}
self revive_give_back_weapons( reviverGun );
}
laststand_give_pistol()
{
assert( IsDefined( self.laststandpistol ) );
assert( self.laststandpistol != "none" );
//assert( WeaponClass( self.laststandpistol ) == "pistol" );
if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
{
self GiveWeapon( self.laststandpistol );
ammoclip = WeaponClipSize( self.laststandpistol );
if (self.laststandpistol == "ray_gun")
{
self SetWeaponAmmoClip( self.laststandpistol, ammoclip );
self SetWeaponAmmoStock( self.laststandpistol, 0 );
}
else
{
self SetWeaponAmmoStock( self.laststandpistol, ammoclip * 2 );
}
self SwitchToWeapon( self.laststandpistol );
}
else
{
self GiveWeapon( self.laststandpistol );
self GiveMaxAmmo( self.laststandpistol );
self SwitchToWeapon( self.laststandpistol );
}
}
laststand_give_grenade()
{
self endon ("player_revived");
self endon ("disconnect");
while( self isThrowingGrenade() )
{
wait( 0.05 );
}
// needed to throw back grenades while in last stand
if( level.campaign == "russian" )
{
grenade_choice = "stick_grenade";
}
// MM (7/8/9) - give the player german grenades because that's the only kind we're using
else if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) )
{
grenade_choice = "stielhandgranate";
}
else
{
grenade_choice = "fraggrenade";
}
self GiveWeapon( grenade_choice );
self SetWeaponAmmoClip( grenade_choice, 0 );
self SwitchToOffhand( grenade_choice );
}
laststand_bleedout( delay )
{
self endon ("player_revived");
self endon ("disconnect");
//self PlayLoopSound("heart_beat",delay); // happens on client now DSL
// Notify client that we're in last stand.
setClientSysState("lsm", "1", self);
self.bleedout_time = delay;
while ( self.bleedout_time > Int( delay * 0.5 ) )
{
self.bleedout_time -= 1;
wait( 1 );
}
self VisionSetLastStand( "death", delay * 0.5 );
while ( self.bleedout_time > 0 )
{
self.bleedout_time -= 1;
wait( 1 );
}
//CODER_MOD: TOMMYK 07/13/2008
while( self.revivetrigger.beingRevived == 1 )
{
wait( 0.1 );
}
setClientSysState("lsm", "0", self); // Notify client last stand ended.
if (isdefined(level.is_zombie_level ) && level.is_zombie_level)
{
self [[level.player_becomes_zombie]]();
}
else
{
self.ignoreme = false;
self mission_failed_during_laststand( self );
}
}
// spawns the trigger used for the player to get revived
revive_trigger_spawn()
{
radius = GetDvarInt( "revive_trigger_radius" );
self.revivetrigger = spawn( "trigger_radius", self.origin, 0, radius, radius );
self.revivetrigger setHintString( "" ); // only show the hint string if the triggerer is facing me
self.revivetrigger setCursorHint( "HINT_NOICON" );
self.revivetrigger EnableLinkTo();
self.revivetrigger LinkTo( self );
//CODER_MOD: TOMMYK 07/13/2008 - Revive text
self.revivetrigger.beingRevived = 0;
self.revivetrigger.createtime = gettime();
if ( maps\_collectibles::has_collectible( "collectible_morphine" ) )
{
self maps\_collectibles_game::morphine_think();
}
else
{
self thread revive_trigger_think();
}
//self.revivetrigger thread revive_debug();
}
revive_debug()
{
for ( ;; )
{
self waittill( "trigger", player );
if ( !player player_is_in_laststand() )
iprintln( "revive triggered!" );
wait( 0.05 );
}
}
// logic for the revive trigger
revive_trigger_think()
{
self endon ( "disconnect" );
self endon ( "zombified" );
while ( 1 )
{
wait ( 0.1 );
//assert( DistanceSquared( self.origin, self.revivetrigger.origin ) <= 25 );
//drawcylinder( self.revivetrigger.origin, 32, 32 );
players = get_players();
self.revivetrigger setHintString( "" );
for ( i = 0; i < players.size; i++ )
{
//PI CHANGES - revive should work in deep water for nazi_zombie_sumpf
is_sumpf = 0;
d = 0;
if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
{
is_sumpf = 1;
d = self depthinwater();
}
if ( players[i] can_revive( self ) ||
(is_sumpf == 1 && d > 20))
//END PI CHANGES
{
// TODO: This will turn on the trigger hint for every player within
// the radius once one of them faces the revivee, even if the others
// are facing away. Either we have to display the hints manually here
// (making sure to prioritize against any other hints from nearby objects),
// or we need a new combined radius+lookat trigger type.
self.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
break;
}
}
for ( i = 0; i < players.size; i++ )
{
reviver = players[i];
if ( !reviver is_reviving( self ) )
continue;
// give the syrette
gun = reviver GetCurrentWeapon();
assert( IsDefined( gun ) );
//assert( gun != "none" );
if ( gun == "syrette" )
continue;
reviver GiveWeapon( "syrette" );
reviver SwitchToWeapon( "syrette" );
reviver DisableWeaponCycling();
reviver DisableOffhandWeapons();
reviver SetWeaponAmmoStock( "syrette", 1 );
//CODER_MOD: TOMMY K
revive_success = reviver revive_do_revive( self, gun );
reviver revive_give_back_weapons( gun );
//PI CHANGE: player couldn't jump - allow this again now that they are revived
if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf")
self AllowJump(true);
//END PI CHANGE
if ( revive_success )
{
self thread revive_success( reviver );
return;
}
}
}
}
revive_give_back_weapons( gun )
{
// take the syrette
self TakeWeapon( "syrette" );
self EnableWeaponCycling();
self EnableOffhandWeapons();
if ( gun != "none" && gun != "mine_bouncing_betty" )
{
self SwitchToWeapon( gun );
}
else
{
// try to switch to first primary weapon
primaryWeapons = self GetWeaponsListPrimaries();
if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 )
{
self SwitchToWeapon( primaryWeapons[0] );
}
}
}
can_revive( revivee )
{
if ( !isAlive( self ) )
return false;
if ( self player_is_in_laststand() )
return false;
if( !isDefined( revivee.revivetrigger ) )
return false;
if ( !self IsTouching( revivee.revivetrigger ) )
return false;
//PI CHANGE: can revive in deep water in sumpf
if (IsDefined(level.script) && level.script == "nazi_zombie_sumpf" && (revivee depthinwater() > 10))
return true;
//END PI CHANGE
if ( !self is_facing( revivee ) )
return false;
if( !SightTracePassed( self.origin + ( 0, 0, 50 ), revivee.origin + ( 0, 0, 30 ), false, undefined ) )
return false;
//chrisp - fix issue where guys can sometimes revive thru a wall
if(!bullettracepassed(self.origin + (0,0,50), revivee.origin + ( 0, 0, 30 ), false, undefined) )
{
return false;
}
// SRS 9/2/2008: in zombie mode, disallow revive if potential reviver is a zombie
if( IsDefined( level.is_zombie_level ) && level.is_zombie_level )
{
if( IsDefined( self.is_zombie ) && self.is_zombie )
{
return false;
}
}
//if the level is nazi_zombie_asylum and playeris drinking, disable the trigger
if(level.script == "nazi_zombie_asylum" && isdefined(self.is_drinking))
return false;
if(level.script == "nazi_zombie_sumpf" && isdefined(self.is_drinking))
return false;
return true;
}
is_reviving( revivee )
{
return ( can_revive( revivee ) && self UseButtonPressed() );
}
is_facing( facee )
{
orientation = self getPlayerAngles();
forwardVec = anglesToForward( orientation );
forwardVec2D = ( forwardVec[0], forwardVec[1], 0 );
unitForwardVec2D = VectorNormalize( forwardVec2D );
toFaceeVec = facee.origin - self.origin;
toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 );
unitToFaceeVec2D = VectorNormalize( toFaceeVec2D );
dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D );
return ( dotProduct > 0.9 ); // reviver is facing within a ~52-degree cone of the player
}
// self = reviver
revive_do_revive( playerBeingRevived, reviverGun )
{
assert( self is_reviving( playerBeingRevived ) );
// reviveTime used to be set from a Dvar, but this can no longer be tunable:
// it has to match the length of the third-person revive animations for
// co-op gameplay to run smoothly.
reviveTime = 3;
if ( self HasPerk( "specialty_quickrevive" ) )
{
reviveTime = reviveTime / 2;
}
timer = 0;
revived = false;
//CODER_MOD: TOMMYK 07/13/2008
playerBeingRevived.revivetrigger.beingRevived = 1;
playerBeingRevived.revive_hud setText( &"GAME_PLAYER_IS_REVIVING_YOU", self );
playerBeingRevived revive_hud_show_n_fade( 3.0 );
playerBeingRevived.revivetrigger setHintString( "" );
playerBeingRevived startrevive( self );
if( !isdefined(self.reviveProgressBar) )
self.reviveProgressBar = self createPrimaryProgressBar();
if( !isdefined(self.reviveTextHud) )
self.reviveTextHud = newclientHudElem( self );
self thread laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun );
self.reviveProgressBar updateBar( 0.01, 1 / reviveTime );
self.reviveTextHud.alignX = "center";
self.reviveTextHud.alignY = "middle";
self.reviveTextHud.horzAlign = "center";
self.reviveTextHud.vertAlign = "bottom";
self.reviveTextHud.y = -148;
if ( IsSplitScreen() )
self.reviveTextHud.y = -107;
self.reviveTextHud.foreground = true;
self.reviveTextHud.font = "default";
self.reviveTextHud.fontScale = 1.8;
self.reviveTextHud.alpha = 1;
self.reviveTextHud.color = ( 1.0, 1.0, 1.0 );
self.reviveTextHud setText( &"GAME_REVIVING" );
//chrisp - zombiemode addition for reviving vo
// cut , but leave the script just in case
//self thread say_reviving_vo();
while( self is_reviving( playerBeingRevived ) )
{
wait( 0.05 );
timer += 0.05;
if ( self player_is_in_laststand() )
break;
if( timer >= reviveTime)
{
revived = true;
break;
}
}
if( isdefined( self.reviveProgressBar ) )
{
self.reviveProgressBar destroyElem();
}
if( isdefined( self.reviveTextHud ) )
{
self.reviveTextHud destroy();
}
if ( !revived )
{
playerBeingRevived stoprevive( self );
}
//CODER_MOD: TOMMYK 07/13/2008
playerBeingRevived.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" );
playerBeingRevived.revivetrigger.beingRevived = 0;
return revived;
}
say_reviving_vo()
{
if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
{
players = get_players();
for(i=0; i<players.size; i++)
{
if (players[i] == self)
{
self playsound("plr_" + i + "_vox_reviving" + "_" + randomintrange(0, 2));
}
}
}
}
say_revived_vo()
{
if( GetDvar( "zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) // CODER_MOD (Austin 5/4/08): zombiemode loadout setup
{
players = get_players();
for(i=0; i<players.size; i++)
{
if (players[i] == self)
{
self playsound("plr_" + i + "_vox_revived" + "_" + randomintrange(0, 2));
}
}
}
}
revive_success( reviver )
{
self notify ( "player_revived", reviver );
self reviveplayer();
//CODER_MOD: TOMMYK 06/26/2008 - For coop scoreboards
reviver.revives++;
//stat tracking
reviver.stats["revives"] = reviver.revives;
// CODER MOD: TOMMY K - 07/30/08
reviver thread maps\_arcademode::arcadeMode_player_revive();
//CODER_MOD: Jay (6/17/2008): callback to revive challenge
if( isdefined( level.missionCallbacks ) )
{
maps\_challenges_coop::doMissionCallback( "playerRevived", reviver );
}
setClientSysState("lsm", "0", self); // Notify client last stand ended.
self.revivetrigger delete();
self.revivetrigger = undefined;
self laststand_giveback_player_weapons();
self.ignoreme = false;
self thread say_revived_vo();
}
revive_force_revive( reviver )
{
assert( IsDefined( self ) );
assert( IsPlayer( self ) );
assert( self player_is_in_laststand() );
self thread revive_success( reviver );
}
// the text that tells players that others are in need of a revive
revive_hud_create()
{
self.revive_hud = newclientHudElem( self );
self.revive_hud.alignX = "center";
self.revive_hud.alignY = "middle";
self.revive_hud.horzAlign = "center";
self.revive_hud.vertAlign = "bottom";
self.revive_hud.y = -50;
self.revive_hud.foreground = true;
self.revive_hud.font = "default";
self.revive_hud.fontScale = 1.5;
self.revive_hud.alpha = 0;
self.revive_hud.color = ( 1.0, 1.0, 1.0 );
self.revive_hud setText( "" );
if( GetDvar( "zombiemode" ) == "1" )
{
self.revive_hud.y = -80;
}
}
//CODER_MOD: TOMMYK 07/13/2008
revive_hud_think()
{
self endon ( "disconnect" );
while ( 1 )
{
wait( 0.1 );
if ( !player_any_player_in_laststand() )
{
continue;
}
players = get_players();
playerToRevive = undefined;
for( i = 0; i < players.size; i++ )
{
if( !players[i] player_is_in_laststand() || !isDefined( players[i].revivetrigger.createtime ) )
continue;
if( !isDefined(playerToRevive) || playerToRevive.revivetrigger.createtime > players[i].revivetrigger.createtime )
{
playerToRevive = players[i];
}
}
if( isDefined( playerToRevive ) )
{
for( i = 0; i < players.size; i++ )
{
if( players[i] player_is_in_laststand() )
continue;
players[i] thread fadeReviveMessageOver( playerToRevive, 3.0 );
}
playerToRevive.revivetrigger.createtime = undefined;
wait( 3.5 );
}
}
}
//CODER_MOD: TOMMYK 07/13/2008
fadeReviveMessageOver( playerToRevive, time )
{
revive_hud_show();
self.revive_hud setText( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED", playerToRevive );
self.revive_hud fadeOverTime( time );
self.revive_hud.alpha = 0;
}
revive_hud_hide()
{
assert( IsDefined( self ) );
assert( IsDefined( self.revive_hud ) );
self.revive_hud.alpha = 0;
}
revive_hud_show()
{
assert( IsDefined( self ) );
assert( IsDefined( self.revive_hud ) );
self.revive_hud.alpha = 1;
}
//CODER_MOD: TOMMYK 07/13/2008
revive_hud_show_n_fade(time)
{
revive_hud_show();
self.revive_hud fadeOverTime( time );
self.revive_hud.alpha = 0;
}
drawcylinder(pos, rad, height)
{
currad = rad;
curheight = height;
for (r = 0; r < 20; r++)
{
theta = r / 20 * 360;
theta2 = (r + 1) / 20 * 360;
line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta2) * currad, sin(theta2) * currad, 0));
line(pos + (cos(theta) * currad, sin(theta) * currad, curheight), pos + (cos(theta2) * currad, sin(theta2) * currad, curheight));
line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta) * currad, sin(theta) * currad, curheight));
}
}
mission_failed_during_laststand( dead_player )
{
if( IsDefined( level.no_laststandmissionfail ) && level.no_laststandmissionfail )
{
return;
}
players = get_players();
for( i = 0; i < players.size; i++ )
{
if( isDefined( players[i] ) )
{
players[i] thread maps\_quotes::displayMissionFailed();
if( players[i] == self )
{
players[i] thread maps\_quotes::displayPlayerDead();
println( "Player #"+i+" is dead" );
}
else
{
players[i] thread maps\_quotes::displayTeammateDead( dead_player );
println( "Player #"+i+" is alive" );
}
}
}
missionfailed();
}
#include maps\_utility;
#include common_scripts\utility;
#include maps\_zombiemode_utility;
init()
{
init_weapons();
init_weapon_upgrade();
init_pay_turret();
init_weapon_cabinet();
treasure_chest_init();
level thread add_limited_tesla_gun();
level.box_moved = false;
}
add_zombie_weapon( weapon_name, hint, cost, weaponVO, variation_count, ammo_cost )
{
if( IsDefined( level.zombie_include_weapons ) && !IsDefined( level.zombie_include_weapons[weapon_name] ) )
{
return;
}
add_weapon_to_sound_array(weaponVO,variation_count);
// Check the table first
table = "mp/zombiemode.csv";
table_cost = TableLookUp( table, 0, weapon_name, 1 );
table_ammo_cost = TableLookUp( table, 0, weapon_name, 2 );
if( IsDefined( table_cost ) && table_cost != "" )
{
cost = round_up_to_ten( int( table_cost ) );
}
if( IsDefined( table_ammo_cost ) && table_ammo_cost != "" )
{
ammo_cost = round_up_to_ten( int( table_ammo_cost ) );
}
PrecacheItem( weapon_name );
PrecacheString( hint );
struct = SpawnStruct();
if( !IsDefined( level.zombie_weapons ) )
{
level.zombie_weapons = [];
}
struct.weapon_name = weapon_name;
struct.weapon_classname = "weapon_" + weapon_name;
struct.hint = hint;
struct.cost = cost;
struct.sound = weaponVO;
struct.variation_count = variation_count;
struct.is_in_box = level.zombie_include_weapons[weapon_name];
if( !IsDefined( ammo_cost ) )
{
ammo_cost = round_up_to_ten( int( cost * 0.5 ) );
}
struct.ammo_cost = ammo_cost;
level.zombie_weapons[weapon_name] = struct;
}
default_weighting_func()
{
return 1;
}
default_tesla_weighting_func()
{
num_to_add = 1;
if( isDefined( level.pulls_since_last_tesla_gun ) )
{
// player has dropped the tesla for another weapon, so we set all future polls to 20%
if( isDefined(level.player_drops_tesla_gun) && level.player_drops_tesla_gun == true )
{
num_to_add += int(.2 * level.zombie_include_weapons.size);
}
// player has not seen tesla gun in late rounds
if( !isDefined(level.player_seen_tesla_gun) || level.player_seen_tesla_gun == false )
{
// after round 10 the Tesla gun percentage increases to 20%
if( level.round_number > 10 )
{
num_to_add += int(.2 * level.zombie_include_weapons.size);
}
// after round 5 the Tesla gun percentage increases to 15%
else if( level.round_number > 5 )
{
// calculate the number of times we have to add it to the array to get the desired percent
num_to_add += int(.15 * level.zombie_include_weapons.size);
}
}
}
return num_to_add;
}
default_ray_gun_weighting_func()
{
if( level.box_moved == true )
{
num_to_add = 1;
// increase the percentage of ray gun
if( isDefined( level.pulls_since_last_ray_gun ) )
{
// after 12 pulls the ray gun percentage increases to 15%
if( level.pulls_since_last_ray_gun > 11 )
{
num_to_add += int(level.zombie_include_weapons.size*0.15);
}
// after 8 pulls the Ray Gun percentage increases to 10%
else if( level.pulls_since_last_ray_gun > 7 )
{
num_to_add += int(.1 * level.zombie_include_weapons.size);
}
}
return num_to_add;
}
else
{
return 0;
}
}
//
// Slightly elevate the chance to get it until someone has it, then make it even
default_cymbal_monkey_weighting_func()
{
players = get_players();
count = 0;
for( i = 0; i < players.size; i++ )
{
if( players[i] has_weapon_or_upgrade( "zombie_cymbal_monkey" ) )
{
count++;
}
}
if ( count > 0 )
{
return 1;
}
else
{
if( level.round_number < 10 )
{
return 3;
}
else
{
return 5;
}
}
}
include_zombie_weapon( weapon_name, in_box, weighting_func )
{
if( !IsDefined( level.zombie_include_weapons ) )
{
level.zombie_include_weapons = [];
}
if( !isDefined( in_box ) )
{
in_box = true;
}
level.zombie_include_weapons[weapon_name] = in_box;
if( !isDefined( weighting_func ) )
{
level.weapon_weighting_funcs[weapon_name] = maps\_zombiemode_weapons::default_weighting_func;
}
else
{
level.weapon_weighting_funcs[weapon_name] = weighting_func;
}
}
init_weapons()
{
// Zombify
PrecacheItem( "zombie_melee" );
// Pistols
//add_zombie_weapon( "colt", &"ZOMBIE_WEAPON_COLT_50", 50, "vox_crappy", 8 );
//add_zombie_weapon( "colt_dirty_harry", &"ZOMBIE_WEAPON_COLT_DH_100", 100, "vox_357", 5 );
add_zombie_weapon( "nambu", &"ZOMBIE_WEAPON_NAMBU_50", 50, "vox_crappy", 8 );
add_zombie_weapon( "sw_357", &"ZOMBIE_WEAPON_SW357_![]() | Has released one or more maps to the UGX-Mods community. |
![]() | Has shown effort and knowledge in the area of scripting while being a part of the UGX-Mods community. |
![]() BO3 Modtools Alpha | This user has access to the Black Ops 3 Modtools Alpha |
![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() Banned Elite |



![]() | Benevolent Soul who has our eternal gratitude and exclusive access to betas and the donator section of the forum. |
![]() | Has shown excellence and experience in the area of custom scripting in the UGX-Mods community. |
![]() Oil Rig Beta Access |
bo_perks_thread()
{
players = getplayers();
for(i=0;i<players.size;i++)
{
players[i] thread staminup();
players[i] thread deadshot();
players[i] thread mulekick();
}
}