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

Damages goes through 2 or more times. How to fix it?

Hello, I made a script that removes health from the stone and finds the damage of your pickaxe. I made a stone respawn, and when stone respawns, the damage goes through two or more times and I don’t know what to do.

ToolScript1 =

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local collect = game:GetService("CollectionService")
local Players = game:GetService("Players")

local Tool = script.Parent
local Remotes = ReplicatedStorage:FindFirstChild("Remotes")

local player = Players.LocalPlayer
local character = player.Character
local humanoid = character:FindFirstChild("Humanoid")
local PickaxeSwingAnim = Instance.new("Animation")
PickaxeSwingAnim.AnimationId = "rbxassetid://11458130668"
local animationTrack1 = humanoid:LoadAnimation(PickaxeSwingAnim)

local ToolConfig = require(ReplicatedStorage:FindFirstChild("Config"):FindFirstChild("ToolConfig"))
local OreConfig = require(ReplicatedStorage:FindFirstChild("Config"):FindFirstChild("OreConfig"))


local inventory = player:FindFirstChild("inventory")
local pickaxeName2 = Tool.Name
print("Found", player.Name, "Pickaxe Equipped Name!")
local pickaxe = player.Character:FindFirstChild(pickaxeName2)
print (pickaxeName2)
local pickaxeDmg = ToolConfig[pickaxeName2].Damage
local Ore = player.leaderstats.Ore

Tool.Activated:Connect(function(player: Player)
	if Tool.Enabled == true then
		local punch = false
		for tool, toolTable in pairs(ToolConfig) do
			if tool == pickaxeName2 then
				local Lezvie = script.Parent.Handle.Lezvie
				Remotes.ToolActivated:FireServer()
				animationTrack1:Play()
				Tool.Enabled = false
				humanoid.WalkSpeed = 0
				wait(0.75)
				Tool.Enabled = true
				humanoid.WalkSpeed = 16
				Lezvie.Touched:Connect(function(hit)
					if collect:HasTag(hit, "RockHitbox") then
						if punch == false then
								Remotes.OreDamaged:FireServer()
						end
						punch = true
					end
				end)

				punch = false
			end
		end
	end
end)




Remotes.OreDestroyed.OnClientEvent:Connect(function()
	Remotes.OreDestroyed:FireServer()
end)
Remotes.OreRespawn.OnClientEvent:Connect(function()
	Remotes.OreRespawn:FireServer()
end)

Rock script:

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local Remotes = ReplicatedStorage:FindFirstChild("Remotes")
local ToolConfig = require(ReplicatedStorage:FindFirstChild("Config"):FindFirstChild("ToolConfig"))
local OreConfig = require(ReplicatedStorage:FindFirstChild("Config"):FindFirstChild("OreConfig"))
local OreName = script.Parent.Name
local Ore = script.Parent
print(OreName)

local miningSound = Instance.new("Sound", Ore)
miningSound.SoundId = "rbxassetid://5772362759"
miningSound.Name = "MiningSound"

local OreDestroyed = false




Players.PlayerAdded:Connect(function()
	if not OreName.Health then
		local HP = Instance.new("IntValue", script.Parent)
		HP.Name = "Health"
		HP.Value = OreConfig[OreName].Health
	end
end)





Remotes.OreDamaged.OnServerEvent:Connect(function(player: Player)
	local OreL = player.leaderstats.Ore
	local pickaxeName = player.inventory.EquippedTool.Value
	local pickaxeDamage = ToolConfig[pickaxeName].Damage
	print(pickaxeDamage)
	local Tool = player.Character:FindFirstChild(pickaxeName)
	if OreDestroyed == false then
		local HP = script.Parent.Health
		print("02")
		HP.Value -= pickaxeDamage
		OreL.Value += pickaxeDamage
		print("02.1")
		miningSound:Play()
		print(HP.Value, "Rock HP.")
		if HP.Value == 0 then
			Remotes.OreDestroyed:FireClient(player)
		end
	end
end)




Remotes.OreDestroyed.OnServerEvent:Connect(function(player: Player)
	OreDestroyed = true
	Ore.Transparency = 1
	Ore.CanCollide = false
	Ore.CanTouch = false
	Ore.Hitbox.CanCollide = false
	Ore.Hitbox.CanTouch = false
	Remotes.OreRespawn:FireClient(player)
end)



Remotes.OreRespawn.OnServerEvent:Connect(function(player: player)
	local RespawnTime = 1
	wait(RespawnTime)
	OreDestroyed = false
	Ore.Transparency = 0
	Ore.CanCollide = true	
	Ore.CanTouch = true
	Ore.Hitbox.CanCollide = true
	Ore.Hitbox.CanTouch = true
	print("01")
	local Health = script.Parent.Health
	Health.Value = OreConfig[OreName].Health
	print("Rock health after RESPAWN:", Health.Value)
end)

Output:

  22:36:19.255  0 Rock HP.  -  Server - OreScript:46
  22:36:19.871  OsipStar4ik Used Pickaxe  -  Server - toolManger:13
  22:36:20.338  01  -  Server - OreScript:77
  22:36:20.338  Rock health after RESPAWN: 10  -  Server - OreScript:80
  22:36:22.687  OsipStar4ik Used Pickaxe  -  Server - toolManger:13
  22:36:22.954  1  -  Server - OreScript:37
  22:36:22.955  02  -  Server - OreScript:41
  22:36:22.955  02.1  -  Server - OreScript:44
  22:36:22.955  9 Rock HP.  -  Server - OreScript:46
  22:36:22.955  1  -  Server - OreScript:37
  22:36:22.955  02  -  Server - OreScript:41
  22:36:22.955  02.1  -  Server - OreScript:44
  22:36:22.955  8 Rock HP.  -  Server - OreScript:46

1 answer

✓ Accepted answer

It seems that what is happening in your code is that each time you swing your pickaxe, the code starts listening for touched events. The problem is simply that it doesn't stop listening for touches, so when you swing your pickaxe again, it will fire twice.

So, all you have to do is separate the two something like this:

Tool.Activated:Connect(function(player: Player)
	if Tool.Enabled == true then
		for tool, toolTable in pairs(ToolConfig) do
			if tool == pickaxeName2 then
				Remotes.ToolActivated:FireServer()
				animationTrack1:Play()
				active = true
				Tool.Enabled = false
				humanoid.WalkSpeed = 0
				wait(0.75)
				Tool.Enabled = true
active = false
				humanoid.WalkSpeed = 16
			end
		end
	end
end)

local Lezvie = script.Parent.Handle.Lezvie
punch = false
Lezvie.Touched:Connect(function(hit)
	if punch == false then
		punch = true
		if active == true then
			if collect:HasTag(hit, "RockHitbox") then
				Remotes.OreDamaged:FireServer()
			end
		end
		punch = false
	end
end)

(EDIT FOR CLARITY)

This code is for Toolscript1, and replaces the code that was

Tool.Activated:Connect(function(player: Player)
	if Tool.Enabled == true then
...
end)

from lines 27 to 53 in the original code.

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