1
0
mirror of https://github.com/JezuzLizard/BO2-Reimagined.git synced 2025-06-07 21:59:49 -05:00

Bouncing Betty: replace Claymore on Origins

Claymore: increase explosion radius
Move certain vars to not exceed canonical string table limit
This commit is contained in:
Jbleezy 2024-02-09 18:39:06 -08:00
parent 04252e9420
commit 4c7b0f53c7
17 changed files with 784 additions and 69 deletions

View File

@ -82,6 +82,7 @@
* [Equipment](#equipment)
* [Combat Knife](#combat-knife)
* [Claymore](#claymore)
* [Bouncing Betty](#bouncing-betty)
* [Time Bomb](#time-bomb)
* [One Inch Punch](#one-inch-punch)
* [Wallbuys](#wallbuys)
@ -564,10 +565,14 @@
#### Claymore
* Can be repurchased
* Can be placed while in the air
* Increased explosion radius by 28% (same as Black Ops 2 Multiplayer Claymore)
* Increased max amount that can be placed from 12 to 20
* Added weapon name on HUD
* Removed initial weapon raise anim
#### Bouncing Betty
* Replaces Claymore on Origins
#### Time Bomb
* No longer sends players back in time
* Kills all zombies

View File

@ -1092,6 +1092,12 @@ LANG_ENGLISH "Hold ^3[{+activate}]^7 for SWAT-556 [Cost: &&1]"
REFERENCE ZOMBIE_WEAPON_STICKY_GRENADE
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Semtex Grenades [Cost: &&1]"
REFERENCE ZOMBIE_WEAPON_BOUNCINGBETTY
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Bouncing Betty [Cost: &&1]"
REFERENCE ZOMBIE_BOUNCINGBETTY_PICKUP
LANG_ENGLISH "Hold ^3&&1^7 to Pick Up Bouncing Betty"
REFERENCE ZOMBIE_PERK_QUICKREVIVE
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Quick Revive [Cost: &&1]"

View File

@ -5039,16 +5039,16 @@
{
"targetname" "pf2204_auto37"
"classname" "script_struct"
"model" "t6_wpn_claymore_world"
"angles" "0 270 0"
"origin" "1204 4364.75 -296"
"model" "t6_wpn_bouncing_betty_world"
"angles" "90 270 0"
"origin" "1204 4362.75 -292"
"script_vector" "0 -90 0"
"guid" "A44E7A85"
}
{
"target" "pf2204_auto37"
"targetname" "claymore_purchase"
"zombie_weapon_upgrade" "claymore_zm"
"zombie_weapon_upgrade" "bouncingbetty_zm"
"classname" "script_struct"
"origin" "1197 4364.75 -289"
"angles" "0 180 0"
@ -5126,16 +5126,16 @@
{
"targetname" "pf2209_auto37"
"classname" "script_struct"
"model" "t6_wpn_claymore_world"
"angles" "0 90 0"
"origin" "-2848 -69.75 300"
"model" "t6_wpn_bouncing_betty_world"
"angles" "90 90 0"
"origin" "-2848 -67.75 304"
"script_vector" "0 -90 0"
"guid" "A44E7A85"
}
{
"target" "pf2209_auto37"
"targetname" "claymore_purchase"
"zombie_weapon_upgrade" "claymore_zm"
"zombie_weapon_upgrade" "bouncingbetty_zm"
"classname" "script_struct"
"origin" "-2841 -69.75 307"
"angles" "0 1.00179e-005 0"
@ -5348,16 +5348,16 @@
{
"targetname" "pf2222_auto37"
"classname" "script_struct"
"model" "t6_wpn_claymore_world"
"angles" "0 270 0"
"origin" "2360 473 165"
"model" "t6_wpn_bouncing_betty_world"
"angles" "90 270 0"
"origin" "2360 471 169"
"script_vector" "0 -90 0"
"guid" "A44E7A85"
}
{
"target" "pf2222_auto37"
"targetname" "claymore_purchase"
"zombie_weapon_upgrade" "claymore_zm"
"zombie_weapon_upgrade" "bouncingbetty_zm"
"classname" "script_struct"
"origin" "2353 473 172"
"angles" "0 180 0"

View File

@ -45,6 +45,7 @@ main()
replaceFunc(maps\mp\zombies\_zm_utility::is_temporary_zombie_weapon, scripts\zm\replaced\_zm_utility::is_temporary_zombie_weapon);
replaceFunc(maps\mp\zombies\_zm_utility::wait_network_frame, scripts\zm\replaced\_zm_utility::wait_network_frame);
replaceFunc(maps\mp\zombies\_zm_utility::track_players_intersection_tracker, scripts\zm\replaced\_zm_utility::track_players_intersection_tracker);
replaceFunc(maps\mp\zombies\_zm_ffotd::ffotd_melee_miss_func, scripts\zm\replaced\_zm_ffotd::ffotd_melee_miss_func);
replaceFunc(maps\mp\zombies\_zm_score::add_to_player_score, scripts\zm\replaced\_zm_score::add_to_player_score);
replaceFunc(maps\mp\zombies\_zm_score::minus_to_player_score, scripts\zm\replaced\_zm_score::minus_to_player_score);
replaceFunc(maps\mp\zombies\_zm_score::player_add_points_kill_bonus, scripts\zm\replaced\_zm_score::player_add_points_kill_bonus);
@ -62,6 +63,8 @@ main()
replaceFunc(maps\mp\zombies\_zm_weapons::ammo_give, scripts\zm\replaced\_zm_weapons::ammo_give);
replaceFunc(maps\mp\zombies\_zm_weapons::get_upgraded_ammo_cost, scripts\zm\replaced\_zm_weapons::get_upgraded_ammo_cost);
replaceFunc(maps\mp\zombies\_zm_weapons::makegrenadedudanddestroy, scripts\zm\replaced\_zm_weapons::makegrenadedudanddestroy);
replaceFunc(maps\mp\zombies\_zm_weapons::weaponobjects_on_player_connect_override_internal, scripts\zm\replaced\_zm_weapons::weaponobjects_on_player_connect_override_internal);
replaceFunc(maps\mp\zombies\_zm_weapons::setupretrievablehintstrings, scripts\zm\replaced\_zm_weapons::setupretrievablehintstrings);
replaceFunc(maps\mp\zombies\_zm_weapons::createballisticknifewatcher_zm, scripts\zm\replaced\_zm_weapons::createballisticknifewatcher_zm);
replaceFunc(maps\mp\zombies\_zm_weapons::weapon_spawn_think, scripts\zm\replaced\_zm_weapons::weapon_spawn_think);
replaceFunc(maps\mp\zombies\_zm_weapons::weapon_set_first_time_hint, scripts\zm\replaced\_zm_weapons::weapon_set_first_time_hint);
@ -118,7 +121,6 @@ main()
replaceFunc(maps\mp\zombies\_zm_weap_ballistic_knife::watch_use_trigger, scripts\zm\replaced\_zm_weap_ballistic_knife::watch_use_trigger);
replaceFunc(maps\mp\zombies\_zm_weap_ballistic_knife::pick_up, scripts\zm\replaced\_zm_weap_ballistic_knife::pick_up);
replaceFunc(maps\mp\zombies\_zm_weap_claymore::claymore_detonation, scripts\zm\replaced\_zm_weap_claymore::claymore_detonation);
replaceFunc(maps\mp\zombies\_zm_weap_claymore::claymore_setup, scripts\zm\replaced\_zm_weap_claymore::claymore_setup);
replaceFunc(maps\mp\zombies\_zm_weap_cymbal_monkey::init, scripts\zm\replaced\_zm_weap_cymbal_monkey::init);
replaceFunc(maps\mp\zombies\_zm_weap_cymbal_monkey::player_handle_cymbal_monkey, scripts\zm\replaced\_zm_weap_cymbal_monkey::player_handle_cymbal_monkey);
}
@ -230,7 +232,6 @@ on_player_spawned()
self.solo_lives_given = 0;
self.stored_weapon_data = undefined;
self.screecher_seen_hint = 1;
self thread health_bar_hud();
self thread zone_name_hud();
@ -340,7 +341,6 @@ post_all_players_spawned()
wait 0.05;
level.near_miss = 2; // makes screecher not run away first time on solo
level.ta_vaultfee = 0;
level.ta_tellerfee = 0;
level.weapon_locker_online = 0;
@ -367,10 +367,6 @@ post_all_players_spawned()
level.zombie_vars["slipgun_reslip_rate"] = 0;
level.zombie_vars["zombie_perk_divetonuke_min_damage"] = 1000;
level.zombie_vars["zombie_perk_divetonuke_max_damage"] = 5000;
level.explode_overheated_jetgun = 0;
level.unbuild_overheated_jetgun = 0;
level.take_overheated_jetgun = 1;
level.dont_allow_meat_interaction = 1;
level.players_can_damage_riotshields = 1;
level.speed_change_round = undefined;
level.playersuicideallowed = undefined;
@ -487,9 +483,10 @@ health_bar_hud()
flag_wait("hud_visible");
prev_health = 0;
prev_maxhealth = 0;
prev_shield_health = 0;
vars = [];
vars["prev_health"] = 0;
vars["prev_maxhealth"] = 0;
vars["prev_shield_health"] = 0;
while (1)
{
@ -501,14 +498,14 @@ health_bar_hud()
shield_health = int((shield_health / level.zombie_vars["riotshield_hit_points"]) * 100);
}
if (self.health != prev_health || self.maxhealth != prev_maxhealth || shield_health != prev_shield_health)
if (self.health != vars["prev_health"] || self.maxhealth != vars["prev_maxhealth"] || shield_health != vars["prev_shield_health"])
{
self luinotifyevent(&"hud_update_health", 3, self.health, self.maxhealth, shield_health);
}
prev_health = self.health;
prev_maxhealth = self.maxhealth;
prev_shield_health = shield_health;
vars["prev_health"] = self.health;
vars["prev_maxhealth"] = self.maxhealth;
vars["prev_shield_health"] = shield_health;
wait 0.05;
}
@ -543,26 +540,28 @@ enemy_counter_hud()
hud.alpha = 1;
vars = [];
while (1)
{
enemies = get_round_enemy_array().size + level.zombie_total;
vars["enemies"] = get_round_enemy_array().size + level.zombie_total;
if (level flag_exists("spawn_ghosts") && flag("spawn_ghosts"))
{
enemies = get_current_ghost_count();
vars["enemies"] = get_current_ghost_count();
}
else if (level flag_exists("sq_tpo_special_round_active") && flag("sq_tpo_special_round_active"))
{
enemies = 0;
vars["enemies"] = 0;
}
if (enemies == 0)
if (vars["enemies"] == 0)
{
hud setText("");
}
else
{
hud setValue(enemies);
hud setValue(vars["enemies"]);
}
wait 0.05;
@ -571,16 +570,19 @@ enemy_counter_hud()
get_current_ghost_count()
{
ghost_count = 0;
ais = getaiarray(level.zombie_team);
vars = [];
vars["ghost_count"] = 0;
vars["ais"] = getaiarray(level.zombie_team);
foreach (ai in ais)
for (i = 0; i < vars["ais"].size; i++)
{
if (isdefined(ai.is_ghost) && ai.is_ghost)
ghost_count++;
vars["ai"] = vars["ais"][i];
if (isdefined(vars["ai"].is_ghost) && vars["ai"].is_ghost)
vars["ghost_count"]++;
}
return ghost_count;
return vars["ghost_count"];
}
timer_hud()
@ -1365,8 +1367,8 @@ fall_velocity_check()
while (!self isOnGround())
{
vars["was_on_ground"] = 0;
vel = self getVelocity();
self.fall_velocity = vel[2];
vars["vel"] = self getVelocity();
self.fall_velocity = vars["vel"][2];
wait 0.05;
}
@ -1393,14 +1395,16 @@ fall_velocity_check()
disable_bank_teller()
{
level notify("stop_bank_teller");
bank_teller_dmg_trig = getent("bank_teller_tazer_trig", "targetname");
vars = [];
if (IsDefined(bank_teller_dmg_trig))
level notify("stop_bank_teller");
vars["bank_teller_dmg_trig"] = getent("bank_teller_tazer_trig", "targetname");
if (IsDefined(vars["bank_teller_dmg_trig"]))
{
bank_teller_transfer_trig = getent(bank_teller_dmg_trig.target, "targetname");
bank_teller_dmg_trig delete();
bank_teller_transfer_trig delete();
vars["bank_teller_transfer_trig"] = getent(vars["bank_teller_dmg_trig"].target, "targetname");
vars["bank_teller_transfer_trig"] delete();
vars["bank_teller_dmg_trig"] delete();
}
}
@ -1470,6 +1474,10 @@ weapon_changes()
include_weapon("held_one_inch_punch_lightning_zm", 0);
register_melee_weapon_for_level("held_one_inch_punch_lightning_zm");
include_weapon("bouncingbetty_zm", 0);
add_zombie_weapon("bouncingbetty_zm", undefined, &"ZOMBIE_WEAPON_BOUNCINGBETTY", 1000, "wpck_explo", "", undefined, 1);
register_placeable_mine_for_level("bouncingbetty_zm");
}
if (isdefined(level.zombie_weapons["saritch_zm"]))

View File

@ -0,0 +1,516 @@
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_equipment;
#include maps\mp\zombies\_zm_score;
#include maps\mp\zombies\_zm_audio;
#include maps\mp\zombies\_zm_weapons;
#include maps\mp\zombies\_zm_stats;
#include maps\mp\gametypes_zm\_weaponobjects;
init()
{
if (!isdefined(level.betties_max_per_player))
level.betties_max_per_player = 20;
trigs = getentarray("betty_purchase", "targetname");
for (i = 0; i < trigs.size; i++)
{
model = getent(trigs[i].target, "targetname");
if (isdefined(model))
model hide();
}
array_thread(trigs, ::buy_betties);
level thread give_betties_after_rounds();
level.betties_on_damage = ::satchel_damage;
level.pickup_betties = ::pickup_betties;
level.pickup_betties_trigger_listener = ::pickup_betties_trigger_listener;
level._effect["betty_light"] = loadfx("weapon/bouncing_betty/fx_betty_light_green");
level._effect["betty_launch"] = loadfx("weapon/bouncing_betty/fx_betty_launch_dust");
level._effect["betty_explosion"] = loadfx("weapon/bouncing_betty/fx_betty_explosion");
}
buy_betties()
{
self.zombie_cost = 1000;
self sethintstring(&"ZOMBIE_WEAPON_BOUNCINGBETTY", self.zombie_cost);
self setcursorhint("HINT_WEAPON", "bouncingbetty_zm");
self endon("kill_trigger");
if (!isdefined(self.stub))
return;
if (isdefined(self.stub) && !isdefined(self.stub.betties_triggered))
self.stub.betties_triggered = 0;
self.betties_triggered = self.stub.betties_triggered;
while (true)
{
self waittill("trigger", who);
if (who in_revive_trigger())
continue;
if (who has_powerup_weapon())
{
wait 0.1;
continue;
}
if (is_player_valid(who))
{
if (who.score >= self.zombie_cost)
{
if (!who is_player_placeable_mine("bouncingbetty_zm") || who getWeaponAmmoStock("bouncingbetty_zm") < 2)
{
play_sound_at_pos("purchase", self.origin);
who maps\mp\zombies\_zm_score::minus_to_player_score(self.zombie_cost);
if (!who is_player_placeable_mine("bouncingbetty_zm"))
{
who thread show_betty_hint("betty_purchased");
}
who thread betty_setup();
who thread maps\mp\zombies\_zm_audio::create_and_play_dialog("weapon_pickup", "grenade");
if (isdefined(self.stub))
self.betties_triggered = self.stub.betties_triggered;
if (self.betties_triggered == 0)
{
model = getent(self.target, "targetname");
if (isdefined(model))
model thread maps\mp\zombies\_zm_weapons::weapon_show(who);
else if (isdefined(self.clientfieldname))
level setclientfield(self.clientfieldname, 1);
self.betties_triggered = 1;
if (isdefined(self.stub))
self.stub.betties_triggered = 1;
}
trigs = getentarray("betty_purchase", "targetname");
for (i = 0; i < trigs.size; i++)
trigs[i] setinvisibletoplayer(who);
}
}
else
{
who play_sound_on_ent("no_purchase");
who maps\mp\zombies\_zm_audio::create_and_play_dialog("general", "no_money_weapon");
}
}
}
}
betty_unitrigger_update_prompt(player)
{
self sethintstring(&"ZOMBIE_WEAPON_BOUNCINGBETTY", self.zombie_cost);
self setcursorhint("HINT_WEAPON", "bouncingbetty_zm");
return true;
}
betty_safe_to_plant()
{
if (self.owner.betties.size >= level.betties_max_per_player)
return 0;
if (isdefined(level.betty_safe_to_plant))
return self [[level.betty_safe_to_plant]]();
return 1;
}
betty_wait_and_detonate()
{
wait 0.1;
self detonate(self.owner);
}
betty_watch()
{
self endon("death");
self notify("betty_watch");
self endon("betty_watch");
while (true)
{
self waittill("grenade_fire", betty, weapname);
if (weapname == "bouncingbetty_zm")
{
betty.owner = self;
betty.team = self.team;
self notify("zmb_enable_betty_prompt");
if (betty betty_safe_to_plant())
{
if (isdefined(level.betty_planted))
self thread [[level.betty_planted]](betty);
betty thread betty_detonation();
betty thread play_betty_effects();
self maps\mp\zombies\_zm_stats::increment_client_stat("betties_planted");
self maps\mp\zombies\_zm_stats::increment_player_stat("betties_planted");
}
else
betty thread betty_wait_and_detonate();
self thread betty_last_shot_switch(weapname);
}
}
}
// empty drop anim doesn't work for weapons that use `offhandSlot\Equipment\` attribute
betty_last_shot_switch(weapname)
{
self endon("disconnect");
fire_time = 0.85;
if (self hasperk("specialty_rof"))
{
fire_time -= 0.2;
}
wait fire_time;
if (!self hasweapon(weapname))
{
return;
}
if (self getcurrentweapon() != weapname)
{
return;
}
if (self getammocount(weapname) != 0)
{
return;
}
self takeweapon(weapname);
self giveweapon(weapname);
self setweaponammoclip(weapname, 0);
}
betty_setup()
{
if (!isdefined(self.betties))
self.betties = [];
self thread betty_watch();
self giveweapon("bouncingbetty_zm");
self set_player_placeable_mine("bouncingbetty_zm");
self setactionslot(4, "weapon", "bouncingbetty_zm");
self setweaponammostock("bouncingbetty_zm", 2);
}
adjust_trigger_origin(origin)
{
origin = origin + vectorscale((0, 0, 1), 20.0);
return origin;
}
on_spawn_retrieve_trigger(watcher, player)
{
self maps\mp\gametypes_zm\_weaponobjects::onspawnretrievableweaponobject(watcher, player);
if (isdefined(self.pickuptrigger))
self.pickuptrigger sethintlowpriority(0);
}
pickup_betties()
{
player = self.owner;
if (!player hasweapon("bouncingbetty_zm"))
{
player thread betty_watch();
player giveweapon("bouncingbetty_zm");
player set_player_placeable_mine("bouncingbetty_zm");
player setactionslot(4, "weapon", "bouncingbetty_zm");
player setweaponammoclip("bouncingbetty_zm", 0);
player notify("zmb_enable_betty_prompt");
}
else
{
clip_ammo = player getweaponammoclip(self.name);
clip_max_ammo = weaponclipsize(self.name);
if (clip_ammo >= clip_max_ammo)
{
self destroy_ent();
player notify("zmb_disable_betty_prompt");
return;
}
}
self pick_up();
clip_ammo = player getweaponammoclip(self.name);
clip_max_ammo = weaponclipsize(self.name);
if (clip_ammo >= clip_max_ammo)
player notify("zmb_disable_betty_prompt");
player maps\mp\zombies\_zm_stats::increment_client_stat("betties_pickedup");
player maps\mp\zombies\_zm_stats::increment_player_stat("betties_pickedup");
}
pickup_betties_trigger_listener(trigger, player)
{
self thread pickup_betties_trigger_listener_enable(trigger, player);
self thread pickup_betties_trigger_listener_disable(trigger, player);
}
pickup_betties_trigger_listener_enable(trigger, player)
{
self endon("delete");
self endon("death");
while (true)
{
player waittill_any("zmb_enable_betty_prompt", "spawned_player");
if (!isdefined(trigger))
return;
trigger trigger_on();
trigger linkto(self);
}
}
pickup_betties_trigger_listener_disable(trigger, player)
{
self endon("delete");
self endon("death");
while (true)
{
player waittill("zmb_disable_betty_prompt");
if (!isdefined(trigger))
return;
trigger unlink();
trigger trigger_off();
}
}
betty_detonation()
{
self endon("death");
self waittill_not_moving();
wait 0.1;
detonateradius = 96;
damagearea = spawn("trigger_radius", self.origin + (0, 0, 0 - detonateradius), 4, detonateradius, detonateradius * 2);
damagearea setexcludeteamfortrigger(self.team);
damagearea enablelinkto();
damagearea linkto(self);
if (is_true(self.isonbus))
damagearea setmovingplatformenabled(1);
self.damagearea = damagearea;
self thread delete_betties_on_death(self.owner, damagearea);
self.owner.betties[self.owner.betties.size] = self;
while (true)
{
damagearea waittill("trigger", ent);
if (isdefined(self.owner) && ent == self.owner)
continue;
if (isdefined(ent.pers) && isdefined(ent.pers["team"]) && ent.pers["team"] == self.team)
continue;
if (isDefined(ent.pers) && isDefined(ent.pers["team"]) && ent.pers["team"] == getOtherTeam(self.team))
continue;
if (isdefined(ent.ignore_betty) && ent.ignore_betty)
continue;
if (ent damageconetrace(self.origin, self) > 0)
{
self spawnminemover();
self.minemover thread bouncingbettyjumpandexplode();
self delete();
return;
}
}
}
spawnminemover()
{
minemover = spawn("script_model", self.origin);
minemover.angles = self.angles;
minemover setmodel(self.model);
minemover.owner = self.owner;
self.minemover = minemover;
}
bouncingbettyjumpandexplode()
{
vars = [];
vars["bettyjumpheight"] = 65;
vars["bettyjumptime"] = 0.65;
vars["bettyrotatevelocity"] = (0, 750, 32);
vars["explodepos"] = self.origin + (0, 0, vars["bettyjumpheight"]);
self moveto(vars["explodepos"], vars["bettyjumptime"], vars["bettyjumptime"], 0);
playfx(level._effect["betty_launch"], self.origin);
self rotatevelocity(vars["bettyrotatevelocity"], vars["bettyjumptime"], 0, vars["bettyjumptime"]);
self playsound("fly_betty_jump");
wait(vars["bettyjumptime"]);
self thread mineexplode();
}
mineexplode()
{
vars = [];
vars["bettydamageradius"] = 256;
vars["bettydamagemax"] = 200;
vars["bettydamagemin"] = 50;
if (!isdefined(self) || !isdefined(self.owner))
return;
self playsound("fly_betty_explo");
wait 0.05;
if (!isdefined(self) || !isdefined(self.owner))
return;
self hide();
self radiusdamage(self.origin, vars["bettydamageradius"], vars["bettydamagemax"], vars["bettydamagemin"], self.owner, "MOD_EXPLOSIVE", "bouncingbetty_zm");
playfx(level._effect["betty_explosion"], self.origin);
wait 0.2;
if (!isdefined(self) || !isdefined(self.owner))
return;
if (isdefined(self.trigger))
self.trigger delete();
self delete();
}
delete_betties_on_death(player, ent)
{
self waittill("death");
if (isdefined(player))
arrayremovevalue(player.betties, self);
wait 0.05;
if (isdefined(ent))
ent delete();
}
satchel_damage()
{
self endon("death");
self setcandamage(1);
self.health = 100000;
self.maxhealth = self.health;
attacker = undefined;
while (true)
{
self waittill("damage", amount, attacker);
if (!isdefined(self))
return;
self.health = self.maxhealth;
if (!isplayer(attacker))
continue;
if (isdefined(self.owner) && attacker == self.owner)
continue;
if (isdefined(attacker.pers) && isdefined(attacker.pers["team"]) && attacker.pers["team"] != level.zombie_team)
continue;
break;
}
if (level.satchelexplodethisframe)
wait(0.1 + randomfloat(0.4));
else
wait 0.05;
if (!isdefined(self))
return;
level.satchelexplodethisframe = 1;
thread reset_satchel_explode_this_frame();
self detonate(attacker);
}
reset_satchel_explode_this_frame()
{
wait 0.05;
level.satchelexplodethisframe = 0;
}
play_betty_effects()
{
self endon("death");
self waittill_not_moving();
playfxontag(level._effect["betty_light"], self, "tag_origin");
}
give_betties_after_rounds()
{
while (true)
{
level waittill("between_round_over");
if (!level flag_exists("teleporter_used") || !flag("teleporter_used"))
{
players = get_players();
for (i = 0; i < players.size; i++)
{
if (players[i] is_player_placeable_mine("bouncingbetty_zm"))
{
players[i] giveweapon("bouncingbetty_zm");
players[i] set_player_placeable_mine("bouncingbetty_zm");
players[i] setactionslot(4, "weapon", "bouncingbetty_zm");
players[i] setweaponammoclip("bouncingbetty_zm", 2);
}
}
}
}
}
show_betty_hint(string)
{
self endon("death");
self endon("disconnect");
if (string == "betty_purchased")
text = &"ZOMBIE_BETTY_HOWTO";
else
text = &"ZOMBIE_BETTY_ALREADY_PURCHASED";
show_equipment_hint_text(text);
}

View File

@ -27,8 +27,8 @@ screecher_spawning_logic()
while (!isdefined(level.zombie_screecher_locations) || level.zombie_screecher_locations.size <= 0)
wait 0.1;
// while ( getdvarint( _hash_B0C0D38F ) )
// wait 0.1;
while (getdvarint("scr_screecher_ignore_player"))
wait 0.1;
if (!flag("spawn_zombies"))
flag_wait("spawn_zombies");
@ -115,6 +115,43 @@ screecher_spawning_logic()
}
}
screecher_attacking()
{
player = self.favoriteenemy;
if (!isdefined(player))
{
self thread screecher_detach(player);
return;
}
if (screecher_should_runaway(player))
{
self thread screecher_detach(player);
player thread do_player_general_vox("general", "screecher_jumpoff");
return;
}
if (self.attack_time < gettime())
{
scratch_score = 5;
players = get_players();
self.screecher_score = self.screecher_score + scratch_score;
killed_player = self screecher_check_score();
if (player.health > 0 && !(isdefined(killed_player) && killed_player))
{
self.attack_delay = self.attack_delay_base + randomint(self.attack_delay_offset);
self.attack_time = gettime() + self.attack_delay;
self thread claw_fx(player, self.attack_delay * 0.001);
self playsound("zmb_vocals_screecher_attack");
player playsoundtoplayer("zmb_screecher_scratch", player);
player thread do_player_general_vox("general", "screecher_attack");
players = get_players();
}
}
}
screecher_melee_damage(player)
{
melee_score = 0;

View File

@ -0,0 +1,26 @@
#include maps\mp\zombies\_zm_ffotd;
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\zombies\_zm_utility;
#include maps\mp\zombies\_zm_stats;
ffotd_melee_miss_func()
{
if (isdefined(self.enemy))
{
if (isplayer(self.enemy) && is_placeable_mine(self.enemy getcurrentweapon()))
{
dist_sq = distancesquared(self.enemy.origin, self.origin);
melee_dist_sq = self.meleeattackdist * self.meleeattackdist;
if (dist_sq < melee_dist_sq)
{
self.enemy dodamage(self.meleedamage, self.origin, self, self, "none", "MOD_MELEE");
return;
}
}
}
if (isdefined(level.original_melee_miss_func))
self [[level.original_melee_miss_func]]();
}

View File

@ -233,16 +233,4 @@ claymore_detonation()
return;
}
}
}
claymore_setup()
{
if (!isdefined(self.claymores))
self.claymores = [];
self thread claymore_watch();
self giveweapon("claymore_zm");
self set_player_placeable_mine("claymore_zm");
self setactionslot(4, "weapon", "claymore_zm");
self setweaponammostock("claymore_zm", 2);
}

View File

@ -149,6 +149,11 @@ init_spawnable_weapon_upgrade()
unitrigger_stub.prompt_and_visibility_func = scripts\zm\replaced\_zm_weap_claymore::claymore_unitrigger_update_prompt;
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger(unitrigger_stub, scripts\zm\replaced\_zm_weap_claymore::buy_claymores);
}
else if (unitrigger_stub.zombie_weapon_upgrade == "bouncingbetty_zm")
{
unitrigger_stub.prompt_and_visibility_func = scripts\zm\reimagined\_zm_weap_bouncingbetty::betty_unitrigger_update_prompt;
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger(unitrigger_stub, scripts\zm\reimagined\_zm_weap_bouncingbetty::buy_betties);
}
else
{
if (is_lethal_grenade(unitrigger_stub.zombie_weapon_upgrade))
@ -220,7 +225,7 @@ add_dynamic_wallbuy(weapon, wallbuy, pristine)
if (!is_melee_weapon(weapon))
{
if (pristine || weapon == "claymore_zm")
if (pristine || weapon == "claymore_zm" || weapon == "bouncingbetty_zm")
unitrigger_stub.hint_string = get_weapon_hint(weapon);
else
unitrigger_stub.hint_string = get_weapon_hint_ammo();
@ -249,6 +254,11 @@ add_dynamic_wallbuy(weapon, wallbuy, pristine)
unitrigger_stub.prompt_and_visibility_func = maps\mp\zombies\_zm_weap_claymore::claymore_unitrigger_update_prompt;
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger(unitrigger_stub, maps\mp\zombies\_zm_weap_claymore::buy_claymores);
}
else if (weapon == "bouncingbetty_zm")
{
unitrigger_stub.prompt_and_visibility_func = scripts\zm\reimagined\_zm_weap_bouncingbetty::betty_unitrigger_update_prompt;
maps\mp\zombies\_zm_unitrigger::register_static_unitrigger(unitrigger_stub, scripts\zm\reimagined\_zm_weap_bouncingbetty::buy_betties);
}
else
{
if (is_lethal_grenade(unitrigger_stub.zombie_weapon_upgrade))
@ -444,6 +454,12 @@ weapon_give(weapon, is_upgrade, magic_box, nosound)
self play_weapon_vo(weapon, magic_box);
return;
}
else if (weapon == "bouncingbetty_zm")
{
self thread scripts\zm\reimagined\_zm_weap_bouncingbetty::betty_setup();
self play_weapon_vo(weapon, magic_box);
return;
}
if (isDefined(level.zombie_weapons_callbacks) && isDefined(level.zombie_weapons_callbacks[weapon]))
{
@ -851,6 +867,73 @@ makegrenadedudanddestroy()
}
}
weaponobjects_on_player_connect_override_internal()
{
self maps\mp\gametypes_zm\_weaponobjects::createbasewatchers();
self createclaymorewatcher_zm();
self createbettywatcher_zm();
for (i = 0; i < level.retrievable_knife_init_names.size; i++)
self createballisticknifewatcher_zm(level.retrievable_knife_init_names[i], level.retrievable_knife_init_names[i] + "_zm");
self maps\mp\gametypes_zm\_weaponobjects::setupretrievablewatcher();
if (!isdefined(self.weaponobjectwatcherarray))
self.weaponobjectwatcherarray = [];
self thread maps\mp\gametypes_zm\_weaponobjects::watchweaponobjectspawn();
self thread maps\mp\gametypes_zm\_weaponobjects::watchweaponprojectileobjectspawn();
self thread maps\mp\gametypes_zm\_weaponobjects::deleteweaponobjectson();
self.concussionendtime = 0;
self.hasdonecombat = 0;
self.lastfiretime = 0;
self thread watchweaponusagezm();
self thread maps\mp\gametypes_zm\_weapons::watchgrenadeusage();
self thread maps\mp\gametypes_zm\_weapons::watchmissileusage();
self thread watchweaponchangezm();
self thread maps\mp\gametypes_zm\_weapons::watchturretuse();
self thread trackweaponzm();
self notify("weapon_watchers_created");
}
createbettywatcher_zm()
{
watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher("bouncingbetty", "bouncingbetty_zm", self.team);
watcher.onspawnretrievetriggers = scripts\zm\reimagined\_zm_weap_bouncingbetty::on_spawn_retrieve_trigger;
watcher.adjusttriggerorigin = scripts\zm\reimagined\_zm_weap_bouncingbetty::adjust_trigger_origin;
watcher.pickup = level.pickup_betties;
watcher.pickup_trigger_listener = level.pickup_betties_trigger_listener;
watcher.skip_weapon_object_damage = 1;
watcher.headicon = 0;
watcher.watchforfire = 1;
watcher.detonate = ::bettydetonate;
watcher.ondamage = level.betties_on_damage;
}
bettydetonate(attacker, weaponname)
{
from_emp = isempweapon(weaponname);
if (from_emp)
{
self delete();
return;
}
if (isdefined(attacker))
self detonate(attacker);
else if (isdefined(self.owner) && isplayer(self.owner))
self detonate(self.owner);
else
self detonate();
}
setupretrievablehintstrings()
{
maps\mp\gametypes_zm\_weaponobjects::createretrievablehint("claymore", &"ZOMBIE_CLAYMORE_PICKUP");
maps\mp\gametypes_zm\_weaponobjects::createretrievablehint("bouncingbetty", &"ZOMBIE_BOUNCINGBETTY_PICKUP");
}
createballisticknifewatcher_zm(name, weapon)
{
watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher(name, weapon, self.team);

View File

@ -176,7 +176,7 @@ dig_up_weapon(digger)
a_rare_weapons = array("dsr50_zm", "srm1216_zm");
if (digger.dig_vars["has_upgraded_shovel"])
a_rare_weapons = combinearrays(a_rare_weapons, array("claymore_zm", "vector_zm", "ksg_zm", "mp40_zm", "mp44_zm"));
a_rare_weapons = combinearrays(a_rare_weapons, array("bouncingbetty_zm", "vector_zm", "ksg_zm", "mp40_zm", "mp44_zm"));
str_weapon = undefined;
@ -189,9 +189,9 @@ dig_up_weapon(digger)
v_spawnang = (0, 0, 0);
str_spec_model = undefined;
if (str_weapon == "claymore_zm")
if (str_weapon == "bouncingbetty_zm")
{
str_spec_model = "t6_wpn_claymore_world";
str_spec_model = "t6_wpn_bouncing_betty_world";
v_spawnang += vectorscale((0, 1, 0), 90.0);
}
@ -199,9 +199,9 @@ dig_up_weapon(digger)
v_angles = (0, v_angles[1], 0) + vectorscale((0, 1, 0), 90.0) + v_spawnang;
m_weapon = spawn_weapon_model(str_weapon, str_spec_model, v_spawnpt, v_angles);
if (str_weapon == "claymore_zm")
if (str_weapon == "bouncingbetty_zm")
{
m_weapon setmodel("t6_wpn_claymore_world");
m_weapon setmodel("t6_wpn_bouncing_betty_world");
v_spawnang += vectorscale((0, 0, 1), 90.0);
}
@ -246,12 +246,12 @@ swap_weapon(str_weapon, e_player)
{
str_current_weapon = e_player getcurrentweapon();
if (str_weapon == "claymore_zm")
if (str_weapon == "bouncingbetty_zm")
{
if (!e_player hasweapon(str_weapon))
{
e_player thread maps\mp\zombies\_zm_weap_claymore::show_claymore_hint("claymore_purchased");
e_player thread maps\mp\zombies\_zm_weap_claymore::claymore_setup();
e_player thread scripts\zm\reimagined\_zm_weap_bouncingbetty::show_betty_hint("betty_purchased");
e_player thread scripts\zm\reimagined\_zm_weap_bouncingbetty::betty_setup();
e_player thread maps\mp\zombies\_zm_audio::create_and_play_dialog("weapon_pickup", "grenade");
}
else

View File

@ -83,6 +83,7 @@ init()
meat_init();
}
level.dont_allow_meat_interaction = 1;
level.can_revive_game_module = ::can_revive;
level._powerup_grab_check = ::powerup_can_player_grab;
level.meat_bounce_override = scripts\zm\replaced\zgrief::meat_bounce_override;

View File

@ -64,6 +64,8 @@ main()
replaceFunc(maps\mp\zombies\_zm_weap_staff_fire::flame_damage_fx, scripts\zm\replaced\_zm_weap_staff_fire::flame_damage_fx);
replaceFunc(maps\mp\zombies\_zm_weap_staff_fire::get_impact_damage, scripts\zm\replaced\_zm_weap_staff_fire::get_impact_damage);
replaceFunc(maps\mp\zombies\_zm_weap_staff_lightning::staff_lightning_ball_kill_zombies, scripts\zm\replaced\_zm_weap_staff_lightning::staff_lightning_ball_kill_zombies);
scripts\zm\reimagined\_zm_weap_bouncingbetty::init();
}
init()

View File

@ -28,6 +28,7 @@ main()
replaceFunc(maps\mp\zombies\_zm_ai_avogadro::avogadro_exit, scripts\zm\replaced\_zm_ai_avogadro::avogadro_exit);
replaceFunc(maps\mp\zombies\_zm_ai_avogadro::avogadro_damage_func, scripts\zm\replaced\_zm_ai_avogadro::avogadro_damage_func);
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_spawning_logic, scripts\zm\replaced\_zm_ai_screecher::screecher_spawning_logic);
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_attacking, scripts\zm\replaced\_zm_ai_screecher::screecher_attacking);
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_melee_damage, scripts\zm\replaced\_zm_ai_screecher::screecher_melee_damage);
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_detach, scripts\zm\replaced\_zm_ai_screecher::screecher_detach);
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_cleanup, scripts\zm\replaced\_zm_ai_screecher::screecher_cleanup);
@ -62,6 +63,9 @@ main()
init()
{
level.explode_overheated_jetgun = 0;
level.unbuild_overheated_jetgun = 0;
level.take_overheated_jetgun = 1;
level.zombie_init_done = ::zombie_init_done;
level.special_weapon_magicbox_check = ::transit_special_weapon_magicbox_check;
level.can_revive = ::can_revive;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,6 +2,8 @@
>type,fastfile
>name,common_mp
>level.ipak_read,mp
include,includes/knife_zm
include,includes/knife_ballistic_zm
@ -10,6 +12,7 @@ include,includes/insas_zm
include,includes/vector_zm
include,includes/sig556_zm
include,includes/sa58_zm
include,includes/bouncing_betty_zm
include,includes/attachment
include,includes/materials

View File

@ -0,0 +1,35 @@
image,~~-gmtl_t6_wpn_bouncing_betty~906cc183
image,mtl_t6_wpn_bouncing_betty_nml
image,~-gmtl_t6_wpn_bouncing_betty_col
material,mc/mtl_t6_wpn_bouncing_betty
xmodel,t6_wpn_bouncing_betty_view
xmodel,t6_wpn_bouncing_betty_world
xanim,viewmodel_bouncing_betty_idle
xanim,viewmodel_bouncing_betty_fire
xanim,viewmodel_bouncing_betty_ads_up
xanim,viewmodel_bouncing_betty_ads_down
material,hud_bounce_betty_256
image,hud_bounce_betty_32
material,hud_bounce_betty
image,mtl_t6_wpn_bouncing_betty_col
material,mc/mtl_t6_wpn_bouncing_betty_detect
xmodel,t6_wpn_bouncing_betty_world_detect
image,fxt_exp_ember_omni
material,gfx_fxt_exp_ember_omni_add
material,gfx_fxt_light_flare_phosphorous_z120
fx,weapon/bouncing_betty/fx_betty_explosion
fx,weapon/bouncing_betty/fx_betty_destroyed
material,gfx_fxt_smk_light_old_z20
image,fxt_debris_gib_rock
material,gfx_fxt_debris_gib_rock
image,fxt_debris_plume_dirt
material,gfx_fxt_debris_plume_dirt_z5
material,gfx_fxt_smk_gen_ds255_z10
material,gfx_fxt_debris_plume_dirt
fx,weapon/bouncing_betty/fx_betty_launch_dirt
material,gfx_fxt_debris_wind_ash
material,gfx_fxt_smk_light_old_z5
fx,weapon/bouncing_betty/fx_betty_launch_dust
material,gfx_fxt_light_flare_halogen_eo4_z2
fx,weapon/bouncing_betty/fx_betty_light_green
fx,weapon/bouncing_betty/fx_betty_light_red