M
Description
-Auto Merge Dinos -Auto Upgrade {Spawn Tier,Lock Time,Max Spawn} -Auto Lock Base -Auto Rebirth
GAMEMerge a Dino
UPDATEDOct 10, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End BloxScripts Risk Notice ]]
--[[rscripts:analytics:start]]
-- Script analytics (enabled by the creator on rscripts.net).
-- Runs in its own thread and cannot affect the script below.
task.spawn(function()
pcall(function()
loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6ab5a250e0ea3fb3dee81e94"))()
end)
end)
--[[rscripts:analytics:end]]
-- Merge a Dino | @hidevin
if game.GameId ~= 10470774864 and game.PlaceId ~= 84546345526935 then
warn("[@hidevin] Merge a Dino script locked to Universe 10470774864 / Place 84546345526935. Current: GameId=" .. tostring(game.GameId) .. " PlaceId=" .. tostring(game.PlaceId))
return
end
local repo = "https://raw.githubusercontent.com/joustingmatch/ObsidianUltra/main/"
local Library = loadstring(game:HttpGet(repo .. "Library.lua"))()
local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()
local Options = Library.Options
local Toggles = Library.Toggles
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local VirtualUser = game:GetService("VirtualUser")
local LocalPlayer = Players.LocalPlayer
local Remotes = ReplicatedStorage:WaitForChild("Remotes")
local Functions = Remotes:WaitForChild("Functions")
local Events = Remotes:WaitForChild("Events")
local UpgradeRequest = Functions:WaitForChild("UpgradeRequest")
local LockBaseRequest = Functions:WaitForChild("LockBaseRequest")
local RebirthRequest = Functions:WaitForChild("RebirthRequest")
local DropDino = Events:WaitForChild("DropDino")
local DinoStats = require(ReplicatedStorage.Modules.Constants.DinoStats)
local GAME_NAME = "Merge a Dino"
local SessionStart = os.clock()
-- State flags (single owner: UI toggles write, loops read)
local State = {
AutoMerge = false,
MergeInterval = 0.5,
AutoSpawnTier = false,
AutoMaxSpawn = false,
AutoLockTime = false,
AutoLockBase = false,
AutoRebirth = false,
AntiAFK = true,
AntiRejoin = false,
}
local MergeBusy = false
local function Notify(title, desc, typ, time)
pcall(function()
Library:Notify({ Title = title, Description = desc, Time = time or 4, Type = typ or "Info" })
end)
end
local function GetPlot()
local map = workspace:FindFirstChild("Map")
local plots = map and map:FindFirstChild("Plots")
if not plots then return nil end
for _, p in ipairs(plots:GetChildren()) do
if p:IsA("Model") and p:GetAttribute("Owner") == LocalPlayer.UserId then
return p
end
end
return nil
end
local function TierOf(dino)
local s = DinoStats[dino.Name]
if s and typeof(s.Tier) == "number" then
return s.Tier
end
return dino.Name
end
local function GetHeldDino()
local char = LocalPlayer.Character
local weld = char and char:FindFirstChild("PickupWeld")
if weld and weld:IsA("WeldConstraint") and weld.Part1 then
return weld.Part1:FindFirstAncestorOfClass("Model")
end
return nil
end
local function FreeOwnDinos()
local plot = GetPlot()
if not plot then return {} end
local out = {}
for _, d in ipairs(plot:GetDescendants()) do
if d:IsA("Model") and d:GetAttribute("OwnerUserId") == LocalPlayer.UserId then
if not d:GetAttribute("Merging") and not d:GetAttribute("Dying") and d:GetAttribute("Held") ~= true then
table.insert(out, d)
end
end
end
return out
end
local function TryUpgrade(key)
local ok, res = pcall(function()
return UpgradeRequest:InvokeServer(key)
end)
if not ok then
return false, tostring(res)
end
return res == true, tostring(res)
end
local function TryLock()
local ok, res = pcall(function()
return LockBaseRequest:InvokeServer()
end)
if not ok then return false, tostring(res) end
return res == true, tostring(res)
end
local function TryRebirth()
local ok, res = pcall(function()
return RebirthRequest:InvokeServer()
end)
if not ok then return false, tostring(res) end
return res == true, tostring(res)
end
-- One merge pass: pick up one dino of a paired tier, carry into partner.
-- Touch-based: pickup = HRP onto dino, merge = HRP (holding) onto same-tier dino.
local function DoMergePass()
local char = LocalPlayer.Character
local hrp = char and char:FindFirstChild("HumanoidRootPart")
if not hrp then return end
local orig = hrp.CFrame
-- start empty-handed
if GetHeldDino() then
pcall(function() DropDino:FireServer() end)
task.wait(0.3)
if GetHeldDino() then return end
end
local free = FreeOwnDinos()
if #free < 2 then return end
local byTier = {}
for _, d in ipairs(free) do
local t = TierOf(d)
byTier[t] = byTier[t] or {}
table.insert(byTier[t], d)
end
local pairTier, pairList = nil, nil
for t, list in pairs(byTier) do
if #list >= 2 then
pairTier, pairList = t, list
break
end
end
if not pairList then return end
-- pickup first of pair (exact pivot = guaranteed touch; retry with +2Y fall)
local first = pairList[1]
pcall(function() hrp.CFrame = first:GetPivot() end)
task.wait(0.35)
local held = GetHeldDino()
if not held then
pcall(function() hrp.CFrame = first:GetPivot() + Vector3.new(0, 2, 0) end)
task.wait(0.4)
held = GetHeldDino()
end
if not held then return end
if TierOf(held) ~= pairTier then
pcall(function() DropDino:FireServer() end)
task.wait(0.3)
return
end
-- carry into a same-tier partner until weld clears (merged)
local partner = nil
for _, d in ipairs(FreeOwnDinos()) do
if d ~= held and TierOf(d) == pairTier then
partner = d
break
end
end
if not partner then
pcall(function() DropDino:FireServer() end)
task.wait(0.3)
return
end
local t0 = os.clock()
while os.clock() - t0 < 5 do
if not State.AutoMerge or Library.Unloaded then break end
if not GetHeldDino() then break end -- merged (or lost) = done
pcall(function() hrp.CFrame = partner:GetPivot() end)
task.wait(0.1)
end
-- park back where we started so next pass is stable
pcall(function() hrp.CFrame = orig + Vector3.new(0, 3, 0) end)
end
-- Loops: every Auto feature on 1s interval
task.spawn(function()
while not Library.Unloaded do
task.wait(1)
if State.AutoSpawnTier then
pcall(TryUpgrade, "SpawnTier")
end
if State.AutoMaxSpawn then
pcall(TryUpgrade, "MaxSpawn")
end
if State.AutoLockTime then
pcall(TryUpgrade, "LockBase")
end
end
end)
task.spawn(function()
while not Library.Unloaded do
task.wait(1)
if State.AutoLockBase then
local now = workspace:GetServerTimeNow()
local lockEnds = LocalPlayer:GetAttribute("LockEndsAt") or 0
local cdEnds = LocalPlayer:GetAttribute("LockCooldownEndsAt") or 0
local plot = GetPlot()
local underAttack = plot and plot:GetAttribute("UnderAttack") == true
if not underAttack and now >= lockEnds and now >= cdEnds then
pcall(TryLock)
end
end
end
end)
task.spawn(function()
while not Library.Unloaded do
task.wait(1)
if State.AutoRebirth then
pcall(TryRebirth)
end
end
end)
-- AutoMerge: one TP pickup+carry pass per 0.5s tick
task.spawn(function()
while not Library.Unloaded do
task.wait(State.MergeInterval)
if State.AutoMerge and not MergeBusy then
MergeBusy = true
pcall(DoMergePass)
MergeBusy = false
end
end
end)
-- Anti-AFK (enabled by default)
local AFKConn = nil
local function SetAntiAFK(on)
State.AntiAFK = on
if on then
if not AFKConn then
AFKConn = LocalPlayer.Idled:Connect(function()
pcall(function()
VirtualUser:CaptureController()
VirtualUser:ClickButton2(Vector2.new())
end)
end)
end
else
if AFKConn then pcall(function() AFKConn:Disconnect() end); AFKConn = nil; end
end
end
SetAntiAFK(true)
-- Anti-Rejoin: block TeleportService teleports issued by game
local TeleportHooked = false
local function SetAntiRejoin(on)
State.AntiRejoin = on
if on and not TeleportHooked then
TeleportHooked = true
pcall(function()
local TeleportService = game:GetService("TeleportService")
local old
old = hookmetamethod and hookmetamethod(game, "__namecall", function(self, ...)
local method = getnamecallmethod()
if not checkcaller() and self == TeleportService and (method == "Teleport" or method == "TeleportToPlaceInstance" or method == "TeleportToPrivateServer") then
Notify("Anti-Rejoin", "Blocked teleport: " .. tostring(method), "Warning", 3)
return nil
end
return old(self, ...)
end)
end)
end
end
-- Window (ObsidianUltra)
local Window = Library:CreateWindow({
Title = "@hidevin",
Footer = "Merge a Dino | Leave a like on Rscripts if it works. @hidevin",
CopyableFooter = false,
NotifySide = "Right",
ShowCustomCursor = true,
DisableSearch = true,
FuzzySearch = false,
Minimizable = true,
EnableSidebarResize = true,
})
-- Apply UI_STYLE.json design tokens
pcall(function()
Library.Scheme.BackgroundColor = Color3.fromHex("0d0d0d")
Library.Scheme.MainColor = Color3.fromHex("282828")
Library.Scheme.OutlineColor = Color3.fromHex("3a3a3a")
Library.Scheme.FontColor = Color3.fromHex("ffffff")
Library.Scheme.AccentColor = Color3.fromHex("5865F2")
if Library.Scheme.BlueColor then
Library.Scheme.BlueColor = Color3.fromHex("5865F2")
end
Library:UpdateColorsUsingRegistry()
end)
pcall(function() Window:SetCornerRadius(10) end)
local Tabs = {
Main = Window:AddTab({ Name = "Main", Icon = "home" }),
Farming = Window:AddTab({ Name = "Farming", Icon = "tractor" }),
Inventory = Window:AddTab({ Name = "Inventory", Icon = "backpack" }),
Rebirth = Window:AddTab({ Name = "Rebirth", Icon = "refresh-ccw" }),
Settings = Window:AddTab({ Name = "Settings", Icon = "settings" }),
}
-- Main: dashboard only, no mechanics
local MainLeft = Tabs.Main:AddLeftGroupbox("Info")
MainLeft:AddLabel(GAME_NAME, true)
MainLeft:AddLabel("Session status", true, "SessionStatus")
MainLeft:AddLabel("Cash: ...", true, "CashLabel")
MainLeft:AddLabel("Rebirths: ...", true, "RebirthLabel")
local MainRight = Tabs.Main:AddRightGroupbox("Quick Status")
MainRight:AddLabel("Upgrades: ...", true, "UpgradeLabel")
MainRight:AddLabel("Base lock: ...", true, "LockLabel")
MainRight:AddLabel("Merge: ...", true, "MergeLabel")
task.spawn(function()
while not Library.Unloaded do
task.wait(1)
pcall(function()
local elapsed = math.floor(os.clock() - SessionStart)
local mm = string.format("%02d:%02d", math.floor(elapsed / 60), elapsed % 60)
if Library.Labels and Library.Labels.SessionStatus then
Library.Labels.SessionStatus:SetText("Session: " .. mm .. " | " .. GAME_NAME)
end
local Data = require(ReplicatedStorage.Modules.Data)
local cash = Data.client.Cash()
if Library.Labels.CashLabel then
Library.Labels.CashLabel:SetText("Cash: " .. tostring(cash))
end
local rb = LocalPlayer:GetAttribute("Rebirths") or 0
if Library.Labels.RebirthLabel then
Library.Labels.RebirthLabel:SetText("Rebirths: " .. tostring(rb))
end
local st = Data.client.Upgrades.SpawnTier()
local ms = Data.client.Upgrades.MaxSpawn()
local lb = Data.client.Upgrades.LockBase()
if Library.Labels.UpgradeLabel then
Library.Labels.UpgradeLabel:SetText(string.format("SpawnTier %s | MaxSpawn %s | LockBase %s", tostring(st), tostring(ms), tostring(lb)))
end
if Library.Labels.LockLabel then
local now = workspace:GetServerTimeNow()
local ends = LocalPlayer:GetAttribute("LockEndsAt") or 0
local txt = now < ends and "Locked" or "Unlocked"
Library.Labels.LockLabel:SetText("Base lock: " .. txt)
end
if Library.Labels.MergeLabel then
local held = GetHeldDino()
local free = FreeOwnDinos()
local pairs = 0
local seen = {}
for _, d in ipairs(free) do
local t = TierOf(d)
seen[t] = (seen[t] or 0) + 1
end
for _, c in pairs(seen) do
pairs = pairs + math.floor(c / 2)
end
local txt = "Holding: " .. (held and held.Name or "none") .. " | Pairs: " .. pairs
Library.Labels.MergeLabel:SetText(txt)
end
end)
end
end)
-- Farming: Auto Lock Base only (single feature, no sub-tab needed)
local FarmBox = Tabs.Farming:AddLeftGroupbox("Defense")
FarmBox:AddToggle("AutoLockBase", {
Text = "Auto Lock Base",
Default = false,
Tooltip = "Locks base whenever off cooldown (1s loop).",
Callback = function(v) State.AutoLockBase = v end,
})
Toggles.AutoLockBase:OnChanged(function() State.AutoLockBase = Toggles.AutoLockBase.Value end)
FarmBox:AddButton({ Text = "Lock Now", Func = function()
local ok, res = TryLock()
Notify("Lock Base", ok and "Locked." or ("Failed: " .. tostring(res)), ok and "Success" or "Warning")
end })
-- Inventory: >1 feature -> sub-tabs mandate
local InvMergeSub = Tabs.Inventory:AddSubTab("Dino Management", "swords")
local InvUpSub = Tabs.Inventory:AddSubTab("Upgrades", "arrow-up")
local MergeBox = InvMergeSub:AddLeftGroupbox("Merging")
MergeBox:AddToggle("AutoMergeDinos", {
Text = "Auto Merge Dinos",
Default = false,
Tooltip = "TP into dino to pick up, TP into same-tier dino to merge.",
Callback = function(v) State.AutoMerge = v end,
})
Toggles.AutoMergeDinos:OnChanged(function() State.AutoMerge = Toggles.AutoMergeDinos.Value end)
MergeBox:AddButton({ Text = "Merge Once", Func = function()
if MergeBusy then
Notify("Auto Merge", "Already merging, wait.", "Warning")
return
end
MergeBusy = true
local ok, err = pcall(DoMergePass)
MergeBusy = false
Notify("Auto Merge", ok and "Pass done." or ("Failed: " .. tostring(err)), ok and "Success" or "Warning")
end })
MergeBox:AddButton({ Text = "Drop Held", Func = function()
pcall(function() DropDino:FireServer() end)
end })
local UpBox = InvUpSub:AddLeftGroupbox("Auto-Upgrade")
UpBox:AddToggle("AutoSpawnTier", {
Text = "Auto Upgrade: Spawn Tier",
Default = false,
Tooltip = "UpgradeRequest SpawnTier every 1s.",
Callback = function(v) State.AutoSpawnTier = v end,
})
UpBox:AddToggle("AutoMaxSpawn", {
Text = "Auto Upgrade: Max Spawn",
Default = false,
Tooltip = "UpgradeRequest MaxSpawn every 1s.",
Callback = function(v) State.AutoMaxSpawn = v end,
})
UpBox:AddToggle("AutoLockTime", {
Text = "Auto Upgrade: Lock Time",
Default = false,
Tooltip = "UpgradeRequest LockBase (lock duration) every 1s.",
Callback = function(v) State.AutoLockTime = v end,
})
Toggles.AutoSpawnTier:OnChanged(function() State.AutoSpawnTier = Toggles.AutoSpawnTier.Value end)
Toggles.AutoMaxSpawn:OnChanged(function() State.AutoMaxSpawn = Toggles.AutoMaxSpawn.Value end)
Toggles.AutoLockTime:OnChanged(function() State.AutoLockTime = Toggles.AutoLockTime.Value end)
local UpRight = InvUpSub:AddRightGroupbox("Manual")
UpRight:AddButton({ Text = "Buy Spawn Tier Once", Func = function()
local ok, res = TryUpgrade("SpawnTier")
Notify("Spawn Tier", ok and "Upgraded." or ("Failed: " .. tostring(res)), ok and "Success" or "Warning")
end })
UpRight:AddButton({ Text = "Buy Max Spawn Once", Func = function()
local ok, res = TryUpgrade("MaxSpawn")
Notify("Max Spawn", ok and "Upgraded." or ("Failed: " .. tostring(res)), ok and "Success" or "Warning")
end })
UpRight:AddButton({ Text = "Buy Lock Time Once", Func = function()
local ok, res = TryUpgrade("LockBase")
Notify("Lock Time", ok and "Upgraded." or ("Failed: " .. tostring(res)), ok and "Success" or "Warning")
end })
-- Rebirth: mechanic exists -> show tab
local RbBox = Tabs.Rebirth:AddLeftGroupbox("Rebirth")
RbBox:AddToggle("AutoRebirth", {
Text = "Auto Rebirth",
Default = false,
Tooltip = "RebirthRequest every 1s when possible.",
Callback = function(v) State.AutoRebirth = v end,
})
Toggles.AutoRebirth:OnChanged(function() State.AutoRebirth = Toggles.AutoRebirth.Value end)
RbBox:AddButton({ Text = "Rebirth Now", Func = function()
local ok, res = TryRebirth()
Notify("Rebirth", ok and "Rebirthed." or ("Failed: " .. tostring(res)), ok and "Success" or "Warning")
end })
-- Settings: Config + Anti-AFK (split to sub-tabs per mandate)
local CfgSub = Tabs.Settings:AddSubTab("Config", "save")
local AutoSub = Tabs.Settings:AddSubTab("Automation", "shield")
local MenuBox = CfgSub:AddLeftGroupbox("Menu")
MenuBox:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", { Default = "RightShift", NoUI = true, Text = "Menu keybind" })
MenuBox:AddToggle("ShowCustomCursor", { Text = "Custom Cursor", Default = Library.ShowCustomCursor, Callback = function(v) Library.ShowCustomCursor = v end })
MenuBox:AddButton("Unload", function() Library:Unload() end)
local AfkBox = AutoSub:AddLeftGroupbox("Safety")
AfkBox:AddToggle("AntiAFK", {
Text = "Anti-AFK",
Default = true,
Tooltip = "VirtualUser click on Idled. Enabled by default.",
Callback = function(v) SetAntiAFK(v) end,
})
AfkBox:AddToggle("AntiRejoin", {
Text = "Anti-Rejoin",
Default = false,
Tooltip = "Blocks TeleportService teleports from game.",
Callback = function(v) SetAntiRejoin(v) end,
})
Toggles.AntiAFK:OnChanged(function() SetAntiAFK(Toggles.AntiAFK.Value) end)
Toggles.AntiRejoin:OnChanged(function() SetAntiRejoin(Toggles.AntiRejoin.Value) end)
Library.ToggleKeybind = Options.MenuKeybind
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetIgnoreIndexes({ "MenuKeybind" })
ThemeManager:SetFolder("hidevin")
SaveManager:SetFolder("hidevin/" .. GAME_NAME)
pcall(function() SaveManager:BuildConfigSection(CfgSub) end)
pcall(function() ThemeManager:ApplyToTab(Tabs.Settings) end)
pcall(function() SaveManager:LoadAutoloadConfig() end)
Library:OnUnload(function()
State.AutoMerge = false
State.AutoSpawnTier = false
State.AutoMaxSpawn = false
State.AutoLockTime = false
State.AutoLockBase = false
State.AutoRebirth = false
if AFKConn then pcall(function() AFKConn:Disconnect() end) end
end)
Notify("@hidevin", GAME_NAME .. " loaded on pincoat4.", "Success", 5)
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place