From 8b8bd3ee2c5039d47c7e7bcc1de38bda2404dac1 Mon Sep 17 00:00:00 2001 From: Mircea Kitsune Date: Wed, 4 Jan 2012 02:06:12 +0200 Subject: [PATCH] Get damage effects working without using a separate entity, but taking advantage of the existing Ent_DamageInfo. Note that some damage effects seem to break, and I need to see why they aren't working. --- qcsrc/client/Main.qc | 1 - qcsrc/client/damage.qc | 20 +++++++++----------- qcsrc/common/constants.qh | 3 +-- qcsrc/server/g_damage.qc | 5 +---- qcsrc/server/g_violence.qc | 32 -------------------------------- 5 files changed, 11 insertions(+), 50 deletions(-) diff --git a/qcsrc/client/Main.qc b/qcsrc/client/Main.qc index b2a21706a..fd8afe117 100644 --- a/qcsrc/client/Main.qc +++ b/qcsrc/client/Main.qc @@ -1049,7 +1049,6 @@ void CSQC_Ent_Update(float bIsNewEntity) case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break; case ENT_CLIENT_TURRET: ent_turret(); break; - case ENT_CLIENT_DAMAGEEFFECT: Ent_DamageEffect(); break; case ENT_CLIENT_MODEL: CSQCModel_Read(bIsNewEntity); break; default: //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype)); diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index fa930e323..4828a5b43 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -1,6 +1,7 @@ +void DamageEffect(float dmg, float type, float specnum1, float entnumber); void Ent_DamageInfo(float isNew) { - float dmg, rad, edge, thisdmg, forcemul; + float dmg, rad, edge, thisdmg, forcemul, species; vector force, thisforce; entity oldself; @@ -18,6 +19,7 @@ void Ent_DamageInfo(float isNew) rad = ReadByte(); edge = ReadByte(); force = decompressShortVector(ReadShort()); + species = ReadByte(); if not(isNew) return; @@ -66,6 +68,8 @@ void Ent_DamageInfo(float isNew) if(self.event_damage) self.event_damage(thisdmg, w_deathtype, w_org, thisforce); + + DamageEffect(dmg, w_deathtype, species, self.entnum); } self = oldself; @@ -234,7 +238,7 @@ void DamageInfo_Precache() .float dmgpartnum, dmgtime; .float lifetime; -void Ent_DamageEffect_Think() +void DamageEffect_Think() { self.nextthink = time; @@ -280,18 +284,12 @@ void Ent_DamageEffect_Think() self.dmgtime = time + autocvar_cl_damageeffect_player; } -void Ent_DamageEffect() +void DamageEffect(float dmg, float type, float specnum1, float entnumber) { - float dmg, type, specnum1, specnum2, entnumber, life; - vector org; + float specnum2, life; string specstr, effectnum; entity e; - dmg = ReadByte(); // damage amount - type = ReadByte(); // damage weapon - specnum1 = ReadByte(); // player species - entnumber = ReadByte(); // player entnum - if(!autocvar_cl_damageeffect_player && !autocvar_cl_damageeffect_gibs) return; if(autocvar_cl_gentle || autocvar_cl_gentle_damage) @@ -330,6 +328,6 @@ void Ent_DamageEffect() e.team = entnumber - 1; e.dmgpartnum = particleeffectnum(effectnum); e.lifetime = time + life; - e.think = Ent_DamageEffect_Think; + e.think = DamageEffect_Think; e.nextthink = time; } diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index cf8ed5215..7532b3f50 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -95,8 +95,7 @@ const float ENT_CLIENT_GAUNTLET = 29; const float ENT_CLIENT_ACCURACY = 30; const float ENT_CLIENT_SHOWNAMES = 31; const float ENT_CLIENT_WARPZONE_TELEPORTED = 32; -const float ENT_CLIENT_DAMAGEEFFECT = 33; -const float ENT_CLIENT_MODEL = 34; +const float ENT_CLIENT_MODEL = 33; const float ENT_CLIENT_TURRET = 40; const float ENT_CLIENT_AUXILIARYXHAIR = 50; diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 2e3296fba..16bde33c2 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -14,6 +14,7 @@ float Damage_DamageInfo_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, bound(0, self.dmg_radius, 255)); WriteByte(MSG_ENTITY, bound(1, self.dmg_edge, 255)); WriteShort(MSG_ENTITY, self.oldorigin_x); + WriteByte(MSG_ENTITY, self.species); return TRUE; } @@ -527,10 +528,6 @@ entity damage_attacker; void Damage (entity targ, entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { - // if the target is a player or dead body, activate damage effects - if(targ.classname == "player" || targ.classname == "body") - Violence_DamageEffect(targ, damage, DEATH_WEAPONOF(deathtype)); - float mirrordamage; float mirrorforce; float teamdamage0; diff --git a/qcsrc/server/g_violence.qc b/qcsrc/server/g_violence.qc index a006677bb..40fb19018 100644 --- a/qcsrc/server/g_violence.qc +++ b/qcsrc/server/g_violence.qc @@ -45,35 +45,3 @@ void Violence_GibSplash(entity source, float type, float amount, entity attacker { Violence_GibSplash_At(source.origin + source.view_ofs, source.velocity, type, amount, source, attacker); } - -// damage effect - -float Violence_DamageEffect_SendEntity(entity to, float sf) -{ - WriteByte(MSG_ENTITY, ENT_CLIENT_DAMAGEEFFECT); - WriteByte(MSG_ENTITY, self.cnt); // damage amount - WriteByte(MSG_ENTITY, self.weapon); // damage weapon - WriteByte(MSG_ENTITY, self.state); // player species - WriteByte(MSG_ENTITY, self.team); // player entnum - return TRUE; -} - -void Violence_DamageEffect(entity pl, float damage, float type) -{ - if(sv_gentle || !type) - return; // return if gentle mode is enabled or the damage was not caused by a weapon - - entity e; - e = spawn(); - e.cnt = damage; - e.weapon = type; - e.state |= 8 * pl.species; // gib type, ranges from 0 to 15 - - // if this is a copied dead body, send the num of its player instead - if(pl.classname == "body") - e.team = num_for_edict(pl.owner); - else - e.team = num_for_edict(pl); - - Net_LinkEntity(e, FALSE, 0.2, Violence_DamageEffect_SendEntity); -} -- 2.39.2