r4674 - trunk/data/qcsrc/server

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Wed Oct 8 12:11:22 EDT 2008


Author: div0
Date: 2008-10-08 12:11:22 -0400 (Wed, 08 Oct 2008)
New Revision: 4674

Modified:
   trunk/data/qcsrc/server/builtins.qh
   trunk/data/qcsrc/server/miscfunctions.qc
   trunk/data/qcsrc/server/t_teleporters.qc
Log:
make objerror safe for all entities again


Modified: trunk/data/qcsrc/server/builtins.qh
===================================================================
--- trunk/data/qcsrc/server/builtins.qh	2008-10-08 16:00:18 UTC (rev 4673)
+++ trunk/data/qcsrc/server/builtins.qh	2008-10-08 16:11:22 UTC (rev 4674)
@@ -9,7 +9,7 @@
 //void(entity e, float chan, string samp, float vol, float atten) sound = #8;
 vector	normalize (vector v)								= #9;
 void	error (string e)								= #10;
-void	objerror (string e)								= #11;
+void	objerror_builtin (string e)								= #11; // do not call, use objerror wrapper
 float	vlen (vector v)									= #12;
 float	vectoyaw (vector v)								= #13;
 entity	spawn (void)									= #14;

Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc	2008-10-08 16:00:18 UTC (rev 4673)
+++ trunk/data/qcsrc/server/miscfunctions.qc	2008-10-08 16:11:22 UTC (rev 4674)
@@ -1,3 +1,5 @@
+void objerror(string s);
+
 void() spawnfunc_info_player_deathmatch; // needed for the other spawnpoints
 void() spawnpoint_use;
 string ColoredTeamName(float t);
@@ -1218,6 +1220,44 @@
 .float initialize_entity_order;
 .entity initialize_entity_next;
 entity initialize_entity_first;
+
+void make_safe_for_remove(entity e)
+{
+	if(e.initialize_entity)
+	{
+		entity ent, prev;
+		for(ent = initialize_entity_first; ent; )
+		{
+			if((ent == e) || ((ent.classname == "initialize_entity") && (ent.enemy == e)))
+			{
+				print("make_safe_for_remove: getting rid of initializer ", etos(ent), "\n");
+				// skip it in linked list
+				if(prev)
+				{
+					prev.initialize_entity_next = ent.initialize_entity_next;
+					ent = prev.initialize_entity_next;
+				}
+				else
+				{
+					initialize_entity_first = ent.initialize_entity_next;
+					ent = initialize_entity_first;
+				}
+			}
+			else
+			{
+				prev = ent;
+				ent = ent.initialize_entity_next;
+			}
+		}
+	}
+}
+
+void objerror(string s)
+{
+	make_safe_for_remove(self);
+	objerror_builtin(s);
+}
+
 void InitializeEntity(entity e, void(void) func, float order)
 {
 	entity prev, cur;

Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc	2008-10-08 16:00:18 UTC (rev 4673)
+++ trunk/data/qcsrc/server/t_teleporters.qc	2008-10-08 16:11:22 UTC (rev 4674)
@@ -161,14 +161,14 @@
 {
 	self.angles = '0 0 0';
 
+	EXACTTRIGGER_INIT;
+
+	// this must be called to spawn the teleport waypoints for bots
+	InitializeEntity(self, teleport_findtarget, INITPRIO_FINDTARGET);
+
 	if (!self.target)
 	{
 		objerror ("Teleporter with no target");
 		return;
 	}
-
-	EXACTTRIGGER_INIT;
-
-	// this must be called to spawn the teleport waypoints for bots
-	InitializeEntity(self, teleport_findtarget, INITPRIO_FINDTARGET);
 }




More information about the nexuiz-commits mailing list