]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Clean up monster armor code
authorMario <mario.mario@y7mail.com>
Sun, 1 Sep 2013 20:01:14 +0000 (06:01 +1000)
committerMario <mario.mario@y7mail.com>
Sun, 1 Sep 2013 20:01:14 +0000 (06:01 +1000)
monsters.cfg
qcsrc/common/monsters/monster/mage.qc
qcsrc/common/monsters/sv_monsters.qc
qcsrc/common/monsters/sv_monsters.qh
qcsrc/server/autocvars.qh

index d7bd5c96843cd0cdafbe2aefb0bd0942d5e1d2c8..8fe16f3715e531a3d63f3b8e9d019e9e2c35c8f1 100644 (file)
@@ -126,7 +126,7 @@ set g_monster_mage_heal_minhealth 250
 set g_monster_mage_heal_range 200
 set g_monster_mage_heal_self 35
 set g_monster_mage_health 200
-set g_monster_mage_shield_blockpercent 40
+set g_monster_mage_shield_blockpercent 0.8
 set g_monster_mage_shield_delay 7
 set g_monster_mage_shield_time 3
 set g_monster_mage_speed_run 75
@@ -178,4 +178,5 @@ set g_monsters_respawn_delay 20
 set g_monsters_score_kill 1
 set g_monsters_max 20
 set g_monsters_max_perplayer 0
+set g_monsters_armor_blockpercent 0.5
 // }}}
index a01cfeab65d96836bb44a8bb0941995b9c421aec..5e6270ab00ed2b58ea77e1b53a3ccf2fbe51c324 100644 (file)
@@ -58,7 +58,6 @@ const float mage_anim_run             = 5;
 
 void() mage_heal;
 void() mage_shield;
-void() mage_shield_die;
 
 float friend_needshelp(entity e)
 {
@@ -303,16 +302,17 @@ void mage_heal()
        }
 }
 
-void mage_shield_die()
+void mage_shield_think()
 {
-       if not(self.weaponentity)
-               return; // why would this be called without a shield?
-       
-       self.armorvalue = 1;
-       
-       remove(self.weaponentity);
-       
-       self.weaponentity = world;
+       self.nextthink = time;
+
+       if(time >= self.ltime || self.owner.health <= 0)
+       {
+               self.owner.armorvalue = 0;
+               self.owner.m_armor_blockpercent = autocvar_g_monsters_armor_blockpercent;
+               remove(self);
+               return;
+       }
 }
 
 void mage_shield()
@@ -325,26 +325,26 @@ void mage_shield()
        shield.owner = self;
        shield.team = self.team;
        shield.ltime = time + MON_CVAR(mage, shield_time);
-       shield.health = 70;
        shield.classname = "shield";
        shield.effects = EF_ADDITIVE;
        shield.movetype = MOVETYPE_NOCLIP;
        shield.solid = SOLID_TRIGGER;
        shield.avelocity = '7 0 11';
        shield.scale = self.scale * 0.6;
+       shield.think = mage_shield_think;
+       shield.nextthink = time;
        
        setattachment(shield, self, "");
        setmodel(shield, "models/ctf/shield.md3");
        setsize(shield, shield.scale * shield.mins, shield.scale * shield.maxs);
        
-       self.weaponentity = shield;
-       
        self.lastshielded = time + MON_CVAR(mage, shield_delay);
        
        monsters_setframe(mage_anim_attack);
        self.attack_finished_single = time + 1;
        
-       self.armorvalue = MON_CVAR(mage, shield_blockpercent) / 100;
+       self.m_armor_blockpercent = MON_CVAR(mage, shield_blockpercent);
+       self.armorvalue = self.health;
 }
 
 float mage_attack(float attack_type)
@@ -416,10 +416,6 @@ float m_mage(float req)
                                need_help = TRUE;
                                break; // found 1 player near us who is low on health
                        }
-                       
-                       if(self.weaponentity)
-                       if(time >= self.weaponentity.ltime)
-                               mage_shield_die();
                                
                        if(self.health < MON_CVAR(mage, heal_minhealth) || need_help)
                        if(time >= self.attack_finished_single)
index a81fe64b2704396d989494c65c95d23e8ff02c82..1505327c61bc5ed407e36f7a1f0e1ccdb35a20a5 100644 (file)
@@ -807,12 +807,6 @@ void monster_die()
        
        monster_dropitem();
                
-       if(self.weaponentity)
-       {
-               remove(self.weaponentity);
-               self.weaponentity = world;
-       }
-               
        monster_sound(self.msound_death, 0, FALSE);
                
        if(!(self.spawnflags & MONSTERFLAG_SPAWNED) && !self.monster_respawned)
@@ -854,13 +848,14 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea
        if(time < self.spawnshieldtime)
                return;
                
-       if(deathtype != DEATH_KILL)
-               damage *= self.armorvalue;
+       vector v;
+       float take, save;
                
-       if(self.weaponentity && self.weaponentity.classname == "shield")
-               self.weaponentity.health -= damage;
+       v = healtharmor_applydamage(self.armorvalue, self.m_armor_blockpercent, damage);
+       take = v_x;
+       save = v_y;
                
-       self.health -= damage;
+       self.health -= take;
                
        self.dmg_time = time;
 
@@ -871,10 +866,10 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea
                
        if(deathtype != DEATH_DROWN)
        {
-               Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
-               if (damage > 50)
+               Violence_GibSplash_At(hitloc, force, 2, bound(0, take, 200) / 16, self, attacker);
+               if (take > 50)
                        Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
-               if (damage > 100)
+               if (take > 100)
                        Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
        }
                
@@ -950,21 +945,20 @@ void monster_spawn()
                self.monster_attack = TRUE; // we can have monster enemies in team games
        
        monster_sound(self.msound_spawn, 0, FALSE);
-
-       MUTATOR_CALLHOOK(MonsterSpawn);
        
        self.think = monster_think;
        self.nextthink = time + self.ticrate;
        
        self.SendFlags |= MSF_SETUP;
+       
+       MUTATOR_CALLHOOK(MonsterSpawn);
 }
 
 float monster_initialize(float mon_id, float nodrop)
 {
        if not(autocvar_g_monsters)
                return FALSE;
-               
-       vector min_s, max_s;
+       
        entity mon = get_monsterinfo(mon_id);
        
        // support for quake style removing monsters based on skill
@@ -979,20 +973,13 @@ float monster_initialize(float mon_id, float nodrop)
        
        if(self.team && !teamplay)
                self.team = 0;
-
-       self.flags = FL_MONSTER;
-               
+       
        if not(self.spawnflags & MONSTERFLAG_SPAWNED) // naturally spawned monster
        if not(self.monster_respawned)
                monsters_total += 1;
-               
-       min_s = mon.mins;
-       max_s = mon.maxs;
        
-       self.netname = mon.netname;
-       self.monster_name = M_NAME(mon_id);
-
-       setsize(self, min_s, max_s);
+       setsize(self, mon.mins, mon.maxs);
+       self.flags                              = FL_MONSTER;
        self.takedamage                 = DAMAGE_AIM;
        self.bot_attack                 = TRUE;
        self.iscreature                 = TRUE;
@@ -1006,12 +993,13 @@ float monster_initialize(float mon_id, float nodrop)
        self.solid                              = SOLID_BBOX;
        self.movetype                   = MOVETYPE_WALK;
        self.spawnshieldtime    = time + autocvar_g_monsters_spawnshieldtime;
-       monsters_spawned           += 1;
        self.enemy                              = world;
        self.velocity                   = '0 0 0';
        self.moveto                             = self.origin;
        self.pos2                               = self.angles;
        self.reset                              = monsters_reset;
+       self.netname                    = mon.netname;
+       self.monster_name               = M_NAME(mon_id);
        self.candrop                    = TRUE;
        self.view_ofs                   = '0 0 1' * (self.maxs_z * 0.5);
        self.oldtarget2                 = self.target2;
@@ -1039,8 +1027,8 @@ float monster_initialize(float mon_id, float nodrop)
                
        self.ticrate = bound(sys_frametime, self.ticrate, 60);
        
-       if not(self.armorvalue)
-               self.armorvalue = 1; // multiplier
+       if not(self.m_armor_blockpercent)
+               self.m_armor_blockpercent = 0.5;
        
        if not(self.target_range)
                self.target_range = autocvar_g_monsters_target_range;
index dd0056f6aed1b42e1c24edd49f9416f7f271782b..ad58d1909f23a8379e0b2c490f5a1f0e97d0539b 100644 (file)
@@ -28,9 +28,9 @@ const float MONSTER_ATTACK_RANGED     = 2;
 
 .vector oldangles;
 
-.float monster_respawned; // used to make sure we're not recounting respawned monster stats
+.float m_armor_blockpercent;
 
-float monsters_spawned;
+.float monster_respawned; // used to make sure we're not recounting respawned monster stats
 
 const float MONSTERSKILL_NOTEASY = 256; // monster will not spawn on skill <= 1
 const float MONSTERSKILL_NOTMEDIUM = 512; // monster will not spawn on skill 2
index 264d55408cd3ad85cd24a474ce24c008354dfe16..72558a443f0fa9f259c11fbed06201f8908a4084 100644 (file)
@@ -1245,6 +1245,7 @@ float autocvar_g_monsters_spawnshieldtime;
 float autocvar_g_monsters_teams;
 float autocvar_g_monsters_respawn_delay;
 float autocvar_g_monsters_respawn;
+float autocvar_g_monsters_armor_blockpercent;
 float autocvar_g_touchexplode_radius;
 float autocvar_g_touchexplode_damage;
 float autocvar_g_touchexplode_edgedamage;