1 const vector SHAMBLER_MIN = '-41 -41 -31';
2 const vector SHAMBLER_MAX = '41 41 65';
4 string SHAMBLER_MODEL = "models/monsters/shambler.mdl";
7 float autocvar_g_monster_shambler;
8 float autocvar_g_monster_shambler_health;
9 float autocvar_g_monster_shambler_damage;
10 float autocvar_g_monster_shambler_attack_lightning_damage;
11 float autocvar_g_monster_shambler_attack_claw_damage;
12 float autocvar_g_monster_shambler_speed_walk;
13 float autocvar_g_monster_shambler_speed_run;
15 const float shambler_anim_stand = 0;
16 const float shambler_anim_walk = 1;
17 const float shambler_anim_run = 2;
18 const float shambler_anim_smash = 3;
19 const float shambler_anim_swingr = 4;
20 const float shambler_anim_swingl = 5;
21 const float shambler_anim_magic = 6;
22 const float shambler_anim_pain = 7;
23 const float shambler_anim_death = 8;
27 self.think = shambler_think;
28 self.nextthink = time + self.ticrate;
30 monster_move(autocvar_g_monster_shambler_speed_run, autocvar_g_monster_shambler_speed_walk, 300, shambler_anim_run, shambler_anim_walk, shambler_anim_stand);
35 monster_melee(self.enemy, autocvar_g_monster_shambler_damage, 0.3, DEATH_MONSTER_SHAMBLER_SMASH, TRUE);
38 void shambler_delayedsmash()
40 monsters_setframe(shambler_anim_smash);
41 defer(0.7, shambler_smash);
42 self.attack_finished_single = time + 1.1;
47 float r = (random() < 0.5);
48 monsters_setframe((r) ? shambler_anim_swingr : shambler_anim_swingl);
49 monster_melee(self.enemy, autocvar_g_monster_shambler_attack_claw_damage, 0.3, DEATH_MONSTER_SHAMBLER_CLAW, TRUE);
50 self.attack_finished_single = time + 0.8;
52 defer(0.5, shambler_swing);
57 local vector org, dir;
60 self.effects |= EF_MUZZLEFLASH;
62 org = self.origin + '0 0 40';
64 dir = self.enemy.origin + '0 0 16' - org;
65 dir = normalize (dir);
67 traceline (org, self.origin + dir * 1000, TRUE, self);
69 FireRailgunBullet (org, org + dir * 1000, autocvar_g_monster_shambler_attack_lightning_damage * monster_skill, 0, 0, 0, 0, 0, DEATH_MONSTER_SHAMBLER_ZAP);
71 // teamcolor / hit beam effect
72 //v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
73 //WarpZone_TrailParticles(world, particleeffectnum("TE_TEI_G3"), org, v);
75 te_csqc_lightningarc(org, trace_endpos);
78 float shambler_attack(float attack_type)
82 case MONSTER_ATTACK_MELEE:
84 float chance = random();
87 shambler_delayedsmash();
93 case MONSTER_ATTACK_RANGED:
95 monsters_setframe(shambler_anim_magic);
96 self.attack_finished_single = time + 1.1;
97 defer(0.6, CastLightning);
108 Monster_CheckDropCvars ("shambler");
110 self.think = monster_dead_think;
111 self.nextthink = time + self.ticrate;
112 self.ltime = time + 5;
113 monsters_setframe(shambler_anim_death);
115 monster_hook_death(); // for post-death mods
118 void shambler_spawn()
121 self.health = autocvar_g_monster_shambler_health;
123 self.damageforcescale = 0.003;
124 self.classname = "monster_shambler";
125 self.monster_attackfunc = shambler_attack;
126 self.nextthink = time + random() * 0.5 + 0.1;
127 self.think = shambler_think;
128 self.weapon = WEP_NEX;
130 monsters_setframe(shambler_anim_stand);
132 monster_setupsounds("shambler");
134 monster_hook_spawn(); // for post-spawn mods
137 void spawnfunc_monster_shambler()
139 if not(autocvar_g_monster_shambler) { remove(self); return; }
141 self.monster_spawnfunc = spawnfunc_monster_shambler;
143 if(Monster_CheckAppearFlags(self))
148 if not (monster_initialize(
149 "Shambler", MONSTER_SHAMBLER,
150 SHAMBLER_MIN, SHAMBLER_MAX,
152 shambler_die, shambler_spawn))