/*--------------------------------------------------------- Starts up the ghost entity The most important part of this is making sure it gets deleted properly ---------------------------------------------------------*/ function ToolObj:MakeGhostEntity( model, pos, angle ) util.PrecacheModel( model ) // We do ghosting serverside in single player // It's done clientside in multiplayer if (SERVER && !SinglePlayer()) then return end if (CLIENT && SinglePlayer()) then return end // Release the old ghost entity self:ReleaseGhostEntity() // Don't allow ragdolls/effects to be ghosts if (!util.IsValidProp( model )) then return end self.GhostEntity = ents.Create( "prop_physics" ) // If there's too many entities we might not spawn.. if (!self.GhostEntity:IsValid()) then self.GhostEntity = nil return end self.GhostEntity:SetModel( model ) self.GhostEntity:SetPos( pos ) self.GhostEntity:SetAngles( angle ) self.GhostEntity:Spawn() self.GhostEntity:SetSolid( SOLID_VPHYSICS ); self.GhostEntity:SetMoveType( MOVETYPE_NONE ) self.GhostEntity:SetNotSolid( true ); self.GhostEntity:SetRenderMode( RENDERMODE_TRANSALPHA ) self.GhostEntity:SetColor( 255, 255, 255, 150 ) end /*--------------------------------------------------------- Starts up the ghost entity The most important part of this is making sure it gets deleted properly ---------------------------------------------------------*/ function ToolObj:StartGhostEntity( ent ) // We can't ghost ragdolls because it looks like ass local class = ent:GetClass() // We do ghosting serverside in single player // It's done clientside in multiplayer if (SERVER && !SinglePlayer()) then return end if (CLIENT && SinglePlayer()) then return end self:MakeGhostEntity( ent:GetModel(), ent:GetPos(), ent:GetAngles() ) end /*--------------------------------------------------------- Releases up the ghost entity ---------------------------------------------------------*/ function ToolObj:ReleaseGhostEntity() if ( self.GhostEntity ) then if (!self.GhostEntity:IsValid()) then self.GhostEntity = nil return end self.GhostEntity:Remove() self.GhostEntity = nil end if ( self.GhostEntities ) then for k,v in pairs( self.GhostEntities ) do if ( v:IsValid() ) then v:Remove() end self.GhostEntities[k] = nil end self.GhostEntities = nil end if ( self.GhostOffset ) then for k,v in pairs( self.GhostOffset ) do self.GhostOffset[k] = nil end end end /*--------------------------------------------------------- Update the ghost entity ---------------------------------------------------------*/ function ToolObj:UpdateGhostEntity() if (self.GhostEntity == nil) then return end if (!self.GhostEntity:IsValid()) then self.GhostEntity = nil return end local tr = utilx.GetPlayerTrace( self:GetOwner(), self:GetOwner():GetCursorAimVector() ) local trace = util.TraceLine( tr ) if (!trace.Hit) then return end local Ang1, Ang2 = self:GetNormal(1):Angle(), (trace.HitNormal * -1):Angle() local TargetAngle = self:GetEnt(1):AlignAngles( Ang1, Ang2 ) self.GhostEntity:SetPos( self:GetEnt(1):GetPos() ) self.GhostEntity:SetAngles( TargetAngle ) local TranslatedPos = self.GhostEntity:LocalToWorld( self:GetLocalPos(1) ) local TargetPos = trace.HitPos + (self:GetEnt(1):GetPos() - TranslatedPos) + (trace.HitNormal) self.GhostEntity:SetPos( TargetPos ) end