WARDOGSK93's Perk System - V:0.2.5
Download from 'WARDOGSK93's Downloadables' page
Screenshots
Perk Machines
Wunderfizz Machine
Description
Simple perk system that allows you to create custom perks that do not need a "specialty_" perk name, Also comes with World at War, Black Ops 1 and Black Ops 2 perks Der Wunderfizz is not in this release as it still needs more work but should be in the next release Thanks to xSanchez78 and lilrifa for help on pretty much anything i needed help on (fx, anim porting, script) Install
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);'