From 33b0cf820fbc032b77f3cf4612d3e359fa639795 Mon Sep 17 00:00:00 2001 From: Mircea Kitsune Date: Sun, 3 Apr 2011 19:32:25 +0300 Subject: [PATCH] First part of my attempt to apply damage effects to gibs as well. Send the entity number of the player when gibbing occurs, and set each gib's team function to it. The damage code in the client shall later scan for gibs, and if their owner's entity number is the same as the damaged player, draw particles there instead. --- qcsrc/client/gibs.qc | 33 ++++++++++++++++++--------------- qcsrc/server/g_violence.qc | 2 ++ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/qcsrc/client/gibs.qc b/qcsrc/client/gibs.qc index 448c6aac3..76f6aaa5e 100644 --- a/qcsrc/client/gibs.qc +++ b/qcsrc/client/gibs.qc @@ -103,17 +103,19 @@ void Gib_Draw() } } -void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent) +void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent, float gibownernum) { entity gib; // TODO remove some gibs according to cl_nogibs gib = RubbleNew("gib"); + gib.classname = "gib"; gib.move_movetype = MOVETYPE_BOUNCE; gib.gravity = 1; gib.solid = SOLID_CORPSE; gib.cnt = specnum; gib.silent = issilent; + gib.team = gibownernum; Gib_setmodel(gib, mdlname, specnum); setsize (gib, '-8 -8 -8', '8 8 8'); @@ -138,7 +140,7 @@ void TossGib (string mdlname, vector org, vector vconst, vector vrand, float spe void Ent_GibSplash(float isNew) { - float amount, type, specnum; + float amount, type, specnum, entnumber; vector org, vel; string specstr; float issilent; @@ -148,6 +150,7 @@ void Ent_GibSplash(float isNew) type = ReadByte(); // gibbage type amount = ReadByte() / 16.0; // gibbage amount + entnumber = ReadByte(); // player num org_x = ReadShort() * 4 + 2; org_y = ReadShort() * 4 + 2; org_z = ReadShort() * 4 + 2; @@ -195,37 +198,37 @@ void Ent_GibSplash(float isNew) sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM); if(prandom() < amount) - TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0, issilent); + TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0, issilent, entnumber); new_te_bloodshower(particleeffectnum(strcat(specstr, "bloodshower")), org, 1200, amount); if(prandom() < amount) - TossGib ("models/gibs/bloodyskull.md3", org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent); + TossGib ("models/gibs/bloodyskull.md3", org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent, entnumber); for(c = 0; c < amount; ++c) { randomvalue = amount - c; if(prandom() < randomvalue) - TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent); + TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent); + TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/chest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent); + TossGib ("models/gibs/chest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/smallchest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent); + TossGib ("models/gibs/smallchest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/leg1.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent); + TossGib ("models/gibs/leg1.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/leg2.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent); + TossGib ("models/gibs/leg2.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber); // these splat on impact if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent); + TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent); + TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent); + TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber); if(prandom() < randomvalue) - TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent); + TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber); } break; case 0x02: @@ -233,7 +236,7 @@ void Ent_GibSplash(float isNew) break; case 0x03: if(prandom() < amount) - TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent); // TODO maybe adjust to more randomization? + TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent, entnumber); // TODO maybe adjust to more randomization? break; case 0x81: pointparticles(particleeffectnum(strcat(gentle_prefix, "damage_dissolve")), org, vel, amount); diff --git a/qcsrc/server/g_violence.qc b/qcsrc/server/g_violence.qc index a1cd89326..0eab388dc 100644 --- a/qcsrc/server/g_violence.qc +++ b/qcsrc/server/g_violence.qc @@ -3,6 +3,7 @@ float Violence_GibSplash_SendEntity(entity to, float sf) WriteByte(MSG_ENTITY, ENT_CLIENT_GIBSPLASH); WriteByte(MSG_ENTITY, self.state); // actually type WriteByte(MSG_ENTITY, bound(1, self.cnt * 16, 255)); // gibbage amount multiplier + WriteByte(MSG_ENTITY, self.team); // player num WriteShort(MSG_ENTITY, floor(self.origin_x / 4)); // not using a coord here, as gibs don't need this accuracy WriteShort(MSG_ENTITY, floor(self.origin_y / 4)); // not using a coord here, as gibs don't need this accuracy WriteShort(MSG_ENTITY, floor(self.origin_z / 4)); // not using a coord here, as gibs don't need this accuracy @@ -25,6 +26,7 @@ void Violence_GibSplash_At(vector org, vector dir, float type, float amount, ent if(!sound_allowed(MSG_BROADCAST, gibowner) || !sound_allowed(MSG_BROADCAST, attacker)) e.state |= 0x40; // "silence" bit e.state |= 8 * self.species; // gib type, ranges from 0 to 15 + e.team = num_for_edict(self); setorigin(e, org); e.velocity = dir; -- 2.39.2