From 493159d6d2011dc644aa33d3a7faac408f5671aa Mon Sep 17 00:00:00 2001 From: Mario Date: Mon, 2 Sep 2013 06:01:14 +1000 Subject: [PATCH] Clean up monster armor code --- monsters.cfg | 3 +- qcsrc/common/monsters/monster/mage.qc | 32 ++++++++--------- qcsrc/common/monsters/sv_monsters.qc | 50 ++++++++++----------------- qcsrc/common/monsters/sv_monsters.qh | 4 +-- qcsrc/server/autocvars.qh | 1 + 5 files changed, 38 insertions(+), 52 deletions(-) diff --git a/monsters.cfg b/monsters.cfg index d7bd5c968..8fe16f371 100644 --- a/monsters.cfg +++ b/monsters.cfg @@ -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 // }}} diff --git a/qcsrc/common/monsters/monster/mage.qc b/qcsrc/common/monsters/monster/mage.qc index a01cfeab6..5e6270ab0 100644 --- a/qcsrc/common/monsters/monster/mage.qc +++ b/qcsrc/common/monsters/monster/mage.qc @@ -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) diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index a81fe64b2..1505327c6 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -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; diff --git a/qcsrc/common/monsters/sv_monsters.qh b/qcsrc/common/monsters/sv_monsters.qh index dd0056f6a..ad58d1909 100644 --- a/qcsrc/common/monsters/sv_monsters.qh +++ b/qcsrc/common/monsters/sv_monsters.qh @@ -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 diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 264d55408..72558a443 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -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; -- 2.39.2