#include maps\mp\zombies\_zm_weap_riotshield; #include maps\mp\_utility; #include common_scripts\utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\zombies\_zm_riotshield; #include maps\mp\zombies\_zm_spawner; #include maps\mp\zombies\_zm_equipment; #include maps\mp\gametypes_zm\_weaponobjects; #include maps\mp\zombies\_zm_stats; #include maps\mp\zombies\_zm_laststand; #include maps\mp\zombies\_zm_weapons; #include maps\mp\zombies\_zm_unitrigger; #include maps\mp\animscripts\zm_death; #include maps\mp\zombies\_zm_audio; init() { maps\mp\zombies\_zm_riotshield::init(); set_zombie_var("riotshield_cylinder_radius", 360); set_zombie_var("riotshield_fling_range", 90); set_zombie_var("riotshield_gib_range", 90); set_zombie_var("riotshield_gib_damage", 75); set_zombie_var("riotshield_knockdown_range", 90); set_zombie_var("riotshield_knockdown_damage", 15); set_zombie_var("riotshield_hit_points", 2250); set_zombie_var("riotshield_fling_damage_shield", 100); set_zombie_var("riotshield_knockdown_damage_shield", 15); level.riotshield_network_choke_count = 0; level.riotshield_gib_refs = []; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "guts"; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "right_arm"; level.riotshield_gib_refs[level.riotshield_gib_refs.size] = "left_arm"; level.riotshield_damage_callback = ::player_damage_shield; level.deployed_riotshield_damage_callback = ::deployed_damage_shield; level.transferriotshield = ::transferriotshield; level.cantransferriotshield = ::cantransferriotshield; maps\mp\zombies\_zm_spawner::register_zombie_damage_callback(::riotshield_zombie_damage_response); maps\mp\zombies\_zm_equipment::register_equipment("riotshield_zm", &"ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_RIOTSHIELD_HOWTO", "riotshield_zm_icon", "riotshield", ::riotshield_activation_watcher_thread, undefined, ::dropshield, ::pickupshield); maps\mp\gametypes_zm\_weaponobjects::createretrievablehint("riotshield", &"ZOMBIE_EQUIP_RIOTSHIELD_PICKUP_HINT_STRING"); onplayerconnect_callback(::onplayerconnect); } onplayerconnect() { self.player_shield_reset_health = ::player_init_shield_health; self.player_shield_apply_damage = ::player_damage_shield; self.player_shield_reset_location = ::player_init_shield_location; self thread watchriotshielduse(); self thread watchriotshieldmelee(); self thread player_watch_laststand(); } player_damage_shield(idamage, bheld) { damagemax = level.zombie_vars["riotshield_hit_points"]; if (!isdefined(self.shielddamagetaken)) self.shielddamagetaken = 0; self.shielddamagetaken += idamage; if (self.shielddamagetaken >= damagemax) { if (bheld || !isdefined(self.shield_ent)) { self playrumbleonentity("damage_heavy"); earthquake(1.0, 0.75, self.origin, 100); self playsound("wpn_riotshield_zm_destroy"); self thread player_take_riotshield(); } else { shield_origin = self.shield_ent.origin; playsoundatposition("fly_riotshield_zm_impact_zombies", shield_origin); if (is_true(self.shield_ent.destroy_begun)) return; self.shield_ent.destroy_begun = 1; self thread player_wait_and_take_riotshield(); } } else { if (bheld || !isdefined(self.shield_ent)) { self playrumbleonentity("damage_light"); earthquake(0.5, 0.5, self.origin, 100); self playsound("fly_riotshield_zm_impact_zombies"); } else { shield_origin = self.shield_ent.origin; playsoundatposition("fly_riotshield_zm_impact_zombies", shield_origin); } self player_set_shield_health(self.shielddamagetaken, damagemax); } } player_wait_and_take_riotshield() { shield_origin = self.shield_ent.origin; level thread maps\mp\zombies\_zm_equipment::equipment_disappear_fx(shield_origin, level._riotshield_dissapear_fx); wait 1; playsoundatposition("wpn_riotshield_zm_destroy", shield_origin); self thread player_take_riotshield(); } watchriotshieldmelee() { for (;;) { self waittill("weapon_melee", weapon); if (weapon == level.riotshield_name) self riotshield_melee(); } } riotshield_melee() { if (!isdefined(level.riotshield_knockdown_enemies)) { level.riotshield_knockdown_enemies = []; level.riotshield_knockdown_gib = []; level.riotshield_fling_enemies = []; level.riotshield_fling_vecs = []; } self riotshield_get_enemies_in_range(); shield_damage = 0; level.riotshield_network_choke_count = 0; for (i = 0; i < level.riotshield_fling_enemies.size; i++) { riotshield_network_choke(); if (isdefined(level.riotshield_fling_enemies[i])) { level.riotshield_fling_enemies[i] thread riotshield_fling_zombie(self, level.riotshield_fling_vecs[i], i); shield_damage += level.zombie_vars["riotshield_fling_damage_shield"]; } } for (i = 0; i < level.riotshield_knockdown_enemies.size; i++) { riotshield_network_choke(); level.riotshield_knockdown_enemies[i] thread riotshield_knockdown_zombie(self, level.riotshield_knockdown_gib[i]); shield_damage += level.zombie_vars["riotshield_knockdown_damage_shield"]; } level.riotshield_knockdown_enemies = []; level.riotshield_knockdown_gib = []; level.riotshield_fling_enemies = []; level.riotshield_fling_vecs = []; if (shield_damage) self player_damage_shield(shield_damage, 0); } riotshield_fling_zombie(player, fling_vec, index) { if (!isdefined(self) || !isalive(self)) return; if (isdefined(self.ignore_riotshield) && self.ignore_riotshield) return; if (isdefined(self.riotshield_fling_func)) { self [[self.riotshield_fling_func]](player); return; } damage = 2500; self dodamage(damage, player.origin, player, player, 0, "MOD_MELEE", 0, level.riotshield_name); if (self.health < 1) { self.riotshield_death = 1; player maps\mp\zombies\_zm_score::player_add_points("death", "MOD_MELEE"); self startragdoll(); self launchragdoll(fling_vec); } else { player maps\mp\zombies\_zm_score::player_add_points("damage_light"); } } zombie_knockdown(player, gib) { if (isdefined(level.override_riotshield_damage_func)) self [[level.override_riotshield_damage_func]](player, gib); else { if (gib) { self.a.gib_ref = random(level.riotshield_gib_refs); self thread maps\mp\animscripts\zm_death::do_gib(); } } } riotshield_knockdown_zombie(player, gib) { self endon("death"); playsoundatposition("vox_riotshield_forcehit", self.origin); playsoundatposition("wpn_riotshield_proj_impact", self.origin); if (!isdefined(self) || !isalive(self)) return; if (isdefined(self.riotshield_knockdown_func)) self [[self.riotshield_knockdown_func]](player, gib); else self zombie_knockdown(player, gib); self dodamage(level.zombie_vars["riotshield_knockdown_damage"], player.origin, player, player, 0, "MOD_MELEE", 0, level.riotshield_name); self playsound("fly_riotshield_forcehit"); if (self.health < 1) { player maps\mp\zombies\_zm_score::player_add_points("death", "MOD_MELEE"); } else { player maps\mp\zombies\_zm_score::player_add_points("damage_light"); } }