local player = game.Players.LocalPlayer
local character = player.Character
local localroot = character:WaitForChild("HumanoidRootPart")

local function closest()
    local range = 50
    local target = nil
    for _, v in pairs(game.Players:GetPlayers()) do
        if v ~= player and v.Character and not v.Character:FindFirstChildWhichIsA("ForceField") then
            local JN = v.Character:FindFirstChild("HumanoidRootPart")
            local JNR = v.Character:FindFirstChildOfClass("Humanoid")
            if JN and JNR.Health > 3 then
                local dist = (localroot.Position - JN.Position).magnitude
                if dist < range then
                    range = dist
                    target = v.Character
                end
            end
        end
    end
    return target
end

game.Players.LocalPlayer.CharacterAdded:Connect(function(char)
    character = char
    localroot = character:WaitForChild("HumanoidRootPart")
end)

local vh = closest()

game:GetService("RunService").Heartbeat:Connect(function()
    vh = closest()
end)

while game:GetService("RunService").Heartbeat:Wait() do
    if vh and vh:FindFirstChild("UpperTorso") then
        local vroot = vh:FindFirstChild("UpperTorso")
        local args = {
            [1] = 1,
            [2] = vh,
            [3] = 50,
            [4] = vroot
        }
        
        game:GetService("ReplicatedStorage").MainEvents.PUNCHEVENT:FireServer(unpack(args))
    end
end