[nexuiz-commits] r7526 - in trunk/data/qcsrc: client server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Wed Aug 26 03:32:03 EDT 2009
Author: div0
Date: 2009-08-26 03:31:57 -0400 (Wed, 26 Aug 2009)
New Revision: 7526
Added:
trunk/data/qcsrc/client/modeleffects.qc
Modified:
trunk/data/qcsrc/client/Main.qc
trunk/data/qcsrc/client/progs.src
trunk/data/qcsrc/server/miscfunctions.qc
Log:
shockwave is now clientside (smoother)
Modified: trunk/data/qcsrc/client/Main.qc
===================================================================
--- trunk/data/qcsrc/client/Main.qc 2009-08-26 04:59:10 UTC (rev 7525)
+++ trunk/data/qcsrc/client/Main.qc 2009-08-26 07:31:57 UTC (rev 7526)
@@ -806,6 +806,7 @@
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;
Added: trunk/data/qcsrc/client/modeleffects.qc
===================================================================
--- trunk/data/qcsrc/client/modeleffects.qc (rev 0)
+++ trunk/data/qcsrc/client/modeleffects.qc 2009-08-26 07:31:57 UTC (rev 7526)
@@ -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;
+}
Modified: trunk/data/qcsrc/client/progs.src
===================================================================
--- trunk/data/qcsrc/client/progs.src 2009-08-26 04:59:10 UTC (rev 7525)
+++ trunk/data/qcsrc/client/progs.src 2009-08-26 07:31:57 UTC (rev 7526)
@@ -38,6 +38,7 @@
casings.qc
effects.qc
wall.qc
+modeleffects.qc
//vehicles/spiderbot.qc
Main.qc
Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc 2009-08-26 04:59:10 UTC (rev 7525)
+++ trunk/data/qcsrc/server/miscfunctions.qc 2009-08-26 07:31:57 UTC (rev 7526)
@@ -2469,51 +2469,83 @@
return world;
}
+.float scale2;
-void shockwave_think()
+float modeleffect_SendEntity(entity to, float sf)
{
- float t;
- self.nextthink = time;
+ float f;
+ WriteByte(MSG_ENTITY, ENT_CLIENT_MODELEFFECT);
- t = time - self.fade_time;
- if(t < 0)
+ 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;
+ return TRUE;
+}
- self.frame = self.count;
-};
-
-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);
+}
More information about the nexuiz-commits
mailing list