From e97fe4ffdcee0657b9f0c2313b15c2c245b328c3 Mon Sep 17 00:00:00 2001 From: savagex Date: Sun, 29 Jun 2008 10:50:42 +0000 Subject: [PATCH] add 100% optional sv_gentle. This will replace the blood and gore with other damage indicators (after all blood and gore *do* serve a gameplay purpose to get immediate visual feedback on success). No corpses, no blood, no pain animation. Instead have particle effects indicate that "energy" was lost. Kumbaya my lord. Next stop would be to defuse the language ("You scored against [Bot]Hooray"). git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3733 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/effectinfo.txt | 30 +++++++++ data/qcsrc/server/cl_player.qc | 108 +++++++++++++++++++------------- data/qcsrc/server/g_violence.qc | 8 ++- 3 files changed, 101 insertions(+), 45 deletions(-) diff --git a/data/effectinfo.txt b/data/effectinfo.txt index eb1b47dd4..3d3d5b89a 100644 --- a/data/effectinfo.txt +++ b/data/effectinfo.txt @@ -2236,3 +2236,33 @@ color 0xE070FF 0xE070FF size 16 16 alpha 256 256 1024 velocityjitter 256 256 256 + +// Zero-violence effects + +// impact effect indicating damage +effect damage_hit +count 1 +type static +color 0x20FF30 0x80FFC0 +size 1 1 +alpha 256 256 256 +gravity -0.4 +bounce 1.5 +airfriction 8 +liquidfriction 16 +//velocityoffset 0 0 120 +velocityjitter 16 16 16 + +// effect for removing player model +effect damage_dissolve +count 112 +type static +color 0x00FF00 0xFFFFFF +size 10 10 +alpha 64 128 256 +airfriction 1 +liquidfriction 4 +originoffset 0 0 28 +originjitter 16 16 28 +velocityjitter 0 0 256 + diff --git a/data/qcsrc/server/cl_player.qc b/data/qcsrc/server/cl_player.qc index 6c3e817bb..20ab1d0cd 100644 --- a/data/qcsrc/server/cl_player.qc +++ b/data/qcsrc/server/cl_player.qc @@ -257,8 +257,10 @@ void SpawnThrownWeapon (vector org, float w) void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { - local float take, save; - pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200)); + local float take, save, gentle; + gentle = cvar("sv_gentle"); + if(gentle < 1) + pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200)); // damage resistance (ignore most of the damage from a bullet or similar) damage = max(damage - 5, 1); @@ -272,10 +274,12 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float else if (take > 10) sound (self, CHAN_IMPACT, "misc/bodyimpact1.wav", 1, ATTN_NORM); - if (take > 50) - TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1); - if (take > 100) - TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.2,1); + if(gentle < 1) { + if (take > 50) + TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.1,1); + if (take > 100) + TossGib (world, "models/gibs/chunk.mdl", hitloc, force * -0.2,1); + } if (!(self.flags & FL_GODMODE)) { @@ -301,44 +305,48 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float multiplier = 1; if (cvar("ekg")) multiplier = 5; - te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 1200 * multiplier, 1000); + // make a meaty mess TossGib (self, "models/gibs/eye.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); - TossGib (world, "models/gibs/bloodyskull.md3", self.origin + self.view_ofs, self.velocity,0); + + if(gentle < 1) { + te_bloodshower (self.origin + self.mins, self.origin + self.maxs, 1200 * multiplier, 1000); + TossGib (world, "models/gibs/bloodyskull.md3", self.origin + self.view_ofs, self.velocity,0); - local float c; - c = 0; - while (c < multiplier) - { - c = c + 1; - //TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity + randomvec() * 450,0); - //TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity + randomvec() * 450,0); - //TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity + randomvec() * 450,0); - //TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity + randomvec() * 450,0); - //TossGib (world, "models/gibs/gib5.md3", self.origin, self.velocity + randomvec() * 450,0); - //TossGib (world, "models/gibs/gib6.md3", self.origin, self.velocity + randomvec() * 450,0); - - TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0); - TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0); - //TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); - //TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); - TossGib (world, "models/gibs/chest.md3", self.origin + self.view_ofs * 0.5, self.velocity + randomvec() * (random() * 120 + 80),0); - //TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); - TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 80),0); - TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * (random() * 120 + 85),0); - TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * (random() * 120 + 85),0); - //TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * 150,0); - //TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * 150,0); - - // these splat on impact - TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); - TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); - } + local float c; + c = 0; - sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); + while (c < multiplier) + { + c = c + 1; + //TossGib (world, "models/gibs/gib1.md3", self.origin, self.velocity + randomvec() * 450,0); + //TossGib (world, "models/gibs/gib2.md3", self.origin, self.velocity + randomvec() * 450,0); + //TossGib (world, "models/gibs/gib3.md3", self.origin, self.velocity + randomvec() * 450,0); + //TossGib (world, "models/gibs/gib4.md3", self.origin, self.velocity + randomvec() * 450,0); + //TossGib (world, "models/gibs/gib5.md3", self.origin, self.velocity + randomvec() * 450,0); + //TossGib (world, "models/gibs/gib6.md3", self.origin, self.velocity + randomvec() * 450,0); + + TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0); + TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 90),0); + //TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); + //TossGib (world, "models/gibs/arm.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); + TossGib (world, "models/gibs/chest.md3", self.origin + self.view_ofs * 0.5, self.velocity + randomvec() * (random() * 120 + 80),0); + //TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * 150,0); + TossGib (world, "models/gibs/smallchest.md3", self.origin + self.view_ofs, self.velocity + randomvec() * (random() * 120 + 80),0); + TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * (random() * 120 + 85),0); + TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * (random() * 120 + 85),0); + //TossGib (world, "models/gibs/leg1.md3", self.origin + self.view_ofs * -0.2, self.velocity + randomvec() * 150,0); + //TossGib (world, "models/gibs/leg2.md3", self.origin + self.view_ofs * -0.4, self.velocity + randomvec() * 150,0); + + // these splat on impact + TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); + TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); + TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); + TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity + randomvec() * 450,1); + } + sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); + } } } @@ -349,14 +357,20 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht local float take, save, waves, sdelay; damage = damage * bound(1.0, self.cvar_cl_handicap, 100.0); + if(cvar("sv_gentle")) { + pointparticles(particleeffectnum("damage_hit"), hitloc, force, bound(0, damage, 200)); + } else { + pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200)); + } - pointparticles(particleeffectnum("blood"), hitloc, force, bound(0, damage, 200)); if (self.pain_finished < time) //Don't switch pain sequences like crazy { - if (random() > 0.5) - player_setanim(self.anim_pain1, FALSE, TRUE, TRUE); - else - player_setanim(self.anim_pain2, FALSE, TRUE, TRUE); + if(!cvar("sv_gentle")) { + if (random() > 0.5) + player_setanim(self.anim_pain1, FALSE, TRUE, TRUE); + else + player_setanim(self.anim_pain2, FALSE, TRUE, TRUE); + } self.pain_finished = time + 0.5; //Supajoe // throw off bot aim temporarily @@ -546,6 +560,12 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht if(defer_ClientKill_Now_TeamChange) ClientKill_Now_TeamChange(); + + if(cvar("sv_gentle")) { + // remove corpse + PlayerCorpseDamage (inflictor, attacker, 100.0, deathtype, hitloc, force); + pointparticles(particleeffectnum("damage_dissolve"), self.origin, force, 1); + } } } diff --git a/data/qcsrc/server/g_violence.qc b/data/qcsrc/server/g_violence.qc index c764908a6..6af33d0c8 100644 --- a/data/qcsrc/server/g_violence.qc +++ b/data/qcsrc/server/g_violence.qc @@ -10,7 +10,9 @@ void GibDamage (entity inflictor, entity attacker, float damage, float deathtype sound (self, CHAN_IMPACT, "misc/gib_splat03.wav", 1, ATTN_NORM); else if (r < 0.75) sound (self, CHAN_IMPACT, "misc/gib_splat04.wav", 1, ATTN_NORM); - pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10); + + if(cvar("sv_gentle") < 1) + pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10); self.health = self.health - damage; if (self.health <= -1000) { @@ -37,6 +39,10 @@ float() Gib_customizeentityforclient = { if(self.classname == "player") // the eye { + if(cvar("sv_gentle")) { + self.model = ""; + return TRUE; + } if(self.gibrandom > other.cvar_cl_nogibs) self.model = self.mdl; else -- 2.39.2