X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fmutators%2Fsandbox.qc;h=28017401af9033b3bf5d24f813f7870699d041de;hp=685425102672b1597bff062b5ccb826a6ab74a82;hb=a86fa5a48ac75276db3da34fd3721678517c62fa;hpb=3325259280ed3bbbce03c353377551363f000949 diff --git a/qcsrc/server/mutators/sandbox.qc b/qcsrc/server/mutators/sandbox.qc index 6854251026..28017401af 100644 --- a/qcsrc/server/mutators/sandbox.qc +++ b/qcsrc/server/mutators/sandbox.qc @@ -86,7 +86,7 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerCommand) { makevectors(self.v_angle); WarpZone_TraceLine(self.origin + self.view_ofs, self.origin + self.view_ofs + v_forward * autocvar_g_sandbox_editor_distance_edit, MOVE_NORMAL, self); - if(trace_ent.classname == "object") + if(trace_ent.classname == "object" && trace_ent.realowner == self) { if(autocvar_g_sandbox_info) print(strcat(self.netname, " removed an object at origin ", vtos(trace_ent.origin), "\n")); @@ -107,13 +107,21 @@ MUTATOR_HOOKFUNCTION(sandbox_PlayerPreThink) // if the player is close enough to their own object and facing it, they can grab it if(autocvar_sv_cheats) - return FALSE; // cheats already allow dragging all objects + return FALSE; // cheat dragging is used instead + float grab; crosshair_trace_plusvisibletriggers(self); - if(trace_ent.classname == "object") - if(Drag(trace_ent, autocvar_g_sandbox_editor_distance_edit)) // execute the dragging - if(autocvar_g_sandbox_info) - print(strcat(self.netname, " grabbed an object at origin ", vtos(trace_ent.origin), "\n")); + + // grab is TRUE if the object can be picked up. While an object is being carried, the Drag() function + // must execute for it either way, otherwise it would cause bugs if it went out of the player's trace. + // This also makes sure that an object can only pe picked up if in range, but does not get dropped if it goes + // out of range while slinging it around. + + if(trace_ent.classname == "object" && trace_ent.realowner == self && vlen(trace_ent.origin - self.origin) <= autocvar_g_sandbox_editor_distance_edit) + grab = TRUE; // object can be picked up + if(Drag(trace_ent, grab)) // execute dragging + if(autocvar_g_sandbox_info) + print(strcat(self.netname, " grabbed an object at origin ", vtos(trace_ent.origin), "\n")); return FALSE; }