Okay, so I've been trying to figure this one out for the past 3 days.

For some context, I created a Gui inventory for the player that lets him equip armor that change his stats (melee, def etc..) I also created a stats Gui that lets the player see the bonus stats he got from the current armor equipped. When armor is equipped it updates the players damage total (dmgt.Value in script below) by adding normal damage and bonus damage values. This all works I tested it and the change can be seen in the stats Gui and in the values while the game is running in studio.

Now for my problem. When I equip some armor and hit my dummy with my tool the damage total is not being updated. I tried many different things including using a refresh function inside the Tool.Handle.Touched function, I tried placing my variables outside the functions but nothing seems to work. This script is located inside the Tool. You can see I'm trying to update dmgt.Value on line [68] which does nothing either.

When I level up through a script in ServerScriptService the normal damage value change is registered but the damage Bonus Value remains the default so maybe it has something to do with my Armor Gui's local script that is changing my player's stat values? But then why does my stat Gui detect the change and display the correct numbers but not the script in my Tool?

Tool = script.Parent

local touchenabled = true
local swinging = false
local en = true
local animnumber = 1
local timer = tick()



Tool.Activated:Connect(function()
	if en == false then return end
	en = false
	
	if tick()-timer > 3 then
		animnumber = 1
	end
	
	timer = tick()
	local char = Tool.Parent
	local hum = char.Humanoid
	local anim = hum:LoadAnimation(script.Parent["Animation"..animnumber]) -- Animation1, Animation2 and Animation 3
	anim:Play()
	swinging = true
	touchenabled = true
	wait(0.4)
	swinging = false
	animnumber = animnumber + 1
	
	if animnumber >= 5 then   -- if number of animations is greater then 5 reset to first anim
		animnumber = 1
		wait()
	end
	
	en = true
	
end)

Tool.Handle.Touched:Connect(function(hit)
	if not swinging then return end
	if touchenabled == false then return end
	touchenabled = false
	
	if hit and hit.Parent:findFirstChild("HitBox") and hit.Parent:FindFirstChild("Parry").Value == false then      -- checks for HitBox target and not parrying 
		touchenabled = false

		local char = Tool.Parent
		local playerhum = char:FindFirstChild("Humanoid")
		local PlayersService = game:GetService("Players")
		local player = PlayersService:GetPlayerFromCharacter(Tool.Parent)
		local ms = player.PlayerGui:FindFirstChild("Masterstats")
		local dmgt = ms:FindFirstChild("DmgT")
		
		print("old damage total..."..dmgt.Value)
		
		local playerposition = char.HumanoidRootPart.CFrame.LookVector

		
		local rootpart = hit.Parent:FindFirstChild("HumanoidRootPart")
		
		local position = Instance.new("BodyVelocity", rootpart)
		position.MaxForce = Vector3.new(9999999,9999999,9999999)
		position.P = 0
		position.Velocity = playerposition * 25
		 																					
				
		--here
		dmgt.Value = ms:FindFirstChild("Dmg").Value + ms:FindFirstChild("DmgB").Value 
		
		hit.Parent:findFirstChild("Humanoid"):TakeDamage(dmgt.Value)

		print("new damage total..."..dmgt.Value) 
		
		game.Debris:AddItem(position, 0.5)	
		return
	end
end)