r4216 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Thu Aug 28 03:39:32 EDT 2008
Author: div0
Date: 2008-08-28 03:39:24 -0400 (Thu, 28 Aug 2008)
New Revision: 4216
Modified:
trunk/data/qcsrc/server/ctf.qc
trunk/data/qcsrc/server/defs.qh
trunk/data/qcsrc/server/domination.qc
trunk/data/qcsrc/server/g_lights.qc
trunk/data/qcsrc/server/g_triggers.qc
trunk/data/qcsrc/server/miscfunctions.qc
trunk/data/qcsrc/server/sv_main.qc
trunk/data/qcsrc/server/t_jumppads.qc
trunk/data/qcsrc/server/t_plats.qc
trunk/data/qcsrc/server/t_teleporters.qc
trunk/data/qcsrc/server/teamplay.qc
Log:
- get rid of delayed init where I found it and replace it by something that runs BEFORE think (in the very first StartFrame); makes sure misc_follow can work right (as all entities are on their INITIAL location then)
- make misc_laser work with misc_follow
Modified: trunk/data/qcsrc/server/ctf.qc
===================================================================
--- trunk/data/qcsrc/server/ctf.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/ctf.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -662,8 +662,6 @@
void ctf_delayedinit()
{
- self.think = SUB_Remove;
- self.nextthink = time;
// if no teams are found, spawn defaults
if (find(world, classname, "ctf_team") == world)
ctf_spawnteams();
@@ -673,11 +671,7 @@
void ctf_init()
{
- local entity e;
-
- e = spawn();
- e.think = ctf_delayedinit;
- e.nextthink = time + 0.1;
+ InitializeEntity(world, ctf_delayedinit, INITPRIO_GAMETYPE);
flagcaptimerecord = stof(db_get(ServerProgsDB, strcat(GetMapname(), "/captimerecord/time")));
};
Modified: trunk/data/qcsrc/server/defs.qh
===================================================================
--- trunk/data/qcsrc/server/defs.qh 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/defs.qh 2008-08-28 07:39:24 UTC (rev 4216)
@@ -28,6 +28,7 @@
entity activator;
string string_null;
+const var void(void) func_null;
float player_count;
float currentbots;
Modified: trunk/data/qcsrc/server/domination.qc
===================================================================
--- trunk/data/qcsrc/server/domination.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/domination.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -560,8 +560,6 @@
{
local entity head;
- self.think = SUB_Remove;
- self.nextthink = time;
// if no teams are found, spawn defaults
if (find(world, classname, "dom_team") == world)
dom_spawnteams();
@@ -592,7 +590,6 @@
void dom_init()
{
- local entity e;
// we have to precache default models/sounds even if they might not be
// used because spawnfunc_worldspawn is executed before any other entities are read,
// so we don't even know yet if this map is set up for domination...
@@ -602,9 +599,7 @@
precache_model("models/domination/dom_pink.md3");
precache_model("models/domination/dom_unclaimed.md3");
precache_sound("domination/claim.wav");
- e = spawn();
- e.think = dom_delayedinit;
- e.nextthink = time + 0.1;
+ InitializeEntity(world, dom_delayedinit, INITPRIO_GAMETYPE);
// teamplay is always on in domination, defaults to hurt self but not teammates
//if(!cvar("teamplay"))
Modified: trunk/data/qcsrc/server/g_lights.qc
===================================================================
--- trunk/data/qcsrc/server/g_lights.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/g_lights.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -33,11 +33,13 @@
if(!self.owner)
remove(self);
- self.nextthink = 0.1;
+ self.nextthink = time + 0.1;
};
void dynlight_find_aiment()
{
local entity targ;
+ if (!self.target)
+ objerror ("dynlight: no target to follow");
targ = find(world, targetname, self.target);
self.movetype = MOVETYPE_FOLLOW;
@@ -46,19 +48,33 @@
self.punchangle = targ.angles;
self.view_ofs = self.origin - targ.origin;
self.v_angle = self.angles - targ.angles;
- self.nextthink = 0.1;
self.think = dynlight_think;
+ self.nextthink = time + 0.1;
};
void dynlight_find_path()
{
local entity targ;
+ if (!self.target)
+ objerror ("dynlight: no target to follow");
targ = find(world, targetname, self.target);
self.target = targ.target;
setorigin (self, targ.origin);
- self.nextthink = self.ltime + 0.1;
self.think = train_next;
+ self.nextthink = time + 0.1;
};
+void dynlight_find_target()
+{
+ local entity targ;
+ if (!self.target)
+ objerror ("dynlight: no target to follow");
+
+ targ = find(world, targetname, self.target);
+ setattachment(self, targ, self.dtagname);
+ self.owner = targ;
+ self.think = dynlight_think;
+ self.nextthink = time + 0.1;
+}
void dynlight_use()
{
if (self.light_lev == 0)
@@ -89,22 +105,14 @@
//tag attaching
if (self.dtagname)
{
- if (!self.target)
- objerror ("dynlight: no target to follow");
- targ = find(world, targetname, self.target);
- setattachment(self, targ, self.dtagname);
- self.owner = targ;
- self.think = dynlight_think;
+ InitializeEntity(self, dynlight_find_target, INITPRIO_FINDTARGET);
return;
}
// entity following
if (self.spawnflags & DFOLLOW)
{
- if (!self.target)
- objerror ("dynlight: no target to follow");
- self.nextthink = time + 0.1;
- self.think = dynlight_find_aiment;
+ InitializeEntity(self, dynlight_find_aiment, INITPRIO_FINDTARGET);
return;
}
// path following
@@ -114,7 +122,7 @@
self.movetype = MOVETYPE_PUSH;
if (!self.speed)
self.speed = 100;
- self.nextthink = self.ltime + 0.1;
- self.think = dynlight_find_path;
+ InitializeEntity(self, dynlight_find_path, INITPRIO_FINDTARGET);
+ return;
}
};
Modified: trunk/data/qcsrc/server/g_triggers.qc
===================================================================
--- trunk/data/qcsrc/server/g_triggers.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/g_triggers.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -712,9 +712,9 @@
{
a = vectoangles(self.enemy.origin - self.origin);
a_x = -a_x;
- if(a != self.angles)
+ if(a != self.mangle)
{
- self.angles = a;
+ self.mangle = a;
self.SendFlags |= 2;
}
}
@@ -725,24 +725,23 @@
}
}
+void misc_laser_init()
+{
+ self.enemy = find(world, targetname, self.target);
+}
+
void misc_laser_think()
{
vector o;
self.nextthink = time;
- if(!self.count)
- {
- self.enemy = find(world, targetname, self.target);
- self.count = 1;
- }
-
if(!self.state)
return;
misc_laser_aim();
- makevectors(self.angles);
+ makevectors(self.mangle);
o = self.origin + 32768 * v_forward;
if(self.dmg)
@@ -773,8 +772,8 @@
}
if(fl & 2)
{
- WriteCoord(MSG_ENTITY, self.angles_x);
- WriteCoord(MSG_ENTITY, self.angles_y);
+ WriteCoord(MSG_ENTITY, self.mangle_x);
+ WriteCoord(MSG_ENTITY, self.mangle_y);
}
if(fl & 4)
WriteByte(MSG_ENTITY, self.state);
@@ -818,6 +817,7 @@
self.message = "saw the light";
self.think = misc_laser_think;
self.nextthink = time;
+ InitializeEntity(self, misc_laser_init, INITPRIO_FINDTARGET);
self.effects = EF_NODEPTHTEST;
self.SendEntity = laser_SendEntity;
@@ -1069,7 +1069,7 @@
self.state = 0;
}
-void follow_think()
+void follow_init()
{
entity src, dst;
src = find(world, targetname, self.killtarget);
@@ -1092,6 +1092,5 @@
void spawnfunc_misc_follow()
{
- self.think = follow_think;
- self.nextthink = time;
+ InitializeEntity(self, follow_init, INITPRIO_FINDTARGET);
}
Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/miscfunctions.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -1190,3 +1190,73 @@
// WARNING: this kills the trace globals
#define EXACTTRIGGER_TOUCH if not(ExactTriggerHit()) return
#define EXACTTRIGGER_INIT InitSolidBSPTrigger(); self.solid = SOLID_TRIGGER
+
+#define INITPRIO_FIRST 0
+#define INITPRIO_GAMETYPE 0
+#define INITPRIO_GAMETYPE_FALLBACK 1
+#define INITPRIO_FINDTARGET 10
+#define INITPRIO_SETLOCATION 90
+#define INITPRIO_LAST 99
+
+.void(void) initialize_entity;
+.float initialize_entity_order;
+.entity initialize_entity_next;
+entity initialize_entity_first;
+void InitializeEntity(entity e, void(void) func, float order)
+{
+ entity prev, cur;
+
+ if(!e || e.initialize_entity)
+ {
+ // make a proxy initializer entity
+ entity e_old;
+ e_old = e;
+ e = spawn();
+ e.classname = "initialize_entity";
+ e.enemy = e_old;
+ }
+
+ e.initialize_entity = func;
+ e.initialize_entity_order = order;
+
+ cur = initialize_entity_first;
+ for(;;)
+ {
+ if(!cur || cur.initialize_entity_order > order)
+ {
+ // insert between prev and cur
+ if(prev)
+ prev.initialize_entity_next = e;
+ else
+ initialize_entity_first = e;
+ e.initialize_entity_next = cur;
+ return;
+ }
+ prev = cur;
+ cur = cur.initialize_entity_next;
+ }
+}
+void InitializeEntitiesRun()
+{
+ for(self = initialize_entity_first; self; )
+ {
+ entity e;
+ var void(void) func;
+ e = self.initialize_entity_next;
+ func = self.initialize_entity;
+ self.initialize_entity_order = 0;
+ self.initialize_entity = func_null;
+ self.initialize_entity_next = world;
+ if(self.classname == "initialize_entity")
+ {
+ entity e_old;
+ e_old = self.enemy;
+ remove(self);
+ self = e_old;
+ }
+ dprint("Delayed initialization: ", self.classname, "\n");
+ func();
+ self = e;
+ }
+ initialize_entity_first = world;
+}
Modified: trunk/data/qcsrc/server/sv_main.qc
===================================================================
--- trunk/data/qcsrc/server/sv_main.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/sv_main.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -136,6 +136,8 @@
if(RedirectionThink())
return;
+ InitializeEntitiesRun();
+
sv_maxairspeed = cvar("sv_maxairspeed");
sv_maxspeed = cvar ("sv_maxspeed");
sv_friction = cvar ("sv_friction");
Modified: trunk/data/qcsrc/server/t_jumppads.qc
===================================================================
--- trunk/data/qcsrc/server/t_jumppads.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/t_jumppads.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -255,8 +255,7 @@
precache_sound (self.noise);
// this must be called to spawn the teleport waypoints for bots
- self.think = trigger_push_findtarget;
- self.nextthink = time + 0.2;
+ InitializeEntity(self, trigger_push_findtarget, INITPRIO_FINDTARGET);
};
void spawnfunc_target_push() {};
Modified: trunk/data/qcsrc/server/t_plats.qc
===================================================================
--- trunk/data/qcsrc/server/t_plats.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/t_plats.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -344,6 +344,8 @@
local entity targ;
targ = find(world, targetname, self.target);
self.target = targ.target;
+ if (!self.target)
+ objerror("func_train_find: no next target");
setorigin(self, targ.origin - self.mins);
self.nextthink = self.ltime + 1;
self.think = train_next;
@@ -365,8 +367,7 @@
self.effects |= EF_LOWPRECISION;
// wait for targets to spawn
- self.nextthink = self.ltime + 0.1;
- self.think = func_train_find;
+ InitializeEntity(self, func_train_find, INITPRIO_SETLOCATION);
};
@@ -1126,8 +1127,7 @@
// LinkDoors can't be done until all of the doors have been spawned, so
// the sizes can be detected properly.
- self.think = LinkDoors;
- self.nextthink = self.ltime + 0.1;
+ InitializeEntity(self, LinkDoors, INITPRIO_FINDTARGET);
};
/*
Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/t_teleporters.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -129,8 +129,8 @@
EXACTTRIGGER_INIT;
- self.think = teleport_findtarget;
- self.nextthink = time + 0.2;
+ // 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");
Modified: trunk/data/qcsrc/server/teamplay.qc
===================================================================
--- trunk/data/qcsrc/server/teamplay.qc 2008-08-27 13:22:10 UTC (rev 4215)
+++ trunk/data/qcsrc/server/teamplay.qc 2008-08-28 07:39:24 UTC (rev 4216)
@@ -142,8 +142,6 @@
void default_delayedinit()
{
- remove(self);
-
if(!scores_initialized)
ScoreRules_generic();
}
@@ -333,10 +331,7 @@
cvar_set("fraglimit", "0");
}
- entity e;
- e = spawn();
- e.nextthink = time + 0.3; // MUST be after all other delayed inits!
- e.think = default_delayedinit;
+ InitializeEntity(world, default_delayedinit, INITPRIO_GAMETYPE_FALLBACK);
}
string GetClientVersionMessage() {
@@ -1323,8 +1318,6 @@
void tdm_delayedinit()
{
- self.think = SUB_Remove;
- self.nextthink = time;
// if no teams are found, spawn defaults
if (find(world, classname, "tdm_team") == world)
tdm_spawnteams();
@@ -1332,10 +1325,5 @@
void tdm_init()
{
- local entity e;
- e = spawn();
- e.think = tdm_delayedinit;
- e.nextthink = time + 0.1;
+ InitializeEntity(world, tdm_delayedinit, INITPRIO_GAMETYPE);
};
-
-
More information about the nexuiz-commits
mailing list