Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

How can I make a sword that doesn't damage other players, only NPCs?

I'm making an RPG, but I'm still a beginner scripter and I don't know how to make it check if it's a player or a npc. I'd like it to only hit the npc and not other players.

Here's the damage script of the sword:

local Tool = script.Parent
local Time = 0
local C0 = script.Parent.Combo.C0
local C1 = script.Parent.Combo.C1
local Debris = game:GetService("Debris")
local players = game:GetService("Players")

C0.OnServerEvent:Connect(function(plr,Part,d)
	Enable = true
	Time = 0
		Part.Touched:Connect(function(hit)
		if Time == 0 and Enable == true then
			if hit.Parent:FindFirstChild("Humanoid") ~= nil and hit.Parent:WaitForChild("Humanoid").Health ~= 0 and not hit.Parent:FindFirstChild("AlreadyHit") then
				local Check = Instance.new("IntValue", hit.Parent)
				Check.Name = "AlreadyHit"
				game.Debris:AddItem(Check ,0.625)
				local vCharacter = Tool.Parent
				local vPlayer = game.Players:GetPlayerFromCharacter(vCharacter)
				local Humanoid = hit.Parent:WaitForChild("Humanoid")
				local sound = script.Hit:Clone()
				sound.Parent = hit.Parent
				sound:Play()
				TagHumanoid(Humanoid, vPlayer)
				Humanoid:TakeDamage(script.Parent.Damage.Value)
				wait(0.25)
				UntagHumanoid(Humanoid)
			end
	   end
	end)
end)
C1.OnServerEvent:Connect(function(plr,Part,d)
	Enable = true
	Time = 0
		Part.Touched:Connect(function(hit)
		if Time == 0 and Enable == true then
			if hit.Parent:FindFirstChild("Humanoid") ~= nil and hit.Parent:WaitForChild("Humanoid").Health ~= 0 and not hit.Parent:FindFirstChild("AlreadyHit") then
				local Check = Instance.new("IntValue", hit.Parent)
				Check.Name = "AlreadyHit"
				game.Debris:AddItem(Check ,1)
				local vCharacter = Tool.Parent
				local vPlayer = game.Players:GetPlayerFromCharacter(vCharacter)
				local Humanoid = hit.Parent:WaitForChild("Humanoid")
				local sound = script.Hit:Clone()
				sound.Parent = hit.Parent
				sound:Play()
				TagHumanoid(Humanoid, vPlayer)
				Humanoid:TakeDamage(script.Parent.Damage.Value)
				wait(0.25)
				UntagHumanoid(Humanoid)
			end
	   end
	 end)
end)

function TagHumanoid(humanoid, player)
	local creator_tag = Instance.new("ObjectValue")
	creator_tag.Value = player
	creator_tag.Name = "creator"
	creator_tag.Parent = humanoid
end

function UntagHumanoid(humanoid)
	if humanoid ~= nil then
		local tag = humanoid:findFirstChild("creator")
		if tag ~= nil then
			tag.Parent = nil
		end
	end
end

while wait(1) do
	Time = Time + 1
	if Time == 0 then
		Time = 1
	end
end

1 answer

✓ Accepted answer

Try checking if the NPC is in the player folder, if it isn't then it's an NPC (since they aren't actual players)

-- localscript in sword

-- inside the blade touch event or whatever you use to detect sword hits, "hit" being the object that got hit

if hit.Parent:FindFirstChild("Humanoid") then
	-- its some sort of player/NPC
	if game.Players:FindFirstChild(hit.Parent.Name) then
		-- its an actual player
	else
		-- not in the players folder, NPC
		-- damage code goes here.
	end
end)

the code I wrote is obviously very simplified but the idea remains, check the name of the parent of the hit (for example, the sword hits a torso, the parent would be the character) and check if it's name is in the player folder. if it is, it's a real player, if not, it's an NPC.

1 comment

0

Wow, thanks a lot!

This discussion is preserved as it was. New answers, comments, and votes are closed.