Problem with a blood system

So, I was doing a blood system and I decided to replicate the Blood Flow blood splat system [ A meat ball fly of your body when you get hitted, and when it touchs the floor or wall, the blood splat litteraly stick to the wall / floor. ] but I didn’t get sucess. I did something that really look liked it, but it isn’t veeeryy perfect. [ Footage - Blood warning. ]:


image


Has you probably see, the blood splat doesn’t stick on the wall, and sometimes it just float, here’s my Script.


Version for Dummies:


local TS = game:GetService('TweenService')

local TweenInfo = TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.InOut)


local RS = game:GetService('ReplicatedStorage')

local Blood01 = RS.BloodParts.Blood01

local BloodTrail01 = RS.BloodParts.BloodTrail01


local Character = script.Parent

local Humanoid = Character:WaitForChild('Humanoid')


local OldHealth = Humanoid.Health


local BodyParts = {'Left Arm', 'Left Leg', 'Right Arm', 'Right Leg', 'Torso', 'HumanoidRootPart', 'Head', 'Handle'}


Debounce = false


Humanoid.HealthChanged:Connect(function(NewHealth)


	local HealthDifference = OldHealth - NewHealth


	OldHealth = NewHealth


	local NumberOfDrops = HealthDifference / 1
	
	
	local BloodParts = game:GetService('Workspace').BloodParts
	

	if HealthDifference <= 0 then


		return


	end


	if Debounce == false then


		Debounce = true


		local BloodTrailClone = BloodTrail01:Clone()

		BloodTrailClone.Parent = BloodParts

		BloodTrailClone.Position = Humanoid.RootPart.Position

		BloodTrailClone.Anchored = false

		BloodTrailClone.CanCollide = false


		local BodyVelocity = Instance.new('BodyVelocity', BloodTrailClone)

		BodyVelocity.MaxForce = Vector3.new(9999999999, 9999999999, 9999999999)

		BodyVelocity.P = Humanoid.RootPart.Position

		BodyVelocity.Velocity = Vector3.new(math.random(-5, 5), 50, math.random(-5, 5))


		wait(0.1)


		BloodTrailClone.CanCollide = true

		BodyVelocity:Destroy()


		BloodTrailClone.Touched:Connect(function(Hit)


			BloodTrailClone.Touched:Connect(function(Hit)


				local BloodDrop


				if Hit.Name ~= 'Blood01' and Hit.Name ~= 'BloodTrail01' and Hit.Name ~= 'Head' and Hit.Name ~= 'Handle' and Hit.Name ~= 'Left Arm' and Hit.Name ~= 'Right Arm' and Hit.Name ~= 'Left Leg' and Hit.Name ~= 'Right Leg' and Hit.Name ~= 'Torso' and Hit.Name ~= 'HumanoidRootPart' and Hit.Name ~= 'ToolMesh' and Hit.CanCollide ~= false and Hit.Transparency == 0 then


					BloodTrailClone.Transparency = 1


					local BloodDropSize = math.random(0.1 * 10, 2 * 10) / 10


					BloodDrop = Blood01:Clone()


					BloodDrop.Size = Vector3.new(0, 0, 0)


					local PositionX = BloodTrailClone.Position.X + math.random(-10, 10) / 10

					local PositionY = BloodTrailClone.Position.Y

					local PositionZ = BloodTrailClone.Position.Z + math.random(-10, 10) / 100


					BloodDrop.Position = Vector3.new(PositionX, PositionY, PositionZ)

					BloodDrop.Parent = BloodParts

					BloodDrop.CanCollide = true

					BloodDrop.Anchored = false


					BloodTrailClone:Destroy()


					TS:Create(BloodDrop, TweenInfo, {Size = Vector3.new(0.05, BloodDropSize, BloodDropSize)}):Play()


				end


				BloodDrop.Touched:Connect(function(Hit)


					if Hit.Name ~= 'Blood01' and Hit.Name ~= 'BloodTrail01' and Hit.Name ~= 'Head' and Hit.Name ~= 'Handle' and Hit.Name ~= 'Left Arm' and Hit.Name ~= 'Right Arm' and Hit.Name ~= 'Left Leg' and Hit.Name ~= 'Right Leg' and Hit.Name ~= 'Torso' and Hit.Name ~= 'HumanoidRootPart' and Hit.Name ~= 'ToolMesh' and Hit.CanCollide ~= false and Hit.Transparency == 0 then


						BloodDrop.Anchored = true

						BloodDrop.Orientation = Blood01.Orientation

						BloodDrop.CanCollide = false


					end


				end)


				game:GetService('Debris'):AddItem(BloodDrop, 15)


			end)


		end)


		wait(0.1)


		Debounce = false


	end
	
	
end)

Version for Players:


local TS = game:GetService('TweenService')

local TweenInfo = TweenInfo.new(1, Enum.EasingStyle.Quint, Enum.EasingDirection.InOut)


local RS = game:GetService('ReplicatedStorage')

local Blood01 = RS.BloodParts.Blood01

local BloodTrail01 = RS.BloodParts.BloodTrail01


local BodyParts = {'Left Arm', 'Left Leg', 'Right Arm', 'Right Leg', 'Torso', 'HumanoidRootPart', 'Head', 'Handle'}


local Players = game:GetService('Players')


Debounce = false


Players.PlayerAdded:Connect(function(Player)


	Player.CharacterAdded:Connect(function(Character)


		local Humanoid = Character:WaitForChild('Humanoid')

		local OldHealth = Humanoid.Health


		Humanoid.HealthChanged:Connect(function(NewHealth)


			local HealthDifference = OldHealth - NewHealth


			OldHealth = NewHealth


			local NumberOfDrops = math.floor(HealthDifference / 1)


			local BloodParts = game:GetService('Workspace').BloodParts


			if HealthDifference <= 0 then


				return


			end
			
			
			if Debounce == false then
				
				
				Debounce = true
				
				
				local BloodTrailClone = BloodTrail01:Clone()

				BloodTrailClone.Parent = BloodParts

				BloodTrailClone.Position = Humanoid.RootPart.Position

				BloodTrailClone.Anchored = false

				BloodTrailClone.CanCollide = false


				local BodyVelocity = Instance.new('BodyVelocity', BloodTrailClone)

				BodyVelocity.MaxForce = Vector3.new(9999999999, 9999999999, 9999999999)

				BodyVelocity.P = Humanoid.RootPart.Position

				BodyVelocity.Velocity = Vector3.new(math.random(-5, 5), 50, math.random(-5, 5))


				wait(0.1)


				BloodTrailClone.CanCollide = true

				BodyVelocity:Destroy()


				BloodTrailClone.Touched:Connect(function(Hit)


					BloodTrailClone.Touched:Connect(function(Hit)


						local BloodDrop


						if Hit.Name ~= 'Blood01' and Hit.Name ~= 'BloodTrail01' and Hit.Name ~= 'Head' and Hit.Name ~= 'Handle' and Hit.Name ~= 'Left Arm' and Hit.Name ~= 'Right Arm' and Hit.Name ~= 'Left Leg' and Hit.Name ~= 'Right Leg' and Hit.Name ~= 'Torso' and Hit.Name ~= 'HumanoidRootPart' and Hit.Name ~= 'ToolMesh' and Hit.CanCollide ~= false and Hit.Transparency == 0 then


							BloodTrailClone.Transparency = 1


							local BloodDropSize = math.random(0.1 * 10, 2 * 10) / 10


							BloodDrop = Blood01:Clone()


							BloodDrop.Size = Vector3.new(0, 0, 0)


							local PositionX = BloodTrailClone.Position.X + math.random(-10, 10) / 10

							local PositionY = BloodTrailClone.Position.Y

							local PositionZ = BloodTrailClone.Position.Z + math.random(-10, 10) / 100


							BloodDrop.Position = Vector3.new(PositionX, PositionY, PositionZ)

							BloodDrop.Parent = BloodParts

							BloodDrop.CanCollide = true

							BloodDrop.Anchored = false


							BloodTrailClone:Destroy()


							TS:Create(BloodDrop, TweenInfo, {Size = Vector3.new(0.05, BloodDropSize, BloodDropSize)}):Play()


						end


						BloodDrop.Touched:Connect(function(Hit)


							if Hit.Name ~= 'Blood01' and Hit.Name ~= 'BloodTrail01' and Hit.Name ~= 'Head' and Hit.Name ~= 'Handle' and Hit.Name ~= 'Left Arm' and Hit.Name ~= 'Right Arm' and Hit.Name ~= 'Left Leg' and Hit.Name ~= 'Right Leg' and Hit.Name ~= 'Torso' and Hit.Name ~= 'HumanoidRootPart' and Hit.Name ~= 'ToolMesh' and Hit.CanCollide ~= false and Hit.Transparency == 0 then


								BloodDrop.Anchored = true

								BloodDrop.Orientation = Blood01.Orientation

								BloodDrop.CanCollide = false


							end


						end)


						game:GetService('Debris'):AddItem(BloodDrop, 15)


					end)


				end)
				
				
				wait(0.1)
				
				
				Debounce = false
				
				
			end
			
			
		end)


	end)


end)

  • Tsu Washington / SovietFurryBruh.
3 Likes

This doesn’t answer your question but I’d review ToS and Community Rules before implementing something like this, it seems like a potential violation.

1 Like

I’ve seen a bunch of games with blood content, a bunch of blood content to be honest, and they didn’t get banned: Phantom Forces, Combat Warriors, Survival of the Fittest, and copies of Blood Flow that uses free models.

1 Like

Use raycast instead of touched

1 Like

I should cast a ray in all the sides of the meatball?

Sorry for necroposting, I know I made this topic 3 years ago but… I found the solution later that year, and have been improving on it since then.

note: do this on the client, the client will be more accurate than the server in this situation.

local function CreateHitbox(BloodDrip: BasePart)
	local LastPosition = BloodDrip.Position
	local Connection
	Connection = game:GetService("RunService").RenderStepped:Connect(function(DeltaTime)
		local Result = workspace:Raycast(BloodDrip.Position, (BloodDrip.Position - LastPosition).Unit * (DeltaTime * 60) * 1.5)
		if Result then
			Connection:Disconnect()
			BloodDrip.Anchored = true
			BloodDrip.CFrame = CFrame.new(Result.Position, Result.Position - Result.Normal) * CFrame.Angles(math.rad(90), 0, 0)
			BloodDrip.Size = Vector3.new(1, 0, 1)
			BloodDrip.Transparency = 0.5
		end
		LastPosition = BloodDrip.Position
	end)
	
	task.delay(3, function()
		if Connection.Connected then
			Connection:Disconnect()
			BloodDrip:Destroy()
		end
	end)
end

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.