]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/atheros/item_keys'
authorRudolf Polzer <divverent@xonotic.org>
Mon, 24 Oct 2011 09:54:50 +0000 (11:54 +0200)
committerRudolf Polzer <divverent@xonotic.org>
Mon, 24 Oct 2011 09:54:50 +0000 (11:54 +0200)
17 files changed:
defaultXonotic.cfg
qcsrc/menu/xonotic/dialog_settings_video.c
qcsrc/server/cl_client.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_subs.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/gamemode_keepaway.qc
qcsrc/server/tturrets/units/unit_tessla.qc
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/server/w_common.qc
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh

index f92882f4424da8b0ca0f2693e7be3a64e0916e95..26ac83fd068ab88e24c7041d41d62f9d9e4a446f 100644 (file)
@@ -53,8 +53,6 @@ alias asay_drop "say_team (%l) dropped %w ; impulse 17"
 alias +hook +button6
 alias -hook -button6
 alias use "impulse 21"
-alias +use use // always send that impulse AND press the key (+use is engine internal command and executes anyway)
-set cl_newusekeysupported 1 // indicates that we always send the use impulse too, so they do not need to be synthesized
 alias ready "cmd ready"
 alias lockteams "sv_cmd lockteams"
 alias unlockteams "sv_cmd unlockteams"
@@ -1040,7 +1038,7 @@ bind MWHEELDOWN weapprev
 bind r reload
 bind BACKSPACE dropweapon
 bind g dropweapon
-bind f use
+bind f +use
 
 // misc
 bind e +hook
@@ -1712,6 +1710,7 @@ seta hud_width 560
 prvm_leaktest_ignore_classnames "ctf_team dom_team tdm_team"
 
 sv_allowdownloads_inarchive 1 // for csprogs.dat
+sv_allowdownloads 0 // download protocol is evil
 
 set g_jump_grunt 0     "Do you make a grunting noise every time you jump? Is it the same grunting noise every time?"
 
@@ -1756,6 +1755,8 @@ set cl_handicap 1 "the higher, the more damage you will receive (client setting)
 
 seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice." 
 
+seta cl_autoscreenshot 0 "client option to automatically take a screenshot once the map has ended (see also sv_autoscreenshot)"
+
 // must be at the bottom of this file:
 // alias for switching the teamselect menu
 alias menu_showteamselect "menu_cmd directmenu TeamSelect"
index 79ad3eefe7db6100c9236209f14fd303343bc1d5..e5f5da237bc73be61dc3e2ab264bece41d243758 100644 (file)
@@ -65,11 +65,11 @@ void XonoticVideoSettingsTab_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "0", _("None")));
-               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "1", _("8bpp")));
+               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "1", _("8bit")));
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "2", _("16bpp HDR")));
-               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "3", _("32bpp HDR")));
+               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "2", _("16bit HDR")));
+               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "r_viewfbo", "3", _("32bit HDR")));
        me.TR(me);
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Depth first:")));
index 9e8539039a307c496a449ca8cac4365f34a45a36..de4c7431d5aafad3db68fe68f1da5e7ad5208070 100644 (file)
@@ -2780,7 +2780,7 @@ void PlayerPreThink (void)
 
        MUTATOR_CALLHOOK(PlayerPreThink);
 
-       if(!self.cvar_cl_newusekeysupported)
+       if(!self.cvar_cl_newusekeysupported) // FIXME remove this - it was a stupid idea to begin with, we can JUST use the button
        {
                if(self.BUTTON_USE && !self.usekeypressed)
                        PlayerUseKey();
index 2f81b83dc7418c49dec4fce818a933cff781ee67..b84d03164d312d8c2b3b410bb8c86a602bb1fca0 100644 (file)
@@ -321,6 +321,7 @@ float default_weapon_alpha;
 .float cvar_cl_handicap;
 .float cvar_cl_playerdetailreduction;
 .float cvar_cl_clippedspectating;
+.float cvar_cl_autoscreenshot;
 .float cvar_cl_movement_track_canjump;
 .float cvar_cl_newusekeysupported;
 
index 5a583fc15ad101f07180877866f28641c5247c07..d7d2287ed6b093a23b63092caccfb496258af825 100644 (file)
@@ -329,7 +329,7 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
                }
                else if (attacker.classname == "player")
                {
-                       if(teamplay && attacker.team == targ.team)
+                       if(!IsDifferentTeam(attacker, targ))
                        {
                                if(attacker.team == COLOR_TEAM1)
                                        type = KILL_TEAM_RED;
@@ -561,7 +561,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                damage = 0;
                                force = '0 0 0';
                        }
-                       else if(teamplay && attacker.team == targ.team)
+                       else if(!IsDifferentTeam(attacker, targ))
                        {
                                if(autocvar_teamplay_mode == 1)
                                        damage = 0;
index e9f9b3454e18ef0151812464e7ce7aabecabf6b9..a908353a4c93b1c5a3116285cb2764c44e429f38 100644 (file)
@@ -389,12 +389,14 @@ void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma,
        if (lag)
        {
                // take players back into the past
-               player = player_list;
-               while (player)
-               {
-                       antilag_takeback(player, time - lag);
-                       player = player.nextplayer;
-               }
+               FOR_EACH_PLAYER(player)
+                       if(player != forent)
+                       {
+                           antilag_takeback(player, time - lag);
+                           if(player.vehicle)
+                    antilag_takeback(player.vehicle, time - lag);
+                       }
+                               
        }
 
        // do the trace
@@ -406,12 +408,14 @@ void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma,
        // restore players to current positions
        if (lag)
        {
-               player = player_list;
-               while (player)
-               {
-                       antilag_restore(player);
-                       player = player.nextplayer;
-               }
+               FOR_EACH_PLAYER(player)
+                       if(player != forent)
+                       {
+                           antilag_restore(player);
+                           if(player.vehicle)
+                    antilag_restore(player.vehicle);
+                       }
+                               
        }
 
        // restore shooter solid type
index b134886d4f6fcfc54281c1af591fb028650650c8..6d60fd8c0b4a88fb7c200c86f0067871bd094a58 100644 (file)
@@ -1345,9 +1345,8 @@ void IntermissionThink()
 {
        FixIntermissionClient(self);
 
-       if(autocvar_sv_autoscreenshot)
-       if(self.autoscreenshot > 0)
-       if(time > self.autoscreenshot)
+       if( (autocvar_sv_autoscreenshot || self.cvar_cl_autoscreenshot)
+               && ((self.autoscreenshot > 0) && (time > self.autoscreenshot)) )
        {
                self.autoscreenshot = -1;
                if(clienttype(self) == CLIENTTYPE_REAL)
@@ -2853,6 +2852,8 @@ void EndFrame()
                self.hitsound = FALSE;
                self.typehitsound = FALSE;
                antilag_record(self, altime);
+               if(self.vehicle)
+            antilag_record(self.vehicle, altime);
        }
 }
 
index 27c04f8a4d02499a2549a81c9aedec74ec53958e..7e675922833eb1107ffacfdcfedeb3c4269be048 100644 (file)
@@ -583,6 +583,7 @@ void GetCvars(float f)
        get_cvars_s = s;
        MUTATOR_CALLHOOK(GetCvars);
        GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
+       GetCvars_handleFloat(s, f, cvar_cl_autoscreenshot, "cl_autoscreenshot");
        GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
        GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
        GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
index 8d3511eceda0750e74266d5649133b69f9c15e84..9134353e015574860dc4478938633ba80e3a56ec 100644 (file)
@@ -3,6 +3,7 @@ void ka_TouchEvent(void);
 void ka_RespawnBall(void);
 void ka_DropEvent(entity);
 void ka_TimeScoring(void);
+void ka_EventLog(string, entity);
 
 entity ka_ball;
 
@@ -125,6 +126,7 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        other.effects |= autocvar_g_keepaway_ballcarrier_effects;
        
        // messages and sounds
+       ka_EventLog("pickup", other);
        Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
        WriteString(MSG_BROADCAST, strcat(other.netname, "^7 has picked up the ball!"));
@@ -167,6 +169,7 @@ void ka_DropEvent(entity plyr) // runs any time that a player is supposed to los
        plyr.effects &~= autocvar_g_keepaway_ballcarrier_effects;
 
        // messages and sounds
+       ka_EventLog("dropped", plyr);
        Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
        WriteString(MSG_BROADCAST, strcat(plyr.netname, "^7 has dropped the ball!"));
@@ -205,6 +208,12 @@ void ka_TimeScoring()
        }
 }
 
+void ka_EventLog(string mode, entity actor) // use an alias for easy changing and quick editing later
+{
+       if(autocvar_sv_eventlog)
+               GameLogEcho(strcat(":ka:", mode, ((actor != world) ? (strcat(":", ftos(actor.playerid))) : "")));
+}
+
 MUTATOR_HOOKFUNCTION(ka_Scoring)
 {
        if((frag_attacker != frag_target) && (frag_attacker.classname == "player"))
index 454557010d11f8b3328aa8a5381e5ad11cdc634b..6c2cce6a73341ad4d3b80fcd25a19233b269b688 100644 (file)
@@ -46,24 +46,45 @@ entity toast(entity from, float range, float damage)
 
 float turret_tesla_firecheck()
 {
-    if not (turret_stdproc_firecheck())
-        return 0;
+    // g_turrets_targetscan_maxdelay forces a target re-scan at least this often
+    float do_target_scan;
+    
+    if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
+        do_target_scan = 1;
+
+    // Old target (if any) invalid?
+    if(self.target_validate_time < time)
+    if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
+    {
+        self.enemy = world;
+        self.target_validate_time = time + 0.5;
+        do_target_scan = 1;
+    }
 
-    self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
+    // But never more often then g_turrets_targetscan_mindelay!
+    if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
+        do_target_scan = 0;
 
-    self.enemy = turret_select_target();
+    if(do_target_scan)
+    {
+        self.enemy = turret_select_target();
+        self.target_select_time = time;
+    }
+
+    if not (turret_stdproc_firecheck())
+        return 0;
 
     if(self.enemy)
         return 1;
 
     return 0;
-
 }
 
+
 void turret_tesla_fire()
 {
-    entity e,t;
-    float d,r,i;
+    entity e, t;
+    float d, r, i;
 
     //w_deathtypestring = "discoverd how a tesla coil works";
 
index e3c74c5e190c864a1d0832834729d2fc4b534979..7595027439bf731bed17c365e38956490f05552a 100644 (file)
@@ -273,10 +273,9 @@ float racer_frame()
         return 1;
     }
 
+    
     racer_align4point();
-
-    crosshair_trace(player);
-
+    vh_crosshair_trace(player);
     racer.angles_x *= -1;
 
     // Yaw
index 201c186c37947d65ad983efd0b4c67c1f0484120..4712777ee8f7db4f31078f9af528fd40bac9e705 100644 (file)
@@ -344,7 +344,7 @@ float raptor_frame()
         player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
         return 1;
     }
-    crosshair_trace(player);
+    vh_crosshair_trace(player);
 
     vector vang;
     vang = raptor.angles;
index f43ec08e52f35f9a792a172a82c6a9da3e4f0093..00e8f3382372f98529bc75ee8b774401217c66e4 100644 (file)
@@ -145,7 +145,7 @@ void spiderbot_rocket_do()
     if not (self.owner.BUTTON_ATCK2)
         return;
 
-    crosshair_trace(self.owner);
+    vh_crosshair_trace(self.owner);
 
     v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
     rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
index c4e2875380486575ed766684f7def98d1053ff28..051a9136ef7a21a3f2e919996f1302a86941b050 100644 (file)
@@ -111,6 +111,40 @@ void CSQCVehicleSetup(entity own, float vehicle_id)
     dont before calling.
 
 **/
+void vh_crosshair_trace(entity player)
+{
+    float lag; 
+    entity pl;
+    
+    lag = ANTILAG_LATENCY(self);
+    if(lag < 0.001)
+        lag = 0;
+    if(clienttype(self) != CLIENTTYPE_REAL)
+        lag = 0;
+    if(autocvar_g_antilag == 0 || self.cvar_cl_noantilag)
+        lag = 0; // only do hitscan, but no antilag
+
+    if(lag)
+        FOR_EACH_PLAYER(pl)
+            if(pl != self)
+            {
+                antilag_takeback(pl, time - lag);
+                if(pl.vehicle)
+                    antilag_takeback(pl.vehicle, time - lag);
+
+            }
+
+    crosshair_trace(player);
+
+    if(lag)
+        FOR_EACH_PLAYER(pl)
+            if(pl != self)
+            {
+                antilag_restore(pl);
+                if(pl.vehicle)
+                    antilag_restore(pl.vehicle);
+            }
+}
 .entity lock_target;
 .float  lock_strength;
 .float  lock_time;
@@ -144,7 +178,7 @@ void vehicles_locktarget(float incr, float decr, float _lock_time)
         if(trace_ent.deadflag != DEAD_NO)
             trace_ent = world;
 
-        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET || trace_ent.classname == "player")
             trace_ent = world;
     }
 
index 08c56121b5c6a110661fe6c6977bc90edee2d992..00a9d2ed09d0a1d5c19ff9d1b1a0709d67534270 100644 (file)
@@ -353,6 +353,8 @@ void fireBallisticBullet_trace_callback(vector start, vector hit, vector end)
 {
        if(vlen(trace_endpos - fireBallisticBullet_trace_callback_ent.origin) > 16)
                zcurveparticles_from_tracetoss(fireBallisticBullet_trace_callback_eff, fireBallisticBullet_trace_callback_ent.origin, trace_endpos, fireBallisticBullet_trace_callback_ent.velocity);
+       WarpZone_trace_forent = world;
+       self.owner = world;
 }
 
 void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
@@ -416,7 +418,14 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
 
                if(lag)
                        FOR_EACH_PLAYER(pl)
-                               antilag_takeback(pl, time - lag);
+                               if(pl != self)
+                               {
+                                   antilag_takeback(pl, time - lag);
+                    if(pl.vehicle)
+                        antilag_takeback(pl.vehicle, time - lag);
+
+                               }
+                                       
 
                oldself = self;
                self = proj;
@@ -438,15 +447,6 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                        trace_fraction = 0;
                        fireBallisticBullet_trace_callback_ent = self;
                        fireBallisticBullet_trace_callback_eff = eff;
-                       // FIXME can we somehow do this with just ONE trace?
-                       WarpZone_TraceToss(self, self.owner);
-                       if(self.owner && WarpZone_trace_firstzone)
-                       {
-                               self.owner = world;
-                               self.velocity = v0;
-                               self.gravity = g0;
-                               continue;
-                       }
                        WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
                        self.velocity = v0;
                        self.gravity = g0;
@@ -503,7 +503,13 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
 
                if(lag)
                        FOR_EACH_PLAYER(pl)
-                               antilag_restore(pl);
+                               if(pl != self)
+                               {
+                                   antilag_restore(pl);
+                                   if(pl.vehicle)
+                        antilag_restore(pl.vehicle);
+                               }
+                                       
 
                remove(proj);
 
index 0f1337d18fb614c447e8efbac9be7d5fc6645040..f09f25bdcd13d320e5b9277da55795865d5c3e88 100644 (file)
@@ -191,6 +191,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        entity wz;
        vector vf, vr, vu;
 
+       WarpZone_trace_forent = forent;
        WarpZone_trace_firstzone = world;
        WarpZone_trace_lastzone = world;
        WarpZone_Trace_InitTransform();
@@ -206,7 +207,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                }
                else
                {
-                       tracebox(org, mi, ma, end, nomonsters, forent);
+                       tracebox(org, mi, ma, end, nomonsters, WarpZone_trace_forent);
                        if(cb)
                                cb(org, trace_endpos, end);
                        return;
@@ -229,8 +230,8 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        nomonsters_adjusted = nomonsters;
                        break;
        }
-       if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
-               BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
+       if((contentshack = (WarpZone_trace_forent.dphitcontentsmask && !(WarpZone_trace_forent.dphitcontentsmask & DPCONTENTS_SOLID))))
+               BITSET_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID);
 
        // if starting in warpzone, first transform
        wz = WarpZone_Find(org + mi, org + ma);
@@ -262,7 +263,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        trace_ent = world;
                        break;
                }
-               tracebox(org, mi, ma, end, nomonsters_adjusted, forent);
+               tracebox(org, mi, ma, end, nomonsters_adjusted, WarpZone_trace_forent);
                if(cb)
                        cb(org, trace_endpos, end);
                if(sol < 0)
@@ -273,7 +274,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        break;
                if(trace_ent.classname != "trigger_warpzone")
                {
-                       if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & forent.dphitcontentsmask) == DPCONTENTS_SOLID))
+                       if((nomonsters == MOVE_NOTHING) || ((nomonsters == MOVE_WORLDONLY) && trace_ent) || (contentshack && (trace_dphitcontents & WarpZone_trace_forent.dphitcontentsmask) == DPCONTENTS_SOLID))
                        {
                                // continue the trace, ignoring this hit (we only care for warpzones)
                                org = trace_endpos + normalize(end - org);
@@ -302,13 +303,13 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                end = WarpZone_TransformOrigin(wz, end);
 
                // we got warped, so let's step back a bit
-               tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, forent);
+               tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, WarpZone_trace_forent);
                org = trace_endpos;
        }
        WarpZone_MakeAllOther();
 :fail
        if(contentshack)
-               BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
+               BITCLR_ASSIGN(WarpZone_trace_forent.dphitcontentsmask, DPCONTENTS_SOLID);
        trace_startsolid = sol;
        v_forward = vf;
        v_right = vr;
@@ -334,13 +335,14 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        o0 = e.origin;
        v0 = e.velocity;
 
+       WarpZone_trace_forent = forent;
        WarpZone_trace_firstzone = world;
        WarpZone_trace_lastzone = world;
        WarpZone_Trace_InitTransform();
        WarpZone_tracetoss_time = 0;
        if(!warpzone_warpzones_exist)
        {
-               tracetoss(e, forent);
+               tracetoss(e, WarpZone_trace_forent);
                if(cb)
                        cb(e.origin, trace_endpos, trace_endpos);
                dt = vlen(e.origin - o0) / vlen(e.velocity);
@@ -384,7 +386,7 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
                        trace_ent = world;
                        break;
                }
-               tracetoss(e, forent);
+               tracetoss(e, WarpZone_trace_forent);
                if(cb)
                        cb(e.origin, trace_endpos, trace_endpos);
                dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
@@ -415,7 +417,7 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
 
                // we got warped, so let's step back a bit
                e.velocity = -e.velocity;
-               tracetoss(e, forent);
+               tracetoss(e, WarpZone_trace_forent);
                dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
                WarpZone_tracetoss_time -= dt;
                e.origin = trace_endpos;
index 1dc12b8cfe97f60bc75d5139bb653a04b1eacf3e..c2f36bea868d8baf7ad06c37294b3b7bb2316a24 100644 (file)
@@ -25,6 +25,7 @@ void WarpZone_MakeAllSolid();
 void WarpZone_MakeAllOther();
 
 #define MOVE_NOTHING -1
+entity WarpZone_trace_forent; // temp, callback is allowed to change it
 typedef void(vector start, vector hit, vector end) WarpZone_trace_callback_t; // called on every elementary trace
 const var WarpZone_trace_callback_t WarpZone_trace_callback_t_null;
 entity WarpZone_trace_transform; // transform accumulator during a trace