I have a script that attacks the player and throws either left or right punches and does random damage. It’s suppose to do 0 damage when the player’s “IsBlocking” attribute is true, but for some reason the NPC will just ignore if the player IsBlocking or not and do 0 damage randomly.
Script:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local targetedPlayer = nil
local playerIsBlocking = nil
local function DealDamage(player, damage)
local character = player.Character
if character then
local humanoid = character:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = humanoid.Health - damage
print(damage)
end
end
end
local function GetDamageForPunchType(punchType)
if targetedPlayer then
playerIsBlocking = targetedPlayer:GetAttribute("IsBlocking")
if playerIsBlocking == true then
return 0
elseif punchType == "LeftPunch" then
return math.random(1, 2)
elseif punchType == "RightPunch" then
return math.random(1, 2)
end
end
end
local function GetNearestPlayer(position, maxDistance)
local players = Players:GetPlayers()
local nearestPlayer
local shortestDistance = maxDistance
for _, player in pairs(players) do
local character = player.Character
if character and character:FindFirstChild("Humanoid") then
local distance = (position - character:WaitForChild("Humanoid").Parent.PrimaryPart.Position).Magnitude
if distance < shortestDistance then
nearestPlayer = player
shortestDistance = distance
end
end
end
targetedPlayer = nearestPlayer
return nearestPlayer
end
local function ThrowPunch(npc, actionName, animationId)
local Remote = ReplicatedStorage:WaitForChild(actionName .. "Remote")
local Animation = Instance.new("Animation")
Animation.AnimationId = animationId
local function PlayPunch()
local humanoid = npc:WaitForChild("Humanoid")
local position = humanoid.Parent.PrimaryPart.Position
local nearestPlayer = GetNearestPlayer(position, 5)
if nearestPlayer then
humanoid:LoadAnimation(Animation):Play()
local damage = GetDamageForPunchType(actionName)
DealDamage(nearestPlayer, damage)
Remote:InvokeClient(nearestPlayer)
end
end
local function PunchLoop()
while wait(1) do
PlayPunch()
end
end
task.spawn(PunchLoop)
end
local npc = script.Parent
while wait(math.random(1, 2)) do
local punchTypes = {
{ type = "LeftPunch", animationId = "rbxassetid://15479380094" },
{ type = "RightPunch", animationId = "rbxassetid://15476721938" }
}
local punchInfo = punchTypes[math.random(1, #punchTypes)]
ThrowPunch(npc, punchInfo.type, punchInfo.animationId)
end