/*--------------------------------------------------------- Sets which stage a tool is at ---------------------------------------------------------*/ function ToolObj:UpdateData() self:SetStage( self:NumObjects() ) end /*--------------------------------------------------------- Sets which stage a tool is at ---------------------------------------------------------*/ function ToolObj:SetStage( i ) if ( SERVER ) then self:GetWeapon():SetNWInt( "Stage", i, true ) end end /*--------------------------------------------------------- Gets which stage a tool is at ---------------------------------------------------------*/ function ToolObj:GetStage() return self:GetWeapon():GetNWInt( "Stage", 0 ) end /*--------------------------------------------------------- ClearObjects - clear the selected objects ---------------------------------------------------------*/ function ToolObj:ClearObjects() self:ReleaseGhostEntity() self.Objects = {} self:SetStage( 0 ) end /*--------------------------------------------------------- Since we're going to be expanding this a lot I've tried to add accessors for all of this crap to make it harder for us to mess everything up. ---------------------------------------------------------*/ function ToolObj:GetEnt( i ) if (!self.Objects[i]) then return NULL end return self.Objects[i].Ent end /*--------------------------------------------------------- Returns the world position of the numbered object hit We store it as a local vector then convert it to world That way even if the object moves it's still valid ---------------------------------------------------------*/ function ToolObj:GetPos( i ) if (self.Objects[i].Ent:EntIndex() == 0) then return self.Objects[i].Pos else if (self.Objects[i].Phys ~= nil && self.Objects[i].Phys:IsValid()) then return self.Objects[i].Phys:LocalToWorld(self.Objects[i].Pos) else return self.Objects[i].Ent:LocalToWorld(self.Objects[i].Pos) end end end /*--------------------------------------------------------- Returns the local position of the numbered hit ---------------------------------------------------------*/ function ToolObj:GetLocalPos( i ) return self.Objects[i].Pos end /*--------------------------------------------------------- Returns the physics bone number of the hit (ragdolls) ---------------------------------------------------------*/ function ToolObj:GetBone( i ) return self.Objects[i].Bone end function ToolObj:GetNormal( i ) if (self.Objects[i].Ent:EntIndex() == 0) then return self.Objects[i].Normal else local norm if (self.Objects[i].Phys ~= nil && self.Objects[i].Phys:IsValid()) then norm = self.Objects[i].Phys:LocalToWorld(self.Objects[i].Normal) else norm = self.Objects[i].Ent:LocalToWorld(self.Objects[i].Normal) end return norm - self:GetPos(i) end end /*--------------------------------------------------------- Returns the physics object for the numbered hit ---------------------------------------------------------*/ function ToolObj:GetPhys( i ) if (self.Objects[i].Phys == nil) then return self:GetEnt(i):GetPhysicsObject() end return self.Objects[i].Phys end /*--------------------------------------------------------- Sets a selected object ---------------------------------------------------------*/ function ToolObj:SetObject( i, ent, pos, phys, bone, norm ) self.Objects[i] = {} self.Objects[i].Ent = ent self.Objects[i].Phys = phys self.Objects[i].Bone = bone self.Objects[i].Normal = norm // Worldspawn is a special case if (ent:EntIndex() == 0) then self.Objects[i].Phys = nil self.Objects[i].Pos = pos else norm = norm + pos // Convert the position to a local position - so it's still valid when the object moves if (phys != nil && phys:IsValid()) then self.Objects[i].Normal = self.Objects[i].Phys:WorldToLocal(norm) self.Objects[i].Pos = self.Objects[i].Phys:WorldToLocal(pos) else self.Objects[i].Normal = self.Objects[i].Ent:WorldToLocal(norm) self.Objects[i].Pos = self.Objects[i].Ent:WorldToLocal(pos) end end if (SERVER) then // Todo: Make sure the client got the same info end end /*--------------------------------------------------------- Returns the number of objects in the list ---------------------------------------------------------*/ function ToolObj:NumObjects() if ( CLIENT ) then return self:GetStage() end return #self.Objects end