Roblox Studio 反 Noclip 脚本

问题描述 投票:0回答:1

我一直在尝试制作一个Anti-Noclip脚本,但效果不太好。有人可以帮助我或告诉我出了什么问题以及如何解决吗?

这是我目前拥有的代码:

local function CheckNoclip(previous_pos: CFrame, current_pos: CFrame, player: string)
    local raycastResult = workspace:Raycast(current_pos, previous_pos)
    
    local char = workspace:FindFirstChild(player)
    
    if raycastResult then
        print("Instance:", raycastResult.Instance)
        print("Position:", raycastResult.Position)
        print("Distance:", raycastResult.Distance)
        print("Material:", raycastResult.Material)
        print("Normal:", raycastResult.Normal)
    end
    
    if raycastResult then
        if raycastResult.Instance.CanCollide == true and (not (raycastResult.Instance:IsDescendantOf(char)) ) then
            local Physical_Part = workspace:FindFirstChild(player)
            local RootPart = Physical_Part:WaitForChild("HumanoidRootPart")
            
            RootPart.CFrame = CFrame.new(previous_pos)
            warn("No-Clip Found")
        end
        print("---------------------------------")
    end
end

local players = game.Players

players.PlayerAdded:Connect(function(plr: Player)
    local player_name = plr.Name
    plr.CharacterAdded:Wait()
    local RootPart = workspace:FindFirstChild(player_name).HumanoidRootPart
    local prev_position = RootPart.CFrame.Position
    local current_position = prev_position
    
    while true do
        current_position = RootPart.CFrame.Position
        if prev_position ~= current_position then
            CheckNoclip(prev_position, current_position, player_name)
            prev_position = current_position
        end
        wait()
    end
end)

这种情况不断发生:https://youtu.be/5hF6SoNxX08(我将其上传为不公开的youtube视频

lua roblox anti-cheat roblox-studio
1个回答
0
投票

问题是您为

:Raycast()
方法提供了错误的参数。该函数需要
Orgin
Direction
而不是
Start
End
您可以通过执行
CurrPos - LastPos
来计算这两个向量之间的方向。

请注意,由于服务器端的延迟或 ping,这可能会出现错误标记。

local exclude = {}

local function CheckNoclip(LastPos: Vector3, CurrPos: Vector3, Player: Player)
    local Orgin = LastPos;
    local Direction = CurrPos - LastPos;
    local Params = RaycastParams.new();
    Params.FilterDescendantsInstances = exclude;
    Params.FilterType = Enum.RaycastFilterType.Exclude;
    
    local Result = workspace:Raycast(Orgin, Direction, Params);

    if Result then
        if Result.Instance.CanCollide then
            local Character = Player.Character;
            local Root = Character:FindFirstChild("HumanoidRootPart");

            Root.CFrame = CFrame.new(LastPos);
            warn("No-Clip Found");
            print("---------------------------------");
        end
    end
end

game:GetService("Players").PlayerAdded:Connect(function(Player: Player)

    Player.CharacterAdded:Connect(function(Character)
        table.insert(exclude, Character);
        
        local Humanoid = Character:WaitForChild("Humanoid");
        local Root = Character:WaitForChild("HumanoidRootPart");
        
        local CurrPos = Root.Position;
        local LastPos = CurrPos;
        
        task.spawn(function() -- create loop in new thread
            repeat 
                LastPos = CurrPos;
                CurrPos = Root.Position;
                
                CheckNoclip(LastPos, CurrPos, Player);
                task.wait();
            until Humanoid.Health <= 0
        end)
    end);
    Player.CharacterRemoving:Connect(function(Character)
        table.remove(exclude, table.find(exclude, Character));
    end);
end)
© www.soinside.com 2019 - 2024. All rights reserved.