add gs
This commit is contained in:
+131
@@ -0,0 +1,131 @@
|
||||
|
||||
|
||||
local PathDisplay = {}
|
||||
PathDisplay.spacing = 8
|
||||
PathDisplay.image = "rbxasset://textures/Cursors/Gamepad/Pointer.png"
|
||||
PathDisplay.imageSize = Vector2.new(2, 2)
|
||||
|
||||
local currentPoints = {}
|
||||
local renderedPoints = {}
|
||||
|
||||
local pointModel = Instance.new("Model")
|
||||
pointModel.Name = "PathDisplayPoints"
|
||||
|
||||
local adorneePart = Instance.new("Part")
|
||||
adorneePart.Anchored = true
|
||||
adorneePart.CanCollide = false
|
||||
adorneePart.Transparency = 1
|
||||
adorneePart.Name = "PathDisplayAdornee"
|
||||
adorneePart.CFrame = CFrame.new(0, 0, 0)
|
||||
adorneePart.Parent = pointModel
|
||||
|
||||
local pointPool = {}
|
||||
local poolTop = 30
|
||||
for i = 1, poolTop do
|
||||
local point = Instance.new("ImageHandleAdornment")
|
||||
point.Archivable = false
|
||||
point.Adornee = adorneePart
|
||||
point.Image = PathDisplay.image
|
||||
point.Size = PathDisplay.imageSize
|
||||
pointPool[i] = point
|
||||
end
|
||||
|
||||
local function retrieveFromPool()
|
||||
local point = pointPool[1]
|
||||
if not point then
|
||||
return
|
||||
end
|
||||
|
||||
pointPool[1], pointPool[poolTop] = pointPool[poolTop], nil
|
||||
poolTop = poolTop - 1
|
||||
return point
|
||||
end
|
||||
|
||||
local function returnToPool(point)
|
||||
poolTop = poolTop + 1
|
||||
pointPool[poolTop] = point
|
||||
end
|
||||
|
||||
local function renderPoint(point, isLast)
|
||||
if poolTop == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local rayDown = Ray.new(point + Vector3.new(0, 2, 0), Vector3.new(0, -8, 0))
|
||||
local hitPart, hitPoint, hitNormal = workspace:FindPartOnRayWithIgnoreList(rayDown, { game.Players.LocalPlayer.Character, workspace.CurrentCamera })
|
||||
if not hitPart then
|
||||
return
|
||||
end
|
||||
|
||||
local pointCFrame = CFrame.new(hitPoint, hitPoint + hitNormal)
|
||||
|
||||
local point = retrieveFromPool()
|
||||
point.CFrame = pointCFrame
|
||||
point.Parent = pointModel
|
||||
return point
|
||||
end
|
||||
|
||||
function PathDisplay.setCurrentPoints(points)
|
||||
if typeof(points) == 'table' then
|
||||
currentPoints = points
|
||||
else
|
||||
currentPoints = {}
|
||||
end
|
||||
end
|
||||
|
||||
function PathDisplay.clearRenderedPath()
|
||||
for _, oldPoint in ipairs(renderedPoints) do
|
||||
oldPoint.Parent = nil
|
||||
returnToPool(oldPoint)
|
||||
end
|
||||
renderedPoints = {}
|
||||
pointModel.Parent = nil
|
||||
end
|
||||
|
||||
function PathDisplay.renderPath()
|
||||
PathDisplay.clearRenderedPath()
|
||||
if not currentPoints or #currentPoints == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
local currentIdx = #currentPoints
|
||||
local lastPos = currentPoints[currentIdx]
|
||||
local distanceBudget = 0
|
||||
|
||||
renderedPoints[1] = renderPoint(lastPos, true)
|
||||
if not renderedPoints[1] then
|
||||
return
|
||||
end
|
||||
|
||||
while true do
|
||||
local currentPoint = currentPoints[currentIdx]
|
||||
local nextPoint = currentPoints[currentIdx - 1]
|
||||
|
||||
if currentIdx < 2 then
|
||||
break
|
||||
else
|
||||
|
||||
local toNextPoint = nextPoint - currentPoint
|
||||
local distToNextPoint = toNextPoint.magnitude
|
||||
|
||||
if distanceBudget > distToNextPoint then
|
||||
distanceBudget = distanceBudget - distToNextPoint
|
||||
currentIdx = currentIdx - 1
|
||||
else
|
||||
local dirToNextPoint = toNextPoint.unit
|
||||
local pointPos = currentPoint + (dirToNextPoint * distanceBudget)
|
||||
local point = renderPoint(pointPos, false)
|
||||
|
||||
if point then
|
||||
renderedPoints[#renderedPoints + 1] = point
|
||||
end
|
||||
|
||||
distanceBudget = distanceBudget + PathDisplay.spacing
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
pointModel.Parent = workspace.CurrentCamera
|
||||
end
|
||||
|
||||
return PathDisplay
|
||||
Reference in New Issue
Block a user