From b33616fde93bf54885ccaf1945daf2fca5479967 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 18 Jan 2009 20:22:34 +0000 Subject: [PATCH] csqc casings git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5605 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/Main.qc | 3 +++ data/qcsrc/client/damage.qc | 12 ++++++++-- data/qcsrc/client/gibs.qc | 15 +++++++++++- data/qcsrc/client/progs.src | 1 + data/qcsrc/common/constants.qh | 1 + data/qcsrc/server/clientcommands.qc | 7 +++--- data/qcsrc/server/g_casings.qc | 36 +++++++++++++++++++++++++++++ data/qcsrc/server/g_damage.qc | 2 +- data/qcsrc/server/g_triggers.qc | 2 -- 9 files changed, 69 insertions(+), 10 deletions(-) diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index 1f3657bdc..218a8e679 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -136,6 +136,7 @@ void CSQC_Init(void) Projectile_Precache(); GibSplash_Precache(); + Casings_Precache(); } // CSQC_Shutdown : Called every time the CSQC code is shutdown (changing maps, quitting, etc) @@ -524,6 +525,8 @@ void(float bIsNewEntity) CSQC_Ent_Update = Ent_GibSplash(); else if(self.enttype == ENT_CLIENT_DAMAGEINFO) Ent_DamageInfo(); + else if(self.enttype == ENT_CLIENT_CASING) + Ent_Casing(); else error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n")); diff --git a/data/qcsrc/client/damage.qc b/data/qcsrc/client/damage.qc index 3d011bb3a..721d3dd23 100644 --- a/data/qcsrc/client/damage.qc +++ b/data/qcsrc/client/damage.qc @@ -23,8 +23,16 @@ void Ent_DamageInfo() thisdmg = vlen(self.origin - org) / rad; if(thisdmg >= 1) continue; - thisdmg = dmg + (edge - dmg) * thisdmg; - thisforce = vlen(force) * normalize(self.origin - org); + if(dmg) + { + thisdmg = dmg + (edge - dmg) * thisdmg; + thisforce = vlen(force) * (thisdmg / dmg) * normalize(self.origin - org); + } + else + { + thisdmg = 0; + thisforce = vlen(force) * normalize(self.origin - org); + } } else { diff --git a/data/qcsrc/client/gibs.qc b/data/qcsrc/client/gibs.qc index 3320ecc4e..114edf8fb 100644 --- a/data/qcsrc/client/gibs.qc +++ b/data/qcsrc/client/gibs.qc @@ -1,6 +1,18 @@ +void SUB_RemoveOnNoImpact() +{ + if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + remove(self); +} + void Gib_Touch() { // TODO maybe bounce of walls, make more gibs, etc. + + if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) + { + remove(self); + return; + } sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(random() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM); pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10); @@ -48,6 +60,8 @@ void TossGib (string mdlname, vector org, vector v, float destroyontouch) gib.draw = Gib_Draw; if(destroyontouch) gib.move_touch = Gib_Touch; + else + gib.move_touch = SUB_RemoveOnNoImpact; gib.move_origin = gib.origin = org; gib.move_velocity = v + randomvec(); @@ -77,7 +91,6 @@ void Ent_GibSplash() isgentle = (type & 0x80 || cvar("cl_gentle")); type = type & 0x7F; - gibfactor = 1 - cvar("cl_nogibs"); if(gibfactor <= 0) return; diff --git a/data/qcsrc/client/progs.src b/data/qcsrc/client/progs.src index 4669b2e36..9a61aaae2 100644 --- a/data/qcsrc/client/progs.src +++ b/data/qcsrc/client/progs.src @@ -32,6 +32,7 @@ laser.qc projectile.qc gibs.qc damage.qc +casings.qc Main.qc View.qc diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index b387dac48..389fe2c69 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -57,6 +57,7 @@ const float ENT_CLIENT_RADARLINK = 11; // flags [startorigin] [endorigin] [start const float ENT_CLIENT_PROJECTILE = 12; const float ENT_CLIENT_GIBSPLASH = 13; const float ENT_CLIENT_DAMAGEINFO = 14; +const float ENT_CLIENT_CASING = 15; const float SPRITERULE_DEFAULT = 0; const float SPRITERULE_TEAMPLAY = 1; diff --git a/data/qcsrc/server/clientcommands.qc b/data/qcsrc/server/clientcommands.qc index fa53a97c8..a5c36901b 100644 --- a/data/qcsrc/server/clientcommands.qc +++ b/data/qcsrc/server/clientcommands.qc @@ -36,23 +36,22 @@ void Nagger_Init() { nagger = spawn(); Net_LinkEntity(nagger); - nagger.SendFlags = 128; nagger.SendEntity = Nagger_SendEntity; } void Nagger_VoteChanged() { if(nagger) - nagger.SendFlags = 128; + nagger.SendFlags |= 128; } void Nagger_VoteCountChanged() { if(nagger) - nagger.SendFlags = 1; + nagger.SendFlags |= 1; } void Nagger_ReadyCounted() { if(nagger) - nagger.SendFlags = 1; + nagger.SendFlags |= 1; } void ReadyCount(); diff --git a/data/qcsrc/server/g_casings.qc b/data/qcsrc/server/g_casings.qc index 1f97795cb..f40122582 100644 --- a/data/qcsrc/server/g_casings.qc +++ b/data/qcsrc/server/g_casings.qc @@ -1,3 +1,4 @@ +#if 0 void casingtouch() { PROJECTILE_TOUCH; @@ -105,3 +106,38 @@ void SpawnCasing(vector org, vector vel, float randomvel, vector ang, vector ave setsize (e, '0 0 -1', '0 0 -1'); setorigin (e, org); }; +#endif + +float Casing_SendEntity(entity to, float sf) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_CASING); + WriteByte(MSG_ENTITY, self.state); // actually type + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + WriteShort(MSG_ENTITY, self.oldorigin_x); // acrually compressed velocity + WriteByte(MSG_ENTITY, self.angles_x * 256 / 360); + WriteByte(MSG_ENTITY, self.angles_y * 256 / 360); + WriteByte(MSG_ENTITY, self.angles_z * 256 / 360); + return TRUE; +} + +void SpawnCasing(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype) +{ + entity e; + + e = spawn(); + e.state = casingtype; + e.origin = org; + e.velocity = vel; + e.angles = ang; + + e.oldorigin_x = compressShortVector(e.velocity); + + setmodel(e, "null"); + e.SendEntity = Casing_SendEntity; + + e.nextthink = time + 0.2; + e.think = SUB_Remove; + // 0.2s should be enough time for all clients to receive this ent once, do the gibbage and be done with it +} diff --git a/data/qcsrc/server/g_damage.qc b/data/qcsrc/server/g_damage.qc index 39824b34c..208c6a9d2 100644 --- a/data/qcsrc/server/g_damage.qc +++ b/data/qcsrc/server/g_damage.qc @@ -956,7 +956,7 @@ float RadiusDamage (entity inflictor, entity attacker, float coredamage, float e if(vlen(force) == 0) force = '0 0 -1'; else - force = normalize(force) * forceintensity; + force = normalize(force); Damage_DamageInfo(blastorigin, coredamage, edgedamage, rad, forceintensity * force, deathtype); } diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index 08443d0a8..01ed653b6 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -597,7 +597,6 @@ void spawnfunc_func_pointparticles() self.effects = EF_NODEPTHTEST; self.SendEntity = pointparticles_SendEntity; - self.SendFlags = 7; if(!self.modelindex) { vector misave, masave; @@ -982,7 +981,6 @@ void spawnfunc_misc_laser() self.effects = EF_NODEPTHTEST; self.SendEntity = laser_SendEntity; - self.SendFlags = 15; setmodel(self, "null"); self.mangle = self.angles; -- 2.39.2