From b02ea52fcf250ed6676f279ceb5157f9063873ac Mon Sep 17 00:00:00 2001 From: div0 Date: Wed, 26 Aug 2009 07:31:57 +0000 Subject: [PATCH] shockwave is now clientside (smoother) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@7526 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/Main.qc | 1 + data/qcsrc/client/modeleffects.qc | 66 ++++++++++++++++++++ data/qcsrc/client/progs.src | 1 + data/qcsrc/server/miscfunctions.qc | 98 ++++++++++++++++++++---------- 4 files changed, 133 insertions(+), 33 deletions(-) create mode 100644 data/qcsrc/client/modeleffects.qc diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index 57f3df013..b9b26ac7f 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -806,6 +806,7 @@ void(float bIsNewEntity) CSQC_Ent_Update = case ENT_CLIENT_CLIENTDATA: Ent_ClientData(); break; case ENT_CLIENT_RANDOMSEED: Ent_RandomSeed(); break; case ENT_CLIENT_WALL: Ent_Wall(); break; + case ENT_CLIENT_MODELEFFECT: Ent_ModelEffect(); break; default: error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n")); break; diff --git a/data/qcsrc/client/modeleffects.qc b/data/qcsrc/client/modeleffects.qc new file mode 100644 index 000000000..e0245d6fd --- /dev/null +++ b/data/qcsrc/client/modeleffects.qc @@ -0,0 +1,66 @@ +.float frame1time; +.float lifetime, fadetime; +.float teleport_time; +.float scale1, scale2; + +void ModelEffect_Draw() +{ + self.angles = self.angles + frametime * self.avelocity; + self.origin = self.origin + frametime * self.velocity; + self.scale = self.scale1 + (self.scale2 - self.scale1) * (time - self.teleport_time) / (self.lifetime + self.fadetime - self.teleport_time); + self.alpha = self.cnt * bound(0, 1 - (time - self.lifetime) / self.fadetime, 1); + if(self.alpha < ALPHA_MIN_VISIBLE) + { + remove(self); + return; + } + if(self.scale <= 0) + return; + R_AddEntity(self); +} + +void Ent_ModelEffect() +{ + float f; + entity e; + + self.classname = "modeleffect_spawner"; + + f = ReadByte(); + + e = spawn(); + e.classname = "modeleffect"; + e.model = "from network"; + e.modelindex = ReadShort(); + e.frame = ReadByte(); + e.frame1time = time; + e.origin_x = ReadCoord(); + e.origin_y = ReadCoord(); + e.origin_z = ReadCoord(); + if(f & 1) + { + e.velocity_x = ReadCoord(); + e.velocity_y = ReadCoord(); + e.velocity_z = ReadCoord(); + } + if(f & 2) + { + e.angles_x = ReadAngle(); + e.angles_y = ReadAngle(); + e.angles_z = ReadAngle(); + } + if(f & 4) + { + e.avelocity_x = ReadAngle(); + e.avelocity_y = ReadAngle(); + e.avelocity_z = ReadAngle(); + } + e.scale1 = ReadShort() / 256.0; + e.scale2 = ReadShort() / 256.0; + e.lifetime = time + ReadByte() * 0.01; + e.fadetime = ReadByte() * 0.01; + e.teleport_time = time; + e.cnt = ReadByte() / 255.0; // actually alpha + + e.draw = ModelEffect_Draw; +} diff --git a/data/qcsrc/client/progs.src b/data/qcsrc/client/progs.src index 23b9c7525..159744123 100644 --- a/data/qcsrc/client/progs.src +++ b/data/qcsrc/client/progs.src @@ -38,6 +38,7 @@ damage.qc casings.qc effects.qc wall.qc +modeleffects.qc //vehicles/spiderbot.qc Main.qc diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index 7acf28765..c7889c19e 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -2469,51 +2469,83 @@ entity GetCommandPlayerSlotTargetFromTokenizedCommand(float tokens, float idx) / return world; } - -void shockwave_think() -{ - float t; - self.nextthink = time; - - t = time - self.fade_time; - if(t < 0) +.float scale2; + +float modeleffect_SendEntity(entity to, float sf) +{ + float f; + WriteByte(MSG_ENTITY, ENT_CLIENT_MODELEFFECT); + + f = 0; + if(self.velocity != '0 0 0') + f |= 1; + if(self.angles != '0 0 0') + f |= 2; + if(self.avelocity != '0 0 0') + f |= 4; + + WriteByte(MSG_ENTITY, f); + WriteShort(MSG_ENTITY, self.modelindex); + WriteByte(MSG_ENTITY, self.frame); + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + if(f & 1) { - self.alpha = 1; + WriteCoord(MSG_ENTITY, self.velocity_x); + WriteCoord(MSG_ENTITY, self.velocity_y); + WriteCoord(MSG_ENTITY, self.velocity_z); } - else + if(f & 2) { - self.alpha = 1 - (time - self.fade_time) * self.fade_rate; + WriteCoord(MSG_ENTITY, self.angles_x); + WriteCoord(MSG_ENTITY, self.angles_y); + WriteCoord(MSG_ENTITY, self.angles_z); } - - if(self.alpha < 0.003) + if(f & 4) { - remove(self); - return; + WriteCoord(MSG_ENTITY, self.avelocity_x); + WriteCoord(MSG_ENTITY, self.avelocity_y); + WriteCoord(MSG_ENTITY, self.avelocity_z); } + WriteShort(MSG_ENTITY, self.scale * 256.0); + WriteShort(MSG_ENTITY, self.scale2 * 256.0); + WriteByte(MSG_ENTITY, self.teleport_time * 100.0); + WriteByte(MSG_ENTITY, self.fade_time * 100.0); + WriteByte(MSG_ENTITY, self.alpha * 255.0); - self.scale = (time - self.teleport_time) / (self.fade_time + 1 / self.fade_rate - self.teleport_time) * self.count; - - self.frame = self.count; -}; + return TRUE; +} -void shockwave_spawn(string m, vector org, float sz, float t1, float t2) +void modeleffect_spawn(string m, float f, vector o, vector v, vector ang, vector angv, float s0, float s2, float a, float t1, float t2) { entity e; + float sz; e = spawn(); - e.classname = "shockwave"; + e.classname = "modeleffect"; setmodel(e, m); - setorigin(e, org); - e.alpha = -1; - e.frame = 0; - e.count = 0; - e.think = shockwave_think; - e.nextthink = time; - e.fade_time = time + t1; - e.fade_rate = 1/t2; - e.teleport_time = time; - if(sz >= 0) - e.count = bound(0, sz / max6(-e.mins_x, -e.mins_y, -e.mins_z, e.maxs_x, e.maxs_y, e.maxs_z), 16); + e.frame = f; + setorigin(e, o); + e.velocity = v; + e.angles = ang; + e.avelocity = angv; + e.alpha = a; + e.teleport_time = t1; + e.fade_time = t2; + sz = max(s0, s2); + if(s0 >= 0) + e.scale = s0 / max6(-e.mins_x, -e.mins_y, -e.mins_z, e.maxs_x, e.maxs_y, e.maxs_z); else - e.count = -sz; + e.scale = -s0; + if(s2 >= 0) + e.scale2 = s2 / max6(-e.mins_x, -e.mins_y, -e.mins_z, e.maxs_x, e.maxs_y, e.maxs_z); + else + e.scale2 = -s2; setsize(e, e.mins * sz, e.maxs * sz); + Net_LinkEntity(e, FALSE, 0.1, modeleffect_SendEntity); +} + +void shockwave_spawn(string m, vector org, float sz, float t1, float t2) +{ + modeleffect_spawn(m, 0, org, '0 0 0', '0 0 0', '0 0 0', 0, sz, 1, t1, t2); } -- 2.39.2