]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Mage has a random chance to spawn a force field which takes 80% of the damage
authorMario <mario.mario@y7mail.com>
Thu, 18 Apr 2013 05:58:48 +0000 (15:58 +1000)
committerMario <mario.mario@y7mail.com>
Thu, 18 Apr 2013 05:58:48 +0000 (15:58 +1000)
qcsrc/server/monsters/lib/defs.qh
qcsrc/server/monsters/lib/monsters.qc
qcsrc/server/monsters/monster/shalrath.qc

index f694192c483fc04b43cb6cd4251ef1cf902f1582..20370f044b6cbb9fdc45b287f3373758c3e664e9 100644 (file)
@@ -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
index 529efb2ac0547d9c000b1853f3ad7529a8a2df7f..13907f99a7df26b384e0ea8f49adbc3597978dce 100644 (file)
@@ -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)
index 7d495c42e36fc2d837609a58b1c212c63346f909..fbd61d0b8316bfcaa87db3ff3b39e088642ee53e 100644 (file)
@@ -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");