Quick actions

cmd+k|ctrl+k

Navigation

Languages

pain engine v0.9.2

Snippet info

Language

Lua

Visibility

public

Author

lazarovalkyrie

Created

2024-07-02T00:18:40.651425Z

Updated

2024-07-12T20:28:20.787485Z

local studspermeters = 20
local fatal_vel = studspermeters*15
local terminal_vel = studspermeters*16
local fallstates = {
	Enum.HumanoidStateType.Freefall,
	Enum.HumanoidStateType.FallingDown,
	Enum.HumanoidStateType.Flying,
	Enum.HumanoidStateType.Jumping,
}
local bleeding = {}
local falling = {}
local ragdolled = {}
local gores1 = {3739335394,3737268126,3929462189,3739335007}
local gores2 = {3847883680,3847884467,3847885772,3929462677}
local gores3 = {4953187368,4953187704}
local pg = {1489922915,1489934368}
local stuns = {
	5169623605,
	5169624072,
	5169626214,
	5169624072,
	5169623821,
	5169626595
}
local impacts = {
	3848124871,
	3848125583,
	3848126035,
	3929466751
}
if not _G['ignore pain engine'] then
	_G['ignore pain engine'] = {}
end

function check_fatal(hum,dmg)
	if 0 >= (hum.Health - dmg) then
		return true
	end
	return false
end

function check_godded(hum,lasthp)
	if lasthp then
		if lasthp > hum.Health then
			return true
		end
	elseif hum.MaxHealth >= math.huge or hum.MaxHealth >= 1/0 then
		return true
	elseif hum.Parent:FindFirstChildOfClass("ForceField") then
		return true
	end
end

function is_enabled(plr)
	if _G['ignore pain engine'][plr.UserId] then
		return true
	elseif _G['ignore pain engine'][plr.UserId] == nil then
		return true
	else
		return false
	end
end

function toggle_enable(plr,bool)
	_G['ignore pain engine'][plr.UserId] = bool
end

local junk = Instance.new("Folder",script)

function bleed2(plr,frick,targhum,can_hurt,t,splat,dir)
	coroutine.resume(coroutine.create(function()
		if frick and targhum then else return end
		local rig = targhum.RigType
		local limbs = {'Head','Left Arm','Right Arm','Left Leg','Right Leg','RightUpperLeg','LeftUpperLeg','RightUpperArm','LeftUpperArm','RightLowerLeg','LeftLowerLeg','RightLowerArm','LeftLowerArm','RightFoot','LeftFoot','RightHand','LeftHand'}
		local interval_bleed = 0.1
		if not bleeding[frick] or 0 >= bleeding[frick] then
			bleeding[frick] = 0
			bleeding[frick] = bleeding[frick] + t
		elseif bleeding[frick] > 0 then
			bleeding[frick] = bleeding[frick] + t
			return
		else
			return
		end
		while bleeding[frick] > 0 do
			if (not frick or not frick.Parent or not frick.Parent.Parent or not targhum or not targhum.Parent) then
				break
			end
			local max_limbs = 0
			local current_limbs = 0
			local gone_limbs = 0
			local targchar = targhum.Parent
			if rig == Enum.HumanoidRigType.R6 then
				max_limbs = 5
			elseif rig == Enum.HumanoidRigType.R15 then
				max_limbs = 13
			end
			for i,v in pairs(targchar:GetChildren()) do
				local found = false
				for i,n in pairs(limbs) do if n == v.Name then found = true; end; end;
				if found and not v:FindFirstChild("Dismembered") then
					current_limbs = current_limbs + 1
				end
			end
			gone_limbs = (max_limbs-current_limbs)
			if targhum and can_hurt then
				local bdmg = 0.3
				local multi = 3
				if 0 >= gone_limbs then
					gone_limbs = 1
				else
					gone_limbs = gone_limbs*multi
				end
				if 0 >= (targhum.Health - bdmg*gone_limbs) then
					targhum.BreakJointsOnDeath = false
					--[[
					pcall(function()
						kill(plr,targchar,dir,5)
					end)
					]]
				end
				targhum:TakeDamage(bdmg*gone_limbs)
			end
			local vel = (dir*0.5)+Vector3.new(math.random(-5, 5)/40,math.random(-5, 5)/30,math.random(-5, 5)/40)
			local thing = Instance.new('Part')
			thing.Name = "blood_drop"
			thing.Size = Vector3.new(0.1,0.1,0.1)
			thing.CFrame = frick.CFrame*CFrame.new(0,frick.Size.Y/2,0)
			if splat then
				thing.Transparency = 0
			elseif not splat then
				thing.Transparency = 1
			end
			thing.Color = Color3.fromRGB(75, 0, 0)
			thing.Material = Enum.Material.SmoothPlastic
			thing.CanCollide = false
			thing.Velocity = vel
			thing.Parent = junk
			thing:SetNetworkOwner(plr)
			local mesh = Instance.new('SpecialMesh')
			mesh.MeshType = Enum.MeshType.Sphere
			mesh.Parent = thing
			game:GetService("Debris"):AddItem(thing,10)
			local att1,att2 = Instance.new("Attachment"),Instance.new("Attachment")
			att1.Parent = thing
			att1.Position = Vector3.new(0,-(thing.Size.Y/2),0)
			att2.Parent = thing
			att2.Position = Vector3.new(0,(thing.Size.Y/2),0)
			if splat then
				local trail_drop = Instance.new("Trail")
				trail_drop.Parent = thing
				trail_drop.Attachment0 = att1
				trail_drop.Attachment1 = att2
				trail_drop.Color = ColorSequence.new(Color3.new(0.5, 0, 0),Color3.new(0.7, 0, 0))
				trail_drop.FaceCamera = true
				trail_drop.LightInfluence = 1
				trail_drop.WidthScale = NumberSequence.new(1,0)
				trail_drop.Transparency = NumberSequence.new(0,1)
				trail_drop.Lifetime = 0.1
				trail_drop.MinLength = 0
			end
			local rawrxd = Instance.new('BodyForce')
			rawrxd.Parent = thing
			rawrxd.Force = vel
			game:GetService("Debris"):AddItem(rawrxd,0.01)
			thing.Touched:connect(function(tou)
				if tou and tou.Parent and not tou:IsDescendantOf(targchar) and not tou:IsDescendantOf(junk) and not tou.Parent:FindFirstChildOfClass("Humanoid") and not tou.Parent.Parent:FindFirstChildOfClass("Humanoid") and not tou.Parent:IsA("Accessory") and tou.Name ~= 'Handle' and tou.Parent.Name ~= 'Handle' and not tou.Parent:IsA("Tool") and not string.match(tou.Name:lower(),'blood_drop') and not string.match(tou.Name:lower(),'bullet') and not string.match(tou.Name:lower(),'bone') and not string.match(tou.Name:lower(),'gun mag') and not string.match(tou.Name:lower(),'limb') then
					local pos = Vector3.new(thing.Position.X,(tou.Position.Y+(tou.Size.Y/2))+(0.02/2),thing.Position.Z)
					local Point1 = pos-Vector3.new(0.01,0.01,0.01)
					local Point2 = pos+Vector3.new(0.01,0.01,0.01)
					local Region = Region3.new(Point1,Point2)
					for _,Part in pairs(game.Workspace:FindPartsInRegion3(Region,nil,math.huge)) do
						if Part.Name == "blood" then
							tou = Part
						end
					end
					thing:Destroy()
					if tou.Name == "blood" then
						local reee = tou.CFrame
						if tou.Transparency > -0.2 then
							tou.Transparency = tou.Transparency - 0.1
						end
						local s = 0.025
						local smax = 0.1
						if tou.Color.R > 0 then
							local nc = tou.Color.R*1.012
							if nc > 1 then
								nc = 1
							end
							tou.Color = Color3.new(nc, 0, 0)
						end
						s = smax*math.clamp(t/10,0,1)
						if tou.Size.X < 5 then
							tou.Size = tou.Size+Vector3.new(s*4,0,s*4)
						elseif tou.Size.X < 7.5 then
							tou.Size = tou.Size+Vector3.new(s*3,0,s*3)
						elseif tou.Size.X < 10 then
							tou.Size = tou.Size+Vector3.new(s*2,0,s*2)
						end
						tou.CFrame = reee
						local tween = game:GetService("TweenService"):Create(tou,TweenInfo.new(4),{Transparency = 1})
						tween:Play()
						tween.Completed:Connect(function()
							if tou.Transparency >= 0.9 then
								tou:Destroy()
							end
						end)
						local splash = Instance.new("Sound",tou)
						splash.SoundId = 'rbxassetid://5157825454' --685857471
						splash.Volume = 0.025
						splash.PlayOnRemove = true
						splash:Destroy()
					elseif tou.CanCollide == true then
						local bloodsplat = Instance.new('Part')
						local s = math.random(5,10)/10
						if gone_limbs >= 1 then
							bloodsplat.Size = Vector3.new(s*gone_limbs,0.2,s*gone_limbs)
						else
							bloodsplat.Size = Vector3.new(s,0.2,s)
						end
						bloodsplat.Name = "blood"
						bloodsplat.Anchored = true
						bloodsplat.CanCollide = false
						bloodsplat.Material = Enum.Material.Glass
						bloodsplat.Color = Color3.fromRGB(75, 0, 0)
						bloodsplat.Transparency = -0.2
						bloodsplat.Parent = junk
						bloodsplat.CFrame = CFrame.new(pos)
						local mesh = Instance.new('SpecialMesh')
						mesh.MeshType = Enum.MeshType.Sphere
						mesh.Parent = bloodsplat
						local tween = game:GetService("TweenService"):Create(bloodsplat,TweenInfo.new(4),{Transparency = 1})
						tween:Play()
						tween.Completed:Connect(function()
							if bloodsplat.Transparency >= 0.9 then
								bloodsplat:Destroy()
							end
						end)
						local splash = Instance.new("Sound",bloodsplat)
						splash.SoundId = 'rbxassetid://5157825454'
						splash.Volume = 0.025
						splash.PlayOnRemove = true
						splash:Destroy()
					end
				end
			end)
			bleeding[frick] = bleeding[frick] - interval_bleed
			wait(interval_bleed)
		end
	end))
end

function blood_splat(obj)
	local ParticleEmitter1 = Instance.new("ParticleEmitter")
	local ParticleEmitter2 = Instance.new("ParticleEmitter")
	local ParticleEmitter3 = Instance.new("ParticleEmitter")
	ParticleEmitter1.Name = "Blood3"
	ParticleEmitter1.Parent = obj
	ParticleEmitter1.Speed = NumberRange.new(3, 7)
	ParticleEmitter1.Rotation = NumberRange.new(-360, 360)
	ParticleEmitter1.Color = ColorSequence.new(Color3.new(0.486275, 0, 0),Color3.new(0.258824, 0, 0))
	ParticleEmitter1.Enabled = false
	ParticleEmitter1.LightEmission = 0.20000000298023
	ParticleEmitter1.LightInfluence = 1
	ParticleEmitter1.Texture = "rbxassetid://241779220"
	ParticleEmitter1.Transparency = NumberSequence.new(1,0.48750001192093,0.75625002384186,1)
	ParticleEmitter1.ZOffset = 0.5
	ParticleEmitter1.Size = NumberSequence.new(0,2.8749995231628)
	ParticleEmitter1.Acceleration = Vector3.new(0, -5, 0)
	ParticleEmitter1.EmissionDirection = Enum.NormalId.Front
	ParticleEmitter1.Lifetime = NumberRange.new(0.40000000596046, 1)
	ParticleEmitter1.Rate = 3000
	ParticleEmitter1.RotSpeed = NumberRange.new(-40, 270)
	ParticleEmitter1.SpreadAngle = Vector2.new(360, 360)
	ParticleEmitter1.VelocitySpread = 360
	ParticleEmitter2.Name = "Blood"
	ParticleEmitter2.Parent = obj
	ParticleEmitter2.Speed = NumberRange.new(5, 10)
	ParticleEmitter2.Rotation = NumberRange.new(-360, 360)
	ParticleEmitter2.Color = ColorSequence.new(Color3.new(0.666667, 0, 0),Color3.new(0.423529, 0, 0))
	ParticleEmitter2.Enabled = false
	ParticleEmitter2.LightEmission = 0.40000000596046
	ParticleEmitter2.LightInfluence = 1
	ParticleEmitter2.Texture = "rbxassetid://73547327"
	ParticleEmitter2.Transparency = NumberSequence.new(0.10000000149012,0.14375001192093,0.49374997615814,1)
	ParticleEmitter2.Size = NumberSequence.new(0,2.8749995231628)
	ParticleEmitter2.Acceleration = Vector3.new(0, -5, 0)
	ParticleEmitter2.EmissionDirection = Enum.NormalId.Front
	ParticleEmitter2.Lifetime = NumberRange.new(0.30000001192093, 0.5)
	ParticleEmitter2.Rate = 10000000
	ParticleEmitter2.RotSpeed = NumberRange.new(-40, 270)
	ParticleEmitter2.SpreadAngle = Vector2.new(360, 360)
	ParticleEmitter2.VelocitySpread = 360
	ParticleEmitter3.Name = "Blood2"
	ParticleEmitter3.Parent = obj
	ParticleEmitter3.Speed = NumberRange.new(5, 14)
	ParticleEmitter3.Color = ColorSequence.new(Color3.new(0.45098, 0, 0),Color3.new(0.45098, 0, 0))
	ParticleEmitter3.Enabled = false
	ParticleEmitter3.LightEmission = 0.20000000298023
	ParticleEmitter3.LightInfluence = 1
	ParticleEmitter3.Texture = "http://www.roblox.com/asset/?id=134531274"
	ParticleEmitter3.Transparency = NumberSequence.new(0.30000001192093,0.30000001192093)
	ParticleEmitter3.ZOffset = 1
	ParticleEmitter3.Size = NumberSequence.new(0.12499988079071,0)
	ParticleEmitter3.Acceleration = Vector3.new(0, -20, 0)
	ParticleEmitter3.EmissionDirection = Enum.NormalId.Front
	ParticleEmitter3.Lifetime = NumberRange.new(0.5, 1.5)
	ParticleEmitter3.Rate = 100000
	ParticleEmitter3.SpreadAngle = Vector2.new(360, 360)
	ParticleEmitter3.VelocitySpread = 360
	--
	ParticleEmitter1:Emit(20)
	ParticleEmitter2:Emit(20)
	ParticleEmitter3:Emit(20)
	--
	game:GetService("Debris"):AddItem(ParticleEmitter1,2)
	game:GetService("Debris"):AddItem(ParticleEmitter2,2)
	game:GetService("Debris"):AddItem(ParticleEmitter3,2)
	--
end

function limb_collide(obj,mode,d)
	if (obj:IsA("UnionOperation") or obj:IsA("BasePart")) and not obj:FindFirstChild('limb') then else return end
	local exists = pcall(game:GetService("PhysicsService").GetCollisionGroupId, game:GetService("PhysicsService"), 'Limb Collide')
	if not exists then
		game:GetService("PhysicsService"):CreateCollisionGroup('Limb Collide')
	end
	game:GetService("PhysicsService"):CollisionGroupSetCollidable('Limb Collide','Limb Collide',false)
	--
	local t = {}
	--
	local cb = Instance.new("Part")
	cb.Name = 'limb'
	cb.Transparency = 1
	cb.CanCollide = true
	cb.Anchored = false
	cb.CFrame = obj.CFrame
	cb.Size = obj.Size*0.9
	cb.Massless = true
	cb.Locked = true
	game:GetService("PhysicsService"):SetPartCollisionGroup(cb,'Limb Collide')
	game:GetService("PhysicsService"):SetPartCollisionGroup(obj,'Limb Collide')
	local weld = Instance.new("Weld")
	weld.Part0 = cb
	weld.Part1 = obj
	weld.Parent = cb
	--obj.Massless = true
	obj.Anchored = false
	if mode or obj:FindFirstChild("Dismembered") then
		cb.Parent = junk -- .Parent
	else
		cb.Parent = junk
		table.insert(t,1,cb)
	end
	if d then
		game:GetService("Debris"):AddItem(cb,d)
	end
	--
	if not string.match(obj.Name:lower(),'torso') and not string.match(obj.Name:lower(),'rootpart') and not string.match(obj.Name:lower(),'head') then
		local lv = Vector3.new() -- Vector3.new(cb.Size.X,0,cb.Size.Z)
		local cb2 = Instance.new("Part")
		cb2.Name = 'limb'
		cb2.Transparency = 1
		cb2.CanCollide = true
		cb2.Anchored = false
		cb2.CFrame = obj.CFrame
		cb2.Size = lv
		cb2.Massless = true
		cb2.Locked = true
		--game:GetService("PhysicsService"):SetPartCollisionGroup(cb2,'Limb Collide')
		local weld2 = Instance.new("Weld")
		weld2.Part0 = cb
		weld2.Part1 = cb2
		weld2.C1 = CFrame.new(0,(cb.Size.Y/2),0)
		weld2.Parent = cb2
		if mode or obj:FindFirstChild("Dismembered") then
			cb2.Parent = junk -- .Parent
		else
			cb2.Parent = junk
			table.insert(t,1,cb2)
		end
		if d then
			game:GetService("Debris"):AddItem(cb2,d)
		end
	end
	--
	return t
end

function recurse(root,callback,i)
	i= i or 0
	for _,v in pairs(root:GetChildren()) do
		i = i + 1
		callback(i,v)

		if #v:GetChildren() > 0 then
			i = recurse(v,callback,i)
		end
	end

	return i
end

function ragdollJoint(character, part0, part1, attachmentName, className, properties)
	attachmentName = attachmentName.."RigAttachment"
	local constraint = Instance.new(className.."Constraint")
	constraint.Attachment0 = part0:FindFirstChild(attachmentName)
	constraint.Attachment1 = part1:FindFirstChild(attachmentName)
	constraint.Name = "RagdollConstraint"..part1.Name

	for _,propertyData in next,properties or {} do
		constraint[propertyData[1]] = propertyData[2]
	end

	constraint.Parent = character
end

function getAttachment0(character, attachmentName)
	for _,child in next,character:GetChildren() do
		local attachment = child:FindFirstChild(attachmentName)
		if attachment then
			return attachment
		end
	end
end

function ragdoll(targchar,kill,remove)
	if targchar then else return end
	local targplr
	pcall(function()
		targplr = game:GetService("Players"):GetPlayerFromCharacter(targchar)
	end)
	local pc = targchar
	local targhum = pc:FindFirstChildOfClass("Humanoid")
	local js,js2 = {},{}
	local lc = {}
	
	targhum.PlatformStand = true
	--if kill then
		local old_pc
		if remove then
			pc.Archivable = true
			old_pc = pc
			pc = pc:Clone()
		end
		for i,v in pairs(pc:GetDescendants()) do
			if v.Name ~= 'HumanoidRootPart' and v.Name ~= 'Torso' and v:IsA("BasePart") then
				if remove or not kill then
					local t = limb_collide(v,false,10)
					table.insert(lc,1,t)
				end
			end
			if kill then
				if v:IsA("ParticleEmitter") then
					v.Enabled = false
				end
				if v:IsA("SelectionBox") or v:IsA("BodyVelocity") or v:IsA("BodyPosition") or v:IsA("BodyAngularVelocity") or v:IsA("BodyForce") or v:IsA("BodyGyro") or v:IsA("BodyThrust") or v:IsA("BodyMover") then
					if v:IsA("BodyVelocity") then
						game:GetService("Debris"):AddItem(v,0.15)
					else
						v:Destroy()
					end
				end
				if (v:IsA("Script") and v.Name == 'Health') or (v:IsA("LocalScript") and v.Name == 'Animate') then
					v:Destroy()
				end
				if v:IsA("Humanoid") then
					v.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOff
					v.PlatformStand = true
				end
			end
		end
		if remove then
			for i,v in pairs(old_pc:GetDescendants()) do
				if v:IsA("BasePart") or v:IsA("UnionOperation") or v:IsA("ForceField") or v:IsA("Accessory") or v:IsA("Decal") or v:IsA("Texture") or v:IsA("SurfaceGui") then
					v:destroy()
				end
				if v:IsA("Humanoid") then
					v.BreakJointsOnDeath = true
					v.Health = 0
					v.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOff
					v.PlatformStand = true
				end
			end
			pc.Parent = junk
			game:GetService("Debris"):AddItem(pc,10)
		end
	--end
	--if kill and targhum:FindFirstChild("Ragdolled") then return; end;
	coroutine.resume(coroutine.create(function()
		if targplr then
			for i,v in pairs(pc:GetChildren()) do
				if v:IsA("BasePart") then
					--v.Massless = true
					if v:CanSetNetworkOwnership() then
						v:SetNetworkOwner(targplr)
					end
				end
			end
		end
	end))
	local kb = 15
	local root = pc:FindFirstChild("HumanoidRootPart")
	local targtorso = pc:FindFirstChild("Torso") or pc:FindFirstChild("UpperTorso") or pc:FindFirstChild("Head") or pc:FindFirstChild("HumanoidRootPart")
	if targtorso then else return end
	local dir = targtorso.CFrame.lookVector*-1
	local bv = Instance.new("BodyVelocity")
	bv.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
	bv.Velocity = --[[dir*kb+]]Vector3.new(0,kb,0)
	bv.Parent = targtorso
	game:GetService("Debris"):AddItem(bv,0.1)
	if kill then
		local ragval = Instance.new("ObjectValue")
		ragval.Name = 'Ragdolled'
		ragval.Parent = targhum
	end
	coroutine.resume(coroutine.create(function()
		if (targhum.RigType == Enum.HumanoidRigType.R6 or (targhum.RigType == Enum.HumanoidRigType.R15 and not kill)) then
			for _,m in pairs(pc:GetChildren()) do
				for _,v in pairs(m:GetChildren()) do
					if (v:IsA("Snap") --[[or v:IsA('Weld')]] or v:IsA("BallSocketConstraint")) and kill then
						v:Destroy()
					end
					if (v:IsA('Motor6D') or v:IsA('Motor') or v:IsA("Weld")) and (v.Parent:IsA("BasePart") or v.Parent:IsA("UnionOperation")) then
						if not kill then
							table.insert(js2,1,{obj = v,par = v.Parent})
						end

						local a0, a1 = Instance.new("Attachment"), Instance.new("Attachment")
						a0.CFrame = v.C0
						a1.CFrame = v.C1
						a0.Parent = v.Part0
						a1.Parent = v.Part1

						local b = Instance.new("BallSocketConstraint")
						b.Attachment0 = a0
						b.Attachment1 = a1
						b.Parent = v.Part0

						v.Parent = nil
						table.insert(js,1,b)
					end
				end
			end
		elseif targhum.RigType == Enum.HumanoidRigType.R15 and kill then
			local character = targchar
			recurse(character, function(_,v)
				if v:IsA("Attachment") then
					v.Axis = Vector3.new(0, 1, 0)
					v.SecondaryAxis = Vector3.new(0, 0, 1)
					v.Rotation = Vector3.new(0, 0, 0)
				end
			end)

			--Re-attach hats
			for _,child in next,character:GetChildren() do
				if child:IsA("Accoutrement") then
					--Loop through all parts instead of only checking for one to be forwards-compatible in the event
					--ROBLOX implements multi-part accessories
					for _,part in next,child:GetChildren() do
						if part:IsA("BasePart") then
							local attachment1 = part:FindFirstChildOfClass("Attachment")
							local attachment0 = getAttachment0(character, attachment1.Name)
							if attachment0 and attachment1 then
								--Shouldn't use constraints for this, but have to because of a ROBLOX idiosyncrasy where
								--joints connecting a character are perpetually deleted while the character is dead
								local constraint = Instance.new("HingeConstraint")
								constraint.Attachment0 = attachment0
								constraint.Attachment1 = attachment1
								constraint.LimitsEnabled = true
								constraint.UpperAngle = 0 --Simulate weld by making it difficult for constraint to move
								constraint.LowerAngle = 0
								constraint.Parent = character
							end
						end
					end
				end
			end

			ragdollJoint(character, character.LowerTorso, character.UpperTorso, "Waist", "BallSocket", {
				{"LimitsEnabled",true};
				{"UpperAngle",5};
			})
			ragdollJoint(character, character.UpperTorso, character.Head, "Neck", "BallSocket", {
				{"LimitsEnabled",true};
				{"UpperAngle",15};
			})

			local handProperties = {
				{"LimitsEnabled", true};
				{"UpperAngle",0};
				{"LowerAngle",0};
			}
			ragdollJoint(character, character.LeftLowerArm, character.LeftHand, "LeftWrist", "Hinge", handProperties)
			ragdollJoint(character, character.RightLowerArm, character.RightHand, "RightWrist", "Hinge", handProperties)

			local shinProperties = {
				{"LimitsEnabled", true};
				{"UpperAngle", 0};
				{"LowerAngle", -75};
			}
			ragdollJoint(character, character.LeftUpperLeg, character.LeftLowerLeg, "LeftKnee", "Hinge", shinProperties)
			ragdollJoint(character, character.RightUpperLeg, character.RightLowerLeg, "RightKnee", "Hinge", shinProperties)

			local footProperties = {
				{"LimitsEnabled", true};
				{"UpperAngle", 15};
				{"LowerAngle", -45};
			}
			ragdollJoint(character, character.LeftLowerLeg, character.LeftFoot, "LeftAnkle", "Hinge", footProperties)
			ragdollJoint(character, character.RightLowerLeg, character.RightFoot, "RightAnkle", "Hinge", footProperties)

			--TODO fix ability for socket to turn backwards whenn ConeConstraints are shipped
			ragdollJoint(character, character.UpperTorso, character.LeftUpperArm, "LeftShoulder", "BallSocket")
			ragdollJoint(character, character.LeftUpperArm, character.LeftLowerArm, "LeftElbow", "BallSocket")
			ragdollJoint(character, character.UpperTorso, character.RightUpperArm, "RightShoulder", "BallSocket")
			ragdollJoint(character, character.RightUpperArm, character.RightLowerArm, "RightElbow", "BallSocket")
			ragdollJoint(character, character.LowerTorso, character.LeftUpperLeg, "LeftHip", "BallSocket")
			ragdollJoint(character, character.LowerTorso, character.RightUpperLeg, "RightHip", "BallSocket")
		end
	end))
	if root then
		root.CanCollide = false
	end
	local c
	if root then
		c = root.Touched:Connect(function(obj)
			if obj and not obj:IsDescendantOf(junk) and (root.Velocity.Magnitude >= 3) then
				local impact = Instance.new("Sound",root)
				impact.Name = 'impact'
				impact.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
				impact.Volume = 0.1
				impact.PlayOnRemove = true
				impact:Destroy()
			end
		end)
	end
	local function restore()
		if c then
			c:Disconnect()
		end
		if root then
			root.CFrame = root.CFrame*CFrame.new(0,4,0)
		end
		for i,v in pairs(js) do
			v:Destroy()
		end
		for i,v in pairs(lc) do
			for i,v in pairs(v) do
				v:Destroy()
			end
		end
		if targhum then
			targhum.PlatformStand = false
		end
		for i,v in pairs(js2) do
			v.obj.Parent = v.par
		end
		if root then
			root.CanCollide = true
		end
	end
	return restore
end

function connectfall(plr,torso,hum)
	local dmg = 0
	local saved_vel = 0
	while falling[hum] do
		if not falling[hum] then
			break
		end
		saved_vel = torso.Velocity.Magnitude
		wait(0)
	end
	if saved_vel >= 75 then
		dmg = 100*(saved_vel/fatal_vel)
		if saved_vel >= fatal_vel*1.2 and torso and plr.Character then
			local p = Instance.new("Part")
			p.CanCollide = false
			p.Anchored = true
			p.Size = Vector3.new()
			p.Position = torso.Position
			p.Transparency = 1
			p.Parent = junk
			local impact = Instance.new("Sound",p)
			impact.Name = 'impact'
			impact.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
			impact.Volume = 0.1
			impact.PlayOnRemove = true
			impact:Destroy()
			local explode2 = Instance.new("Sound",p)
			explode2.Name = 'expode'
			explode2.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
			explode2.Volume = 0.15
			explode2.PlayOnRemove = true
			explode2:Destroy()
			local exp_gore = Instance.new("Sound")
			exp_gore.SoundId = "rbxassetid://" .. gores3[math.random(1,#gores3)]
			exp_gore.Volume = 4
			exp_gore.Parent = p
			exp_gore:Play()
			local pe = Instance.new("ParticleEmitter")
			pe.Speed = NumberRange.new(15, 15)
			pe.Color = ColorSequence.new({
				ColorSequenceKeypoint.new(0,Color3.new(1, 0, 0)),
				ColorSequenceKeypoint.new(0.5,Color3.new(1, 0.33333, 0)),
				ColorSequenceKeypoint.new(1,Color3.new(1, 1, 1)),
			})
			pe.LightEmission = 0.80000001192093
			pe.Texture = "rbxassetid://162359401"
			pe.Size = NumberSequence.new({
				NumberSequenceKeypoint.new(0,0),
				NumberSequenceKeypoint.new(0.0264,1),
				NumberSequenceKeypoint.new(0.3,1),
				NumberSequenceKeypoint.new(0.5,1.5),
				NumberSequenceKeypoint.new(1,2),
			})
			--pe.Drag = 0.60000002384186
			pe.Transparency = NumberSequence.new({
				NumberSequenceKeypoint.new(0,0),
				NumberSequenceKeypoint.new(0.5,0),
				NumberSequenceKeypoint.new(1,1),
			})
			pe.Lifetime = NumberRange.new(1,2)
			pe.Rate = 100
			pe.SpreadAngle = Vector2.new(180, 180)
			pe.Parent = p
			pe.Enabled = false
			pe:Emit(75)
			blood_splat(p)
			for _,v in pairs(plr.Character:GetChildren()) do
				if v:IsA("BasePart") or v:IsA("UnionOperation") then
					explode_limb(plr,v,plr.Character,v.CFrame.upVector*-1,dmg)
				end
			end
			game:GetService("Debris"):AddItem(p,5)
		end
		if check_godded(hum) then
			return
		end
		if not check_fatal(hum,dmg) then
			if not torso:FindFirstChild("pain groan") then
				local groan = Instance.new("Sound")
				groan.Name = 'pain groan'
				groan.SoundId = 'rbxassetid://' .. stuns[math.random(1,#stuns)]
				groan.Volume = 1
				groan.Parent = torso
				groan.PlayOnRemove = true
				groan:Destroy()
			end
			coroutine.resume(coroutine.create(function()
				ragdolled[plr] = true
				local restore = ragdoll(torso.Parent,false)
				hum:SetStateEnabled(Enum.HumanoidStateType.Freefall,true)
				hum:SetStateEnabled(Enum.HumanoidStateType.Landed,true)
				wait(10*(saved_vel/fatal_vel))
				if plr and ragdolled[plr] then
					ragdolled[plr] = false
				end
				if restore then
					restore()
				end
			end))
		end
		blood_splat(torso,torso.Position,Vector3.new())
		--[[
		if check_fatal(hum,dmg) then
			bleed2(plr,torso,hum,false,game:GetService("Players").RespawnTime,false,torso.CFrame.upVector*-1)
		elseif dmg >= 25 then
			bleed2(plr,torso,hum,false,3,false,torso.CFrame.upVector*-1)
		end
		]]
		local smash_s = Instance.new("Sound")
		smash_s.Parent = torso
		smash_s.PlayOnRemove = true
		local dmg_s = Instance.new("Sound")
		dmg_s.Parent = torso
		dmg_s.PlayOnRemove = true
		if check_fatal(hum,dmg) then
			--smash_s.SoundId = 'rbxassetid://' .. gores2[math.random(1,#gores2)]
			smash_s.Volume = 0.7
			dmg_s.SoundId = 'rbxassetid://704141469'
			dmg_s.Volume = 1.5
		elseif dmg >= 50 then
			--smash_s.SoundId = 'rbxassetid://' .. gores1[math.random(1,#gores1)]
			smash_s.Volume = 0.7
			dmg_s.SoundId = 'rbxassetid://535681058'
			dmg_s.Volume = 1
		elseif dmg >= 25 then
			dmg_s.SoundId = 'rbxassetid://4057626616'
			dmg_s.Volume = 1.5
		end
		smash_s:Destroy()
		dmg_s:Destroy()
		hum:TakeDamage(dmg)
	end
end

function burn_up(obj,mode)
	if mode == 1 then
		local particle = obj:FindFirstChild("flame")
		local light = obj:FindFirstChild("flame light")
		local flame_sound = obj:FindFirstChild('burn up')
		local scream_sound = obj:FindFirstChild('flame scream')
		if not obj:FindFirstChild("burn up") then
			local start_flame = Instance.new("Sound")
			start_flame.SoundId = 'rbxassetid://5868574236'
			start_flame.Parent = obj
			start_flame.Volume = 2.5
			start_flame.PlayOnRemove = true
			start_flame:Destroy()
			flame_sound = Instance.new("Sound")
			flame_sound.Name = 'burn up'
			flame_sound.SoundId = 'rbxassetid://443980606'
			flame_sound.Volume = 1.5
			flame_sound.Parent = obj
			flame_sound.Looped = true
			flame_sound:Play()
			scream_sound = Instance.new("Sound")
			scream_sound.Name = 'flame scream'
			scream_sound.SoundId = 'rbxassetid://147758618'
			scream_sound.Parent = obj
			scream_sound.Looped = true
			scream_sound:Play()
			local PointLight1 = Instance.new("PointLight")
			PointLight1.Name = 'flame light'
			PointLight1.Parent = obj
			PointLight1.Color = Color3.new(1, 0.803922, 0.341176)
			PointLight1.Range = 21
			PointLight1.Brightness = 0.47499999403954
			PointLight1.Shadows = true
			light = PointLight1
			particle = Instance.new("Fire")
			particle.Name = 'flame'
			particle.Size = 10
			particle.Parent = obj
		end
	elseif mode == 2 then
		local particle = obj:FindFirstChild("flame")
		local light = obj:FindFirstChild("flame light")
		local flame_sound = obj:FindFirstChild('burn up')
		local scream_sound = obj:FindFirstChild('flame scream')
		if particle and particle.Enabled then
			particle.Enabled = false
			game:GetService("Debris"):AddItem(particle,1.5)
		end
		if light and light.Enabled then
			light.Enabled = false
			game:GetService("Debris"):AddItem(light,1)
		end
		if flame_sound then
			flame_sound:Destroy()
		end
		if scream_sound then
			scream_sound:Destroy()
		end
	end
end

function explode_limb(plr,obj,targchar,dir,dmg)
	local targhum = targchar:FindFirstChildOfClass("Humanoid")
	local targtorso = targchar:FindFirstChild("Torso") or targchar:FindFirstChild("UpperTorso") or targchar:FindFirstChild("HumanoidRootPart")
	if dmg > 0 and not obj:FindFirstChild('Dismembered') --[[and obj.Name ~= 'Torso' and obj.Name ~= 'HumanoidRootPart' and obj.Name ~= 'UpperTorso' and obj.Name ~= 'LowerTorso']] then else return end
	local d = 10
	local t = dmg/d
	local t2 = dmg/20/d
	bleed2(plr,targtorso,targhum,true,t,true,Vector3.new(0,-1,0).Unit)
	local gs = Instance.new("Sound")
	gs.SoundId = 'rbxassetid://206082273' -- 'rbxassetid://' .. gores2[math.random(1,#gores2)]
	gs.Volume = 0.3
	gs.PlayOnRemove = true
	gs.Parent = obj
	gs:Destroy()
	for i = 1,d do
		local p = Vector3.new(obj.Size.X/math.random(d/3,d/2),obj.Size.Y/math.random(d/3,d/2),obj.Size.Z/math.random(d/3,d/2))
		local blood_chunk = Instance.new("Part")
		blood_chunk.Size = p
		blood_chunk.CanCollide = true
		blood_chunk.Anchored = false
		if math.random(1,2) == 1 then
			blood_chunk.Color = Color3.fromRGB(math.random(90,170),0,0)
		else
			blood_chunk.Color = obj.Color
		end
		blood_chunk.Position = obj.Position+Vector3.new(math.random(-obj.Size.X*10,obj.Size.X*10)/10/2,math.random(-obj.Size.Y*10,obj.Size.Y*10)/10/2,math.random(-obj.Size.Z*10,obj.Size.Z*10)/10/2)
		blood_chunk.Material = Enum.Material.Slate
		blood_chunk.Parent = junk
		local kb = 25
		local ka = 90
		local bav = Instance.new("BodyAngularVelocity")
		bav.MaxTorque = Vector3.new(math.huge,math.huge,math.huge)
		bav.AngularVelocity = Vector3.new(math.random(-ka,ka),math.random(-ka,ka),math.random(-ka,ka))
		bav.Parent = blood_chunk
		local bv = Instance.new("BodyVelocity")
		bv.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
		local ud = (obj.Position-blood_chunk.Position).Unit
		if kb*3 >= ud.Magnitude then
			bv.Velocity = (ud*kb)+Vector3.new(0,kb,0)
			--bleed2(plr,targtorso,targhum,true,3,false,ud)
		else
			bv.Velocity = Vector3.new(0,kb,0)
			--bleed2(plr,targtorso,targhum,true,3,false,dir)
		end
		bv.Parent = blood_chunk
		game:GetService("Debris"):AddItem(bv,0.1)
		game:GetService("Debris"):AddItem(bav,0.1)
		game:GetService("Debris"):AddItem(blood_chunk,10)
	end
	obj:Destroy()
end

function bind(plr,char,new)
	pcall(function()
		if char then else return end
		if is_enabled(plr) then
			local ff = Instance.new("ForceField",char)
			game:GetService("Debris"):AddItem(ff,1)
		end
		local torso = char:FindFirstChild("Torso") or char:FindFirstChild("UpperTorso") or char:FindFirstChild("HumanoidRootPart")
		local hum = char:FindFirstChildOfClass("Humanoid")
		local base = workspace:FindFirstChild('Base') or workspace:FindFirstChild('Baseplate')
		if new then
			wait(0.1)
			if base then
				--torso.CFrame = base.CFrame*CFrame.new(0,base.Size.Y/2+4,0)
			else
				--torso.CFrame = CFrame.new(0,base.Size.Y/2+4,0)
			end
		end
		hum.StateChanged:Connect(function(oldstate,newstate)
            local foundstate = false
            for i,v in pairs(fallstates) do
            	if v == newstate then
                	foundstate = true
                    break
                end
            end
			if foundstate and not check_godded(hum) and is_enabled(plr) then
				if not falling[hum] then
					falling[hum] = true
					connectfall(plr,torso,hum)
				end
			else
				falling[hum] = false
			end
		end)
		local cv
		if is_enabled(plr) then
			cv = game:GetService("RunService").Stepped:Connect(function()
				if not char or not char.Parent or not torso or not torso.Parent or not hum then
					cv:Disconnect()
				end
				local vel = torso.Velocity.Magnitude
				if vel >= terminal_vel and not check_godded(hum) then
					local dmg = (vel/terminal_vel)/5
					hum:TakeDamage(dmg)
					burn_up(torso,1)
				else
					burn_up(torso,2)
				end
			end)
		end
		if hum.RigType == Enum.HumanoidRigType.R6 then
			hum.BreakJointsOnDeath = false
			hum:SetStateEnabled(Enum.HumanoidStateType.Dead,true)
		end
		local bid = 0
		local did_break = {}
		local can_break = false
		local dmged = false
		
		for _,limb in pairs(char:GetChildren()) do
			if (limb:IsA("BasePart") or limb:IsA("UnionOperation")) and limb.Name ~= 'HumanoidRootPart' and limb.Name ~= 'Torso' and limb.Name ~= 'UpperTorso' and limb.Name ~= 'LowerTorso' then
				limb.Touched:Connect(function(obj)
					local saved_vel = limb.Velocity.Magnitude
					local saved_vel2 = obj.Velocity.Magnitude*(obj.Mass/5)
					local dmg = (saved_vel/fatal_vel)*hum.MaxHealth
					local dmg2 = (saved_vel2/fatal_vel)*hum.MaxHealth
					if obj and obj.Parent and not obj.Parent:FindFirstChildOfClass("Humanoid") and obj.CanCollide then else
						saved_vel2 = 0
					end
					if limb and not dmged and (can_break or ragdolled[plr]) and not check_godded(hum) and (saved_vel >= fatal_vel or saved_vel2 >= fatal_vel) then
						dmged = true
						did_break[bid] = true
						local p = Instance.new("Part")
						p.CanCollide = false
						p.Anchored = true
						p.Size = Vector3.new()
						p.Position = limb.Position
						p.Transparency = 1
						p.Parent = junk
						local impact = Instance.new("Sound",p)
						impact.Name = 'impact'
						impact.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
						impact.Volume = 0.1
						impact.PlayOnRemove = true
						impact:Destroy()
						local explode2 = Instance.new("Sound",p)
						explode2.Name = 'expode'
						explode2.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
						explode2.Volume = 0.15
						explode2.PlayOnRemove = true
						explode2:Destroy()
						local exp_gore = Instance.new("Sound")
						exp_gore.SoundId = "rbxassetid://" .. gores3[math.random(1,#gores3)]
						exp_gore.Volume = 4
						exp_gore.Parent = p
						exp_gore:Play()
						local pe = Instance.new("ParticleEmitter")
			pe.Speed = NumberRange.new(15, 15)
			pe.Color = ColorSequence.new({
				ColorSequenceKeypoint.new(0,Color3.new(1, 0, 0)),
				ColorSequenceKeypoint.new(0.5,Color3.new(1, 0.33333, 0)),
				ColorSequenceKeypoint.new(1,Color3.new(1, 1, 1)),
			})
			pe.LightEmission = 0.80000001192093
			pe.Texture = "rbxassetid://162359401"
			pe.Size = NumberSequence.new({
				NumberSequenceKeypoint.new(0,0),
				NumberSequenceKeypoint.new(0.0264,1),
				NumberSequenceKeypoint.new(0.3,1),
				NumberSequenceKeypoint.new(0.5,1.5),
				NumberSequenceKeypoint.new(1,2),
			})
			--pe.Drag = 0.60000002384186
			pe.Transparency = NumberSequence.new({
				NumberSequenceKeypoint.new(0,0),
				NumberSequenceKeypoint.new(0.5,0),
				NumberSequenceKeypoint.new(1,1),
			})
			pe.Lifetime = NumberRange.new(1,2)
			pe.Rate = 100
			pe.SpreadAngle = Vector2.new(180, 180)
			pe.Parent = p
			pe.Enabled = false
			pe:Emit(75)
						blood_splat(p)
						for _,v in pairs(char:GetChildren()) do
							if v:IsA("BasePart") or v:IsA("UnionOperation") then
								explode_limb(plr,v,char,v.CFrame.upVector*-1,dmg)
							end
						end
						game:GetService("Debris"):AddItem(p,5)
						wait(0.2)
						dmged = false

					elseif limb and not dmged and (can_break or ragdolled[plr]) and (dmg >= 40 or dmg2 >= 40) then
						dmged = true
						did_break[bid] = true
						local d = dmg
						if dmg2 > dmg then
							d = dmg2
						end
						local p = Instance.new("Part")
						p.CanCollide = false
						p.Anchored = true
						p.Size = Vector3.new()
						p.Position = limb.Position
						p.Transparency = 1
						p.Parent = junk
						local impact = Instance.new("Sound",p)
						impact.Name = 'impact'
						impact.SoundId = 'rbxassetid://' .. impacts[math.random(1,#impacts)]
						impact.Volume = 0.1
						impact.PlayOnRemove = true
						impact:Destroy()
						local explode = Instance.new("Sound",p)
						explode.Name = 'expode'
						explode.SoundId = 'rbxassetid://' .. gores2[math.random(1,#gores2)]
						explode.Volume = 0.1
						explode.PlayOnRemove = true
						explode:Destroy()
						blood_splat(p)
						explode_limb(plr,limb,char,limb.CFrame.upVector*-1,d)
						game:GetService("Debris"):AddItem(p,2)
						wait(0.2)
						dmged = false

					end
				end)
			end
		end
		local curhealth = hum.Health
		hum.HealthChanged:Connect(function(newhealth)
			if check_godded(hum) then return end
			local dmg = (curhealth-newhealth)
			if curhealth > newhealth and torso --[[and hum.Health > 0]] then
				if dmg >= 30 or 0 >= newhealth then
					bid = bid + 1
					can_break = true
					wait(0.4)
					can_break = false
				end
				if dmg > 0 then
					if not did_break[bid] then
						bleed2(plr,torso,hum,false,(dmg/hum.MaxHealth)*10,false,torso.CFrame.upVector*-1)
					end
				end
			end
			curhealth = hum.Health
		end)
		hum.Died:Connect(function()
			ragdoll(char,true)
		end)
	end)
end

function chat(plr)
	plr.Chatted:Connect(function(msg)
		if msg:lower():sub(1,6) == 'tfall/' then
			local bool = msg:lower():sub(7)
			if bool == 'true' then
				toggle_enable(plr,true)
			elseif bool == 'false' then
				toggle_enable(plr,false)
			end
		end
	end)
end

for _,plr in pairs(game:GetService("Players"):GetPlayers()) do
	chat(plr)
	bind(plr,plr.Character)
	plr.CharacterAdded:Connect(function(char)
		bind(plr,char,true)
	end)
end

game:GetService("Players").PlayerAdded:Connect(function(plr)
	chat(plr)
	plr.CharacterAdded:Connect(function(char)
		bind(plr,char,true)
	end)
end)

while wait(1) do
	if not junk then
		junk = Instance.new("Folder",script)
	end
end
INFO