我一直在尝试制作一个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视频)
: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)