+#ifndef MENUQC
// size
const vector HELLKNIGHT_MIN = '-16 -16 -24';
const vector HELLKNIGHT_MAX = '16 16 32';
+// model
+string HELLKNIGHT_MODEL = "models/monsters/hknight.mdl";
+
+#endif
+
+#ifdef SVQC
// cvars
float autocvar_g_monster_hellknight;
float autocvar_g_monster_hellknight_health;
float autocvar_g_monster_hellknight_jump_dist;
// animations
-#define hellknight_anim_stand 0
-#define hellknight_anim_walk 1
-#define hellknight_anim_run 2
-#define hellknight_anim_pain 3
-#define hellknight_anim_death1 4
-#define hellknight_anim_death2 5
-#define hellknight_anim_charge1 6
-#define hellknight_anim_magic1 7
-#define hellknight_anim_magic2 8
-#define hellknight_anim_charge2 9
-#define hellknight_anim_slice 10
-#define hellknight_anim_smash 11
-#define hellknight_anim_wattack 12
-#define hellknight_anim_magic3 13
+const float hellknight_anim_stand = 0;
+const float hellknight_anim_walk = 1;
+const float hellknight_anim_run = 2;
+const float hellknight_anim_pain = 3;
+const float hellknight_anim_death1 = 4;
+const float hellknight_anim_death2 = 5;
+const float hellknight_anim_charge1 = 6;
+const float hellknight_anim_magic1 = 7;
+const float hellknight_anim_magic2 = 8;
+const float hellknight_anim_charge2 = 9;
+const float hellknight_anim_slice = 10;
+const float hellknight_anim_smash = 11;
+const float hellknight_anim_wattack = 12;
+const float hellknight_anim_magic3 = 13;
void hknight_spike_think()
{
if(self)
{
- RadiusDamage (self, self.realowner, autocvar_g_monster_hellknight_spike_damage * self.realowner.scale, autocvar_g_monster_hellknight_spike_edgedamage, autocvar_g_monster_hellknight_spike_force, world, autocvar_g_monster_hellknight_spike_radius, WEP_CRYLINK, other);
+ RadiusDamage (self, self.realowner, autocvar_g_monster_hellknight_spike_damage * self.realowner.scale, autocvar_g_monster_hellknight_spike_edgedamage, autocvar_g_monster_hellknight_spike_force, world, autocvar_g_monster_hellknight_spike_radius, DEATH_MONSTER_HKNIGHT_SPIKE, other);
remove(self);
}
}
setsize (missile, '0 0 0', '0 0 0');
setorigin(missile, self.origin + '0 0 10' + v_forward * 14);
missile.scale = self.scale;
+ missile.flags = FL_PROJECTILE;
missile.velocity = dir * 400;
missile.avelocity = '300 300 300';
missile.nextthink = time + 5;
traceline((self.absmin + self.absmax) * 0.5, (self.enemy.absmin + self.enemy.absmax) * 0.5, TRUE, world);
if (trace_fraction != 1)
return; // not visible
- if(enemy_range() <= 2000)
- Fire_AddDamage(self.enemy, self, autocvar_g_monster_hellknight_inferno_damage * monster_skill, autocvar_g_monster_hellknight_inferno_damagetime, self.projectiledeathtype);
+ if(vlen(self.enemy.origin - self.origin) <= 2000)
+ Fire_AddDamage(self.enemy, self, autocvar_g_monster_hellknight_inferno_damage * monster_skill, autocvar_g_monster_hellknight_inferno_damagetime, DEATH_MONSTER_HKNIGHT_INFERNO);
}
void hknight_infernowarning ()
local float dot = 0;
// use magic to kill zombies as they heal too fast for sword
- if (self.enemy.classname == "monster_zombie")
+ if (self.enemy.monsterid == MONSTER_ZOMBIE)
{
traceline((self.absmin + self.absmax) * 0.5, (self.enemy.absmin + self.enemy.absmax) * 0.5, FALSE, self);
if (trace_ent == self.enemy)
void hellknight_think ()
{
self.think = hellknight_think;
- self.nextthink = time + 0.1;
+ self.nextthink = time + self.ticrate;
monster_move(autocvar_g_monster_hellknight_speed_run, autocvar_g_monster_hellknight_speed_walk, 100, hellknight_anim_run, hellknight_anim_walk, hellknight_anim_stand);
}
if(self.hknight_cycles >= 5)
{
- self.frame = hellknight_anim_magic1;
+ monsters_setframe(hellknight_anim_magic1);
self.attack_finished_single = time + 0.7;
hknight_infernowarning();
self.think = hellknight_think;
float scle = self.realowner.scale;
if(self)
{
- RadiusDamage (self, self.realowner, autocvar_g_monster_hellknight_fireball_damage * scle, autocvar_g_monster_hellknight_fireball_edgedamage * scle, autocvar_g_monster_hellknight_fireball_force * scle, world, autocvar_g_monster_hellknight_fireball_radius * scle, WEP_FIREBALL, targ);
+ RadiusDamage (self, self.realowner, autocvar_g_monster_hellknight_fireball_damage * scle, autocvar_g_monster_hellknight_fireball_edgedamage * scle, autocvar_g_monster_hellknight_fireball_force * scle, world, autocvar_g_monster_hellknight_fireball_radius * scle, self.projectiledeathtype, targ);
if(targ)
Fire_AddDamage(targ, self, 5 * monster_skill, autocvar_g_monster_hellknight_inferno_damagetime, self.projectiledeathtype);
remove(self);
missile.owner = missile.realowner = self;
missile.solid = SOLID_TRIGGER;
missile.movetype = MOVETYPE_FLYMISSILE;
+ self.projectiledeathtype = DEATH_MONSTER_HKNIGHT_FBALL;
setsize (missile, fmins, fmaxs);
setorigin(missile, self.origin + '0 0 10' + v_forward * 14);
+ missile.flags = FL_PROJECTILE;
missile.velocity = dir * 400;
missile.avelocity = '300 300 300';
missile.nextthink = time + 5;
void hellknight_magic2 ()
{
- self.frame = hellknight_anim_magic2;
+ monsters_setframe(hellknight_anim_magic2);
self.attack_finished_single = time + 1.2;
self.delay = time + 0.4;
self.monster_delayedattack = hellknight_fireball;
void hellknight_magic3 ()
{
- self.frame = hellknight_anim_magic3;
+ monsters_setframe(hellknight_anim_magic3);
self.attack_finished_single = time + 1;
self.think = hellknight_spikes;
self.nextthink = time + 0.4;
void hellknight_charge ()
{
- self.frame = hellknight_anim_charge1;
+ monsters_setframe(hellknight_anim_charge1);
self.attack_finished_single = time + 0.5;
hknight_checkmagic();
- monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 70, DEATH_MONSTER_MELEE);
+ monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 0.3, DEATH_MONSTER_HKNIGHT_MELEE, FALSE);
hknight_checkmagic();
}
void hellknight_charge2 ()
{
- self.frame = hellknight_anim_charge2;
+ monsters_setframe(hellknight_anim_charge2);
self.attack_finished_single = time + 0.5;
CheckContinueCharge ();
- monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 70, DEATH_MONSTER_MELEE);
+ monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 0.3, DEATH_MONSTER_HKNIGHT_MELEE, FALSE);
}
void hellknight_slice ()
{
- self.frame = hellknight_anim_slice;
+ monsters_setframe(hellknight_anim_slice);
self.attack_finished_single = time + 0.7;
- monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 70, DEATH_MONSTER_MELEE);
+ monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 0.3, DEATH_MONSTER_HKNIGHT_MELEE, FALSE);
}
void hellknight_smash ()
{
- self.frame = hellknight_anim_smash;
+ monsters_setframe(hellknight_anim_smash);
self.attack_finished_single = time + 0.7;
- monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 70, DEATH_MONSTER_MELEE);
+ monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 0.3, DEATH_MONSTER_HKNIGHT_MELEE, TRUE);
}
void hellknight_weapon_attack ()
{
- self.frame = hellknight_anim_wattack;
+ monsters_setframe(hellknight_anim_wattack);
self.attack_finished_single = time + 0.7;
- monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 70, DEATH_MONSTER_MELEE);
+ monster_melee(self.enemy, autocvar_g_monster_hellknight_melee_damage, 0.3, DEATH_MONSTER_HKNIGHT_MELEE, TRUE);
}
float hknight_type;
self.hknight_cycles = 0;
- if (self.enemy.classname == "monster_zombie")
+ if (self.enemy.monsterid == MONSTER_ZOMBIE)
{
// always use fireball to kill zombies
hellknight_magic2();
RandomSelection_Add(world, 0, "inferno", autocvar_g_monster_hellknight_inferno_chance, 1);
RandomSelection_Add(world, 0, "spikes", autocvar_g_monster_hellknight_spike_chance, 1);
if(self.health >= 100)
- RandomSelection_Add(world, 0, "jump", ((enemy_range() > autocvar_g_monster_hellknight_jump_dist * self.scale) ? 1 : autocvar_g_monster_hellknight_jump_chance), 1);
+ RandomSelection_Add(world, 0, "jump", ((vlen(self.enemy.origin - self.origin) > autocvar_g_monster_hellknight_jump_dist * self.scale) ? 1 : autocvar_g_monster_hellknight_jump_chance), 1);
switch(RandomSelection_chosen_string)
{
}
case "jump":
{
- if (enemy_range() >= 400)
+ if (vlen(self.enemy.origin - self.origin) >= 400)
if (findtrajectorywithleading(self.origin, self.mins, self.maxs, self.enemy, 1000, 0, 10, 0, self))
{
self.velocity = findtrajectory_velocity;
- Damage(self.enemy, self, self, autocvar_g_monster_hellknight_jump_damage * monster_skill, DEATH_VHCRUSH, self.enemy.origin, normalize(self.enemy.origin - self.origin));
+ Damage(self.enemy, self, self, autocvar_g_monster_hellknight_jump_damage * monster_skill, DEATH_MONSTER_HKNIGHT_CRUSH, self.enemy.origin, normalize(self.enemy.origin - self.origin));
self.attack_finished_single = time + 2;
return TRUE;
}
float chance = random();
Monster_CheckDropCvars ("hellknight");
- self.solid = SOLID_NOT;
- self.takedamage = DAMAGE_NO;
- self.event_damage = func_null;
- self.enemy = world;
- self.movetype = MOVETYPE_TOSS;
- self.think = Monster_Fade;
- self.nextthink = time + 2.1;
- self.pain_finished = self.nextthink;
+ self.think = Monster_Fade;
+ self.nextthink = time + 5;
+ monsters_setframe((random() > 0.5) ? hellknight_anim_death1 : hellknight_anim_death2);
if(chance < 0.10 || self.flags & MONSTERFLAG_MINIBOSS)
+ if(self.candrop)
{
- self.superweapons_finished = time + autocvar_g_balance_superweapons_time;
- W_ThrowNewWeapon(self, WEP_FIREBALL, 0, self.origin, self.velocity);
+ self.superweapons_finished = time + autocvar_g_balance_superweapons_time + 5; // give the player a few seconds to find the weapon
+ self.weapon = WEP_FIREBALL;
}
-
- if (random() > 0.5)
- self.frame = hellknight_anim_death1;
- else
- self.frame = hellknight_anim_death2;
monster_hook_death(); // for post-death mods
}
self.attack_ranged = hknight_magic;
self.nextthink = time + random() * 0.5 + 0.1;
self.think = hellknight_think;
- self.sprite_height = 30 * self.scale;
- self.frame = hellknight_anim_stand;
+ self.sprite_height = 30;
+
+ monsters_setframe(hellknight_anim_stand);
monster_hook_spawn(); // for post-spawn mods
}
void spawnfunc_monster_hell_knight ()
{
- if not(autocvar_g_monster_hellknight)
- {
- remove(self);
- return;
- }
+ if not(autocvar_g_monster_hellknight) { remove(self); return; }
self.monster_spawnfunc = spawnfunc_monster_hell_knight;
- if(self.spawnflags & MONSTERFLAG_APPEAR)
- {
- self.think = func_null;
- self.nextthink = -1;
- self.use = Monster_Appear;
+ if(Monster_CheckAppearFlags(self))
return;
- }
self.scale = 1.3;
if not (monster_initialize(
- "Hell-knight",
- "models/monsters/hknight.mdl",
+ "Hell-knight", MONSTER_HELLKNIGHT,
+ HELLKNIGHT_MODEL,
HELLKNIGHT_MIN, HELLKNIGHT_MAX,
FALSE,
hellknight_die, hellknight_spawn))
// compatibility with old spawns
void spawnfunc_monster_hellknight () { spawnfunc_monster_hell_knight(); }
+
+#endif // SVQC