X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fdamage.qc;h=fe99d507b7e49dc27068cded9aac8820ac15fed3;hb=f63d2620d2bbf6946ed257f297332a743f977a7c;hp=4f25aef13ef2d25bd6c9a1cdf81637f8a104e60c;hpb=96e1acc3050bcb718e2f06702e5b88a60459a015;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index 4f25aef13..fe99d507b 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -1,16 +1,8 @@ #include "damage.qh" -#include "_all.qh" -#include "gibs.qh" - -#include "../common/vehicles/all.qh" - -#include "../common/constants.qh" -#include "../common/deathtypes.qh" -#include "../common/effects/effects.qh" +#include "../common/deathtypes/all.qh" #include "../common/movetypes/movetypes.qh" -#include "../common/util.qh" - +#include "../common/vehicles/all.qh" #include "../common/weapons/all.qh" .entity tag_entity; @@ -49,7 +41,22 @@ void DamageEffect_Think() // now generate the particles vector org; org = gettaginfo(self, 0); // origin at attached location - pointparticles(self.team, org, '0 0 0', 1); + __pointparticles(self.team, org, '0 0 0', 1); +} + +string species_prefix(int specnum) +{ + switch(specnum) + { + case SPECIES_HUMAN: return ""; + case SPECIES_ALIEN: return "alien_"; + case SPECIES_ROBOT_SHINY: return "robot_"; + case SPECIES_ROBOT_RUSTY: return "robot_"; // use the same effects, only different gibs + case SPECIES_ROBOT_SOLID: return "robot_"; // use the same effects, only different gibs + case SPECIES_ANIMAL: return "animal_"; + case SPECIES_RESERVED: return "reserved_"; + default: return ""; + } } void DamageEffect(vector hitorg, float thedamage, int type, int specnum) @@ -99,7 +106,7 @@ void DamageEffect(vector hitorg, float thedamage, int type, int specnum) life = bound(autocvar_cl_damageeffect_lifetime_min, thedamage * autocvar_cl_damageeffect_lifetime, autocvar_cl_damageeffect_lifetime_max); - effectname = get_weaponinfo(DEATH_WEAPONOF(type)).netname; + effectname = DEATH_WEAPONOF(type).netname; if(substring(effectname, strlen(effectname) - 5, 5) == "BLOOD") { @@ -112,10 +119,10 @@ void DamageEffect(vector hitorg, float thedamage, int type, int specnum) else { return; } // objects don't bleed } - e = spawn(); + e = new(damage); + make_pure(e); setmodel(e, MDL_Null); // necessary to attach and read origin setattachment(e, self, gettaginfo_name); // attach to the given bone - e.classname = "damage"; e.owner = self; e.cnt = time + life; e.team = _particleeffectnum(effectname); @@ -124,8 +131,9 @@ void DamageEffect(vector hitorg, float thedamage, int type, int specnum) self.total_damages += 1; } -void Ent_DamageInfo(float isNew) -{SELFPARAM(); +NET_HANDLE(ENT_CLIENT_DAMAGEINFO, bool isNew) +{ + make_pure(this); float thedamage, rad, edge, thisdmg; bool hitplayer = false; int species, forcemul; @@ -145,6 +153,8 @@ void Ent_DamageInfo(float isNew) force = decompressShortVector(ReadShort()); species = ReadByte(); + return = true; + if (!isNew) return; @@ -221,7 +231,7 @@ void Ent_DamageInfo(float isNew) setorigin(self, w_org + w_backoff * 2); // for sound() calls - switch(w_deathtype) + switch(DEATH_ENT(w_deathtype)) { case DEATH_VH_CRUSH: break; @@ -229,33 +239,33 @@ void Ent_DamageInfo(float isNew) // spiderbot case DEATH_VH_SPID_MINIGUN: sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_SPIDERBOT_MINIGUN_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_SPIDERBOT_MINIGUN_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_SPID_ROCKET: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_SPIDERBOT_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_SPIDERBOT_ROCKET_EXPLODE, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_SPID_DEATH: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_EXPLOSION_BIG, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_WAKI_GUN: sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_RACER_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_RACER_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_WAKI_ROCKET: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_RACER_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_RACER_ROCKET_EXPLODE, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_WAKI_DEATH: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_EXPLOSION_BIG, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_RAPT_CANNON: sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_RAPTOR_CANNON_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_RAPTOR_CANNON_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_RAPT_FRAGMENT: float i; @@ -267,19 +277,19 @@ void Ent_DamageInfo(float isNew) RaptorCBShellfragToss(w_org, vel, ang + '0 0 1' * (120 * i)); } sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_RAPTOR_BOMB_SPREAD), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_RAPTOR_BOMB_SPREAD, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_RAPT_BOMB: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_RAPTOR_BOMB_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_RAPTOR_BOMB_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_RAPT_DEATH: sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_EXPLOSION_BIG), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_EXPLOSION_BIG, self.origin, w_backoff * 1000, 1); break; case DEATH_VH_BUMB_GUN: sound(self, CH_SHOTS, SND_FIREBALL_IMPACT2, VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_BIGPLASMA_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_BIGPLASMA_IMPACT, self.origin, w_backoff * 1000, 1); break; } } @@ -295,15 +305,15 @@ void Ent_DamageInfo(float isNew) setorigin(self, w_org + w_backoff * 2); // for sound() calls - switch(w_deathtype) + switch(DEATH_ENT(w_deathtype)) { case DEATH_TURRET_EWHEEL: sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_BLASTER_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_TURRET_FLAC: - pointparticles(particleeffectnum(EFFECT_HAGAR_EXPLODE), w_org, '0 0 0', 1); + pointparticles(EFFECT_HAGAR_EXPLODE, w_org, '0 0 0', 1); sound(self, CH_SHOTS, SND_HAGEXP_RANDOM(), VOL_BASE, ATTEN_NORM); break; @@ -312,23 +322,23 @@ void Ent_DamageInfo(float isNew) case DEATH_TURRET_WALK_ROCKET: case DEATH_TURRET_HELLION: sound(self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_ROCKET_EXPLODE, self.origin, w_backoff * 1000, 1); break; case DEATH_TURRET_MACHINEGUN: case DEATH_TURRET_WALK_GUN: sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTEN_NORM); - pointparticles(particleeffectnum(EFFECT_MACHINEGUN_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_MACHINEGUN_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_TURRET_PLASMA: sound(self, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_ELECTRO_IMPACT), self.origin, w_backoff * 1000, 1); + pointparticles(EFFECT_ELECTRO_IMPACT, self.origin, w_backoff * 1000, 1); break; case DEATH_TURRET_WALK_MELEE: - sound(self, CH_SHOTS, SND_RIC1, VOL_BASE, ATTEN_MIN); - pointparticles(particleeffectnum(EFFECT_TE_SPARK), self.origin, w_backoff * 1000, 1); + sound(self, CH_SHOTS, SND_RIC_RANDOM(), VOL_BASE, ATTEN_MIN); + pointparticles(EFFECT_TE_SPARK, self.origin, w_backoff * 1000, 1); break; case DEATH_TURRET_PHASER: @@ -345,16 +355,18 @@ void Ent_DamageInfo(float isNew) if(!DEATH_ISSPECIAL(w_deathtype)) if(!hitplayer || rad) // don't show ground impacts for hitscan weapons if a player was hit { - int hitwep = DEATH_WEAPONOFWEAPONDEATH(w_deathtype); + Weapon hitwep = DEATH_WEAPONOF(w_deathtype); w_random = prandom(); traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world); - if(trace_fraction < 1 && hitwep != WEP_VORTEX.m_id && hitwep != WEP_VAPORIZER.m_id) + if(trace_fraction < 1 && hitwep != WEP_VORTEX && hitwep != WEP_VAPORIZER) w_backoff = trace_plane_normal; else w_backoff = -1 * normalize(force); setorigin(self, w_org + w_backoff * 2); // for sound() calls - if(!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)) { WEP_ACTION(hitwep, WR_IMPACTEFFECT); } + if(!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)) { + hitwep.wr_impacteffect(hitwep); + } } }