[nexuiz-commits] r6229 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Mar 20 08:25:07 EDT 2009


Author: div0
Date: 2009-03-20 08:25:06 -0400 (Fri, 20 Mar 2009)
New Revision: 6229

Modified:
   trunk/data/qcsrc/server/cl_client.qc
   trunk/data/qcsrc/server/defs.qh
Log:
entity dragging: make it more gravity gun-like


Modified: trunk/data/qcsrc/server/cl_client.qc
===================================================================
--- trunk/data/qcsrc/server/cl_client.qc	2009-03-20 09:41:28 UTC (rev 6228)
+++ trunk/data/qcsrc/server/cl_client.qc	2009-03-20 12:25:06 UTC (rev 6229)
@@ -2379,20 +2379,160 @@
 	target_voicescript_next(self);
 }
 
-void DragCursor_Think()
+// on dragger:
+.entity dragentity;
+.float dragspeed; // speed of mouse wheel action
+.float dragdistance; // distance of dragentity's draglocalvector from view_ofs
+.vector draglocalvector; // local attachment vector of the dragentity
+.float draglocalangle;
+
+// on draggee:
+.entity draggedby;
+.float dragmovetype;
+
+void Drag_Begin(entity dragger, entity draggee, vector touchpoint)
 {
-	self.model = self.owner.dragentity.model;
-	self.modelindex = self.owner.dragentity.modelindex;
-	self.origin = self.owner.dragentity.origin;
-	self.angles = self.owner.dragentity.angles;
-	self.tag_entity = self.owner.dragentity.tag_entity;
-	self.tag_index = self.owner.dragentity.tag_index;
-	self.scale = self.owner.dragentity.scale;
-	detach_sameorigin(self);
+	float tagscale;
 
-	self.nextthink = time;
+	draggee.dragmovetype = draggee.movetype;
+	draggee.movetype = MOVETYPE_BOUNCEMISSILE;
+	draggee.flags &~= FL_ONGROUND;
+	draggee.draggedby = dragger;
+
+	dragger.dragentity = draggee;
+
+	dragger.dragdistance = vlen(touchpoint - dragger.origin - dragger.view_ofs);
+	dragger.draglocalangle = draggee.angles_y - dragger.v_angle_y;
+	touchpoint = touchpoint - gettaginfo(draggee, 0);
+	tagscale = pow(vlen(v_forward), -2);
+	dragger.draglocalvector_x = touchpoint * v_forward * tagscale;
+	dragger.draglocalvector_y = touchpoint * v_right * tagscale;
+	dragger.draglocalvector_z = touchpoint * v_up * tagscale;
+	print(vtos(v_forward), "\n");
+
+	dragger.dragspeed = 64;
 }
 
+void Drag_Finish(entity dragger)
+{
+	entity draggee;
+	draggee = dragger.dragentity;
+	if(dragger)
+		dragger.dragentity = world;
+	draggee.draggedby = world;
+	draggee.movetype = draggee.dragmovetype;
+
+	switch(draggee.movetype)
+	{
+		case MOVETYPE_TOSS:
+		case MOVETYPE_WALK:
+		case MOVETYPE_STEP:
+		case MOVETYPE_FLYMISSILE:
+		case MOVETYPE_BOUNCE:
+		case MOVETYPE_BOUNCEMISSILE:
+			break;
+		default:
+			draggee.velocity = '0 0 0';
+			break;
+	}
+
+	if((draggee.flags & FL_ITEM) && (vlen(draggee.velocity) < 32))
+	{
+		draggee.velocity = '0 0 0';
+		draggee.flags |= FL_ONGROUND; // floating items are FUN
+	}
+}
+
+float Drag_IsDraggable(entity draggee)
+{
+	// TODO add more checks for bad stuff here
+	if(draggee.classname == "func_bobbing")
+		return FALSE;
+	if(draggee.classname == "door") // FIXME find out why these must be excluded, or work around the problem (trying to drag these causes like 4 fps)
+		return FALSE;
+	if(draggee.classname == "plat")
+		return FALSE;
+	if(draggee.classname == "func_button")
+		return FALSE;
+	if(draggee.model == "")
+		return FALSE;
+	return TRUE;
+}
+
+float Drag_MayChangeAngles(entity draggee)
+{
+	// TODO add more checks for bad stuff here
+	if(draggee.classname == "door")
+		return FALSE;
+	if(draggee.classname == "plat")
+		return FALSE;
+	if(draggee.classname == "func_button")
+		return FALSE;
+	return TRUE;
+}
+
+void Drag_MoveForward(entity dragger)
+{
+	dragger.dragdistance += dragger.dragspeed;
+}
+
+void Drag_SetSpeed(entity dragger, float s)
+{
+	dragger.dragspeed = pow(2, s);
+}
+
+void Drag_MoveBackward(entity dragger)
+{
+	dragger.dragdistance = max(0, dragger.dragdistance - dragger.dragspeed);
+}
+
+void Drag_Update(entity dragger)
+{
+	vector curorigin, neworigin, goodvelocity;
+	float f;
+	entity draggee;
+
+	draggee = dragger.dragentity;
+
+	curorigin = gettaginfo(draggee, 0);
+	curorigin = curorigin + v_forward * dragger.draglocalvector_x + v_right * dragger.draglocalvector_y + v_up * dragger.draglocalvector_z;
+	makevectors(dragger.v_angle);
+	neworigin = dragger.origin + dragger.view_ofs + v_forward * dragger.dragdistance;
+	goodvelocity = (neworigin - curorigin) * (1 / frametime);
+
+	while(draggee.angles_y - dragger.v_angle_y - dragger.draglocalangle > 180)
+		dragger.draglocalangle += 360;
+	while(draggee.angles_y - dragger.v_angle_y - dragger.draglocalangle <= -180)
+		dragger.draglocalangle -= 360;
+
+	f = min(frametime * 10, 1);
+	draggee.velocity = draggee.velocity * (1 - f) + goodvelocity * f;
+
+	if(Drag_MayChangeAngles(draggee))
+		draggee.angles_y = draggee.angles_y * (1 - f) + (dragger.v_angle_y + dragger.draglocalangle) * f;
+	
+	draggee.ltime = max(servertime + serverframetime, draggee.ltime); // fixes func_train breakage
+
+	te_lightning1(dragger, dragger.origin + dragger.view_ofs, curorigin);
+}
+
+float Drag_IsDragging(entity dragger)
+{
+	if(!dragger.dragentity)
+		return FALSE;
+	if(wasfreed(dragger.dragentity) || dragger.dragentity.draggedby != dragger)
+	{
+		dragger.dragentity = world;
+		return FALSE;
+	}
+	if(!Drag_IsDraggable(dragger.dragentity))
+	{
+		Drag_Finish(dragger);
+		return FALSE;
+	}
+	return TRUE;
+}
+
 /*
 =============
 PlayerPostThink
@@ -2443,67 +2583,44 @@
 		if(self.BUTTON_DRAG)
 			if(!self.dragentity)
 				if(self.cursor_trace_ent)
-					if(!self.cursor_trace_ent.tag_index)
+					if(Drag_IsDraggable(self.cursor_trace_ent))
 					{
-						self.dragentity = self.cursor_trace_ent;
-						if(self.dragentity.tag_entity)
-						{
-							detach_sameorigin(self.dragentity);
-							if(self.dragentity.dragmovetype)
-								self.dragentity.movetype = self.dragentity.dragmovetype;
-						}
-						self.dragentity.dragmovetype = self.dragentity.movetype;
-						self.dragentity.movetype = MOVETYPE_NONE;
-						self.dragentity.draggedby = self;
-						self.dragcursor = spawn();
-						self.dragcursor.owner = self;
-						self.dragcursor.think = DragCursor_Think;
-						self.dragcursor.nextthink = time;
-						self.dragcursor.exteriormodeltoclient = self;
-						attach_sameorigin(self.dragentity, self.weaponentity, "");
-						self.dragentity.effects |= EF_FLAME;
+						if(self.cursor_trace_ent.draggedby)
+							Drag_Finish(self.cursor_trace_ent.draggedby);
+						if(self.cursor_trace_ent.tag_entity)
+							detach_sameorigin(self.cursor_trace_ent);
+						Drag_Begin(self, self.cursor_trace_ent, self.cursor_trace_endpos);
 					}
 	
-	if(self.dragentity.draggedby == self)
+	if(Drag_IsDragging(self))
 	{
 		if(self.BUTTON_DRAG)
 		{
-			float f;
-			if(self.dragspeed == 0)
-				self.dragspeed = 32;
 			if(self.impulse == 10 || self.impulse == 15 || self.impulse == 18)
 			{
-				f = 1 + self.dragspeed / vlen(self.dragentity.origin);
-				self.dragentity.origin = self.dragentity.origin * f;
+				Drag_MoveForward(self);
 				self.impulse = 0;
 			}
 			else if(self.impulse == 12 || self.impulse == 16 || self.impulse == 19)
 			{
-				f = max(0.5, 1 - self.dragspeed / vlen(self.dragentity.origin));
-				self.dragentity.origin = self.dragentity.origin * f;
+				Drag_MoveBackward(self);
 				self.impulse = 0;
 			}
 			else if(self.impulse >= 1 && self.impulse <= 9)
 			{
-				self.dragspeed = pow(2, self.impulse);
-				self.impulse = 0;
+				Drag_SetSpeed(self, self.impulse - 1);
 			}
 			else if(self.impulse == 14)
 			{
-				self.dragspeed = pow(2, 10);
-				self.impulse = 0;
+				Drag_SetSpeed(self, 9);
 			}
+
+			if(frametime)
+				Drag_Update(self);
 		}
 		else
 		{
-			self.dragentity.effects &~= EF_FLAME;
-			//self.dragentity.flags &~= FL_ONGROUND;
-			if(self.dragentity.dragmovetype)
-				self.dragentity.movetype = self.dragentity.dragmovetype;
-			detach_sameorigin(self.dragentity);
-			self.dragentity = world;
-			remove(self.dragcursor);
-			self.dragcursor = world;
+			Drag_Finish(self);
 		}
 	}
 

Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh	2009-03-20 09:41:28 UTC (rev 6228)
+++ trunk/data/qcsrc/server/defs.qh	2009-03-20 12:25:06 UTC (rev 6229)
@@ -552,9 +552,3 @@
 .float wasplayer;
 
 float servertime, serverprevtime, serverframetime;
-
-.entity dragentity;
-.float dragspeed;
-.entity dragcursor;
-.entity draggedby;
-.float dragmovetype;



More information about the nexuiz-commits mailing list