--[[ d888888b d888888b d88888b .88b d88. .d8888. db d8b db .d8b. d8888b. d8888b. d88888b d8888b. `88' `~~88~~' 88' 88'YbdP`88 88' YP 88 I8I 88 d8' `8b 88 `8D 88 `8D 88' 88 `8D 88 88 88ooooo 88 88 88 `8bo. 88 I8I 88 88ooo88 88oodD' 88oodD' 88ooooo 88oobY' 88 88 88~~~~~ 88 88 88 `Y8b. Y8 I8I 88 88~~~88 88~~~ 88~~~ 88~~~~~ 88`8b .88. 88 88. 88 88 88 db 8D `8b d8'8b d8' 88 88 88 88 88. 88 `88. Y888888P YP Y88888P YP YP YP `8888Y' `8b8' `8d8' YP YP 88 88 Y88888P 88 YD Item Swapper - Swap items from your inventory using the Numpad! Changelog: July 04, 2016 [r3.3]: - Updated for 6.13. June 20, 2016 [r3.2]: - Updated for 6.12. June 03, 2016 [r3.1]: - Updated for 6.11. May 19, 2016 [r3.0]: - Updated for 6.10. May 04, 2016 [r2.9]: - Updated for 6.9. April 23, 2016 [r2.8]: - Updated for 6.8 Mini-Patch. April 20, 2016 [r2.7]: - Updated for 6.8. - Updated BoL-Tracker's code. April 16, 2016 [r2.6]: - Fixed a bug with the Auto-Updater. April 16, 2016 [r2.5]: - Improved the performance of the Script. April 08, 2016 [r2.4]: - Updated for 6.7HF. - Fixed a 'nil value' throwing error. - Re-structured the Packet Table. April 06, 2016 [r2.3]: - Updated for 6.7. April 04, 2016 [r2.2]: - Deleted IndexOf function and its usage. - Added Script Version and Game Version to the menu. April 01, 2016 [r2.1]: - Updated for 6.6HF. March 28, 2016 [r2.0]: - Improved the Auto-Updater. - Added Global Y Offset for the Auto-Updater so the Drawing won't draw in the same Spot. March 27, 2016 [r1.9]: - Added an Auto-Updater. March 23, 2016 [r1.8]: - Updated for 6.6. March 14, 2016 [r1.7]: - Re-wrote the Script as a Class (For my upcoming Auto-Updater). - Added Bol-Tools Tracker. March 11, 2016 [r1.6]: - Updated for 6.5HF. March 09, 2016 [r1.5]: - Updated for 6.5. March 07, 2016 [r1.4]: - Re-wrote the tables to make it look better. - Now it will support Mini-Patches as well. March 04, 2016 [r1.3]: - Improved SwapItem Function: - It won't send packets if both inventory slots are empty. - It will automatically check if the first slot you choose is empty and reverse swap the items. March 02, 2016 [r1.2]: - Fixed a little mistake, the script was not working anymore. February 29, 2016 [r1.1]: - Added a version check so the game won't crash if the Script is used on an "Outdated" Version of the game. February 28, 2016 [r1.0]: - First Release. ]]-- local Script = { Name = "Item Swapper", Version = 3.3 } local function Print(string) print("" .. Script.Name .. ": " .. string .. "") end if not VIP_USER then Print("Sorry, this script is VIP Only!") return end class "ISUpdater" local random, round = math.random, math.round function ISUpdater:__init(LocalVersion, Host, Path, LocalPath, CallbackUpdate, CallbackNoUpdate, CallbackNewVersion, CallbackError) self.LocalVersion = LocalVersion self.Host = Host self.VersionPath = '/BoL/TCPUpdater/GetScript5.php?script=' .. self:Base64Encode(self.Host .. Path .. '.ver') .. '&rand=' .. random(99999999) self.ScriptPath = '/BoL/TCPUpdater/GetScript5.php?script=' .. self:Base64Encode(self.Host .. Path .. '.lua') .. '&rand=' .. random(99999999) self.LocalPath = LocalPath self.CallbackUpdate = CallbackUpdate self.CallbackNoUpdate = CallbackNoUpdate self.CallbackNewVersion = CallbackNewVersion self.CallbackError = CallbackError self.OffsetY = _G.OffsetY and _G.OffsetY or 0 _G.OffsetY = _G.OffsetY and _G.OffsetY + round(0.08333333333 * WINDOW_H) or round(0.08333333333 * WINDOW_H) AddDrawCallback(function() self:OnDraw() end) self:CreateSocket(self.VersionPath) self.DownloadStatus = 'Connecting to Server..' self.Progress = 0 AddTickCallback(function() self:GetOnlineVersion() end) end function ISUpdater:OnDraw() if (self.DownloadStatus == 'Downloading Script:' or self.DownloadStatus == 'Downloading Version:') and self.Progress == 100 then return end local LoadingBar = { X = round(0.91 * WINDOW_W), Y = round(0.73 * WINDOW_H) - self.OffsetY, Height = round(0.01666666666 * WINDOW_H), Width = round(0.171875 * WINDOW_W), Border = 1, HeaderFontSize = round(0.01666666666 * WINDOW_H), ProgressFontSize = round(0.01125 * WINDOW_H), BackgroundColor = 0xFF3A99D9, ForegroundColor = 0xFF35445A } DrawText(self.DownloadStatus, LoadingBar.HeaderFontSize, LoadingBar.X - 0.5 * LoadingBar.Width, LoadingBar.Y - LoadingBar.Height - LoadingBar.Border, LoadingBar.BackgroundColor) DrawLine(LoadingBar.X, LoadingBar.Y, LoadingBar.X, LoadingBar.Y + LoadingBar.Height, LoadingBar.Width, LoadingBar.BackgroundColor) if self.Progress > 0 then local Width = 0.01 * ((LoadingBar.Width - 2 * LoadingBar.Border) * self.Progress) local Offset = 0.5 * (LoadingBar.Width - Width) DrawLine(LoadingBar.X - Offset + LoadingBar.Border, LoadingBar.Y + LoadingBar.Border, LoadingBar.X - Offset + LoadingBar.Border, LoadingBar.Y + LoadingBar.Height - LoadingBar.Border, Width, LoadingBar.ForegroundColor) end DrawText(self.Progress .. '%', LoadingBar.ProgressFontSize, LoadingBar.X - 2 * LoadingBar.Border, LoadingBar.Y + LoadingBar.Border, self.Progress < 50 and LoadingBar.ForegroundColor or LoadingBar.BackgroundColor) end function ISUpdater:CreateSocket(url) if not self.LuaSocket then self.LuaSocket = require("socket") else self.Socket:close() self.Socket = nil self.Size = nil self.RecvStarted = false end self.LuaSocket = require("socket") self.Socket = self.LuaSocket.tcp() self.Socket:settimeout(0, 'b') self.Socket:settimeout(99999999, 't') self.Socket:connect('sx-bol.eu', 80) self.Url = url self.Started = false self.LastPrint = "" self.File = "" end local gsub, byte, sub = string.gsub, string.byte, string.sub function ISUpdater:Base64Encode(data) local b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' return (gsub((gsub(data, '.', function(x) local r, b = '', byte(x) for i = 8, 1, -1 do r = r .. (b % 2 ^ i - b % 2 ^ (i - 1) > 0 and '1' or '0') end return r; end) .. '0000'), '%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c = 0 for i = 1, 6 do c = c + (sub(x, i, i) == '1' and 2 ^ (6 - i) or 0) end return sub(b, 1 + c, 1 + c) end) .. ({ '', '==', '=' })[#data % 3 + 1]) end local find, len = string.find, string.len function ISUpdater:GetOnlineVersion() if self.GotScriptVersion then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET " .. self.Url .. " HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading Version:' self.Progress = 0 end self.File = self.File .. (self.Receive or self.Snipped) if find(self.File, '') then if not self.Size then self.Size = tonumber(sub(self.File, 6 + find(self.File, ''), find(self.File, '') - 1)) end if find(self.File, '') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = len(sub(self.File, 1 + ScriptFind, ScriptEnd or -1)) self.Progress = round(100 / self.Size * DownloadedSize, 2) end end if find(self.File, '') then local a, b = find(self.File, '\r\n\r\n') self.File = sub(self.File, a, -1) self.NewFile = '' for line, content in ipairs(self.File:split('\n')) do if len(content) > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = find(self.File, '') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else self.OnlineVersion = (Base64Decode(sub(self.File, 1 + ContentStart, ContentEnd - 1))) self.OnlineVersion = tonumber(self.OnlineVersion) if self.OnlineVersion > self.LocalVersion then if self.CallbackNewVersion and type(self.CallbackNewVersion) == 'function' then self.CallbackNewVersion(self.OnlineVersion,self.LocalVersion) end self:CreateSocket(self.ScriptPath) self.DownloadStatus = 'Connecting to Server..' self.Progress = 0 AddTickCallback(function() self:DownloadUpdate() end) else if self.CallbackNoUpdate and type(self.CallbackNoUpdate) == 'function' then self.CallbackNoUpdate(self.LocalVersion) end end end self.GotScriptVersion = true end end function ISUpdater:DownloadUpdate() if self.GotScriptUpdate then return end self.Receive, self.Status, self.Snipped = self.Socket:receive(1024) if self.Status == 'timeout' and not self.Started then self.Started = true self.Socket:send("GET " .. self.Url .. " HTTP/1.1\r\nHost: sx-bol.eu\r\n\r\n") end if (self.Receive or (#self.Snipped > 0)) and not self.RecvStarted then self.RecvStarted = true self.DownloadStatus = 'Downloading Script:' self.Progress = 0 end self.File = self.File .. (self.Receive or self.Snipped) if find(self.File, '') then if not self.Size then self.Size = tonumber(sub(self.File, 6 + find(self.File, ''), find(self.File, '') - 1)) end if find(self.File, '') if ScriptEnd then ScriptEnd = ScriptEnd - 1 end local DownloadedSize = len(sub(self.File, 1 + ScriptFind, ScriptEnd or -1)) self.Progress = round(100 / self.Size * DownloadedSize, 2) end end if find(self.File, '') then local a, b = find(self.File, '\r\n\r\n') self.File = sub(self.File, a, -1) self.NewFile = '' for line, content in ipairs(self.File:split('\n')) do if len(content) > 5 then self.NewFile = self.NewFile .. content end end local HeaderEnd, ContentStart = find(self.NewFile, '') if not ContentStart or not ContentEnd then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local newf = sub(self.NewFile, 1 + ContentStart, ContentEnd - 1) local newf = gsub(newf, '\r','') if len(newf) ~= self.Size then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end return end local newf = Base64Decode(newf) if type(load(newf)) ~= 'function' then if self.CallbackError and type(self.CallbackError) == 'function' then self.CallbackError() end else local f = io.open(self.LocalPath,"w+b") f:write(newf) f:close() if self.CallbackUpdate and type(self.CallbackUpdate) == 'function' then self.CallbackUpdate(self.OnlineVersion,self.LocalVersion) end end end self.GotScriptUpdate = true end end local format = string.format AddLoadCallback(function() local UpdaterInfo = { Version = Script.Version, Host = 'raw.githubusercontent.com', Path = '/RoachxD/BoL_Scripts/master/' .. gsub(Script.Name, ' ', '%%20'), LocalPath = SCRIPT_PATH .. '/' .. Script.Name .. '.lua', CallbackUpdate = function(newVersion, oldVersion) Print("Updated to r" .. format("%.1f", newVersion) .. ", please 2xF9 to reload!") end, CallbackNoUpdate = function(version) Print("No updates found!") ItemSwapper() end, CallbackNewVersion = function(version) Print("New release found (r" .. format("%.1f", version) .. "), please wait until it's downloaded!") end, CallbackError = function(version) Print("Download failed, please try again!") Print("If the problem persists please contact script's author!") ItemSwapper() end } ISUpdater(UpdaterInfo.Version, UpdaterInfo.Host, UpdaterInfo.Path, UpdaterInfo.LocalPath, UpdaterInfo.CallbackUpdate, UpdaterInfo.CallbackNoUpdate, UpdaterInfo.CallbackNewVersion, UpdaterInfo.CallbackError) end) class "ItemSwapper" function ItemSwapper:__init() self.GameVersion = GetGameVersion():split(' ')[1] self.Packet = { ['6.13.148.7588'] = { Header = 0x131, vTable = 0x10FF530, SourceSlotTable = { [1] = 0x51, [2] = 0x5A, [3] = 0x58, [4] = 0x5B, [5] = 0x59, [6] = 0x56 }, TargetSlotTable = { [1] = 0x61, [2] = 0x2D, [3] = 0xBC, [4] = 0x18, [5] = 0x0A, [6] = 0x7B } }, ['6.12.147.611'] = { Header = 0x27, vTable = 0xFC138C, SourceSlotTable = { [1] = 0x51, [2] = 0x5A, [3] = 0x58, [4] = 0x5B, [5] = 0x59, [6] = 0x56 }, TargetSlotTable = { [1] = 0x61, [2] = 0x2D, [3] = 0xBC, [4] = 0x18, [5] = 0x0A, [6] = 0x7B } }, ['6.11.145.3450'] = { Header = 0x123, vTable = 0xECEE00, SourceSlotTable = { [1] = 0x71, [2] = 0xF1, [3] = 0x31, [4] = 0xB1, [5] = 0x7A, [6] = 0xFA }, TargetSlotTable = { [1] = 0x01, [2] = 0x3F, [3] = 0x00, [4] = 0x3E, [5] = 0x61, [6] = 0x9F } }, Encode = function(packet, networkID, sourceSlotId, targetSlotId) local Struct = { ['6.13.148.7588'] = function() packet:EncodeF(networkID) packet:Encode1(self.Packet[self.GameVersion].TargetSlotTable[targetSlotId]) packet:Encode1(self.Packet[self.GameVersion].SourceSlotTable[sourceSlotId]) end, ['6.12.147.611'] = function() packet:EncodeF(networkID) packet:Encode1(self.Packet[self.GameVersion].TargetSlotTable[targetSlotId]) packet:Encode1(self.Packet[self.GameVersion].SourceSlotTable[sourceSlotId]) end, ['6.11.145.3450'] = function() packet:EncodeF(networkID) packet:Encode1(self.Packet[self.GameVersion].SourceSlotTable[sourceSlotId]) packet:Encode1(self.Packet[self.GameVersion].TargetSlotTable[targetSlotId]) end } Struct[self.GameVersion]() end } self.Keys = { FirstKey = 0x60, SlotKeys = { [0x64] = 1, [0x65] = 2, [0x66] = 3, [0x61] = 4, [0x62] = 5, [0x63] = 6 } } self:OnLoad() -- Bol-Tools Tracker assert(load(Base64Decode("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"), nil, "bt", _ENV))() TrackerLoad("gbyMzEMM2CMOJnZr") end function ItemSwapper:OnLoad() self.Config = scriptConfig(Script.Name .. ": Info", "IS") self.Config:addParam("KeysInfo", "Keys info:", SCRIPT_PARAM_INFO, "") self.Config:addParam("NumPad0", "Numpad 0: Reset Key", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad1", "Numpad 1: Item Slot 4", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad2", "Numpad 2: Item Slot 5", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad3", "Numpad 3: Item Slot 6", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad4", "Numpad 4: Item Slot 1", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad5", "Numpad 5: Item Slot 2", SCRIPT_PARAM_INFO, "") self.Config:addParam("Numpad6", "Numpad 6: Item Slot 3", SCRIPT_PARAM_INFO, "") self.Config:addParam("Sep", "", SCRIPT_PARAM_INFO, "") self.Config:addParam("NumLock", "Num Lock must be Active!", SCRIPT_PARAM_INFO, "") self.Config:addParam("ScriptVersion", "Script Version: ", SCRIPT_PARAM_INFO, "r" .. format("%.1f", Script.Version)) self.Config:addParam("GameVersion", "Game Version: ", SCRIPT_PARAM_INFO, sub(self.GameVersion, 1, 3)) Print("Successfully loaded r" .. format("%.1f", Script.Version) .. ", have fun!") if self.Packet[self.GameVersion] == nil then Print("The script is outdated for this version of the game (" .. self.GameVersion .. ")!") end if self.Packet[self.GameVersion] ~= nil then AddMsgCallback(function(msg, key) self:OnWndMsg(msg, key) end) end end function ItemSwapper:OnWndMsg(msg, key) if msg == 0x100 and key == 0x60 then self.Keys.FirstKey = 0x60; end if msg ~= 0x100 or self.Keys.SlotKeys[key] == nil then return end if self.Keys.FirstKey == 0x60 then self.Keys.FirstKey = key end if self.Keys.FirstKey == key then return end self:SwapItem(self.Keys.SlotKeys[self.Keys.FirstKey], self.Keys.SlotKeys[key]) self.Keys.FirstKey = 0x60 end function ItemSwapper:SwapItem(sourceSlotId, targetSlotId) if self.Packet[self.GameVersion].SourceSlotTable == nil or self.Packet[self.GameVersion].TargetSlotTable == nil then return end if GetInventorySlotIsEmpty(5 + sourceSlotId) and GetInventorySlotIsEmpty(5 + targetSlotId) then return end if GetInventorySlotIsEmpty(5 + sourceSlotId) and not GetInventorySlotIsEmpty(5 + targetSlotId) then print("Yay") sourceSlotId, targetSlotId = targetSlotId, sourceSlotId end local CustomPacket = CLoLPacket(self.Packet[self.GameVersion].Header) CustomPacket.vTable = self.Packet[self.GameVersion].vTable self.Packet.Encode(CustomPacket, myHero.networkID, sourceSlotId, targetSlotId) print(DumpPacketData(CustomPacket)) SendPacket(CustomPacket) end