From af7bd642e79dfa0cce4c56de0173677357dca9b3 Mon Sep 17 00:00:00 2001 From: Mario Date: Thu, 18 Apr 2013 15:58:48 +1000 Subject: [PATCH] Mage has a random chance to spawn a force field which takes 80% of the damage --- qcsrc/server/monsters/lib/defs.qh | 1 + qcsrc/server/monsters/lib/monsters.qc | 3 ++ qcsrc/server/monsters/monster/shalrath.qc | 47 +++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/qcsrc/server/monsters/lib/defs.qh b/qcsrc/server/monsters/lib/defs.qh index f694192c4..20370f044 100644 --- a/qcsrc/server/monsters/lib/defs.qh +++ b/qcsrc/server/monsters/lib/defs.qh @@ -5,6 +5,7 @@ .float candrop; .string oldtarget2; +.float lastshielded; const float MONSTER_RESPAWN_SPAWNPOINT = 10; // re-spawn at original spawn point const float MONSTER_RESPAWN_DEATHPOINT = 11; // re-spawn where we died diff --git a/qcsrc/server/monsters/lib/monsters.qc b/qcsrc/server/monsters/lib/monsters.qc index 529efb2ac..13907f99a 100644 --- a/qcsrc/server/monsters/lib/monsters.qc +++ b/qcsrc/server/monsters/lib/monsters.qc @@ -812,6 +812,9 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea if(deathtype != DEATH_KILL) damage *= self.armorvalue; + if(self.weaponentity && self.weaponentity.classname == "shield") + self.weaponentity.health -= damage; + self.health -= damage; if(self.sprite) diff --git a/qcsrc/server/monsters/monster/shalrath.qc b/qcsrc/server/monsters/monster/shalrath.qc index 7d495c42e..fbd61d0b8 100644 --- a/qcsrc/server/monsters/monster/shalrath.qc +++ b/qcsrc/server/monsters/monster/shalrath.qc @@ -32,6 +32,8 @@ const float shalrath_anim_run = 5; void() ShalMissile; float() shal_missile; void() shalrath_heal; +void() shalrath_shield; +void() shalrath_shield_die; void shalrath_think () { @@ -51,6 +53,10 @@ void shalrath_think () self.think = shalrath_think; self.nextthink = time + self.ticrate; + if(self.weaponentity) + if(time >= self.weaponentity.ltime) + shalrath_shield_die(); + if(self.delay != -1) self.nextthink = self.delay; @@ -58,6 +64,12 @@ void shalrath_think () if(time >= self.attack_finished_single) if(random() < 0.5) shalrath_heal(); + + if(self.enemy) + if(self.health < self.max_health) + if(time >= self.lastshielded) + if(random() < 0.5) + shalrath_shield(); monster_move(autocvar_g_monster_shalrath_speed, autocvar_g_monster_shalrath_speed, 50, shalrath_anim_walk, shalrath_anim_run, shalrath_anim_idle); } @@ -251,6 +263,41 @@ void shalrath_heal() } } +void shalrath_shield_die() +{ + if not(self.weaponentity) + return; // why would this be called without a shield? + + self.armorvalue = 1; + + remove(self.weaponentity); + + self.weaponentity = world; +} + +void shalrath_shield() +{ + if(self.weaponentity) + return; // already have a shield + + self.weaponentity = spawn(); + self.weaponentity.owner = self.weaponentity.realowner = self; + setmodel(self.weaponentity, "models/onslaught/generator_shield.md3"); + setattachment(self.weaponentity, self, ""); + self.weaponentity.classname = "shield"; + self.weaponentity.ltime = time + 3; + self.weaponentity.health = 70; + self.weaponentity.alpha = 0.5; + self.weaponentity.scale = self.scale; + + self.lastshielded = time + 7; // 1 shield every 7 seconds? + + monsters_setframe(shalrath_anim_attack); + self.attack_finished_single = time + 1; + + self.armorvalue = 0.2; +} + void shalrath_die () { Monster_CheckDropCvars ("shalrath"); -- 2.39.2