local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local nativePrint = print local player = Players.LocalPlayer local events = ReplicatedStorage:WaitForChild("Events") local configs = ReplicatedStorage:WaitForChild("Configs") local weightsConfig = require(configs:WaitForChild("WeightsConfig")) local dnkConfig = require(configs:WaitForChild("DnkConfig")) local stagesConfig = require(configs:WaitForChild("StagesConfig")) local dataClient = require(ReplicatedStorage:WaitForChild("Data")).client local gameEnvironment = getfenv(getmetatable(dataClient).__index) hookfunction(gameEnvironment.print, function() end) hookfunction(gameEnvironment.warn, function() end) local function log(message) nativePrint("[LiftFarm] " .. tostring(message)) end local sellMuscleRemote = events:WaitForChild("SellMuscle") local buyWeightRemote = events:WaitForChild("BuyWeight") local buyDnkRemote = events:WaitForChild("BuyDnk") local buyStageRemote = events:WaitForChild("BuyStage") local equipRemote = events:WaitForChild("Equip") local LIFT_INTERVAL = 1 / 30 local SELL_PERCENT = 0.98 local SELL_INTERVAL = 2 local EQUIP_WAIT = 0.3 local RETRY_WAIT = 1 local GAIN_TICK = 60 local CAPACITY_MARGIN = 2 local MAX_UPGRADES = 40 local function getCharacter() local character = player.Character if character and character:FindFirstChildOfClass("Humanoid") then return character end return player.CharacterAdded:Wait() end local function findWeightTool(character) for _, item in ipairs(character:GetChildren()) do if item:IsA("Tool") and item:GetAttribute("IsWeight") then return item end end local backpack = player:FindFirstChild("Backpack") if backpack then for _, item in ipairs(backpack:GetChildren()) do if item:IsA("Tool") and item:GetAttribute("IsWeight") then return item end end end return nil end local function equipWeight(character, tool) local humanoid = character:FindFirstChildOfClass("Humanoid") if not humanoid then return false end pcall(function() humanoid:EquipTool(tool) end) task.wait(EQUIP_WAIT) return tool.Parent == character end local function requestWeightGrant() pcall(function() equipRemote:InvokeServer(dataClient.CurrentWeight(), "Weights") end) end local function musclePerSecond() local weightEntry = weightsConfig[dataClient.CurrentWeight()] if not weightEntry then return 0 end return weightEntry.MuscleGain * dataClient.StrengthBoost() * GAIN_TICK end local function buyWeights() local bought = 0 local index = dataClient.MaxUnlockedWeight() local coins = dataClient.Coins() while bought < MAX_UPGRADES do local entry = weightsConfig[index] if not entry or entry.donate or entry.Price > coins then break end local success, result = pcall(function() return buyWeightRemote:InvokeServer(index, weightsConfig, "Weights") end) if not success or not result then break end coins -= entry.Price bought += 1 index += 1 task.wait() end return bought end local function buyDnks() local bought = 0 local index = dataClient.CurrentDnk() + 1 local coins = dataClient.Coins() while bought < MAX_UPGRADES and dataClient.Dnk_capacity() < musclePerSecond() * CAPACITY_MARGIN do local entry = dnkConfig[index] if not entry or entry.donate or entry.Price > coins then break end local success, result = pcall(function() return buyDnkRemote:InvokeServer(index) end) if not success or not result then break end coins -= entry.Price bought += 1 index += 1 task.wait() end return bought end local function buyStages() local bought = 0 local index = dataClient.BestStage() + 1 local coins = dataClient.Coins() while bought < MAX_UPGRADES do local entry = stagesConfig[index] if not entry or entry.Price > coins then break end local success, result = pcall(function() return buyStageRemote:InvokeServer(index) end) if not success or not result then break end coins -= entry.Price bought += 1 index += 1 task.wait() end return bought end local function upgrade() local weightCount = buyWeights() local dnkCount = buyDnks() local stageCount = buyStages() if weightCount + dnkCount + stageCount > 0 then log(string.format("upgrade | weight +%d | dnk +%d | stage +%d", weightCount, dnkCount, stageCount)) end end local function liftWeight(character, tool) local threshold = dataClient.Dnk_capacity() * SELL_PERCENT local deadline = os.clock() + SELL_INTERVAL while dataClient.Muscle() < threshold and os.clock() < deadline do if tool.Parent ~= character then return false end tool:Activate() task.wait(LIFT_INTERVAL) end return true end local function sellMuscle() local success, gained = pcall(function() return sellMuscleRemote:InvokeServer() end) if success and gained and gained > 0 then log(string.format("sold %s | coins %s", tostring(gained), tostring(dataClient.Coins()))) end end log(string.format("started | weight %d | stage %d | dnk %d | capacity %s", dataClient.CurrentWeight(), dataClient.Stage(), dataClient.CurrentDnk(), tostring(dataClient.Dnk_capacity()))) while true do upgrade() local character = getCharacter() local tool = findWeightTool(character) if tool then if tool.Parent ~= character and not equipWeight(character, tool) then task.wait(RETRY_WAIT) continue end if liftWeight(character, tool) then sellMuscle() end else requestWeightGrant() task.wait(RETRY_WAIT) end end