diff --git a/entities/entities/lambda_ragdollmanager.lua b/entities/entities/lambda_ragdollmanager.lua index 05b63c20..47904376 100644 --- a/entities/entities/lambda_ragdollmanager.lua +++ b/entities/entities/lambda_ragdollmanager.lua @@ -211,30 +211,60 @@ function ENT:HandleRagdollCollision(ragdoll, data) end end +-- HACKHACK: Compensate for issue https://github.com/Facepunch/garrysmod-issues/issues/5894 +local function CompensateRotation(ply) + local res = Angle(0, 0, 0) + local vehicle = ply:GetVehicle() + if not IsValid(vehicle) then + return res + end + + local vehicleMdl = vehicle:GetModel() + if vehicleMdl == "models/buggy.mdl" then + res = Angle(0, 85, 0) + elseif vehicleMdl == "models/airboat.mdl" then + res = Angle(0, 85, 0) + end + + return res +end + +local function GetPlayerVelocity(ply) + local res = ply:GetVelocity() + local vehicle = ply:GetVehicle() + if not IsValid(vehicle) then + return res + end + return vehicle:GetVelocity() +end + function ENT:CreateRagdoll(dmgForce, gibPlayer, didExplode) DbgPrint(self, "CreateRagdoll", dmgForce, gibPlayer, didExplode) - local ent = self:GetOwner() + local ent = self:GetOwner() if not IsValid(ent) then DbgPrint("No valid owner for ragdoll manager") - return end local mdl = ent:GetModel() - if mdl == nil then DbgPrint("Player has no valid model for ragdoll manager") - return end + -- HACKHACK: Compensate for issue https://github.com/Facepunch/garrysmod-issues/issues/5894 + local rotation = CompensateRotation(ent) + local vel = GetPlayerVelocity(ent) + + local spawnPos = ent:GetPos() + self:RemoveRagdoll() if gibPlayer == true then return self:GibPlayer(dmgForce, gibPlayer, didExplode) end local ragdoll = ents.Create("prop_ragdoll") ragdoll:SetModel(mdl) - ragdoll:SetPos(ent:GetPos()) - ragdoll:SetAngles(ent:GetAngles()) + ragdoll:SetPos(spawnPos) + ragdoll:SetAngles(Angle(0, 0, 0)) ragdoll:SetColor(ent:GetColor()) ragdoll:SetSkin(ent:GetSkin()) @@ -253,15 +283,13 @@ function ENT:CreateRagdoll(dmgForce, gibPlayer, didExplode) ragdoll.LastRagdollImpact = 0 ragdoll:SetNWBool("IsReviving", false) - ragdoll:AddCallback("PhysicsCollide", function(e, data) if IsValid(self) then self:HandleRagdollCollision(e, data) end end) - local vel = ent:GetVelocity() - + local centralPos = ragdoll:GetPos() for i = 0, ragdoll:GetPhysicsObjectCount() - 1 do local bone = ragdoll:GetPhysicsObjectNum(i) @@ -269,8 +297,12 @@ function ENT:CreateRagdoll(dmgForce, gibPlayer, didExplode) local bp, ba = ent:GetBonePosition(ragdoll:TranslatePhysBoneToBone(i)) if bp and ba then + local relativePos = bp - centralPos + relativePos:Rotate(rotation) + bp = centralPos + relativePos + bone:SetPos(bp) - bone:SetAngles(ba) + bone:SetAngles(ba + rotation) end bone:SetVelocity(vel)