From 06831e1c6c3e6794fc27298355ade96acdcb5515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 8 Jun 2024 15:44:33 +0300 Subject: [PATCH 1/2] Fix ragdoll spawn from vehicles being offset --- entities/entities/lambda_ragdollmanager.lua | 32 ++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/entities/entities/lambda_ragdollmanager.lua b/entities/entities/lambda_ragdollmanager.lua index 05b63c20..ed664a26 100644 --- a/entities/entities/lambda_ragdollmanager.lua +++ b/entities/entities/lambda_ragdollmanager.lua @@ -213,7 +213,9 @@ end function ENT:CreateRagdoll(dmgForce, gibPlayer, didExplode) DbgPrint(self, "CreateRagdoll", dmgForce, gibPlayer, didExplode) + local ent = self:GetOwner() + local vel = ent:GetVelocity() if not IsValid(ent) then DbgPrint("No valid owner for ragdoll manager") @@ -225,16 +227,30 @@ function ENT:CreateRagdoll(dmgForce, gibPlayer, didExplode) 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 = Angle(0, 0, 0) + if SERVER then + local vehicle = ent:GetVehicle() + if IsValid(vehicle) then + local vehicleMdl = vehicle:GetModel() + if vehicleMdl == "models/buggy.mdl" then + rotation = Angle(0, 85, 0) + vel = vehicle:GetVelocity() + end + end + end + + 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 +269,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 +283,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) From db6c7eb216963e186a85542dde8f2e71cbdf99c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=CE=B6eh=20Matt?= <5415177+ZehMatt@users.noreply.github.com> Date: Sat, 8 Jun 2024 15:59:21 +0300 Subject: [PATCH 2/2] Refactor ragdoll spawn, handle airboat too --- entities/entities/lambda_ragdollmanager.lua | 44 ++++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/entities/entities/lambda_ragdollmanager.lua b/entities/entities/lambda_ragdollmanager.lua index ed664a26..47904376 100644 --- a/entities/entities/lambda_ragdollmanager.lua +++ b/entities/entities/lambda_ragdollmanager.lua @@ -211,37 +211,51 @@ 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 vel = ent:GetVelocity() - 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 = Angle(0, 0, 0) - if SERVER then - local vehicle = ent:GetVehicle() - if IsValid(vehicle) then - local vehicleMdl = vehicle:GetModel() - if vehicleMdl == "models/buggy.mdl" then - rotation = Angle(0, 85, 0) - vel = vehicle:GetVelocity() - end - end - end + local rotation = CompensateRotation(ent) + local vel = GetPlayerVelocity(ent) local spawnPos = ent:GetPos()