ForceField Unable to Prevent Damage

  1. What do you want to achieve? Honestly the main thing I want to do is just make my character take no damage when they reach a certain hp number (basically shows they are “knocked”). My way of working around this (because I saw it was impossible to do that (have a humanoid take no damage) from a similar post on dev forums) was using a forcefield but the forcefield doesn’t work.

  2. What is the issue? As I previously stated, the forcefield doesn’t work or do the job of preventing damage. I included a video for you which goes over the code at the end which you probably don’t need to see because I pasted it in here.
    Dropbox - Health.rbxl - Roblox Studio.mp4 - Simplify your life

  3. What solutions have you tried so far? Quite frankly I am so confused because isn’t a forcefield supposed to prevent damage to the humanoid according to the documentation on it? I tried many things such as adding in an if statement and a damage variable but to no avail. I previously even had a zombie spawner model but figured it took damage by taking away from my health explaining why the forcefield wasn’t working but I guess I was wrong.

-- Quick kill script I made in workspace --
local part = script.Parent
local db = true


part.Touched:Connect(function(otherpart, damage)
	local humanoid = otherpart.Parent:FindFirstChild("Humanoid")
	if humanoid then
		if not otherpart.Parent:FindFirstChild("force") and db == true then
			db = false
			humanoid:TakeDamage(5)
			task.wait(0.5)
			db = true
		end
	end
end)

-- Server Script in ScriptService --
local rs = game:GetService("ReplicatedStorage")
local peel = rs.peel

local function fuse(player, charac, humanoid)
	local animateScript = charac:WaitForChild("Animate")
	local animation1 = animateScript.idle:WaitForChild("Animation1")
	animation1.AnimationId = "rbxassetid://14237514199"
	local animation2 = animateScript.idle:WaitForChild("Animation2")
	animation2.AnimationId = "rbxassetid://14237514199"
	humanoid.WalkSpeed = 0.5
	humanoid.JumpPower = 0
	humanoid.AutoRotate = false
end

peel.OnServerEvent:Connect(fuse)

-- Local Script in ScreenGUI -- 
local rs = game:GetService("ReplicatedStorage")
local peel = rs.peel

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local hum = character:WaitForChild("Humanoid")

local function giveForcefield()
		local forceField = Instance.new("ForceField")
		forceField.Visible = true
		forceField.Parent = character
end

hum.HealthChanged:Connect(function(health)
	if health <= 80 then
		local forceField = Instance.new("ForceField")
		forceField.Name = "force"
		forceField.Visible = true
		forceField.Parent = character
		peel:FireServer(character, hum)
	end
	local screenui = script.Parent
	local hpbar  = screenui.Frame.hpbar
	local hp = health / hum.MaxHealth
	hpbar:TweenSize(UDim2.new(hp,0,1,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5)
	task.wait(0.1)
end)

Thank you for the help in advance!

It’s because you’re adding the forcefield on the client, so other server scripts won’t be able to see it.

Change your local script to this:

--//Services
local Players = game:GetService("Players")
local rs = game:GetService("ReplicatedStorage")

--//Variables
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local hum = character:WaitForChild("Humanoid")
local peel = rs.peel

--//Functions
hum.HealthChanged:Connect(function(health)
	if health <= 80 then
		peel:FireServer(character, hum)
	end
	
	local screenui = script.Parent
	local hpbar  = screenui.Frame.hpbar
	local hp = health / hum.MaxHealth
	hpbar:TweenSize(UDim2.new(hp,0,1,0), Enum.EasingDirection.Out, Enum.EasingStyle.Quad, 0.5)
	task.wait(0.1)
end)

And the server script to this:

--//Services
local rs = game:GetService("ReplicatedStorage")

--//Variables
local peel = rs.peel

--//Functions
local function fuse(player, charac, humanoid)
	local forceField = Instance.new("ForceField")
	forceField.Name = "force"
	forceField.Visible = true
	forceField.Parent = character
	
	task.delay(5, forceField.Destroy, forceField)
	
	local animateScript = charac:WaitForChild("Animate")
	
	local animation1 = animateScript.idle:WaitForChild("Animation1")
	animation1.AnimationId = "rbxassetid://14237514199"
	
	local animation2 = animateScript.idle:WaitForChild("Animation2")
	animation2.AnimationId = "rbxassetid://14237514199"
	
	humanoid.WalkSpeed = 0.5
	humanoid.JumpPower = 0
	humanoid.AutoRotate = false
end

peel.OnServerEvent:Connect(fuse)

(5 is the amount of time the forcefield will last for)

1 Like

Oh my days, I am so dumb… Thank you so much it worked!

1 Like

No problem, it was only a small issue. Have a good day!

1 Like

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