AddCSLuaFile() ENT.Type = "anim" ENT.Base = "base_anim" ENT.AutomaticFrameAdvance = true local bones_to_animate = { "ValveBiped.Bip01_Pelvis", "ValveBiped.Bip01_Spine2", "ValveBiped.Bip01_Head1", "ValveBiped.Bip01_R_Thigh", "ValveBiped.Bip01_L_Thigh", "ValveBiped.Bip01_L_Calf", "ValveBiped.Bip01_R_Calf", "ValveBiped.Bip01_R_Foot", "ValveBiped.Bip01_L_Foot", "ValveBiped.Bip01_R_Upperarm", "ValveBiped.Bip01_L_Upperarm", "ValveBiped.Bip01_R_Forearm", "ValveBiped.Bip01_L_Forearm", "ValveBiped.Bip01_R_Hand", "ValveBiped.Bip01_L_Hand", } local function GetBoneLocalOffsetMatrix(ent, bone_index) local parent = ent:GetBoneParent(bone_index) local parent_matrix = Matrix(ent:GetBoneMatrix(parent)) parent_matrix:Invert() parent_matrix:Mul(ent:GetBoneMatrix(bone_index)) return parent_matrix end local function GetGlobalMatrixFromLocal(ent, bone_index, local_matrix) local parent = ent:GetBoneParent(bone_index) local parent_matrix = Matrix(ent:GetBoneMatrix(parent)) parent_matrix:Mul(local_matrix) return parent_matrix end function ENT:Initialize() if SERVER then print("I AM SERVERSIDE") self:SetModel("models/dav0r/hoverball.mdl") end if CLIENT then print("I AM CLIENTSIDE") timer.Simple(0.2, function() end) end end function ENT:Draw() if CLIENT then local old_ragdoll = self:GetNWEntity("parent") local old_npc = self:GetNWEntity("parent_npc") if IsValid(old_ragdoll) and IsValid(old_npc) then if !self.ready_to_unfake then self:SetModel(old_ragdoll:GetModel()) self.bone_list = {} self.bone_list_end = {} self.bone_list_end_offset = {} self:SetupBones() local i = 0 while i < self:GetBoneCount() do local name = self:GetBoneName(i) if name == "__INVALIDBONE__" then i = i + 1 continue end table.insert(bones_to_animate, name) local matrix = Matrix() local position, angle = old_ragdoll:GetBonePosition(i) if position == old_ragdoll:GetPos() then get_matrix = old_ragdoll:GetBoneMatrix(i) if get_matrix then position = get_matrix:GetTranslation() end end matrix:Translate(position) matrix:Rotate(angle) self.bone_list[name] = matrix local matrix = Matrix() local npc_bone_index = old_npc:LookupBone(name) local position, angle = old_npc:GetBonePosition(npc_bone_index) if position == old_npc:GetPos() then print("DINGUS!!!! "..name) self.bone_list_end_offset[name] = GetBoneLocalOffsetMatrix(self, npc_bone_index) get_matrix = old_npc:GetBoneMatrix(npc_bone_index) if get_matrix then position = get_matrix:GetTranslation() end else matrix:Translate(position) matrix:Rotate(angle) self.bone_list_end[name] = matrix end i = i + 1 end PrintTable(bones_to_animate) --[[for i,name in pairs(bones_to_animate) do local bone_index = old_ragdoll:LookupBone(name) if bone_index == nil then continue end self.bone_list[name] = Matrix(old_ragdoll:GetBoneMatrix(bone_index)) end]] print("BONES:"..self:GetBoneCount()) self.ready_to_unfake = true end self:SetPos(old_ragdoll:GetPos()) self:SetupBones() local fake_start = self:GetNWFloat("fake_start") local fake_end = self:GetNWFloat("fake_end") local progress = (CurTime() - fake_start) / (fake_end - fake_start) for name,matrix in pairs(self.bone_list) do local bone_index = self:LookupBone(name) if bone_index == -1 then print(name.." does not exist, skipping...") continue end local matrix_end = self.bone_list_end[name] if matrix_end == nil then if (self.bone_list_end_offset[name] == nil) then print("OH FUCKKKKKKKK! No matrix end for "..name) continue end matrix_end = GetGlobalMatrixFromLocal(self, bone_index, self.bone_list_end_offset[name]) end local final_matrix = Matrix() final_matrix:Translate(LerpVector(progress, matrix:GetTranslation(), matrix_end:GetTranslation())) final_matrix:Rotate(LerpAngle(progress, matrix:GetAngles(), matrix_end:GetAngles())) --print(name) --local bone_matrix = old_ragdoll:GetBoneMatrix(bone_index) if matrix:GetTranslation():DistToSqr(self:GetPos()) == 1 then continue end self:SetBoneMatrix(bone_index, final_matrix) end end end self:DrawModel() end function ENT:Think() return true end function ENT:OnRemove() if CLIENT then --[[if self.anim_ragdoll then self.anim_ragdoll:Remove() end]] end end