- if(self.BUTTON_DRAG)
- IS_CHEAT(0, 0, CHRAME_DRAG);
- crosshair_trace_plusvisibletriggers(self);
- if(Drag(trace_ent))
- DID_CHEAT();
+ if(self.maycheat || (gamestart_sv_cheats && autocvar_sv_cheats))
+ {
+ // use cheat dragging if cheats are enabled
+ crosshair_trace_plusvisibletriggers(self);
+ Drag(trace_ent, TRUE, TRUE);
+ }
+ else
+ {
+ // drag 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.
+
+ float drag;
+ crosshair_trace_plusvisibletriggers(self);
+ if(vlen(self.origin - trace_ent.origin) <= autocvar_g_grab_range)
+ {
+ switch(trace_ent.grab)
+ {
+ case 0: // can't grab
+ break;
+ case 1: // owner can grab
+ if(trace_ent.owner == self || trace_ent.realowner == self)
+ drag = TRUE;
+ break;
+ case 2: // owner and team mates can grab
+ if(!IsDifferentTeam(trace_ent.owner, self) || !IsDifferentTeam(trace_ent.realowner, self) || trace_ent.team == self.team)
+ drag = TRUE;
+ break;
+ case 3: // anyone can grab
+ drag = TRUE;
+ break;
+ default:
+ break;
+ }
+ }
+ Drag(trace_ent, drag, FALSE); // execute dragging
+ }