2 const vector SHAMBLER_MIN = '-41 -41 -31';
3 const vector SHAMBLER_MAX = '41 41 65';
6 string SHAMBLER_MODEL = "models/monsters/shambler.mdl";
10 float autocvar_g_monster_shambler;
11 float autocvar_g_monster_shambler_health;
12 float autocvar_g_monster_shambler_damage;
13 float autocvar_g_monster_shambler_attack_lightning_damage;
14 float autocvar_g_monster_shambler_attack_claw_damage;
15 float autocvar_g_monster_shambler_speed_walk;
16 float autocvar_g_monster_shambler_speed_run;
19 const float shambler_anim_stand = 0;
20 const float shambler_anim_walk = 1;
21 const float shambler_anim_run = 2;
22 const float shambler_anim_smash = 3;
23 const float shambler_anim_swingr = 4;
24 const float shambler_anim_swingl = 5;
25 const float shambler_anim_magic = 6;
26 const float shambler_anim_pain = 7;
27 const float shambler_anim_death = 8;
29 void shambler_think ()
31 self.think = shambler_think;
32 self.nextthink = time + self.ticrate;
34 monster_move(autocvar_g_monster_shambler_speed_run, autocvar_g_monster_shambler_speed_walk, 300, shambler_anim_run, shambler_anim_walk, shambler_anim_stand);
37 void shambler_smash ()
39 self.monster_delayedattack = func_null;
42 monster_melee(self.enemy, autocvar_g_monster_shambler_damage, 0.3, DEATH_MONSTER_SHAMBLER_SMASH, TRUE);
45 void shambler_delayedsmash ()
47 monsters_setframe(shambler_anim_smash);
48 self.monster_delayedattack = shambler_smash;
49 self.delay = time + 0.7;
50 self.attack_finished_single = time + 1.1;
53 void() shambler_swing_right;
54 void shambler_swing_left ()
56 monsters_setframe(shambler_anim_swingl);
57 monster_melee(self.enemy, autocvar_g_monster_shambler_attack_claw_damage, 0.3, DEATH_MONSTER_SHAMBLER_CLAW, TRUE);
58 self.attack_finished_single = time + 0.8;
60 self.monster_delayedattack = func_null;
63 self.monster_delayedattack = shambler_swing_right;
64 self.delay = time + 0.5;
68 void shambler_swing_right ()
70 monsters_setframe(shambler_anim_swingr);
71 monster_melee(self.enemy, autocvar_g_monster_shambler_attack_claw_damage, 0.3, DEATH_MONSTER_SHAMBLER_CLAW, TRUE);
72 self.attack_finished_single = time + 0.8;
73 self.monster_delayedattack = func_null;
77 self.monster_delayedattack = shambler_swing_left;
78 self.delay = time + 0.5;
84 self.monster_delayedattack = func_null;
87 local vector org = '0 0 0', dir = '0 0 0';
90 self.effects |= EF_MUZZLEFLASH;
92 org = self.origin + '0 0 40';
94 dir = self.enemy.origin + '0 0 16' - org;
95 dir = normalize (dir);
97 traceline (org, self.origin + dir * 1000, TRUE, self);
99 FireRailgunBullet (org, org + dir * 1000, autocvar_g_monster_shambler_attack_lightning_damage * monster_skill, 0, 0, 0, 0, 0, DEATH_MONSTER_SHAMBLER_ZAP);
101 // teamcolor / hit beam effect
102 v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
103 WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), org, v);
106 float shambler_attack(float attack_type)
110 case MONSTER_ATTACK_MELEE:
112 float chance = random();
115 shambler_delayedsmash();
116 else if(chance > 0.3)
117 shambler_swing_right();
119 shambler_swing_left();
123 case MONSTER_ATTACK_RANGED:
125 monsters_setframe(shambler_anim_magic);
126 self.attack_finished_single = time + 1.1;
127 self.monster_delayedattack = CastLightning;
128 self.delay = time + 0.6;
139 Monster_CheckDropCvars ("shambler");
141 self.think = monster_dead_think;
142 self.nextthink = time + self.ticrate;
143 self.ltime = time + 5;
144 monsters_setframe(shambler_anim_death);
146 monster_hook_death(); // for post-death mods
149 void shambler_spawn ()
152 self.health = autocvar_g_monster_shambler_health;
154 self.damageforcescale = 0.003;
155 self.classname = "monster_shambler";
156 self.monster_attackfunc = shambler_attack;
157 self.nextthink = time + random() * 0.5 + 0.1;
158 self.think = shambler_think;
159 self.weapon = WEP_NEX;
161 monsters_setframe(shambler_anim_stand);
163 monster_setupsounds("shambler");
165 monster_hook_spawn(); // for post-spawn mods
168 void spawnfunc_monster_shambler ()
170 if not(autocvar_g_monster_shambler) { remove(self); return; }
172 self.monster_spawnfunc = spawnfunc_monster_shambler;
174 if(Monster_CheckAppearFlags(self))
179 if not (monster_initialize(
180 "Shambler", MONSTER_SHAMBLER,
181 SHAMBLER_MIN, SHAMBLER_MAX,
183 shambler_die, shambler_spawn))