Checking if player is in part/touching part for multiplier, simulator

I am currently trying to make a simulator which includes a training zone, I’m not sure how you can detect if a player is touching without using a while loop. People have told me to use touched and touchended but I am unsure on how to use it.
This is my current code: (tool)

local tool = script.Parent
local Player = tool.Parent.Parent
local leaderstat = Player.leaderstats
local zone1 = workspace.Psychic
tool.Activated:Connect(function()
	if zone1.Touched then
		leaderstat.Psychic.Value +=2
	else
		leaderstat.Psychic.Value +=1
	end
end)

I think this is what you want:

local tool = script.Parent
local Player = tool.Parent.Parent
local leaderstat = Player.leaderstats
local PlayersTouching = {}
local zone1 = workspace.Psychic
tool.Activated:Connect(function()
	game:GetService("RunService").Heartbeat:Connect(function()
		zone1.Touched:Connect(function(Part)
			local PlayerTouched = Players:GetPlayerFromCharacter(Part.Parent)
			if PlayerTouched == Player then
				PlayersTouching[Player] = true
			end
		end)
		zone1.TouchEnded:Connect(function(Part)
			local PlayerTouched = Players:GetPlayerFromCharacter(Part.Parent)
			if PlayerTouched == Player then
				PlayersTouching[Player] = nil
			end
		end)
	end)
	task.spawn(function()
		while task.wait(1) do
			for _, PlayerTouching in pairs(game:GetService("Players"):GetPlayers()) do
				if PlayersTouching[PlayerTouching] and PlayerTouching == Player then
					leaderstat.Psychic.Value += 2
				elseif PlayerTouching == Player then
					leaderstat.Psychic.Value += 1
				end
			end
		end
	end)
end)

I tried this but it caused lag and didnt stop raising a stat when i click standing anywhere with the tool. If i touch the part then it adds 2 but infinitely grows in numbers.
also sorry for responding 4 days late

.touched would fire many times without a debounce.

Also, your really adding Physics Value, never resetting it to 1 or staying at 2, not sure what your trying to do but…

Your code:

	if zone1.Touched then
		leaderstat.Psychic.Value +=2
	else
		leaderstat.Psychic.Value +=1
	end

What you could do:

if zone1.Touched then
	leaderstat.Psychic.Value = 2
else
	leaderstat.Psychic.Value = 1 -- This is the default multiplier I'm assuming?

end

so basically,
training game with psychic - you click tool to add psychic, +1 stat, and when you stand in/on a certain part you get +2 stat. Not setting the value of it to 1 or 2.