[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