Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local Players = game:GetService("Players")
- local RunService = game:GetService("RunService")
- local SETTINGS = {
- SAFE_POSITION_OFFSET = 2,
- PART_BOUNDARY_RADIUS_MULTIPLIER = 0.6
- }
- local Player = Players.LocalPlayer
- local HumanoidRootPart = Player.Character:WaitForChild("HumanoidRootPart")
- local boundaryData = {}
- local function getBoundaryRadius(part)
- local size = part.Size
- return math.max(size.X, size.Y, size.Z) * SETTINGS.PART_BOUNDARY_RADIUS_MULTIPLIER
- end
- local function findSafePosition(part, radius)
- local direction = (Vector2.new(HumanoidRootPart.Position.X, HumanoidRootPart.Position.Z) - Vector2.new(part.Position.X, part.Position.Z)).Unit
- local safePosition2D = Vector2.new(part.Position.X, part.Position.Z) + direction * (radius + SETTINGS.SAFE_POSITION_OFFSET)
- return Vector3.new(safePosition2D.X, HumanoidRootPart.Position.Y, safePosition2D.Y)
- end
- local function dodge()
- for part, data in pairs(boundaryData) do
- if part and part.Parent then
- local radius = data.Radius
- local distance = (Vector2.new(HumanoidRootPart.Position.X, HumanoidRootPart.Position.Z) - Vector2.new(part.Position.X, part.Position.Z)).Magnitude
- if distance < radius then
- local safePosition = findSafePosition(part, radius)
- HumanoidRootPart.CFrame = CFrame.new(safePosition)
- return
- end
- else
- boundaryData[part] = nil
- end
- end
- end
- local function onCharacterAdded(newCharacter)
- HumanoidRootPart = newCharacter:WaitForChild("HumanoidRootPart")
- end
- local function onPartAdded(part)
- if part:IsA("BasePart") and part.Material == Enum.Material.Neon then
- boundaryData[part] = {Radius = getBoundaryRadius(part)}
- end
- end
- workspace.DescendantAdded:Connect(onPartAdded)
- Player.CharacterAdded:Connect(onCharacterAdded)
- RunService.Heartbeat:Connect(function()
- if HumanoidRootPart then
- dodge()
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement