From a91d8aa9182040a51f90c7d98cdac185c94080d2 Mon Sep 17 00:00:00 2001 From: div0 Date: Sat, 19 Jul 2008 14:57:11 +0000 Subject: [PATCH] add a rule for impulse 911 to not spawn above trigger_hurt entities git-svn-id: svn://svn.icculus.org/nexuiz/trunk@3845 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/cl_impulse.qc | 7 ++++ data/qcsrc/server/defs.qh | 1 + data/qcsrc/server/g_triggers.qc | 70 +++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/data/qcsrc/server/cl_impulse.qc b/data/qcsrc/server/cl_impulse.qc index 2c0169ad6..c79cf9c90 100644 --- a/data/qcsrc/server/cl_impulse.qc +++ b/data/qcsrc/server/cl_impulse.qc @@ -299,6 +299,13 @@ void ImpulseCommands (void) if(trace_fraction * delta_z > 1024) start = trace_endpos + '0 0 1024'; + // rule 3: we must not end up in trigger_hurt + if(tracebox_hits_trigger_hurt(start, self.mins, self.maxs, trace_endpos)) + { + dprint("trigger_hurt! ouch!\n"); + continue; + } + // these can be traceLINES as we already verified the starting box traceline(start, start + '1 0 0' * delta_x, MOVE_NORMAL, self); if(trace_fraction >= 1) diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 0dbc23f65..69d3a6b8c 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -438,6 +438,7 @@ float sv_maxidle_spectatorsareidle; float sv_pogostick; float sv_doublejump; +float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end); float next_pingtime; diff --git a/data/qcsrc/server/g_triggers.qc b/data/qcsrc/server/g_triggers.qc index f67ecb8ee..877570f75 100644 --- a/data/qcsrc/server/g_triggers.qc +++ b/data/qcsrc/server/g_triggers.qc @@ -378,6 +378,9 @@ Any object touching this will be hurt set dmg to damage amount defalt dmg = 5 */ +.entity trigger_hurt_next; +entity trigger_hurt_last; +entity trigger_hurt_first; void spawnfunc_trigger_hurt() { InitTrigger (); @@ -386,8 +389,75 @@ void spawnfunc_trigger_hurt() self.dmg = 1000; if (!self.message) self.message = "was in the wrong place."; + + if(!trigger_hurt_first) + trigger_hurt_first = self; + if(trigger_hurt_last) + trigger_hurt_last.trigger_hurt_next = self; + trigger_hurt_last = self; }; +float trace_hits_box_a0, trace_hits_box_a1; + +float trace_hits_box_1d(float end, float thmi, float thma) +{ + if(end == 0) + { + // just check if x is in range + if(0 < thmi) + return FALSE; + if(0 > thma) + return FALSE; + } + else + { + // do the trace with respect to x + // 0 -> end has to stay in thmi -> thma + trace_hits_box_a0 = max(trace_hits_box_a0, min(thmi / end, thma / end)); + trace_hits_box_a1 = min(trace_hits_box_a1, max(thmi / end, thma / end)); + if(trace_hits_box_a0 > trace_hits_box_a1) + return FALSE; + } + return TRUE; +} + +float trace_hits_box(vector start, vector end, vector thmi, vector thma) +{ + end -= start; + thmi -= start; + thma -= start; + // now it is a trace from 0 to end + + trace_hits_box_a0 = 0; + trace_hits_box_a1 = 1; + + if(!trace_hits_box_1d(end_x, thmi_x, thma_x)) + return FALSE; + if(!trace_hits_box_1d(end_y, thmi_y, thma_y)) + return FALSE; + if(!trace_hits_box_1d(end_z, thmi_z, thma_z)) + return FALSE; + + return TRUE; +} + +float tracebox_hits_box(vector start, vector mi, vector ma, vector end, vector thmi, vector thma) +{ + return trace_hits_box(start, end, thmi - ma, thma - mi); +} + +float tracebox_hits_trigger_hurt(vector start, vector mi, vector ma, vector end) +{ + entity th; + + for(th = trigger_hurt_first; th; th = th.trigger_hurt_next) + if(tracebox_hits_box(start, mi, ma, end, th.absmin, th.absmax)) + return TRUE; + + return FALSE; +} + + void target_speaker_use() {sound(self, CHAN_VOICE, self.noise, 1, 1);} void spawnfunc_target_speaker() -- 2.39.2