animtrees\genric_human.atr
(Copy from root/raw/animtrees to root/mods/{MAPNAME}/animtrees/ if you dont have this file) Add the following above '// modern stuff' // 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
maps\_zombiemode.gsc
In the function 'main(init_zombie_spawner_name)' Add 'maps\wardog\_wardog_init::pre_init();' above 'SetAILimit( 24 );' Add 'maps\wardog\_wardog_init::init();' above 'init_utility();' Comment Out 'maps\_zombiemode_perks::init();' Add 'maps\wardog\_wardog_init::post_init();' above 'level thread players_playing();' Add the following to the end of the function 'player_laststand()' /********************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********************/
Find the function 'player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )' Add BOX#1 above BOX#2 /********************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" ); }
In the same function replace BOX#1 with BOX#2 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********************/
maps\_laststand.gsc
Replace BOX#1 with BOX#2 in the function 'revive_trigger_think()' 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********************/
Add The Following to the end of the file /********************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********************/
maps\_callbackglobal.gsc
Add the following to the start of the function 'Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime )' /********************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********************/
maps\_zombiemode_weapons.gsc
Replace Function 'treasure_chest_give_weapon(weapon)' with the following /********************WARDOGSK93 PERK CODE********************/ treasure_chest_give_weapon(weapon) { self maps\wardog\perks\_wardog_perks_bo1::mule_weapon_give(weapon, true); } /********************WARDOGSK93 PERK CODE********************/
Replace Function 'weapon_give(weapon, is_upgraded)' with the following /********************WARDOGSK93 PERK CODE********************/ weapon_give(weapon, is_upgrade) { self maps\wardog\perks\_wardog_perks_bo1::mule_weapon_give(weapon, false); } /********************WARDOGSK93 PERK CODE********************/
maps\_zombiemode_tesla.gsc
Replace the function 'tesla_pvp_thread()' with the following 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" ); } }
maps\_zombiemode_spawner.gsc
Add the following undeneath 'self thread zombie_damage_failsafe();' in the function 'zombie_spawn_init( animname_set )' /********************WARDOGSK93 PERK CODE********************/ self maps\wardog\_wardog_callback::callback("on_zombie_spawned"); /********************WARDOGSK93 PERK CODE********************/
maps\_zombiemode_powerups.gsc'
Add the following undeneath 'powerup thread powerup_grab();' in the function 'powerup_drop(drop_point)' /********************WARDOGSK93 PERK CODE********************/ powerup thread maps\wardog\perks\_wardog_perks_bo2::vulture_powerup_glow(); /********************WARDOGSK93 PERK CODE********************/
maps\_zombiemode_perks.gsc
Replace the whole with the following #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; } }
clientscripts\{MAPNAME}.csc
Add 'clientscripts\sanchez\_xS78_fx_system::init();' Above 'thread clientscripts\_audio::audio_init(0);'