Run it
Copy the script and paste it into your executor.
Players = :()
UserInputService = :()
RunService = :()
TweenService = :()
CoreGui = :()
GuiService = :()
Workspace = :()
LocalPlayer = Players.LocalPlayer
PlayerGui = LocalPlayer:(, )
CoreGui:()
CoreGui.Cursor:()
isEscMenuOpen =
originalCursorImage =
outOfRangeTexture =
success, assets = (()
:()
)
success assets assets[]
eazywin = assets[]:()
eazywin:()
eazywin.LocalScript:()
eazywin.DisplayOrder =
eazywin.IgnoreGuiInset =
eazywin.Y.Value =
eazywin.Parent = CoreGui
imageLabel = eazywin:()
actionLabel = imageLabel imageLabel:()
imageLabel
originalCursorImage = imageLabel.Image
GuiService.MenuOpened:(()
isEscMenuOpen =
)
GuiService.MenuClosed:(()
isEscMenuOpen =
)
(mousePos)
PlayerGui
guiObjects = PlayerGui:(mousePos.X, mousePos.Y)
_, obj (guiObjects)
obj:() obj:() obj:()
RunService.RenderStepped:((step)
eazywin eazywin.Parent
mouse = LocalPlayer:()
mousePos = .(mouse.X, mouse.Y)
character = LocalPlayer.Character
rootPart = character character:()
isOutOfRange =
rootPart mouse.Hit
distance = (rootPart.Position - mouse.Hit.Position).Magnitude
distance >
isOutOfRange =
imageLabel
isOutOfRange (mousePos) isEscMenuOpen
imageLabel.Image = outOfRangeTexture
imageLabel.Image = originalCursorImage
isHoveringWorldClickable =
mouse.Target mouse.Target:()
isHoveringWorldClickable =
isHoveringUIButton = (mousePos)
isEscMenuOpen
UserInputService.MouseIconEnabled =
imageLabel imageLabel.Visible =
actionLabel actionLabel.Visible =
isHoveringWorldClickable
UserInputService.MouseIconEnabled =
imageLabel imageLabel.Visible =
isHoveringUIButton
UserInputService.MouseIconEnabled =
imageLabel imageLabel.Visible =
actionLabel actionLabel.Visible =
UserInputService.MouseIconEnabled =
imageLabel imageLabel.Visible =
actionLabel actionLabel.Visible =
imageLabel imageLabel.Visible
targetX = mouse.X - eazywin.X.Value
targetY = mouse.Y - eazywin.Y.Value +
tweenInfo = TweenInfo.(step, .EasingStyle.Linear, .EasingDirection.InOut)
goalProperties = {Position = .(, targetX, , targetY)}
TweenService:(imageLabel, tweenInfo, goalProperties):()
)
()
Players = :()
RunService = :()
Workspace = :()
UserInputService = :()
LocalPlayer = Players.LocalPlayer
PlayerGui = LocalPlayer:(, )
Mouse = LocalPlayer:()
Camera = Workspace.CurrentCamera
StarterPlayer = :()
StarterPlayerScripts = StarterPlayer:()
StarterPlayerScripts:()
fakePlayerModule = .()
fakePlayerModule.Name =
fakeControlModule = .()
fakeControlModule.Name =
fakeControlModule.Parent = fakePlayerModule
fakeCTM = .()
fakeCTM.Name =
fakeCTM.Source =
fakeCTM.Parent = fakeControlModule
fakePlayerModule.Parent = StarterPlayerScripts
(()
LocalPlayer.DevComputerMovementMode = .DevComputerMovementMode.UserChoice
LocalPlayer.DevTouchMovementMode = .DevTouchMovementMode.UserChoice
)
oldModel = Workspace:()
oldModel oldModel:()
oldClone = Workspace:()
oldClone oldClone:()
isFollowerVisible =
currentClone =
isPathfinding =
touchConnection =
activeTouches = {}
touchStartPositions = {}
dodecagonModel = .()
dodecagonModel.Name =
dodecagonModel.Parent = Workspace
cylinderPart = .()
cylinderPart.Name =
cylinderPart.Size = .(, , )
cylinderPart.Shape = .PartType.Cylinder
cylinderPart.Color = .(, , )
cylinderPart.Material = .Material.SmoothPlastic
cylinderPart.CanCollide =
cylinderPart.CanTouch =
cylinderPart.CanQuery =
cylinderPart.Anchored =
cylinderPart.CFrame = .(, , ) * .(, , .())
cylinderPart.Parent = dodecagonModel
dodecagonModel.PrimaryPart = cylinderPart
()
character = LocalPlayer.Character
character character:() ~=
(target)
target
target == cylinderPart target:(dodecagonModel) (currentClone target:(currentClone))
target:() target.Parent:()
target:() target:()
target:() target.Parent:()
(screenPos)
PlayerGui
guiObjects = PlayerGui:(screenPos.X, screenPos.Y)
_, obj (guiObjects)
obj:() obj:() obj.Active
()
touchConnection
touchConnection:()
touchConnection =
currentClone
currentClone:()
currentClone =
isPathfinding =
()
character = LocalPlayer.Character
head = character character:()
head Camera
(Camera.CFrame.Position - head.Position).Magnitude <
(character)
()
humanoid = character:(, )
rootPart = character:(, )
humanoid rootPart
humanoid.Seated:((isSitting, seat)
isSitting
()
humanoid:(rootPart.Position)
)
LocalPlayer.Character (LocalPlayer.Character)
LocalPlayer.CharacterAdded:(setupCharacter)
(targetWorldPos)
character = LocalPlayer.Character
humanoid = character character:()
() (humanoid (humanoid.MoveDirection.Magnitude > humanoid.Sit))
()
dodecagonModel.Archivable =
currentClone = dodecagonModel:()
currentClone.Name =
currentClone:(.(targetWorldPos) * .(, , .()))
cloneHitbox = currentClone:()
cloneHitbox
cloneHitbox.CanCollide =
touchConnection = cloneHitbox.Touched:((hit)
character = LocalPlayer.Character
character hit:(character)
()
)
cloneCylinder = currentClone:()
cloneCylinder
cloneCylinder.LocalTransparencyModifier =
currentClone.Parent = Workspace
isPathfinding =
Mouse.Button1Down:(()
isFollowerVisible dodecagonModel.PrimaryPart
(dodecagonModel.PrimaryPart.Position)
)
UserInputService.TouchStarted:((touch, gameProcessedEvent)
gameProcessedEvent
activeTouches[touch] =
touchStartPositions[touch] = touch.Position
)
UserInputService.TouchEnded:((touch, gameProcessedEvent)
startPos = touchStartPositions[touch]
activeTouches[touch] =
touchStartPositions[touch] =
gameProcessedEvent
activeCount =
_ (activeTouches) activeCount = activeCount +
activeCount >
startPos
dragDistance = (touch.Position - startPos).Magnitude
dragDistance >
touchPos = .(touch.Position.X, touch.Position.Y)
(touchPos) ()
unitRay = Camera:(touchPos.X, touchPos.Y)
raycastParams = RaycastParams.()
raycastParams.FilterType = .RaycastFilterType.Exclude
raycastParams.FilterDescendantsInstances = {LocalPlayer.Character, dodecagonModel}
raycastResult = Workspace:(unitRay.Origin, unitRay.Direction * , raycastParams)
raycastResult (raycastResult.Instance)
character = LocalPlayer.Character
rootPart = character character:()
rootPart
distanceFromPlayer = (rootPart.Position - raycastResult.Position).Magnitude
distanceFromPlayer <=
(raycastResult.Position)
)
connection
connection = RunService.RenderStepped:(()
dodecagonModel dodecagonModel.Parent
connection:()
character = LocalPlayer.Character
humanoid = character character:()
rootPart = character character:()
isPathfinding currentClone humanoid rootPart
horizontalMove = .(humanoid.MoveDirection.X, , humanoid.MoveDirection.Z)
horizontalMove.Magnitude >
()
clonePos = currentClone.PrimaryPart.Position
humanoid:(clonePos)
(rootPart.Position - clonePos).Magnitude <=
()
hasMouse = UserInputService.MouseEnabled
shouldShow =
hasMouse humanoid (humanoid.MoveDirection.Magnitude == humanoid.Sit) ()
unitRay = Camera:(Mouse.X, Mouse.Y)
raycastParams = RaycastParams.()
raycastParams.FilterType = .RaycastFilterType.Exclude
ignoreList = {LocalPlayer.Character, dodecagonModel}
currentClone .(ignoreList, currentClone)
raycastParams.FilterDescendantsInstances = ignoreList
raycastResult = Workspace:(unitRay.Origin, unitRay.Direction * , raycastParams)
shouldShow =
() (.(Mouse.X, Mouse.Y))
shouldShow =
raycastResult shouldShow
rootPart
distanceFromPlayer = (rootPart.Position - raycastResult.Position).Magnitude
distanceFromPlayer > (raycastResult.Instance)
shouldShow =
dodecagonModel:(.(raycastResult.Position) * .(, , .()))
shouldShow =
shouldShow =
isFollowerVisible = shouldShow
cylinderPart.LocalTransparencyModifier = (hasMouse shouldShow)
)this script has all the machanics the roblox mouse cursor had beetween 2008 and 2014, click to move mechanic included, this script also supports mobile, where the mouse won't show and the click to move mechanic only works with a one click where there are no uis and the player is standing still, fully working on all devices! :P

Universal