
Keyless

local SETTINGS = {
-- Roll
["AUTO_ROLL"] = true, -- auto roll (false|true)
-- Stock
["AUTO_DICE_STOCK"] = true, -- auto purchase dice stock (false|true)
["AUTO_POTION_STOCK"] = true, -- auto purchase potions stock (false|true)
["AUTO_MERCHANT_STOCK"] = true, -- auto purchase merchant stock when arrive (false|true)
-- Roulette
["AUTO_ROLL_ROULETTE"] = true, -- auto spin roulette (false|true)
-- Quests
["AUTO_CLAIM_QUESTS"] = true, -- auto claim quests rewards (false|true)
-- Baddies
["AUTO_EQUIP_BEST_BADDIES"] = true, -- auto equip/place best baddies (false|true)
["BEST_BADDIES_EQUIP_COOLDOWN"] = 180, -- cooldown to equip/place best baddies (number in seconds)
}
if not game.IsLoaded then game.Laoded:Wait() end
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local GameStatus = ReplicatedStorage.status
local MerchantBuyRemote = ReplicatedStorage.Events.MerchantBuy
local MerchantRequestRemote = ReplicatedStorage.Events.MerchantRequest
local MerchantStockUpdateRemote = ReplicatedStorage.Events.MerchantStockUpdate
local UpdateRollingDiceRemote = ReplicatedStorage.Events.updateRollingDice
local PlaceBestBaddiesRemote = ReplicatedStorage.Events.PlaceBestBaddies
local SponRequestRemote = ReplicatedStorage.Events.spinrequest
local RegularPetRemote = ReplicatedStorage.Events.RegularPet
local QuestRemote = ReplicatedStorage.Events.QuestRemote
local BuyItemRemote = ReplicatedStorage.Events.buy
local Player = Players.LocalPlayer
local GameEnv = getsenv(Player.PlayerScripts:FindFirstChildOfClass("LocalScript"))._G
while not (GameEnv.Profile and GameEnv.Profile.Data) do
task.wait()
end
local PotionsData = require(ReplicatedStorage.Modules.PotionData)
local DicesData = require(ReplicatedStorage.Modules.DiceData)
local BEST_BADDIES_EQUIP_COOLDOWN = SETTINGS["BEST_BADDIES_EQUIP_COOLDOWN"]
local EQUIP_BEST_COOLDOWN = 0
local Connections = {}
local MerchantStock = nil
local NULITTY_SPAWN_CFRAME = CFrame.new(-58, 8, -19)
if type(BEST_BADDIES_EQUIP_COOLDOWN) ~= "number" then
BEST_BADDIES_EQUIP_COOLDOWN = 30
end
local function IsAlive(Character)
local Humanoid = Character and Character:FindFirstChildOfClass("Humanoid")
return Humanoid and Humanoid.Health > 0
end
local function GetCharacter(Target)
local Character = (Target or Player).Character
return IsAlive(Character) and Character
end
local function GetRootPart(Target)
local Character = GetCharacter(Target)
return Character and Character:FindFirstChild("HumanoidRootPart")
end
local function GetCoins()
return GameEnv.Profile.Data.Coins or 0
end
local function GetRebirths()
return GameEnv.Profile.Data.Rebirths or 0
end
local function GetSpins()
return Player.rewards.SpinCount.Value
end
local function GetDiceStock()
return GameEnv.Profile.Data.dice_stock
end
local function GetPotionStock()
return GameEnv.Profile.Data.potion_stock
end
local function GetQuests()
return (GameEnv.Profile.Data.quests or {}).active_quests
end
local function IsNullityActive()
return GameStatus:GetAttribute("nullity_active")
end
local function ValidateMerchantStock()
return MerchantStock and MerchantStock.wares
end
local function RequestMerchantStock()
local RootPart = GetRootPart()
if not RootPart then return end
RootPart.CFrame = NULITTY_SPAWN_CFRAME
MerchantStock = MerchantRequestRemote:InvokeServer()
if not ValidateMerchantStock() and workspace:FindFirstChild("Nullity") then
local ProximityPrompt = workspace.Nullity:FindFirstChild("ProximityPrompt", true)
if ProximityPrompt then
fireproximityprompt(ProximityPrompt)
task.wait(2)
end
end
return MerchantStock
end
--[[
table.foreach(getsenv(game.Players.LocalPlayer.PlayerScripts:FindFirstChildOfClass("LocalScript"))._G.Profile.Data, print)
setclipboard(game.HttpService:JSONEncode(getsenv(game.Players.LocalPlayer.PlayerScripts:FindFirstChildOfClass("LocalScript"))._G.Profile.Data.quests))
]]
local function RollNextDice()
local RollState = Player.PlayerGui.Main:FindFirstChild("RollState", true)
if not RollState then return end
RollState:InvokeServer()
end
local function OpenEgg(EggName, Amount)
task.spawn(RegularPetRemote.InvokeServer, RegularPetRemote, EggName or "CatEgg", Amount)
end
local function CheckCanPurchase(Data)
if not Data.Not_Restockable then
return (Data.Cost or 0) <= GetCoins() and (Data.RebirthsRequired or 0) <= GetRebirths()
end
end
local function PurshaseItem(Category, ItemName, Data, StockAmount)
local Affordability = math.floor(GetCoins() / Data.Cost)
local MaxPurchase = math.min(StockAmount, Affordability)
return BuyItemRemote:InvokeServer(ItemName, MaxPurchase, Category)
end
local function HandleConnections()
local Connections = BADDIES_SCRIPT_CONNECTIONS or {}
getgenv().BADDIES_SCRIPT_CONNECTIONS = Connections
for index = #Connections, 1, -1 do
Connections[index]:Disconnect()
Connections[index] = nil
end
local function NewConnection(Signal, Func)
table.insert(Connections, Signal:Connect(Func))
end
NewConnection(MerchantStockUpdateRemote.OnClientEvent, function(ID, Stock)
while not ValidateMerchantStock() and IsNullityActive() do
RequestMerchantStock()
end
MerchantStock.wares[ID].Stock = Stock
end)
NewConnection(GameStatus:GetAttributeChangedSignal("nullity_active"), function()
if not IsNullityActive() then
MerchantStock = nil
end
end)
end
local function PurchaseDiceStock()
local DiceStock = GetDiceStock()
if not DiceStock or not next(DiceStock) then return end
for DiceName, DiceData in DicesData do
local StockAmount = DiceStock[DiceName] or 0
if StockAmount == 0 then continue end
if not CheckCanPurchase(DiceData) then continue end
-- { Cost: number, RebirthsRequired: number }
if PurshaseItem("dice", DiceName, DiceData, StockAmount) then
DiceStock[DiceName] = 0
end
end
end
local function PurchasePotionStock()
local PotionStock = GetPotionStock()
if not PotionStock or not next(PotionStock) then return end
for PotionName, PotionData in PotionsData do
local StockAmount = PotionStock[PotionName] or 0
if StockAmount == 0 then continue end
if not CheckCanPurchase(PotionData) then continue end
-- { Cost: number, RebirthsRequired: number }
if PurshaseItem("potion", PotionName, PotionData, StockAmount) then
PotionStock[PotionName] = 0
end
end
end
local function RollRoulette()
if GetSpins() > 0 then
SponRequestRemote:InvokeServer()
end
end
local function ClaimQuests()
local ActiveQuests = GetQuests()
if not ActiveQuests then return end
for ID, Quest in ActiveQuests do
if Quest.completed and not Quest.claimed then
QuestRemote:InvokeServer("ClaimReward", ID)
end
end
end
local function EquipBestBaddies()
if (tick() - EQUIP_BEST_COOLDOWN) > 0 then
PlaceBestBaddiesRemote:InvokeServer()
EQUIP_BEST_COOLDOWN = tick() + BEST_BADDIES_EQUIP_COOLDOWN
end
end
local function PurchaseMerchantStock()
while not ValidateMerchantStock() and IsNullityActive() do
RequestMerchantStock()
end
if not IsNullityActive() then return end
if not ValidateMerchantStock() then return end
for ID, StockData in MerchantStock.wares do
local DiceName = StockData.Name
if not CheckCanPurchase(DicesData[DiceName]) then continue end
for index = StockData.Stock, 1, -1 do
if index == 1 then
MerchantBuyRemote:InvokeServer(ID)
else
task.spawn(MerchantBuyRemote.InvokeServer, MerchantBuyRemote, ID)
end
end
end
end
local function Main()
local uid = math.random()
shared.auid = uid
HandleConnections()
while task.wait() and shared.auid == uid do
-- if SETTINGS["AUTO_EQUIP_BEST_DICE"] then EquipBestDice() end
if SETTINGS["AUTO_ROLL"] then RollNextDice() end
if SETTINGS["AUTO_DICE_STOCK"] then PurchaseDiceStock() end
if SETTINGS["AUTO_POTION_STOCK"] then PurchasePotionStock() end
if SETTINGS["AUTO_MERCHANT_STOCK"] then PurchaseMerchantStock() end
if SETTINGS["AUTO_ROLL_ROULETTE"] then RollRoulette() end
if SETTINGS["AUTO_CLAIM_QUESTS"] then ClaimQuests() end
if SETTINGS["AUTO_EQUIP_BEST_BADDIES"] then EquipBestBaddies() end
end
end
Main()No comments yet for this script.