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

Can someone please advise where I should place a debounce?

Hey all,

I have a sword script that kills the opponent perfectly. However, there is a line in there that adds to the "Spree" stat. What happens is that, instead of one increment, it does multiple increments. I know that I need a debounce, but Where?

The entire script is around 170 lines long, but I have put down the place where it needs a debounce. Just to note: This was not the original script from where I got it from. If you want me to put in the original script, leave a comment.

Faulty Section

function blow(hit)
	local humanoid = hit.Parent:findFirstChild("Humanoid")
	local vCharacter = Tool.Parent
	local vPlayer = game.Players:playerFromCharacter(vCharacter)
	local hum = vCharacter:findFirstChild("Humanoid") -- non-nil if tool held by a character
	if humanoid~=nil and humanoid ~= hum and hum ~= nil then
		-- final check, make sure sword is in-hand

		local right_arm = vCharacter:FindFirstChild("Right Arm")
		if (right_arm ~= nil) then
			local joint = right_arm:FindFirstChild("RightGrip")
			if (joint ~= nil and (joint.Part0 == sword or joint.Part1 == sword)) then
				tagHumanoid(humanoid, vPlayer)
				humanoid:TakeDamage(damage)
				if humanoid.Health <= 0 and FindTag(humanoid,vPlayer) == true then
					vPlayer.leaderstats.Spree.Value = vPlayer.leaderstats.Spree.Value +1
				end
				wait(1)
				untagHumanoid(humanoid)
			end
		end


	end
end

Full Script

r = game:service("RunService")


local damage = 5


local slash_damage = 8
local lunge_damage = 12

sword = script.Parent.Handle
Tool = script.Parent


local SlashSound = Instance.new("Sound")
SlashSound.SoundId = "rbxasset://sounds\\swordslash.wav"
SlashSound.Parent = sword
SlashSound.Volume = .7
SlashSound.Pitch = .9

local LungeSound = Instance.new("Sound")
LungeSound.SoundId = "rbxasset://sounds\\swordlunge.wav"
LungeSound.Parent = sword
LungeSound.Volume = .6
LungeSound.Pitch = .9

local UnsheathSound = Instance.new("Sound")
UnsheathSound.SoundId = "rbxasset://sounds\\unsheath.wav"
UnsheathSound.Parent = sword
UnsheathSound.Volume = 1


function blow(hit)
	local humanoid = hit.Parent:findFirstChild("Humanoid")
	local vCharacter = Tool.Parent
	local vPlayer = game.Players:playerFromCharacter(vCharacter)
	local hum = vCharacter:findFirstChild("Humanoid") -- non-nil if tool held by a character
	if humanoid~=nil and humanoid ~= hum and hum ~= nil then
		-- final check, make sure sword is in-hand

		local right_arm = vCharacter:FindFirstChild("Right Arm")
		if (right_arm ~= nil) then
			local joint = right_arm:FindFirstChild("RightGrip")
			if (joint ~= nil and (joint.Part0 == sword or joint.Part1 == sword)) then
				tagHumanoid(humanoid, vPlayer)
				humanoid:TakeDamage(damage)
				if humanoid.Health <= 0 and FindTag(humanoid,vPlayer) == true then
					vPlayer.leaderstats.Spree.Value = vPlayer.leaderstats.Spree.Value +1
				end
				wait(1)
				untagHumanoid(humanoid)
			end
		end


	end
end

function FindTag(humanoid,player)
	children = humanoid:GetChildren()
	for i=1,#children do
		if children[i].Name == "creator" and children[i].Value == player then return true 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


function attack()
	damage = slash_damage
	SlashSound:play()
	local anim = Instance.new("StringValue")
	anim.Name = "toolanim"
	anim.Value = "Slash"
	anim.Parent = Tool
end

function lunge()
	damage = lunge_damage

	LungeSound:play()

	local anim = Instance.new("StringValue")
	anim.Name = "toolanim"
	anim.Value = "Lunge"
	anim.Parent = Tool
	
	
	force = Instance.new("BodyVelocity")
	force.velocity = Vector3.new(0,10,0) --Tool.Parent.Torso.CFrame.lookVector * 80
	force.Parent = Tool.Parent.Torso
	wait(.2)
	swordOut()
	wait(.2)
	force.Parent = nil
	wait(.4)
	swordUp()

	damage = slash_damage
end

function swordUp()
	Tool.GripForward = Vector3.new(-1,0,0)
	Tool.GripRight = Vector3.new(0,1,0)
	Tool.GripUp = Vector3.new(0,0,1)
end

function swordOut()
	Tool.GripForward = Vector3.new(0,0,1)
	Tool.GripRight = Vector3.new(0,1,0)
	Tool.GripUp = Vector3.new(1,0,0)
end

function swordAcross()
	-- parry
end


Tool.Enabled = true
local last_attack = 0
function onActivated()

	if not Tool.Enabled then
		return
	end

	Tool.Enabled = false

	local character = Tool.Parent;
	local humanoid = character.Humanoid
	if humanoid == nil then
		print("Humanoid not found")
		return 
	end

	t = r.Stepped:wait()

	if (t - last_attack < .2) then
		lunge()
	else
		attack()
	end

	last_attack = t

	--wait(.5)

	Tool.Enabled = true
end


function onEquipped()
	UnsheathSound:play()
end


script.Parent.Activated:connect(onActivated)
script.Parent.Equipped:connect(onEquipped)


connection = sword.Touched:connect(blow)

2 comments

0

Put the debounce if statement right at the start of the function, and set the debounce to true at the start, and false at the end.

0

@TheDeadlyPanther: Which function?

1 answer

✓ Accepted answer

You don't want debounce. Instead of repeatedly telling the game you killed someone when they're already dead, make sure they're not already dead before you try to say you killed them. You can only kill someone once before they're dead.

It also isn't exactly necessary to check for the weld to the tool; that's really just to make sure you're alive. Here's what it should look like:

function blow(hit)
	local humanoid=hit.Parent:FindFirstChild("Humanoid")
	local vCharacter=Tool.Parent
	local vPlayer=game.Players:GetPlayerFromCharacter(vCharacter)
	local hum=vCharacter:FindFirstChild("Humanoid")
	if humanoid~=hum and humanoid and hum then
		if humanoid.Health>0 and hum.Health>0 then
			tagHumanoid(humanoid,vPlayer)
			humanoid:TakeDamage(damage)
			if humanoid.Health<=0 and FindTag(humanoid,vPlayer)then
				vPlayer.leaderstats.Spree.Value=vPlayer.leaderstats.Spree.Value+1
			end
			wait(1)
			untagHumanoid(humanoid)
		end
	end
end

2 comments

0

So now if I kill him I SHOULD be rewarded once?

0

will

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