X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fwarpzonelib%2Fcommon.qc;h=48f20982e7e53fca4f29d39e8b0698a62a0b22d4;hp=1c3835afa35235a51d9a88e47ef5d7b749038c0a;hb=ed8788b2cfc2099073b7dd4e25fe245524d3a87b;hpb=a5dcc1361726a5d7fcb73407d716e3201d4e764c diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 1c3835afa3..48f20982e7 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -1,5 +1,5 @@ float trace_dphitcontents; -.float dphitcontents; +.float dphitcontentsmask; void WarpZone_Accumulator_Clear(entity acc) { @@ -28,6 +28,11 @@ var float autocvar_cl_warpzone_usetrace = 1; vector WarpZone_camera_transform(vector org, vector ang) { vector vf, vr, vu; + if(self.warpzone_fadestart) + if(vlen(org - self.origin - 0.5 * (self.mins + self.maxs)) > self.warpzone_fadeend + 400) + return org; + // don't transform if zone faded out (plus 400qu safety margin for typical speeds and latencies) + // unneeded on client, on server this helps a lot vf = v_forward; vr = v_right; vu = v_up; @@ -61,6 +66,11 @@ void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, ve vector WarpZone_Camera_camera_transform(vector org, vector ang) { // a fixed camera view + if(self.warpzone_fadestart) + if(vlen(org - self.origin - 0.5 * (self.mins + self.maxs)) > self.warpzone_fadeend + 400) + return org; + // don't transform if zone faded out (plus 400qu safety margin for typical speeds and latencies) + // unneeded on client, on server this helps a lot trace_endpos = self.warpzone_origin; makevectors(self.warpzone_angles); return self.warpzone_origin; @@ -113,7 +123,7 @@ float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig) { float f, s; - if not(e.modelindex) + if(!e.modelindex || e.warpzone_isboxy) return 1; s = e.solid; @@ -132,6 +142,8 @@ entity WarpZone_Find(vector mi, vector ma) { // if we are near any warpzone planes - MOVE AWAY (work around nearclip) entity e; + if(!warpzone_warpzones_exist) + return world; for(e = world; (e = find(e, classname, "trigger_warpzone")); ) if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world)) return e; @@ -141,6 +153,8 @@ entity WarpZone_Find(vector mi, vector ma) void WarpZone_MakeAllSolid() { entity e; + if(!warpzone_warpzones_exist) + return; for(e = world; (e = find(e, classname, "trigger_warpzone")); ) e.solid = SOLID_BSP; } @@ -148,6 +162,8 @@ void WarpZone_MakeAllSolid() void WarpZone_MakeAllOther() { entity e; + if(!warpzone_warpzones_exist) + return; for(e = world; (e = find(e, classname, "trigger_warpzone")); ) e.solid = SOLID_TRIGGER; } @@ -174,6 +190,28 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, vector o0, e0; entity wz; vector vf, vr, vu; + + WarpZone_trace_firstzone = world; + WarpZone_Trace_InitTransform(); + if(!warpzone_warpzones_exist) + { + if(nomonsters == MOVE_NOTHING) + { + trace_endpos = end; + trace_fraction = 1; + if(cb) + cb(org, trace_endpos, end); + return; + } + else + { + tracebox(org, mi, ma, end, nomonsters, forent); + if(cb) + cb(org, trace_endpos, end); + return; + } + } + vf = v_forward; vr = v_right; vu = v_up; @@ -193,11 +231,11 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID)))) forent.dphitcontentsmask |= DPCONTENTS_SOLID; - WarpZone_Trace_InitTransform(); // if starting in warpzone, first transform wz = WarpZone_Find(org + mi, org + ma); if(wz) { + WarpZone_trace_firstzone = wz; if(zone && wz != zone) { // we are in ANOTHER warpzone. This is bad. Make a zero length trace and return. @@ -207,7 +245,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, goto fail; } WarpZone_Trace_AddTransform(wz); - org = WarpZone_TransformOrigin(wz, trace_endpos); + org = WarpZone_TransformOrigin(wz, org); end = WarpZone_TransformOrigin(wz, end); } WarpZone_MakeAllSolid(); @@ -245,11 +283,13 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, } if(trace_ent == wz) { + // FIXME can this check be removed? Do we really need it? dprint("I transformed into the same zone again, wtf, aborting the trace\n"); trace_ent = world; break; } wz = trace_ent; + WarpZone_trace_firstzone = wz; if(zone && wz != zone) break; WarpZone_Trace_AddTransform(wz); @@ -283,17 +323,34 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo vector vf, vr, vu, v0, o0; entity wz; - vf = v_forward; - vr = v_right; - vu = v_up; o0 = e.origin; v0 = e.velocity; WarpZone_Trace_InitTransform(); + WarpZone_trace_firstzone = world; + WarpZone_tracetoss_time = 0; + if(!warpzone_warpzones_exist) + { + tracetoss(e, forent); + if(cb) + cb(e.origin, trace_endpos, trace_endpos); + dt = vlen(e.origin - o0) / vlen(e.velocity); + WarpZone_tracetoss_time += dt; + e.velocity_z -= dt * g; + WarpZone_tracetoss_velocity = e.velocity; + e.velocity = v0; + return; + } + + vf = v_forward; + vr = v_right; + vu = v_up; + // if starting in warpzone, first transform wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs); if(wz) { + WarpZone_trace_firstzone = wz; if(zone && wz != zone) { // we are in ANOTHER warpzone. This is bad. Make a zero length trace and return. @@ -308,7 +365,6 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo } WarpZone_MakeAllSolid(); g = cvar("sv_gravity") * e.gravity; - WarpZone_tracetoss_time = 0; i = 16; for(;;) { @@ -322,20 +378,22 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo if(cb) cb(e.origin, trace_endpos, trace_endpos); e.origin = trace_endpos; - e.velocity_z -= WarpZone_tracetoss_time * g; dt = vlen(e.origin - o0) / vlen(e.velocity); WarpZone_tracetoss_time += dt; + e.velocity_z -= dt * g; if(trace_fraction >= 1) break; if(trace_ent.classname != "trigger_warpzone") break; if(trace_ent == wz) { + // FIXME can this check be removed? Do we really need it? dprint("I transformed into the same zone again, wtf, aborting the trace\n"); trace_ent = world; break; } wz = trace_ent; + WarpZone_trace_firstzone = wz; if(zone && wz != zone) break; WarpZone_Trace_AddTransform(wz); @@ -373,6 +431,24 @@ void WarpZone_TrailParticles(entity own, float eff, vector org, vector end) WarpZone_TraceBox_ThroughZone(org, '0 0 0', '0 0 0', end, MOVE_NOMONSTERS, world, world, WarpZone_TrailParticles_trace_callback); } +#ifdef CSQC +float WarpZone_TrailParticles_trace_callback_f; +float WarpZone_TrailParticles_trace_callback_flags; +void WarpZone_TrailParticles_WithMultiplier_trace_callback(vector from, vector endpos, vector to) +{ + boxparticles(WarpZone_TrailParticles_trace_callback_eff, WarpZone_TrailParticles_trace_callback_own, from, endpos, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_f, WarpZone_TrailParticles_trace_callback_flags); +} + +void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, float boxflags) +{ + WarpZone_TrailParticles_trace_callback_own = own; + WarpZone_TrailParticles_trace_callback_eff = eff; + WarpZone_TrailParticles_trace_callback_f = f; + WarpZone_TrailParticles_trace_callback_flags = boxflags; + WarpZone_TraceBox_ThroughZone(org, '0 0 0', '0 0 0', end, MOVE_NOMONSTERS, world, world, WarpZone_TrailParticles_WithMultiplier_trace_callback); +} +#endif + float WarpZone_PlaneDist(entity wz, vector v) { return (v - wz.warpzone_origin) * wz.warpzone_forward;