www.mediafire.com
1.- In radiant create a script_origin with these values:
targetname zombiegoto
2.0 - Go to your _zombiemode.gsc and replace all this function award_grenades_for_survivors() with this one:
award_grenades_for_survivors() { players = get_players(); for (i = 0; i < players.size; i++) { if (!players[i].is_zombie) { if ( players[i] hasPerk( "specialty_extraammo" )) { if ( !players[i] hasWeapon( "bo3_zm_widows_grenade" ) ) { players[i] giveWeapon( "bo3_zm_widows_grenade" ); } // Extra precautions if ( players[i] HasWeapon( "frag_grenade_zm" ) ) { players[i] TakeWeapon( "frag_grenade_zm" ); } clip_ammo = players[i] GetWeaponAmmoClip( "bo3_zm_widows_grenade" ); if ( !isDefined( clip_ammo ) ) { clip_ammo = 0; } clip_ammo += 2; if ( clip_ammo > 4 ) { clip_ammo = 4; } players SetWeaponAmmoClip( "bo3_zm_widows_grenade", clip_ammo ); self set_player_lethal_grenade( "bo3_zm_widows_grenade" ); } else { if( !players[i] HasWeapon( "frag_grenade_zm" ) ) { players[i] GiveWeapon( "frag_grenade_zm" ); players[i] SetWeaponAmmoClip( "frag_grenade_zm", 0 ); } // Extra precautions if ( players[i] HasWeapon( "bo3_zm_widows_grenade" ) ) { players[i] TakeWeapon( "bo3_zm_widows_grenade" ); } if ( players[i] GetFractionMaxAmmo( "frag_grenade_zm" ) < .25 ) { players[i] SetWeaponAmmoClip( "frag_grenade_zm", 2 ); } else if (players[i] GetFractionMaxAmmo( "frag_grenade_zm" ) < .5 ) { players[i] SetWeaponAmmoClip( "frag_grenade_zm", 3 ); } else { players[i] SetWeaponAmmoClip( "frag_grenade_zm", 4 ); } self set_player_lethal_grenade( "frag_grenade_zm" ); } } } }
2.1 - In the same file go to round_start() and comment the following:
//players[i] giveweapon( players[i] get_player_lethal_grenade() ); //players[i] setweaponammoclip( players[i] get_player_lethal_grenade(), 0);
It would look like this:
// so players get init'ed with grenades players = get_players(); for (i = 0; i < players.size; i++) { //players[i] giveweapon( players[i] get_player_lethal_grenade() ); //players[i] setweaponammoclip( players[i] get_player_lethal_grenade(), 0); players[i] SetClientDvars( "ammoCounterHide", "0", "miniscoreboardhide", "0" ); //players[i] thread maps\_zombiemode_ability::give_round1_abilities(); }
3.0 - Go to your _zombiemode_spawner.gsc file and find this function: zombie_gib_on_damage()
Above this line:
if( !self zombie_should_gib( amount, attacker, type ) ) { continue; }
add this:
self thread maps\_zombiemode_perks_functions::perks_zombie_hit_effect(amount, attacker, point, type);
and below this line:
if( !self zombie_should_gib( amount, attacker, type ) ) { continue; }
add this:
// Double tap 2.0 if( isDefined(attacker) && isplayer(attacker) && isAlive(attacker) ) { if(attacker HasPerk("specialty_rof") && ( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) ) { //iprintln( "Si entra Double Tap" ); self harrybo21_perks_doubletap_damage( amount, self.origin, attacker, self.damageLocation ); } if ( ( self.damageLocation == "head" || self.damageLocation == "helmet" ) && attacker hasPerk( "specialty_deadshot" ) ) { //iprintln( "Si entra Death Shot" ); self harrybo21_perks_deadshot_damage( amount, attacker, type, self.damageLocation ); } } // Double tap 2.0
3.1 - Find the find_flesh() function and replace with this function:
// the seeker logic for zombies find_flesh() { self endon( "death" ); level endon( "intermission" ); self endon( "stop_find_flesh" ); if( level.intermission ) { return; } self.helitarget = true; self.ignoreme = false; // don't let attack dogs give chase until the zombie is in the playable area self.noDodgeMove = true; // WW (0107/2011) - script_forcegoal KVP overwites this variable which allows zombies to push the player in laststand //PI_CHANGE - 7/2/2009 JV Changing this to an array for the meantime until we get a more substantial fix //for ignoring multiple players - Reenabling change 274916 (from DLC3) self.ignore_player = ; self zombie_history( "find flesh -> start" ); self.goalradius = 32; while( 1 ) { zombie_poi = undefined; // try to split the zombies up when the bunch up // see if a bunch zombies are already near my current target; if there's a bunch // and I'm still far enough away, ignore my current target and go after another one near_zombies = getaiarray("axis"); same_enemy_count = 0; for (i = 0; i < near_zombies.size; i++) { if ( isdefined( near_zombies[i] ) && isalive( near_zombies[i] ) ) { if ( isdefined( near_zombies[i].favoriteenemy ) && isdefined( self.favoriteenemy ) && near_zombies[i].favoriteenemy == self.favoriteenemy ) { if ( distancesquared( near_zombies[i].origin, self.favoriteenemy.origin ) < 225 * 225 && distancesquared( near_zombies[i].origin, self.origin ) > 525 * 525) { same_enemy_count++; } } } } if (same_enemy_count > 12) { self.ignore_player[self.ignore_player.size] = self.favoriteenemy; } //PI_CHANGE_BEGIN - 6/18/09 JV It was requested that we use the poi functionality to set the "wait" point while all players //are in the process of teleportation. It should not intefere with the monkey. The way it should work is, if all players are in teleportation, //zombies should go and wait at the stage, but if there is a valid player not in teleportation, they should go to him if (isDefined(level.zombieTheaterTeleporterSeekLogicFunc) ) { self [[ level.zombieTheaterTeleporterSeekLogicFunc ]](); } //PI_CHANGE_END if( IsDefined( level._poi_override ) ) { zombie_poi = self [[ level._poi_override ]](); } if( !IsDefined( zombie_poi ) ) { zombie_poi = self get_zombie_point_of_interest( self.origin ); } players = get_players(); // If playing single player, never ignore the player if( players.size == 1 ) { self.ignore_player = ; } //PI_CHANGE_BEGIN - 7/2/2009 JV Reenabling change 274916 (from DLC3) else { for(i = 0; i < self.ignore_player.size; i++) { if( IsDefined( self.ignore_player[i] ) && IsDefined( self.ignore_player[i].ignore_counter ) && self.ignore_player[i].ignore_counter > 3 ) { self.ignore_player[i].ignore_counter = 0; self.ignore_player = array_remove( self.ignore_player, self.ignore_player[i] ); } } } //PI_CHANGE_END player = maps\_zombiemode_perks_functions::get_closest_valid_player_plus_perks( self.origin, self.ignore_player ); if( !isDefined( player ) ) { if ( isDefined( level.zombiegoto ) && !isDefined( zombie_poi ) ) { self SetGoalPos( level.zombiegoto.origin ); wait randomfloatrange( 1, 2 ); continue; } else if ( !isDefined( zombie_poi ) ) { self zombie_history( "find flesh -> can't find player, continue" ); if( IsDefined( self.ignore_player ) ) { self.ignore_player = ; } wait( 1 ); continue; } } //PI_CHANGE - 7/2/2009 JV Reenabling change 274916 (from DLC3) //self.ignore_player = undefined; if ( !isDefined( level.check_for_alternate_poi ) || ![[level.check_for_alternate_poi]]() ) { self.enemyoverride = zombie_poi; self.favoriteenemy = player; } self thread zombie_pathing(); //PI_CHANGE_BEGIN - 7/2/2009 JV Reenabling change 274916 (from DLC3) if( players.size > 1 ) { for(i = 0; i < self.ignore_player.size; i++) { if( IsDefined( self.ignore_player[i] ) ) { if( !IsDefined( self.ignore_player[i].ignore_counter ) ) self.ignore_player[i].ignore_counter = 0; else self.ignore_player[i].ignore_counter += 1; } } } //PI_CHANGE_END self thread attractors_generated_listener(); self.zombie_path_timer = GetTime() + ( RandomFloatRange( 1, 3 ) * 1000 );// + path_timer_extension; while( GetTime() < self.zombie_path_timer ) { wait( 0.1 ); } self notify( "path_timer_done" ); self zombie_history( "find flesh -> bottom of loop" ); debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); self notify( "zombie_acquire_enemy" ); } }
3.2 - Go to the window_notetracks() function and replace with this:
window_notetracks(msg) { while(1) { self waittill( msg, notetrack ); if( notetrack == "end" ) { //self waittill("end"); self teleport(self.old_origin); return; } if( notetrack == "fire" ) { if(self.ignoreall) { self.ignoreall = false; } // just hit a player if ( isDefined( self.first_node ) ) { _MELEE_DIST_SQ = 90*90; _TRIGGER_DIST_SQ = 51*51; for ( i = 0; i < self.player_targets.size; i++ ) { // !!=====!! Widow's Wine if ( self.player_targets[i] hasPerk("specialty_extraammo") ) { self.player_targets[i] notify("widows_wine_melee", self); wait_network_frame(); } playerDistSq = Distance2DSquared( self.player_targets[i].origin, self.origin ); heightDiff = abs( self.player_targets[i].origin[2] - self.origin[2] ); // be sure we're on the same floor if ( playerDistSq < _MELEE_DIST_SQ && (heightDiff * heightDiff) < _MELEE_DIST_SQ ) { triggerDistSq = Distance2DSquared( self.player_targets[i].origin, self.first_node.trigger_location.origin ); heightDiff = abs( self.player_targets[i].origin[2] - self.first_node.trigger_location.origin[2] ); // be sure we're on the same floor if ( triggerDistSq < _TRIGGER_DIST_SQ && (heightDiff * heightDiff) < _TRIGGER_DIST_SQ ) { self.player_targets[i] DoDamage( self.meleeDamage, self.origin, self, 0, "MOD_MELEE" ); break; } } } } else { self melee(); } } } }
3.3 At the end of the file add this:
// Double tap 2.0 harrybo21_perks_doubletap_damage( amount, origin, attacker, location, direction_vec, point, type ) { self endon( "death" ); self.damageLocation = location; wait_network_frame(); setPlayerIgnoreRadiusDamage( true ); self.attacker radiusDamage( self.origin, 1, amount, amount, self.attacker, self.damagemod ); setPlayerIgnoreRadiusDamage( false ); // self doDamage( amount, origin, attacker ); self.damageLocation = location; wait_network_frame(); } harrybo21_perks_deadshot_damage( amount, origin, attacker, location ) { self endon( "death" ); self.deadshot_hit = true; new_damage = amount / 4; if ( attacker hasPerk( "specialty_rof" ) ) new_damage = new_damage * 2; if ( new_damage > self.health ) { score = 40; if ( isDefined( level.zombie_vars["zombie_powerup_point_doubler_on"] ) && level.zombie_vars["zombie_powerup_point_doubler_on"] ) score = score * 2; attacker maps\_zombiemode_score::add_to_player_score( score ); } self.damageLocation = location; wait_network_frame(); self.attacker radiusDamage( self.origin, 1, amount, amount, self.attacker, self.damagemod ); // self doDamage( new_damage, origin, attacker ); wait_network_frame(); self.deadshot_hit = undefined; } // Double tap 2.0
4.0 Go to animscripts/zombie_melee.gsc and look for this line:
self waittill("meleeanim", note);
below find this line
if ( !IsDefined( self.enemy ) ) { break; }
below that line add this:
// !!=====!! Widow's Wine if ( self.enemy hasPerk("specialty_extraammo") ) { self.enemy notify("widows_wine_melee", self); wait_network_frame(); }
5.0 In your zombie_mapname below this line:
maps\_zombiemode::main();
add this:
thread fix_Health();
and at the end of the file add this:
fix_Health() { flag_wait("all_players_connected"); players = get_players(); for(i=0;i<players.size;i++) { players[i] thread return_fix(); } } return_fix() { while(1) { self waittill_any_return( "player_revived", "spawned_player"); self SetMaxHealth( 150 ); //iprintln("150 de vida"); } }
6.0 The following files added to your map:
_zombiemode_perks _zombiemode_perks_functions _zombiemode_perks_items
7.0 In your mod.csv add this:
//Perks sound,map_sounds material,specialty_cherry_zombies material,specialty_vulture_zombies material,specialty_vulture_zombies_glow material,specialty_widowswine_zombies material,vending_widows_grenade_indicator fx,cherry\cherry_1 fx,cherry\cherry_2 fx,cherry\cherry_3 fx,cherry\cherry_4 fx,maps\zombie\fx_zombie_tesla_bolt_secondary fx,maps\zombie\fx_zombie_tesla_shock fx,maps\zombie\fx_zombie_tesla_shock_secondary fx,maps\zombie\fx_zombie_tesla_shock_eyes fx,vulture_powerup fx,vulture_smell fx,vulture\fx_vulture_box fx,vulture\fx_vulture_pap fx,vulture\fx_vulture_rifle fx,vulture\fx_vulture_revive fx,vulture\fx_vulture_speed fx,vulture\fx_vulture_jugg fx,vulture\fx_vulture_double fx,vulture\fx_vulture_deadshot fx,vulture\fx_vulture_stamin fx,vulture\fx_vulture_mule fx,vulture\fx_vulture_phd fx,vulture\fx_vulture_cherry fx,vulture\fx_vulture_vulture fx,vulture\fx_vulture_widow fx,widowswine\fx_widows_wine_explode fx,widowswine\fx_widows_wine_zombie weapon,sp/zombie_perk_bottle_cherry weapon,sp/zombie_perk_bottle_vulture weapon,sp/zombie_perk_bottle_widowswine weapon,sp/bo3_zm_widows_grenade xmodel,bo2_p6_zm_vending_electric_cherry_on xmodel,bo2_zombie_vending_vultureaid_on xmodel,bo2_p6_zm_perk_vulture_ammo xmodel,bo2_p6_zm_perk_vulture_points xmodel,bo3_p7_zm_vending_widows_wine_on xmodel,bo3_t7_ww_grenade_proj xmodel,bo3_t7_ww_powerup
Credits: - Gympie6 - Shippuden1592 - Salamanca21 - Cpt_johnson1 - Bamskater - Harry Bo21 - Fusorf - Alaurenc9 - ConvictioNDR - HitmanVere - Lilfria - Redspace200 - StevieWonder87 - Rollonmath - UGX, CCM, Treyarch and Activision