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:
parent
04252e9420
commit
4c7b0f53c7
@ -82,6 +82,7 @@
|
|||||||
* [Equipment](#equipment)
|
* [Equipment](#equipment)
|
||||||
* [Combat Knife](#combat-knife)
|
* [Combat Knife](#combat-knife)
|
||||||
* [Claymore](#claymore)
|
* [Claymore](#claymore)
|
||||||
|
* [Bouncing Betty](#bouncing-betty)
|
||||||
* [Time Bomb](#time-bomb)
|
* [Time Bomb](#time-bomb)
|
||||||
* [One Inch Punch](#one-inch-punch)
|
* [One Inch Punch](#one-inch-punch)
|
||||||
* [Wallbuys](#wallbuys)
|
* [Wallbuys](#wallbuys)
|
||||||
@ -564,10 +565,14 @@
|
|||||||
#### Claymore
|
#### Claymore
|
||||||
* Can be repurchased
|
* Can be repurchased
|
||||||
* Can be placed while in the air
|
* 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
|
* Increased max amount that can be placed from 12 to 20
|
||||||
* Added weapon name on HUD
|
* Added weapon name on HUD
|
||||||
* Removed initial weapon raise anim
|
* Removed initial weapon raise anim
|
||||||
|
|
||||||
|
#### Bouncing Betty
|
||||||
|
* Replaces Claymore on Origins
|
||||||
|
|
||||||
#### Time Bomb
|
#### Time Bomb
|
||||||
* No longer sends players back in time
|
* No longer sends players back in time
|
||||||
* Kills all zombies
|
* Kills all zombies
|
||||||
|
@ -1092,6 +1092,12 @@ LANG_ENGLISH "Hold ^3[{+activate}]^7 for SWAT-556 [Cost: &&1]"
|
|||||||
REFERENCE ZOMBIE_WEAPON_STICKY_GRENADE
|
REFERENCE ZOMBIE_WEAPON_STICKY_GRENADE
|
||||||
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Semtex Grenades [Cost: &&1]"
|
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
|
REFERENCE ZOMBIE_PERK_QUICKREVIVE
|
||||||
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Quick Revive [Cost: &&1]"
|
LANG_ENGLISH "Hold ^3[{+activate}]^7 for Quick Revive [Cost: &&1]"
|
||||||
|
|
||||||
|
@ -5039,16 +5039,16 @@
|
|||||||
{
|
{
|
||||||
"targetname" "pf2204_auto37"
|
"targetname" "pf2204_auto37"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"model" "t6_wpn_claymore_world"
|
"model" "t6_wpn_bouncing_betty_world"
|
||||||
"angles" "0 270 0"
|
"angles" "90 270 0"
|
||||||
"origin" "1204 4364.75 -296"
|
"origin" "1204 4362.75 -292"
|
||||||
"script_vector" "0 -90 0"
|
"script_vector" "0 -90 0"
|
||||||
"guid" "A44E7A85"
|
"guid" "A44E7A85"
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
"target" "pf2204_auto37"
|
"target" "pf2204_auto37"
|
||||||
"targetname" "claymore_purchase"
|
"targetname" "claymore_purchase"
|
||||||
"zombie_weapon_upgrade" "claymore_zm"
|
"zombie_weapon_upgrade" "bouncingbetty_zm"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"origin" "1197 4364.75 -289"
|
"origin" "1197 4364.75 -289"
|
||||||
"angles" "0 180 0"
|
"angles" "0 180 0"
|
||||||
@ -5126,16 +5126,16 @@
|
|||||||
{
|
{
|
||||||
"targetname" "pf2209_auto37"
|
"targetname" "pf2209_auto37"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"model" "t6_wpn_claymore_world"
|
"model" "t6_wpn_bouncing_betty_world"
|
||||||
"angles" "0 90 0"
|
"angles" "90 90 0"
|
||||||
"origin" "-2848 -69.75 300"
|
"origin" "-2848 -67.75 304"
|
||||||
"script_vector" "0 -90 0"
|
"script_vector" "0 -90 0"
|
||||||
"guid" "A44E7A85"
|
"guid" "A44E7A85"
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
"target" "pf2209_auto37"
|
"target" "pf2209_auto37"
|
||||||
"targetname" "claymore_purchase"
|
"targetname" "claymore_purchase"
|
||||||
"zombie_weapon_upgrade" "claymore_zm"
|
"zombie_weapon_upgrade" "bouncingbetty_zm"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"origin" "-2841 -69.75 307"
|
"origin" "-2841 -69.75 307"
|
||||||
"angles" "0 1.00179e-005 0"
|
"angles" "0 1.00179e-005 0"
|
||||||
@ -5348,16 +5348,16 @@
|
|||||||
{
|
{
|
||||||
"targetname" "pf2222_auto37"
|
"targetname" "pf2222_auto37"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"model" "t6_wpn_claymore_world"
|
"model" "t6_wpn_bouncing_betty_world"
|
||||||
"angles" "0 270 0"
|
"angles" "90 270 0"
|
||||||
"origin" "2360 473 165"
|
"origin" "2360 471 169"
|
||||||
"script_vector" "0 -90 0"
|
"script_vector" "0 -90 0"
|
||||||
"guid" "A44E7A85"
|
"guid" "A44E7A85"
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
"target" "pf2222_auto37"
|
"target" "pf2222_auto37"
|
||||||
"targetname" "claymore_purchase"
|
"targetname" "claymore_purchase"
|
||||||
"zombie_weapon_upgrade" "claymore_zm"
|
"zombie_weapon_upgrade" "bouncingbetty_zm"
|
||||||
"classname" "script_struct"
|
"classname" "script_struct"
|
||||||
"origin" "2353 473 172"
|
"origin" "2353 473 172"
|
||||||
"angles" "0 180 0"
|
"angles" "0 180 0"
|
||||||
|
@ -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::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::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_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::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::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);
|
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::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::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::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::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_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);
|
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::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_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_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::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);
|
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.solo_lives_given = 0;
|
||||||
self.stored_weapon_data = undefined;
|
self.stored_weapon_data = undefined;
|
||||||
self.screecher_seen_hint = 1;
|
|
||||||
|
|
||||||
self thread health_bar_hud();
|
self thread health_bar_hud();
|
||||||
self thread zone_name_hud();
|
self thread zone_name_hud();
|
||||||
@ -340,7 +341,6 @@ post_all_players_spawned()
|
|||||||
|
|
||||||
wait 0.05;
|
wait 0.05;
|
||||||
|
|
||||||
level.near_miss = 2; // makes screecher not run away first time on solo
|
|
||||||
level.ta_vaultfee = 0;
|
level.ta_vaultfee = 0;
|
||||||
level.ta_tellerfee = 0;
|
level.ta_tellerfee = 0;
|
||||||
level.weapon_locker_online = 0;
|
level.weapon_locker_online = 0;
|
||||||
@ -367,10 +367,6 @@ post_all_players_spawned()
|
|||||||
level.zombie_vars["slipgun_reslip_rate"] = 0;
|
level.zombie_vars["slipgun_reslip_rate"] = 0;
|
||||||
level.zombie_vars["zombie_perk_divetonuke_min_damage"] = 1000;
|
level.zombie_vars["zombie_perk_divetonuke_min_damage"] = 1000;
|
||||||
level.zombie_vars["zombie_perk_divetonuke_max_damage"] = 5000;
|
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.players_can_damage_riotshields = 1;
|
||||||
level.speed_change_round = undefined;
|
level.speed_change_round = undefined;
|
||||||
level.playersuicideallowed = undefined;
|
level.playersuicideallowed = undefined;
|
||||||
@ -487,9 +483,10 @@ health_bar_hud()
|
|||||||
|
|
||||||
flag_wait("hud_visible");
|
flag_wait("hud_visible");
|
||||||
|
|
||||||
prev_health = 0;
|
vars = [];
|
||||||
prev_maxhealth = 0;
|
vars["prev_health"] = 0;
|
||||||
prev_shield_health = 0;
|
vars["prev_maxhealth"] = 0;
|
||||||
|
vars["prev_shield_health"] = 0;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
@ -501,14 +498,14 @@ health_bar_hud()
|
|||||||
shield_health = int((shield_health / level.zombie_vars["riotshield_hit_points"]) * 100);
|
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);
|
self luinotifyevent(&"hud_update_health", 3, self.health, self.maxhealth, shield_health);
|
||||||
}
|
}
|
||||||
|
|
||||||
prev_health = self.health;
|
vars["prev_health"] = self.health;
|
||||||
prev_maxhealth = self.maxhealth;
|
vars["prev_maxhealth"] = self.maxhealth;
|
||||||
prev_shield_health = shield_health;
|
vars["prev_shield_health"] = shield_health;
|
||||||
|
|
||||||
wait 0.05;
|
wait 0.05;
|
||||||
}
|
}
|
||||||
@ -543,26 +540,28 @@ enemy_counter_hud()
|
|||||||
|
|
||||||
hud.alpha = 1;
|
hud.alpha = 1;
|
||||||
|
|
||||||
|
vars = [];
|
||||||
|
|
||||||
while (1)
|
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"))
|
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"))
|
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("");
|
hud setText("");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hud setValue(enemies);
|
hud setValue(vars["enemies"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
wait 0.05;
|
wait 0.05;
|
||||||
@ -571,16 +570,19 @@ enemy_counter_hud()
|
|||||||
|
|
||||||
get_current_ghost_count()
|
get_current_ghost_count()
|
||||||
{
|
{
|
||||||
ghost_count = 0;
|
vars = [];
|
||||||
ais = getaiarray(level.zombie_team);
|
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)
|
vars["ai"] = vars["ais"][i];
|
||||||
ghost_count++;
|
|
||||||
|
if (isdefined(vars["ai"].is_ghost) && vars["ai"].is_ghost)
|
||||||
|
vars["ghost_count"]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ghost_count;
|
return vars["ghost_count"];
|
||||||
}
|
}
|
||||||
|
|
||||||
timer_hud()
|
timer_hud()
|
||||||
@ -1365,8 +1367,8 @@ fall_velocity_check()
|
|||||||
while (!self isOnGround())
|
while (!self isOnGround())
|
||||||
{
|
{
|
||||||
vars["was_on_ground"] = 0;
|
vars["was_on_ground"] = 0;
|
||||||
vel = self getVelocity();
|
vars["vel"] = self getVelocity();
|
||||||
self.fall_velocity = vel[2];
|
self.fall_velocity = vars["vel"][2];
|
||||||
wait 0.05;
|
wait 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,14 +1395,16 @@ fall_velocity_check()
|
|||||||
|
|
||||||
disable_bank_teller()
|
disable_bank_teller()
|
||||||
{
|
{
|
||||||
level notify("stop_bank_teller");
|
vars = [];
|
||||||
bank_teller_dmg_trig = getent("bank_teller_tazer_trig", "targetname");
|
|
||||||
|
|
||||||
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");
|
vars["bank_teller_transfer_trig"] = getent(vars["bank_teller_dmg_trig"].target, "targetname");
|
||||||
bank_teller_dmg_trig delete();
|
vars["bank_teller_transfer_trig"] delete();
|
||||||
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);
|
include_weapon("held_one_inch_punch_lightning_zm", 0);
|
||||||
register_melee_weapon_for_level("held_one_inch_punch_lightning_zm");
|
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"]))
|
if (isdefined(level.zombie_weapons["saritch_zm"]))
|
||||||
|
516
scripts/zm/reimagined/_zm_weap_bouncingbetty.gsc
Normal file
516
scripts/zm/reimagined/_zm_weap_bouncingbetty.gsc
Normal 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);
|
||||||
|
}
|
@ -27,8 +27,8 @@ screecher_spawning_logic()
|
|||||||
while (!isdefined(level.zombie_screecher_locations) || level.zombie_screecher_locations.size <= 0)
|
while (!isdefined(level.zombie_screecher_locations) || level.zombie_screecher_locations.size <= 0)
|
||||||
wait 0.1;
|
wait 0.1;
|
||||||
|
|
||||||
// while ( getdvarint( _hash_B0C0D38F ) )
|
while (getdvarint("scr_screecher_ignore_player"))
|
||||||
// wait 0.1;
|
wait 0.1;
|
||||||
|
|
||||||
if (!flag("spawn_zombies"))
|
if (!flag("spawn_zombies"))
|
||||||
flag_wait("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)
|
screecher_melee_damage(player)
|
||||||
{
|
{
|
||||||
melee_score = 0;
|
melee_score = 0;
|
||||||
|
26
scripts/zm/replaced/_zm_ffotd.gsc
Normal file
26
scripts/zm/replaced/_zm_ffotd.gsc
Normal 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]]();
|
||||||
|
}
|
@ -233,16 +233,4 @@ claymore_detonation()
|
|||||||
return;
|
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);
|
|
||||||
}
|
}
|
@ -149,6 +149,11 @@ init_spawnable_weapon_upgrade()
|
|||||||
unitrigger_stub.prompt_and_visibility_func = scripts\zm\replaced\_zm_weap_claymore::claymore_unitrigger_update_prompt;
|
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);
|
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
|
else
|
||||||
{
|
{
|
||||||
if (is_lethal_grenade(unitrigger_stub.zombie_weapon_upgrade))
|
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 (!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);
|
unitrigger_stub.hint_string = get_weapon_hint(weapon);
|
||||||
else
|
else
|
||||||
unitrigger_stub.hint_string = get_weapon_hint_ammo();
|
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;
|
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);
|
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
|
else
|
||||||
{
|
{
|
||||||
if (is_lethal_grenade(unitrigger_stub.zombie_weapon_upgrade))
|
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);
|
self play_weapon_vo(weapon, magic_box);
|
||||||
return;
|
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]))
|
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)
|
createballisticknifewatcher_zm(name, weapon)
|
||||||
{
|
{
|
||||||
watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher(name, weapon, self.team);
|
watcher = self maps\mp\gametypes_zm\_weaponobjects::createuseweaponobjectwatcher(name, weapon, self.team);
|
||||||
|
@ -176,7 +176,7 @@ dig_up_weapon(digger)
|
|||||||
a_rare_weapons = array("dsr50_zm", "srm1216_zm");
|
a_rare_weapons = array("dsr50_zm", "srm1216_zm");
|
||||||
|
|
||||||
if (digger.dig_vars["has_upgraded_shovel"])
|
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;
|
str_weapon = undefined;
|
||||||
|
|
||||||
@ -189,9 +189,9 @@ dig_up_weapon(digger)
|
|||||||
v_spawnang = (0, 0, 0);
|
v_spawnang = (0, 0, 0);
|
||||||
str_spec_model = undefined;
|
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);
|
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;
|
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);
|
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);
|
v_spawnang += vectorscale((0, 0, 1), 90.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,12 +246,12 @@ swap_weapon(str_weapon, e_player)
|
|||||||
{
|
{
|
||||||
str_current_weapon = e_player getcurrentweapon();
|
str_current_weapon = e_player getcurrentweapon();
|
||||||
|
|
||||||
if (str_weapon == "claymore_zm")
|
if (str_weapon == "bouncingbetty_zm")
|
||||||
{
|
{
|
||||||
if (!e_player hasweapon(str_weapon))
|
if (!e_player hasweapon(str_weapon))
|
||||||
{
|
{
|
||||||
e_player thread maps\mp\zombies\_zm_weap_claymore::show_claymore_hint("claymore_purchased");
|
e_player thread scripts\zm\reimagined\_zm_weap_bouncingbetty::show_betty_hint("betty_purchased");
|
||||||
e_player thread maps\mp\zombies\_zm_weap_claymore::claymore_setup();
|
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");
|
e_player thread maps\mp\zombies\_zm_audio::create_and_play_dialog("weapon_pickup", "grenade");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -83,6 +83,7 @@ init()
|
|||||||
meat_init();
|
meat_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
level.dont_allow_meat_interaction = 1;
|
||||||
level.can_revive_game_module = ::can_revive;
|
level.can_revive_game_module = ::can_revive;
|
||||||
level._powerup_grab_check = ::powerup_can_player_grab;
|
level._powerup_grab_check = ::powerup_can_player_grab;
|
||||||
level.meat_bounce_override = scripts\zm\replaced\zgrief::meat_bounce_override;
|
level.meat_bounce_override = scripts\zm\replaced\zgrief::meat_bounce_override;
|
||||||
|
@ -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::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_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);
|
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()
|
init()
|
||||||
|
@ -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_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_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_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_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_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);
|
replaceFunc(maps\mp\zombies\_zm_ai_screecher::screecher_cleanup, scripts\zm\replaced\_zm_ai_screecher::screecher_cleanup);
|
||||||
@ -62,6 +63,9 @@ main()
|
|||||||
|
|
||||||
init()
|
init()
|
||||||
{
|
{
|
||||||
|
level.explode_overheated_jetgun = 0;
|
||||||
|
level.unbuild_overheated_jetgun = 0;
|
||||||
|
level.take_overheated_jetgun = 1;
|
||||||
level.zombie_init_done = ::zombie_init_done;
|
level.zombie_init_done = ::zombie_init_done;
|
||||||
level.special_weapon_magicbox_check = ::transit_special_weapon_magicbox_check;
|
level.special_weapon_magicbox_check = ::transit_special_weapon_magicbox_check;
|
||||||
level.can_revive = ::can_revive;
|
level.can_revive = ::can_revive;
|
||||||
|
1
weapons/zm/bouncingbetty_zm
Normal file
1
weapons/zm/bouncingbetty_zm
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -2,6 +2,8 @@
|
|||||||
>type,fastfile
|
>type,fastfile
|
||||||
>name,common_mp
|
>name,common_mp
|
||||||
|
|
||||||
|
>level.ipak_read,mp
|
||||||
|
|
||||||
include,includes/knife_zm
|
include,includes/knife_zm
|
||||||
include,includes/knife_ballistic_zm
|
include,includes/knife_ballistic_zm
|
||||||
|
|
||||||
@ -10,6 +12,7 @@ include,includes/insas_zm
|
|||||||
include,includes/vector_zm
|
include,includes/vector_zm
|
||||||
include,includes/sig556_zm
|
include,includes/sig556_zm
|
||||||
include,includes/sa58_zm
|
include,includes/sa58_zm
|
||||||
|
include,includes/bouncing_betty_zm
|
||||||
|
|
||||||
include,includes/attachment
|
include,includes/attachment
|
||||||
include,includes/materials
|
include,includes/materials
|
35
zone_source/includes/bouncing_betty_zm.zone
Normal file
35
zone_source/includes/bouncing_betty_zm.zone
Normal 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
|
Loading…
x
Reference in New Issue
Block a user