• GetPhysicsObject on client
    1 replies, posted
Is there anyway to use [url]http://wiki.garrysmod.com/page/Entity/GetPhysicsObject[/url] on an entity clientside?
Well you could use PhysicsInit on the client object, usually they dont have that by default because the server is managing all that well except clientside ragdolls. Also if you initialize the physics on the client u'll be noticing that they arent synchronized with the server physics just like that, you would need to manually set its position every frame. I used to mess with this stuff a while ago. [lua] ClientsidePhysics = ClientsidePhysics or {} ClientsidePhysics.Active = ClientsidePhysics.Active or {} ClientsidePhysics.Disabled = ClientsidePhysics.Disabled or {} ClientsidePhysics.Whitelist = {} ClientsidePhysics.Whitelist["prop_physics"] = 1 function ClientsidePhysics:Disable(ent) if ent.ClientsidePhysicsTracking then local phys = ent:GetPhysicsObject() if IsValid(phys) then --print("Disabled physics: ", ent) ent:PhysicsDestroy() self.Disabled[ent] = true end end end function ClientsidePhysics:Enable(ent) if self.Disabled[ent] ~= nil then --print("Enabled Physics: ", ent) ent:PhysicsInit(SOLID_VPHYSICS) self.Disabled[ent] = nil end end local ENT = FindMetaTable("Entity") if ENT.PhysicsInitOverride == nil then ENT.PhysicsInitOverride = ENT.PhysicsInit end if ENT.PhysicsDestroyOverride == nil then ENT.PhysicsDestroyOverride = ENT.PhysicsDestroy end function ENT:PhysicsInit(flags) ENT.PhysicsInitOverride(self, flags) local phys = self:GetPhysicsObject() if IsValid(phys) then phys:EnableMotion(false) self.ClientsidePhysicsTracking = true ClientsidePhysics.Active[self] = true end end function ENT:PhysicsDestroy() ENT.PhysicsDestroyOverride(self) self.ClientsidePhysicsTracking = false ClientsidePhysics.Active[self] = nil end function ENT:PhysicsTrackingActive() if self.ClientsidePhysicsTracking ~= nil then return self.ClientsidePhysicsTracking end return false end hook.Add("Think", "ClientsidePhysics", function() for v,_ in pairs(ClientsidePhysics.Active) do if v.ClientsidePhysicsTracking then local phys = v:GetPhysicsObject() if IsValid(phys) and v:IsDormant() == false then phys:EnableMotion(false) phys:SetPos(v:GetPos()) phys:SetAngles(v:GetAngles()) phys:SetVelocity(v:GetVelocity()) end end end end) hook.Add("EntityRemoved", "ClientsidePhysicsRemove", function(ent) ClientsidePhysics.Active[ent] = nil ClientsidePhysics.Disabled[ent] = nil end) hook.Add("NetworkEntityCreated", "ClientsidePhysics", function(ent) if ClientsidePhysics.Whitelist[ent:GetClass()] ~= nil then local phys = ent:GetPhysicsObject() if not IsValid(phys) then ent:PhysicsInit(SOLID_VPHYSICS) end end end) hook.Add("PhysgunPickup", "ClientsidePhysicsPickup", function(ply, ent) ClientsidePhysics:Disable(ent) end) hook.Add("PhysgunDrop", "ClientsidePhysicsDrop", function(ply, ent) ClientsidePhysics:Enable(ent) end) -- Those are not shared at the moment, should we setup some usermessage/net message? -- The gravity gun takes away the clientside physics, so we have to deal with this. hook.Add("GravGunOnPickedUp", "ClientsidePhysicsPickup", function(ply, ent) ClientsidePhysics:Disable(ent) end) hook.Add("GravGunOnDropped", "ClientsidePhysicsDrop", function(ply, ent) ClientsidePhysics:Enable(ent) end) [/lua] There is an issue with the Gravity gun, it will kill the physics on the client haven't worked that out yet so ignore the useless hooks. EDIT: One might ask what this is all about, long story short: This would allow clientside ragdolls to actually collide with your shitty contraptions.
Sorry, you need to Log In to post a reply to this thread.