diff --git a/modules/client_stats/stats.lua b/modules/client_stats/stats.lua index 53959ad..9af95fb 100644 --- a/modules/client_stats/stats.lua +++ b/modules/client_stats/stats.lua @@ -133,6 +133,7 @@ function sendStats() cpu = g_platform.getCPUName(), mem = g_platform.getTotalSystemMemory(), mem_usage = g_platform.getMemoryUsage(), + lua_mem_usage = gcinfo(), os_name = g_platform.getOSName(), platform = g_window.getPlatformType(), uptime = g_clock.seconds() @@ -170,6 +171,7 @@ function update() end statsWindow.debugPanel.sleepTime:setText("Sleep: " .. math.round(g_stats.getSleepTime() / math.max(1, g_clock.micros() - lastSleepTimeReset), 2) .. "%") + statsWindow.debugPanel.luaRamUsage:setText("Ram usage by lua: " .. gcinfo() .. " kb") local adaptive = "Adaptive: " .. g_adaptiveRenderer.getLevel() .. " | " .. g_adaptiveRenderer.getDebugInfo() adaptiveRender:setText(adaptive) atlas:setText("Atlas: " .. g_atlas.getStats()) diff --git a/modules/client_stats/stats.otui b/modules/client_stats/stats.otui index 13a65bc..8ed8acb 100644 --- a/modules/client_stats/stats.otui +++ b/modules/client_stats/stats.otui @@ -38,6 +38,10 @@ MainWindow text: - anchors.top: parent.top + DebugText + id: luaRamUsage + text: - + DebugLabel !text: tr('Render') @@ -89,7 +93,7 @@ MainWindow text: - DebugLabel - !text: tr('Widgets') + !text: tr('Widgets & Objects') DebugText id: widgetsInfo diff --git a/modules/game_battle/battle.lua b/modules/game_battle/battle.lua index 725d435..33579e4 100644 --- a/modules/game_battle/battle.lua +++ b/modules/game_battle/battle.lua @@ -3,7 +3,6 @@ battleButton = nil battlePanel = nil filterPanel = nil toggleFilterButton = nil -creatureAgeList = {} battleButtonsList = {} mouseWidget = nil @@ -233,12 +232,8 @@ function checkCreatures() local dimension = modules.game_interface.getMapPanel():getVisibleDimension() local spectators = g_map.getSpectatorsInRangeEx(player:getPosition(), false, math.floor(dimension.width / 2), math.floor(dimension.width / 2), math.floor(dimension.height / 2), math.floor(dimension.height / 2)) - creatures = {} + local creatures = {} for _, creature in ipairs(spectators) do - if creatureAgeList[creature] == nil then - creatureAgeList[creature] = creatureAgeCounter - creatureAgeCounter = creatureAgeCounter + 1 - end if doCreatureFitFilters(creature) then table.insert(creatures, creature) end @@ -335,23 +330,23 @@ function sortCreatures(creatures) local playerPos = player:getPosition() table.sort(creatures, function(a, b) if getDistanceBetween(playerPos, a:getPosition()) == getDistanceBetween(playerPos, b:getPosition()) then - return creatureAgeList[a] > creatureAgeList[b] + return a:getAge() > b:getAge() end return getDistanceBetween(playerPos, a:getPosition()) > getDistanceBetween(playerPos, b:getPosition()) end) elseif getSortType() == 'health' then table.sort(creatures, function(a, b) if a:getHealthPercent() == b:getHealthPercent() then - return creatureAgeList[a] > creatureAgeList[b] + return a:getAge() > b:getAge() end return a:getHealthPercent() > b:getHealthPercent() end) elseif getSortType() == 'age' then - table.sort(creatures, function(a, b) return creatureAgeList[a] > creatureAgeList[b] end) + table.sort(creatures, function(a, b) return a:getAge() > b:getAge() end) else -- name table.sort(creatures, function(a, b) if a:getName():lower() == b:getName():lower() then - return creatureAgeList[a] > creatureAgeList[b] + return a:getAge() > b:getAge() end return a:getName():lower() > b:getName():lower() end) diff --git a/modules/game_bot/bot.otui b/modules/game_bot/bot.otui index b858cdf..046b2e6 100644 --- a/modules/game_bot/bot.otui +++ b/modules/game_bot/bot.otui @@ -1,3 +1,23 @@ +BotTabBar < MoveableTabBar + tab-spacing: 1 + margin-left: 1 + margin-right: 1 + movable: false + height: 20 + + $on: + visible: true + margin-top: 2 + + $!on: + visible: false + margin-top: -20 + +BotTabBarButton < MoveableTabBarButton + padding: 3 + text-horizontal-auto-resize: true + + MiniWindow id: botWindow !text: tr('Bot') @@ -88,24 +108,12 @@ MiniWindow margin-left: 2 margin-right: 2 - MoveableTabBar + BotTabBar id: botTabs anchors.top: prev.bottom anchors.left: parent.left anchors.right: parent.right - tab-spacing: 1 - margin-left: 1 - margin-right: 1 - height: 20 - movable: false - - $on: - visible: true - margin-top: 2 - - $!on: - visible: false - margin-top: -20 + margin-right: -20 Panel id: botPanel diff --git a/modules/game_bot/executor.lua b/modules/game_bot/executor.lua index eb58fc6..366f60d 100644 --- a/modules/game_bot/executor.lua +++ b/modules/game_bot/executor.lua @@ -67,6 +67,12 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, webs context.table = table context.string = string context.tonumber = tonumber + context.type = type + context.pcall = pcall + context.load = function(str) return load(str, nil, nil, context) end + context.loadstring = context.load + context.assert = assert + context.gcinfo = gcinfo context.tr = tr context.json = json context.regexMatch = regexMatch @@ -84,9 +90,16 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, webs context.g_window = g_window context.g_mouse = g_mouse + context.Item = Item + context.Creature = Creature + context.ThingType = ThingType + context.Effect = Effect + context.Missile = Missile + context.Player = Player + context.Monster = Monster context.StaticText = StaticText - context.Config = Config context.HTTP = HTTP + context.OutputMessage = OutputMessage context.modules = modules -- log functions @@ -123,7 +136,7 @@ function executeBot(config, storage, tabs, msgCallback, saveConfigCallback, webs context.time = g_clock.millis() for i, macro in ipairs(context._macros) do - if macro.lastExecution + macro.timeout <= context.now and (macro.name == nil or macro.name:len() < 1 or macro.enabled) then + if macro.lastExecution + macro.timeout <= context.now and macro.enabled then local status, result = pcall(function() if macro.callback(macro) then macro.lastExecution = context.now diff --git a/modules/game_bot/functions/const.lua b/modules/game_bot/functions/const.lua new file mode 100644 index 0000000..149f3a8 --- /dev/null +++ b/modules/game_bot/functions/const.lua @@ -0,0 +1,8 @@ +North = 0 +East = 1 +South = 2 +West = 3 +NorthEast = 4 +SouthEast = 5 +SouthWest = 6 +NorthWest = 7 \ No newline at end of file diff --git a/modules/game_bot/functions/icon.lua b/modules/game_bot/functions/icon.lua index 2cf957f..0a8d82c 100644 --- a/modules/game_bot/functions/icon.lua +++ b/modules/game_bot/functions/icon.lua @@ -10,8 +10,6 @@ context.addIcon = function(id, options, callback) text: string x: float (0.0 - 1.0) y: float (0.0 - 1.0) - width: number - height: number hotkey: string switchable: true / false [default: true] movable: true / false [default: true] @@ -63,6 +61,9 @@ context.addIcon = function(id, options, callback) widget.status:hide() widget.status:setOn(true) else + if config.enabled ~= true then + config.enabled = false + end widget.status:setOn(config.enabled) end diff --git a/modules/game_bot/functions/main.lua b/modules/game_bot/functions/main.lua index aaaa415..0675396 100644 --- a/modules/game_bot/functions/main.lua +++ b/modules/game_bot/functions/main.lua @@ -95,6 +95,8 @@ context.macro = function(timeout, name, hotkey, callback, parent) if context.storage._macros[name] == true then macro.setOn() end + else + macro.enabled = true -- unnamed macros are enabled by default end local desc = "lua" diff --git a/modules/game_bot/functions/npc.lua b/modules/game_bot/functions/npc.lua index bbcea4b..585a2d4 100644 --- a/modules/game_bot/functions/npc.lua +++ b/modules/game_bot/functions/npc.lua @@ -16,16 +16,17 @@ context.NPC.isTrading = function() end context.NPC.hasTrade = context.NPC.isTrading context.NPC.hasTradeWindow = context.NPC.isTrading - +context.NPC.isTradeOpen = context.NPC.isTrading context.NPC.getSellItems = function() if not context.NPC.isTrading() then return {} end local items = {} for i, item in ipairs(modules.game_npctrade.tradeItems[modules.game_npctrade.SELL]) do table.insert(items, { + item = item.ptr, id = item.ptr:getId(), - name = item.name, count = item.ptr:getCount(), + name = item.name, subType = item.ptr:getSubType(), weight = item.weight / 100, price = item.price @@ -36,11 +37,13 @@ end context.NPC.getBuyItems = function() if not context.NPC.isTrading() then return {} end + local items = {} for i, item in ipairs(modules.game_npctrade.tradeItems[modules.game_npctrade.BUY]) do table.insert(items, { + item = item.ptr, id = item.ptr:getId(), - name = item.name, count = item.ptr:getCount(), + name = item.name, subType = item.ptr:getSubType(), weight = item.weight / 100, price = item.price @@ -67,7 +70,15 @@ end context.NPC.sell = function(item, count, ignoreEquipped) if type(item) == 'number' then + for i, entry in ipairs(context.NPC.getSellItems()) do + if entry.id == item then + item = entry.item + break + end + end + if type(item) == 'number' then item = Item.create(item) + end end if count == 0 then count = 1 @@ -83,7 +94,15 @@ end context.NPC.buy = function(item, count, ignoreCapacity, withBackpack) if type(item) == 'number' then + for i, entry in ipairs(context.NPC.getBuyItems()) do + if entry.id == item then + item = entry.item + break + end + end + if type(item) == 'number' then item = Item.create(item) + end end if count == nil or count <= 0 then count = 1 diff --git a/modules/game_bot/functions/ui.lua b/modules/game_bot/functions/ui.lua index 9a37c68..31201d4 100644 --- a/modules/game_bot/functions/ui.lua +++ b/modules/game_bot/functions/ui.lua @@ -10,9 +10,24 @@ context.setupUI = function(otml, parent) end context.addTab = function(name) + local tab = context.tabs:getTab(name) + if tab then -- return existing tab + return tab.tabPanel.content + end + context.tabs:setOn(true) - return context.tabs:addTab(name, g_ui.createWidget('BotPanel')).tabPanel.content + local newTab = context.tabs:addTab(name, g_ui.createWidget('BotPanel')).tabPanel.content + print(#(context.tabs.tabs)) + if #(context.tabs.tabs) > 5 then + for k,tab in pairs(context.tabs.tabs) do + tab:setPadding(3) + tab:setFont('cipsoftFont') + end + end + + return newTab end +context.getTab = context.addTab context.addSwitch = function(id, text, onClickCallback, parent) if not parent then diff --git a/modules/game_npctrade/npctrade.lua b/modules/game_npctrade/npctrade.lua index 744b3f7..f8f5bb4 100644 --- a/modules/game_npctrade/npctrade.lua +++ b/modules/game_npctrade/npctrade.lua @@ -424,7 +424,7 @@ function onOpenNpcTrade(items) newItem.price = item[4] table.insert(tradeItems[BUY], newItem) end - + if item[5] > 0 then local newItem = {} newItem.ptr = item[1] @@ -551,8 +551,10 @@ function sellAll() for itemid,item in pairs(playerItems) do local item = Item.create(itemid) local amount = getSellQuantity(item) - if amount > 0 then - g_game.sellItem(item, amount, ignoreEquipped:isChecked()) + while amount > 0 do + local maxAmount = math.min(amount, getMaxAmount()) + g_game.sellItem(item, maxAmount, ignoreEquipped:isChecked()) + amount = amount - maxAmount end end end diff --git a/modules/game_walking/walking.lua b/modules/game_walking/walking.lua index dd1c869..1203400 100644 --- a/modules/game_walking/walking.lua +++ b/modules/game_walking/walking.lua @@ -20,7 +20,8 @@ function init() onPositionChange = onPositionChange, onWalk = onWalk, onTeleport = onTeleport, - onWalkFinish = onWalkFinish + onWalkFinish = onWalkFinish, + onCancelWalk = onCancelWalk }) modules.game_interface.getRootPanel().onFocusChange = stopSmartWalk @@ -255,6 +256,10 @@ function onWalkFinish(player) end end +function onCancelWalk(player) + player:lockWalk(50) +end + function walk(dir) lastManualWalk = g_clock.millis() local player = g_game.getLocalPlayer() diff --git a/otclient_dx.exe b/otclient_dx.exe index 73b5430..1846c32 100644 Binary files a/otclient_dx.exe and b/otclient_dx.exe differ diff --git a/otclient_gl.exe b/otclient_gl.exe index afd50aa..8db172d 100644 Binary files a/otclient_gl.exe and b/otclient_gl.exe differ diff --git a/pdb/otclient_dx.zip b/pdb/otclient_dx.zip index 96a153b..ff153af 100644 Binary files a/pdb/otclient_dx.zip and b/pdb/otclient_dx.zip differ diff --git a/pdb/otclient_gl.zip b/pdb/otclient_gl.zip index cd6692a..bdf060e 100644 Binary files a/pdb/otclient_gl.zip and b/pdb/otclient_gl.zip differ