-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. 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 Rscripts 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)