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

How do you make a weapon do damage only to NPC's and not players?

I want to make a game that is so you can't hurt other players, but can hurt humanoid NPC's can somebody help me with how to do this? I've searched for videos and googled it but there wasn't anything on this specific topic. Please reply and help.

Thank you!

2 answers

✓ Accepted answer

You could use a Player check using GetPlayerFromCharacter()?

local Players = game:GetService('Players')

Blade.Touched:Connect(function(Hit)
	local Player = Players:GetPlayerFromCharacter(Hit.Parent)
	if not Player then -- makes sure isn't player
	local Humanoid = hit.Parent:FindFirstChild('Humanoid') -- finds humanoid
	if Humanoid then
		-- damage stuff here
	end
end)

How would I implement the script into this knife script?

local parent = script.Parent
local Handle = parent:WaitForChild("Handle")
local Creator = parent:WaitForChild("Creator")
CanDmg = false
Can = true
parent.Equipped:Connect(function()
	Handle.Equip:Play()
	if Creator.Value == nil then
	Creator.Value = parent.Parent end
end)
parent.Unequipped:Connect(function()
	Handle.UnEquip:Play()
end)
repeat wait() until Creator.Value ~= nil
parent.Activated:Connect(function()
	if Handle.Transparency == 1 then return end
	function slash()
		print("hip")
		local creator = Creator.Value
		local Animations = parent:WaitForChild("Animations")
		local AnimChild = Animations:GetChildren()
		local AnimRad = math.random(1,#AnimChild)
		local AnimSel = AnimChild[AnimRad]
		local AP = creator:WaitForChild("Humanoid"):LoadAnimation(AnimSel)
		if Can == true then
		Can = false
		AP:Play()
		wait(0.15)
		CanDmg = true
		Handle.Swing:Play()
		Handle.SlashTrail.Enabled = true
		wait(0.25)
		CanDmg = false
		Handle.SlashTrail.Enabled = false
		wait(0.06)
		Can = true
		end
	end
	slash()
end)
function on(t)
	local h = t.Parent:FindFirstChildOfClass("Humanoid")
	if h ~= nil and CanDmg == true then
		CanDmg = false
		local cre = Creator.Value
		h:TakeDamage(parent.Dmg.Value)
		Handle.Swing:Stop()
		Handle.Hit:Play()
		if h.Health>0 then
		if not h:FindFirstChild("creator") then
	        local ov = Instance.new("ObjectValue",h)
	        ov.Name = "creator"
	        ov.Value = game.Players:WaitForChild(cre.Name)
	        else
			local ovs = h:GetChildren()
			for i = 1,#ovs do
			if (ovs[i].Name == "creator") then
	        ovs[i].Value = game.Players:WaitForChild(cre.Name) end
			end
			end
		end
	end
end
Handle.Touched:Connect(on)

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