#include maps\mp\zombies\_zm_ai_sloth; #include common_scripts\utility; #include maps\mp\_utility; #include maps\mp\zombies\_zm_utility; #include maps\mp\animscripts\zm_utility; #include maps\mp\zombies\_zm_ai_sloth_buildables; #include maps\mp\zombies\_zm_ai_sloth_crawler; #include maps\mp\zombies\_zm_ai_sloth_magicbox; #include maps\mp\zombies\_zm_ai_sloth_utility; #include maps\mp\zombies\_zm_ai_sloth_ffotd; #include maps\mp\zombies\_zm_zonemgr; #include maps\mp\zombies\_zm_equipment; #include maps\mp\zombies\_zm_audio; #include maps\mp\zombies\_zm_stats; #include maps\mp\zombies\_zm_score; #include maps\mp\zombies\_zm_equip_headchopper; #include maps\mp\zombies\_zm_spawner; #include maps\mp\animscripts\zm_shared; #include maps\mp\zombies\_zm_unitrigger; #include maps\mp\zombies\_zm_buildables; #include maps\mp\animscripts\zm_death; #include maps\mp\animscripts\zm_run; #include maps\mp\zombies\_zm_powerups; #include maps\mp\zombies\_zm_weap_slowgun; #include maps\mp\zombies\_zm_weap_time_bomb; sloth_init_start_funcs() { self.start_funcs = []; self.start_funcs["jail_idle"] = ::start_jail_idle; self.start_funcs["jail_cower"] = ::start_jail_cower; self.start_funcs["jail_open"] = ::start_jail_open; self.start_funcs["jail_run"] = ::start_jail_run; self.start_funcs["jail_wait"] = ::start_jail_wait; self.start_funcs["jail_close"] = ::start_jail_close; self.start_funcs["player_idle"] = ::start_player_idle; self.start_funcs["roam"] = ::start_roam; self.start_funcs["follow"] = ::start_follow; self.start_funcs["mansion"] = ::start_mansion; self.start_funcs["berserk"] = ::start_berserk; self.start_funcs["eat"] = ::start_eat; self.start_funcs["crash"] = ::start_crash; self.start_funcs["gunshop_run"] = ::start_gunshop_run; self.start_funcs["gunshop_candy"] = ::start_gunshop_candy; self.start_funcs["table_eat"] = ::start_table_eat; self.start_funcs["headbang"] = ::start_headbang; self.start_funcs["smell"] = ::start_smell; self.start_funcs["context"] = ::start_context; } sloth_init_update_funcs() { self.update_funcs = []; self.update_funcs["jail_idle"] = ::update_jail_idle; self.update_funcs["jail_cower"] = ::update_jail_cower; self.update_funcs["jail_open"] = ::update_jail_open; self.update_funcs["jail_run"] = ::update_jail_run; self.update_funcs["jail_wait"] = ::update_jail_wait; self.update_funcs["jail_close"] = ::update_jail_close; self.update_funcs["player_idle"] = ::update_player_idle; self.update_funcs["roam"] = ::update_roam; self.update_funcs["follow"] = ::update_follow; self.update_funcs["mansion"] = ::update_mansion; self.update_funcs["berserk"] = ::update_berserk; self.update_funcs["eat"] = ::update_eat; self.update_funcs["crash"] = ::update_crash; self.update_funcs["gunshop_run"] = ::update_gunshop_run; self.update_funcs["gunshop_candy"] = ::update_gunshop_candy; self.update_funcs["table_eat"] = ::update_table_eat; self.update_funcs["headbang"] = ::update_headbang; self.update_funcs["smell"] = ::update_smell; self.update_funcs["context"] = ::update_context; self.locomotion_func = ::update_locomotion; } start_jail_run(do_pain) { if (self is_jail_state()) return false; if (self.state == "berserk" || self.state == "crash") return false; if (self sloth_is_traversing()) return false; if (self.state == "gunshop_candy" || self.state == "table_eat") { if (isdefined(self.bench)) { if (isdefined(level.weapon_bench_reset)) self.bench [[level.weapon_bench_reset]](); } } self stop_action(); self thread sndchangebreathingstate("happy"); self thread action_jail_run(self.jail_start.origin, do_pain); if (self.state == "context") { if (isdefined(self.context.interrupt)) self [[self.context.interrupt]](); } self sloth_init_roam_point(); thread maps\mp\zombies\_zm_unitrigger::unregister_unitrigger(self.gift_trigger); return true; } action_jail_run(pos, do_pain) { self.needs_action = 0; if (isdefined(self.candy_model)) self.candy_model ghost(); if (isdefined(self.booze_model)) self.booze_model ghost(); if (is_true(do_pain)) { if (!self sloth_is_traversing() && !is_true(self.is_pain)) { self.is_pain = 1; self setanimstatefromasd("zm_pain"); self.reset_asd = "zm_pain"; self thread finish_pain(); maps\mp\animscripts\zm_shared::donotetracks("pain_anim"); self notify("pain_done"); self.is_pain = 0; } } while (true) { if (!self sloth_is_pain()) break; wait 0.1; } self.reset_asd = undefined; self animmode("normal"); self set_zombie_run_cycle("run"); self.locomotion = "run"; self thread sloth_retreat_vo(); self check_behind_mansion(); if (isdefined(self.mansion_goal)) { self setgoalpos(self.mansion_goal.origin); self waittill("goal"); self action_teleport_to_courtyard(); } self.goalradius = 2; self setgoalpos(self.jail_start.origin + (0, 128, 0)); self waittill("goal"); self.goalradius = 16; self orientmode("face angle", self.jail_start.angles[1]); wait 0.5; self.needs_action = 1; } start_jail_wait() { self stopanimscripted(); self action_jail_wait(); self thread sndchangebreathingstate("happy"); return 1; } action_jail_wait() { self.needs_action = 0; self setgoalpos(self.origin); self.anchor.origin = self.origin; self.anchor.angles = self.angles; self linkto(self.anchor); self setanimstatefromasd("zm_idle_protect"); self.needs_action = 1; } update_jail_idle() { if (is_true(self.open_jail)) { level notify("cell_open"); self.open_jail = 0; } if (is_true(level.cell_open)) { self stop_action(); self sloth_set_state("jail_idle"); } } update_jail_wait() { if (is_true(self.dance_action)) { return; } players = get_players(); foreach (player in players) { if (player maps\mp\zombies\_zm_zonemgr::entity_in_zone("zone_underground_jail")) { return; } } if (self.needs_action) self sloth_set_state("jail_close"); } update_eat() { if (is_true(self.needs_action)) { self setclientfield("sloth_eating", 0); if (isdefined(self.candy_model)) self.candy_model ghost(); context = self check_contextual_actions(); if (isdefined(context)) { self sloth_set_state("context", context); return; } self sloth_set_state("roam"); } } sloth_check_ragdolls(ignore_zombie) { non_ragdoll = 0; zombies = getaispeciesarray(level.zombie_team, "all"); for (i = 0; i < zombies.size; i++) { zombie = zombies[i]; if (is_true(zombie.is_sloth)) continue; if (isdefined(ignore_zombie) && zombie == ignore_zombie) continue; if (isdefined(self.crawler) && zombie == self.crawler) continue; if (self is_facing(zombie)) { dist = distancesquared(self.origin, zombie.origin); if (dist < 4096) { if (!self sloth_ragdoll_zombie(zombie)) { if (!is_true(self.no_gib) && non_ragdoll % 3 == 0) { zombie.force_gib = 1; zombie.a.gib_ref = random(array("guts", "right_arm", "left_arm", "head")); zombie thread maps\mp\animscripts\zm_death::do_gib(); } non_ragdoll++; zombie dodamage(zombie.health * 10, zombie.origin); zombie playsound("zmb_ai_sloth_attack_impact"); zombie.noragdoll = 1; zombie.nodeathragdoll = 1; } if (isdefined(self.target_zombie) && self.target_zombie == zombie) self.target_zombie = undefined; } } } } sloth_ragdoll_zombie(zombie) { if (!isdefined(self.ragdolls)) self.ragdolls = 0; if (self.ragdolls < 4) { self.ragdolls++; zombie dodamage(zombie.health * 10, zombie.origin); zombie playsound("zmb_ai_sloth_attack_impact"); zombie startragdoll(); zombie setclientfield("sloth_ragdoll_zombie", 1); self thread sloth_ragdoll_wait(); return true; } return false; } wait_start_candy_booze(piece) { // remove }