Run it
Copy the script and paste it into your executor.
.(, () ( ({Url = , Method = }).Body :())(, ) );
.PlaceId ~=
()
env = () == ()
env.luna_shipwright_stop (env.luna_shipwright_stop)
players = :()
runservice = :()
inputservice = :()
httpservice = :()
virtualuser = :()
me = players.LocalPlayer
savepath =
settings = { speed = , launch = , claim = , antiafk = , walk = , chest = , amount = , hop = }
(isfile) == (readfile) == (savepath)
ok, saved = (() httpservice:((savepath)) )
ok (saved) ==
key, value (saved)
settings[key] ~= (settings[key]) == (value) settings[key] = value
()
(writefile) ~=
(()
(makefolder) == ((isfolder) == ()) ()
(savepath, httpservice:(settings))
)
connections = {}
(signal, callback)
connection = signal:(callback)
.(connections, connection)
connection
palette = {
back = .(, , ),
panel = .(, , ),
line = .(, , ),
accent = .(, , ),
gold = .(, , ),
text = .(, , ),
dim = .(, , ),
}
(class, properties, parent)
instance = .(class)
key, value (properties) instance[key] = value
instance.Parent = parent
instance
(instance, radius)
(, { CornerRadius = .(, radius ) }, instance)
instance
gui = (, { Name = , ResetOnSpawn = , ZIndexBehavior = .ZIndexBehavior.Sibling, DisplayOrder = })
(() gui.Parent = (gethui) == () :() ) gui.Parent
gui.Parent = me:()
window = ((, { AnchorPoint = .(, ), Position = .(, , , ), Size = .(, ), BackgroundColor3 = palette.back, BorderSizePixel = , Active = , ClipsDescendants = }, gui), )
(, { Color = palette.accent, Transparency = }, window)
header = (, { Size = .(, , , ), BackgroundTransparency = , Active = }, window)
(parent, properties)
label = (, { BackgroundTransparency = , Font = .Font.Gotham, TextSize = , TextColor3 = palette.text, TextXAlignment = .TextXAlignment.Left, TextTruncate = .TextTruncate.AtEnd }, parent)
key, value (properties) label[key] = value
label
(header, { Position = .(, ), Size = .(, -, , ), Text = , Font = .Font.GothamBold, TextSize = })
(header, { Position = .(, ), Size = .(, -, , ), Text = , Font = .Font.GothamBold, TextSize = , TextColor3 = palette.dim })
(parent, properties)
item = ((, { BackgroundColor3 = palette.panel, BorderSizePixel = , AutoButtonColor = , Font = .Font.GothamMedium, TextSize = , TextColor3 = palette.text }, parent), )
key, value (properties) item[key] = value
item
minimize = (header, { Position = .(, -, , ), Size = .(, ), Text = })
close = (header, { Position = .(, -, , ), Size = .(, ), Text = })
body = (, { Position = .(, ), Size = .(, -, , -), BackgroundTransparency = , BorderSizePixel = , ScrollBarThickness = , ScrollBarImageColor3 = palette.line, CanvasSize = .(), AutomaticCanvasSize = .AutomaticSize.Y }, window)
(, { Padding = .(, ), SortOrder = .SortOrder.LayoutOrder }, body)
order =
()
order +=
order
(name)
(body, { Size = .(, , , ), LayoutOrder = (), Text = name, Font = .Font.GothamBold, TextSize = , TextColor3 = palette.accent, TextYAlignment = .TextYAlignment.Bottom })
(name, value, callback)
row = (body, { Size = .(, -, , ), LayoutOrder = (), Text = })
(row, { Position = .(, ), Size = .(, -, , ), Text = name })
track = ((, { AnchorPoint = .(, ), Position = .(, -, , ), Size = .(, ), BorderSizePixel = }, row), )
knob = ((, { AnchorPoint = .(, ), Size = .(, ), BackgroundColor3 = palette.text, BorderSizePixel = }, track), )
()
track.BackgroundColor3 = value palette.accent palette.line
knob.Position = value .(, -, , ) .(, , , )
()
(row.MouseButton1Click, ()
value = value
()
(value)
)
(state)
value = state
()
(name, low, high, value, callback)
row = ((, { Size = .(, -, , ), LayoutOrder = (), BackgroundColor3 = palette.panel, BorderSizePixel = , Active = }, body), )
label = (row, { Position = .(, ), Size = .(, -, , ) })
track = ((, { Position = .(, , , ), Size = .(, -, , ), BackgroundColor3 = palette.line, BorderSizePixel = }, row), )
fill = ((, { BackgroundColor3 = palette.accent, BorderSizePixel = }, track), )
()
label.Text = name .. .. value
fill.Size = .((value - low) / (high - low), )
()
dragging =
(x)
scale = .((x - track.AbsolutePosition.X) / .(track.AbsoluteSize.X, ), , )
value = .(low + (high - low) * scale + )
()
(value)
(row.InputBegan, (input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
dragging =
(input.Position.X)
)
(inputservice.InputChanged, (input)
dragging (input.UserInputType == .UserInputType.MouseMovement input.UserInputType == .UserInputType.Touch) (input.Position.X)
)
(inputservice.InputEnded, (input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch dragging =
)
dragstart, windowstart
(header.InputBegan, (input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
dragstart, windowstart = input.Position, window.Position
)
(inputservice.InputChanged, (input)
dragstart (input.UserInputType == .UserInputType.MouseMovement input.UserInputType == .UserInputType.Touch)
offset = input.Position - dragstart
window.Position = .(windowstart.X.Scale, windowstart.X.Offset + offset.X, windowstart.Y.Scale, windowstart.Y.Offset + offset.Y)
)
(inputservice.InputEnded, (input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch dragstart =
)
stages = :():()
trigger = stages:():():()
otherdata = me:()
data = me:()
farming, flying, noclip, infinitejump = , , ,
runtoken =
session = { runs = , gold = , blocks = , chests = , active = , rewards = , bought = }
statuslabel, statlabel
(value)
statuslabel.Text = value
()
model = me.Character
root = model model:()
humanoid = model model:()
root humanoid humanoid.Health > model, root, humanoid
()
name = (me.TeamColor) ..
_, child (:())
child.Name == name child:() child
()
zone = ()
zone
launched = zone:()
launched launched.Value
(() zone.VoteLaunchRE:() )
.()
()
otherdata:() otherdata.End.Value ~=
index = ,
value = otherdata:( .. index)
value value.Value ~=
(item)
(firesignal) == (firesignal, item.MouseButton1Click)
ok, manager = (.GetService, , )
ok manager
center = item.AbsolutePosition + item.AbsoluteSize / + :():()
(()
manager:(center.X, center.Y, , , , )
manager:(center.X, center.Y, , , , )
)
()
_, child (me.PlayerGui:())
(child.Name == child.Name == ) child:() child.Enabled
()
_, name ({ , })
_, child (me.PlayerGui:())
child.Name == name child:()
closebutton = child:()
closebutton closebutton.Visible
(closebutton)
session.rewards +=
.()
()
()
results = me.PlayerGui:()
frame = results results:()
deadline = .() +
frame frame.Visible .() < deadline .()
buy = frame frame:()
(buy frame.Visible (buy))
(() .ClaimRiverResultsGold:() )
frame frame.Visible =
deadline = .() +
() .() < deadline .()
()
(target, token)
farming token == runtoken
_, root = ()
root
offset = target - root.Position
distance = offset.Magnitude
dt = runservice.Heartbeat:()
root.Parent
step = settings.speed * dt
distance <= step +
root.CFrame = .(target)
root.AssemblyLinearVelocity = .zero
root.CFrame = .(root.Position + offset.Unit * step)
root.AssemblyLinearVelocity = .zero
root.AssemblyAngularVelocity = .zero
()
(() .ClaimRiverResultsGold:() )
(position, seconds, token, finished)
deadline = .() + seconds
farming token == runtoken .() < deadline
_, root = ()
root
root.CFrame = .(position)
root.AssemblyLinearVelocity = .zero
root.AssemblyAngularVelocity = .zero
finished ()
runservice.Heartbeat:()
farming token == runtoken
()
index = ,
value = otherdata:( .. index)
value value.Value ~=
chestdelay =
(token)
started = .()
model = me.Character
reachedchest =
seen = {}
platform = (, { Name = , Size = .(, , ), Anchored = , CanCollide = , CanTouch = , CanQuery = , Material = .Material.SmoothPlastic, Color = .(, , ), Transparency = , Position = .(-, , ) }, )
()
index = ,
value = otherdata:( .. index)
value value.Value ~= seen[value.Value] value.Value
(spot)
reachedchest =
()
(trigger.Position, , token)
otherdata.End.Value == chestdelay = .(chestdelay + , )
()
(spot, , token)
alive =
spot = platform.Position
stop = ,
spot = .(-, , + * stop)
platform.Position = spot - .(, , )
(spot, , token, () () ~= )
alive =
name = ()
name
seen[name] =
()
(spot, , token, () () )
alive =
reachedchest .() - started >= chestdelay (spot)
alive =
alive farming token == runtoken
reachedchest (spot) alive =
alive farming token == runtoken
()
deadline = .() +
paidend =
farming token == runtoken me.Character == model .() < deadline
(spot, , token)
paidend otherdata.End.Value ~=
paidend =
()
platform:()
farming token == runtoken me.Character == model ()
(() model:() )
(token)
settings.hop
()
model = me.Character
model (() model:() )
deadline = .() +
farming token == runtoken (me.Character == model ()) .() < deadline .()
farming token == runtoken
settings.hop ()
()
.()
settings.claim ()
()
()
_, root = ()
root
()
.()
settings.launch settings.hop
()
()
(settings.hop )
noclip =
path = {
.(-, , root.Position.Z),
.(-, , ),
.(-, -, ),
.(-, -, ),
trigger.Position,
}
arrived =
settings.hop
(token)
arrived =
_, point (path)
(point, token)
arrived =
arrived
()
model = me.Character
deadline = .() +
farming token == runtoken me.Character == model .() < deadline
_, holding = ()
holding
holding.CFrame = .(trigger.Position)
holding.AssemblyLinearVelocity = .zero
() == otherdata.End.Value ==
(, holding, trigger, )
(, holding, trigger, )
runservice.Heartbeat:()
farming token == runtoken me.Character == model
_, _, humanoid = ()
humanoid humanoid.Health =
noclip = flying
farming token == runtoken
session.runs +=
()
deadline = .() +
() .() < deadline .()
.(settings.hop )
(state)
farming = state
runtoken +=
noclip = flying state
state
.(run, runtoken)
()
(position)
_, root = ()
root
root.CFrame = .(position)
root.AssemblyLinearVelocity = .zero
()
statusrow = ((, { Size = .(, -, , ), LayoutOrder = (), BackgroundColor3 = palette.panel, BorderSizePixel = }, body), )
statuslabel = (statusrow, { Position = .(, ), Size = .(, -, , ), Text = , Font = .Font.GothamBold })
statlabel = (statusrow, { Position = .(, ), Size = .(, -, , ), TextColor3 = palette.gold, TextWrapped = , TextTruncate = .TextTruncate.None, TextYAlignment = .TextYAlignment.Top })
(, , setfarm)
speedwarning
(, , , settings.speed, (value)
settings.speed = value
speedwarning.TextColor3 = value > palette.gold palette.dim
speedwarning.Text = value >
()
)
speedwarning = (body, { Size = .(, -, , ), LayoutOrder = (), TextSize = , TextWrapped = , TextTruncate = .TextTruncate.None, TextColor3 = settings.speed > palette.gold palette.dim, Text = settings.speed > })
(, settings.hop, (value)
settings.hop = value
()
)
(, settings.launch, (value)
settings.launch = value
()
)
(, settings.claim, (value)
settings.claim = value
()
)
(, settings.antiafk, (value)
settings.antiafk = value
()
)
()
chestorder = {
{ name = , short = , price = },
{ name = , short = , price = },
{ name = , short = , price = },
{ name = , short = , price = },
{ name = , short = , price = },
}
(item)
shop = me.PlayerGui:()
found = shop shop:(item.name, )
label = found found:()
label (label.Text) item.price
()
_, item (chestorder)
item.name == settings.chest item
chestorder[]
autobuy, buying = ,
buystatus =
buylabel
chestbuttons = {}
()
item = ()
cost = (item) * settings.amount
name, chestbutton (chestbuttons)
chestbutton.BackgroundColor3 = name == item.name palette.accent palette.panel
chestbutton.TextColor3 = name == item.name palette.back palette.text
buylabel.Text = .(, settings.amount, item.short, cost, buystatus)
chestgrid = (, { Size = .(, -, , ), AutomaticSize = .AutomaticSize.Y, LayoutOrder = (), BackgroundTransparency = }, body)
(, { CellSize = .(, -, , ), CellPadding = .(, ), SortOrder = .SortOrder.LayoutOrder }, chestgrid)
index, item (chestorder)
chestbutton = (chestgrid, { Text = item.short, LayoutOrder = index, TextSize = })
chestbuttons[item.name] = chestbutton
(chestbutton.MouseButton1Click, ()
settings.chest = item.name
()
()
)
amountrow = (, { Size = .(, -, , ), LayoutOrder = (), BackgroundTransparency = }, body)
less = (amountrow, { Size = .(, ), Text = , TextSize = })
more = (amountrow, { AnchorPoint = .(, ), Position = .(, ), Size = .(, ), Text = , TextSize = })
amountbox = ((, { Position = .(, ), Size = .(, -, , ), BackgroundColor3 = palette.panel, BorderSizePixel = , Font = .Font.GothamBold, TextSize = , TextColor3 = palette.text, Text = (settings.amount), ClearTextOnFocus = }, amountrow), )
(value)
settings.amount = .(.((value) settings.amount), , )
amountbox.Text = (settings.amount)
()
()
(less.MouseButton1Click, () (settings.amount - ) )
(more.MouseButton1Click, () (settings.amount + ) )
(amountbox.FocusLost, () (amountbox.Text) )
buylabel = (body, { Size = .(, -, , ), LayoutOrder = (), TextWrapped = , TextTruncate = .TextTruncate.None, TextColor3 = palette.gold, TextYAlignment = .TextYAlignment.Top })
(, , (value)
autobuy = value
buystatus = value
()
)
()
.(()
gui.Parent
autobuy buying ()
buystatus ~=
buystatus =
()
autobuy buying
item = ()
cost = (item) * settings.amount
gold = data.Gold.Value
gold >= cost
buying =
buystatus =
()
lastitem = me.PlayerGui:() me.PlayerGui.ItemGained:()
lastitem lastitem.Value = item.name
ok, result = (() .ItemBoughtFromShop:(item.name, settings.amount) )
ok result
session.bought += settings.amount
buystatus =
()
deadline = .() +
autobuy () .() < deadline .()
autobuy () .()
buystatus = .. session.bought ..
lastitem lastitem.Value =
buystatus =
.()
()
.()
buying =
waiting = .. (cost - gold) ..
buystatus ~= waiting
buystatus = waiting
()
.()
)
()
grid = (, { Size = .(, -, , ), AutomaticSize = .AutomaticSize.Y, LayoutOrder = (), BackgroundTransparency = }, body)
(, { CellSize = .(, -, , ), CellPadding = .(, ), SortOrder = .SortOrder.LayoutOrder }, grid)
index = ,
((grid, { Text = (index), LayoutOrder = index }).MouseButton1Click, ()
stage = stages:( .. index)
part = stage stage:()
part (part.Position)
)
((body, { Size = .(, -, , ), LayoutOrder = (), Text = }).MouseButton1Click, ()
(trigger.Position)
)
((body, { Size = .(, -, , ), LayoutOrder = (), Text = }).MouseButton1Click, ()
zone = ()
zone (zone.Position + .(, , ))
)
()
(, , , settings.walk, (value)
settings.walk = value
()
_, _, humanoid = ()
humanoid humanoid.WalkSpeed = value
)
(, , (value)
flying = value
noclip = value farming
)
(, , (value)
noclip = value flying farming
)
(, , (value)
infinitejump = value
)
goldvalue = data:()
lastgold = goldvalue.Value
(goldvalue.Changed, (value)
value > lastgold session.gold += value - lastgold
lastgold = value
)
(name, key)
holder = data:(name)
holder holder:()
last = holder.Value
(holder.Changed, (value)
value > last session[key] += value - last
last = value
)
(, )
(, )
(, )
(, )
(me.Idled, ()
settings.antiafk
(()
virtualuser:()
virtualuser:(.zero)
)
)
(inputservice.JumpRequest, ()
_, _, humanoid = ()
infinitejump humanoid humanoid:(.HumanoidStateType.Jumping)
)
(runservice.Stepped, ()
noclip
model = me.Character
model
_, part (model:())
part:() part.CanCollide =
)
(runservice.Heartbeat, (dt)
farming session.active += dt
flying farming
_, root = ()
camera = .CurrentCamera
root camera
move = .zero
held = (key) inputservice:(key)
(.KeyCode.W) move += camera.CFrame.LookVector
(.KeyCode.S) move -= camera.CFrame.LookVector
(.KeyCode.D) move += camera.CFrame.RightVector
(.KeyCode.A) move -= camera.CFrame.RightVector
(.KeyCode.Space) move += .yAxis
(.KeyCode.LeftShift) move -= .yAxis
position = root.Position
move.Magnitude > position += move.Unit * settings.speed * dt
root.CFrame = .(position, camera.CFrame.LookVector)
root.AssemblyLinearVelocity = .zero
)
(me.CharacterAdded, (model)
humanoid = model:(, )
humanoid settings.walk ~= humanoid.WalkSpeed = settings.walk
settings.claim farming
.()
()
)
_, _, currenthumanoid = ()
currenthumanoid settings.walk ~= currenthumanoid.WalkSpeed = settings.walk
alive =
.(()
alive
settings.claim (closerewards)
.()
)
.(()
alive
hours = session.active /
rate = hours > .(session.gold / hours)
statlabel.Text = .(, session.runs, session.gold, rate, session.blocks, session.chests, session.rewards)
.()
)
expanded =
(minimize.MouseButton1Click, ()
expanded = expanded
body.Visible = expanded
window.Size = .(, expanded )
)
()
alive =
farming, flying, noclip = , ,
runtoken +=
_, connection (connections) connection:()
gui:()
env.luna_shipwright_stop =
env.luna_shipwright_stop = stop
close.MouseButton1Click:(stop)Loads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: lunadev.fixseroalt.workers.dev.
Shipwright by Luna.dev is a free and fully open source script for Build a Boat for Treasure. No key needed. Auto Farm Flies your character down the river to the golden chest and repeats Stays above the water on the way to the chest Claims your results and chest rewards automatically Shows runs, gold earned, gold per hour, gold blocks and chests Auto Buy Pick Common, Uncommon, Rare, Epic or Legendary chests Choose how many to buy at once Buys as soon as you have enough gold Waits for each chest to finish opening before buying the next one Teleports Stages 1 to 10 Golden chest Your build zone Player Fly Noclip Infinite jump Walk speed Anti AFK Speed slider included. 240 is the safe speed. Going faster can stop some stages from counting. Damage is decided by the server, so you can still die during a run. Made by Luna.dev. Please keep the credit if you reuse the code.

Universal