r4142 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Aug 22 07:01:05 EDT 2008
Author: div0
Date: 2008-08-22 07:01:02 -0400 (Fri, 22 Aug 2008)
New Revision: 4142
Modified:
trunk/data/qcsrc/server/miscfunctions.qc
trunk/data/qcsrc/server/race.qc
trunk/data/qcsrc/server/t_jumppads.qc
trunk/data/qcsrc/server/t_teleporters.qc
Log:
exact triggers: jumppads, teleporters and race checkpoints now work EXACTLY as
made in the map editor (not as bbox any more). This change might be desirable
on other entity types too.
Usage:
- In the spawn functions, call EXACTTRIGGER_INIT; instead of InitTrigger();
- In the touch function, first do the classname checks, then call EXACTTRIGGER_TOUCH;
(this will abort the touch function if it is a bad touch)
Modified: trunk/data/qcsrc/server/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/server/miscfunctions.qc 2008-08-22 08:02:39 UTC (rev 4141)
+++ trunk/data/qcsrc/server/miscfunctions.qc 2008-08-22 11:01:02 UTC (rev 4142)
@@ -1140,20 +1140,48 @@
}
}
-#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) \
- entity varname; \
- varname = msg_entity; \
- FOR_EACH_REALCLIENT(msg_entity) \
- if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) \
- statement \
- msg_entity = varname
-#define WRITESPECTATABLE_MSG_ONE(statement) \
- WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
-#define WRITESPECTATABLE(msg,statement) \
- if(msg == MSG_ONE) \
- { \
- WRITESPECTATABLE_MSG_ONE(statement); \
- } \
- else \
- statement \
- float WRITESPECTATABLE_workaround = 0
+// sorry, but using \ in macros breaks line numbers
+#define WRITESPECTATABLE_MSG_ONE_VARNAME(varname,statement) entity varname; varname = msg_entity; FOR_EACH_REALCLIENT(msg_entity) if(msg_entity == varname || (msg_entity.classname == STR_SPECTATOR && msg_entity.enemy == varname)) statement msg_entity = varname
+#define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
+#define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
+
+vector ExactTriggerHit_mins;
+vector ExactTriggerHit_maxs;
+float ExactTriggerHit_Recurse()
+{
+ float s;
+ entity se;
+ float f;
+
+ tracebox('0 0 0', ExactTriggerHit_mins, ExactTriggerHit_maxs, '0 0 0', MOVE_NORMAL, world);
+ if not(trace_ent)
+ return 0;
+ if(trace_ent == self)
+ return 1;
+
+ se = trace_ent;
+ s = se.solid;
+ se.solid = SOLID_NOT;
+ f = ExactTriggerHit_Recurse();
+ se.solid = s;
+
+ return f;
+}
+
+float ExactTriggerHit()
+{
+ float f, s;
+
+ s = self.solid;
+ self.solid = SOLID_BSP;
+ ExactTriggerHit_mins = other.absmin + '1 1 1';
+ ExactTriggerHit_maxs = other.absmax - '1 1 1';
+ f = ExactTriggerHit_Recurse();
+ self.solid = s;
+
+ return f;
+}
+
+// WARNING: this kills the trace globals
+#define EXACTTRIGGER_TOUCH if not(ExactTriggerHit()) return
+#define EXACTTRIGGER_INIT InitSolidBSPTrigger(); self.solid = SOLID_TRIGGER
Modified: trunk/data/qcsrc/server/race.qc
===================================================================
--- trunk/data/qcsrc/server/race.qc 2008-08-22 08:02:39 UTC (rev 4141)
+++ trunk/data/qcsrc/server/race.qc 2008-08-22 11:01:02 UTC (rev 4142)
@@ -275,11 +275,37 @@
});
}
+void dumpsurface(entity e)
+{
+ float n, si, ni;
+ vector norm, vec;
+ print("Surfaces of ", etos(e), ":\n");
+
+ print("TEST = ", ftos(getsurfacenearpoint(e, '0 0 0')), "\n");
+
+ for(si = 0; ; ++si)
+ {
+ n = getsurfacenumpoints(e, si);
+ if(n <= 0)
+ break;
+ print(" Surface ", ftos(si), ":\n");
+ norm = getsurfacenormal(e, si);
+ print(" Normal = ", vtos(norm), "\n");
+ for(ni = 0; ni < n; ++ni)
+ {
+ vec = getsurfacepoint(e, si, ni);
+ print(" Point ", ftos(ni), " = ", vtos(vec), " (", ftos(norm * vec), ")\n");
+ }
+ }
+}
+
void checkpoint_touch()
{
if(other.classname != "player")
return;
+ EXACTTRIGGER_TOUCH;
+
if(other.race_checkpoint == -1 || other.race_checkpoint == self.race_checkpoint)
{
other.race_checkpoint = race_NextCheckpoint(self.race_checkpoint);
@@ -327,7 +353,9 @@
remove(self);
return;
}
- InitTrigger();
+
+ EXACTTRIGGER_INIT;
+
self.use = checkpoint_use;
if not(self.spawnflags & 1)
self.touch = checkpoint_touch;
Modified: trunk/data/qcsrc/server/t_jumppads.qc
===================================================================
--- trunk/data/qcsrc/server/t_jumppads.qc 2008-08-22 08:02:39 UTC (rev 4141)
+++ trunk/data/qcsrc/server/t_jumppads.qc 2008-08-22 11:01:02 UTC (rev 4142)
@@ -120,6 +120,8 @@
if (other.deadflag && other.classname == "player")
return;
+ EXACTTRIGGER_TOUCH;
+
if(self.target)
self.movedir = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
@@ -239,7 +241,7 @@
if (self.angles != '0 0 0')
SetMovedir ();
- InitTrigger();
+ EXACTTRIGGER_INIT;
self.touch = trigger_push_touch;
Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc 2008-08-22 08:02:39 UTC (rev 4141)
+++ trunk/data/qcsrc/server/t_teleporters.qc 2008-08-22 11:01:02 UTC (rev 4142)
@@ -8,6 +8,8 @@
if (!other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too
return;
+ EXACTTRIGGER_TOUCH;
+
sound (other, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
pointparticles(particleeffectnum("teleport"), other.origin, '0 0 0', 1);
@@ -125,7 +127,7 @@
{
self.angles = '0 0 0';
- InitTrigger();
+ EXACTTRIGGER_INIT;
self.think = teleport_findtarget;
self.nextthink = time + 0.2;
More information about the nexuiz-commits
mailing list