{
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"));
// 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;
}