2022-07-09 22:09:37 +00:00

674 lines
19 KiB
Lua

setDefaultTab("Tools")
local panelName = "renameContainers"
if type(storage[panelName]) ~= "table" then
storage[panelName] = {
enabled = false;
height = 170,
purse = true;
list = {
{
value = "Main Backpack",
enabled = true,
item = 9601,
min = false,
items = { 3081, 3048 }
},
{
value = "Runes",
enabled = true,
item = 2866,
min = true,
items = { 3161, 3180 }
},
{
value = "Money",
enabled = true,
item = 2871,
min = true,
items = { 3031, 3035, 3043 }
},
{
value = "Purse",
enabled = true,
item = 23396,
min = true,
items = {}
},
}
}
end
local config = storage[panelName]
UI.Separator()
local renameContui = setupUI([[
Panel
height: 50
Label
text-align: center
text: Container Panel
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
font: verdana-11px-rounded
BotSwitch
id: title
anchors.top: prev.bottom
anchors.left: parent.left
text-align: center
width: 130
!text: tr('Open Minimised')
font: verdana-11px-rounded
Button
id: editContList
anchors.top: prev.top
anchors.left: prev.right
anchors.right: parent.right
margin-left: 3
height: 17
text: Setup
font: verdana-11px-rounded
Button
id: reopenCont
!text: tr('Reopen All')
anchors.left: parent.left
anchors.top: prev.bottom
anchors.right: parent.horizontalCenter
margin-right: 2
height: 17
margin-top: 3
font: verdana-11px-rounded
Button
id: minimiseCont
!text: tr('Minimise All')
anchors.top: prev.top
anchors.left: parent.horizontalCenter
anchors.right: parent.right
margin-right: 2
height: 17
font: verdana-11px-rounded
]])
renameContui:setId(panelName)
g_ui.loadUIFromString([[
BackpackName < Label
background-color: alpha
text-offset: 18 2
focusable: true
height: 17
font: verdana-11px-rounded
CheckBox
id: enabled
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
width: 15
height: 15
margin-top: 1
margin-left: 3
$focus:
background-color: #00000055
Button
id: state
!text: tr('M')
anchors.right: remove.left
anchors.verticalCenter: parent.verticalCenter
margin-right: 1
width: 15
height: 15
Button
id: remove
!text: tr('X')
!tooltip: tr('Remove')
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
margin-right: 15
width: 15
height: 15
Button
id: openNext
!text: tr('N')
anchors.right: state.left
anchors.verticalCenter: parent.verticalCenter
margin-right: 1
width: 15
height: 15
tooltip: Open container inside with the same ID.
ContListsWindow < MainWindow
!text: tr('Container Names')
size: 465 170
@onEscape: self:hide()
TextList
id: itemList
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: separator.top
width: 200
margin-bottom: 6
margin-top: 3
margin-left: 3
vertical-scrollbar: itemListScrollBar
VerticalScrollBar
id: itemListScrollBar
anchors.top: itemList.top
anchors.bottom: itemList.bottom
anchors.right: itemList.right
step: 14
pixels-scroll: true
VerticalSeparator
id: sep
anchors.top: parent.top
anchors.left: itemList.right
anchors.bottom: separator.top
margin-top: 3
margin-bottom: 6
margin-left: 10
Label
id: lblName
anchors.left: sep.right
anchors.top: sep.top
width: 70
text: Name:
margin-left: 10
margin-top: 3
font: verdana-11px-rounded
TextEdit
id: contName
anchors.left: lblName.right
anchors.top: sep.top
anchors.right: parent.right
font: verdana-11px-rounded
Label
id: lblCont
anchors.left: lblName.left
anchors.verticalCenter: contId.verticalCenter
width: 70
text: Container:
font: verdana-11px-rounded
BotItem
id: contId
anchors.left: contName.left
anchors.top: contName.bottom
margin-top: 3
BotContainer
id: sortList
anchors.left: prev.left
anchors.right: parent.right
anchors.top: prev.bottom
anchors.bottom: separator.top
margin-bottom: 6
margin-top: 3
Label
anchors.left: lblCont.left
anchors.verticalCenter: sortList.verticalCenter
width: 70
text: Items:
font: verdana-11px-rounded
Button
id: addItem
anchors.right: contName.right
anchors.top: contName.bottom
margin-top: 5
text: Add
width: 40
font: cipsoftFont
HorizontalSeparator
id: separator
anchors.right: parent.right
anchors.left: parent.left
anchors.bottom: closeButton.top
margin-bottom: 8
CheckBox
id: purse
anchors.left: parent.left
anchors.bottom: parent.bottom
text: Open Purse
tooltip: Opens Store/Charm Purse
width: 85
height: 15
margin-top: 2
margin-left: 3
font: verdana-11px-rounded
CheckBox
id: sort
anchors.left: prev.right
anchors.bottom: parent.bottom
text: Sort Items
tooltip: Sort items based on items widget
width: 85
height: 15
margin-top: 2
margin-left: 15
font: verdana-11px-rounded
CheckBox
id: forceOpen
anchors.left: prev.right
anchors.bottom: parent.bottom
text: Keep Open
tooltip: Will keep open containers all the time
width: 85
height: 15
margin-top: 2
margin-left: 15
font: verdana-11px-rounded
CheckBox
id: lootBag
anchors.left: prev.right
anchors.bottom: parent.bottom
text: Loot Bag
tooltip: Open Loot Bag (gunzodus franchaise)
width: 85
height: 15
margin-top: 2
margin-left: 15
font: verdana-11px-rounded
Button
id: closeButton
!text: tr('Close')
font: cipsoftFont
anchors.right: parent.right
anchors.bottom: parent.bottom
size: 45 21
margin-top: 15
ResizeBorder
id: bottomResizeBorder
anchors.fill: separator
height: 3
minimum: 170
maximum: 245
margin-left: 3
margin-right: 3
background: #ffffff88
]])
function findItemsInArray(t, tfind)
local tArray = {}
for x,v in pairs(t) do
if type(v) == "table" then
local aItem = t[x].item
local aEnabled = t[x].enabled
if aItem then
if tfind and aItem == tfind then
return x
elseif not tfind then
if aEnabled then
table.insert(tArray, aItem)
end
end
end
end
end
if not tfind then return tArray end
end
local lstBPs
local openContainer = function(id)
local t = {getRight(), getLeft(), getAmmo()} -- if more slots needed then add them here
for i=1,#t do
local slotItem = t[i]
if slotItem and slotItem:getId() == id then
return g_game.open(slotItem, nil)
end
end
for i, container in pairs(g_game.getContainers()) do
for i, item in ipairs(container:getItems()) do
if item:isContainer() and item:getId() == id then
return g_game.open(item, nil)
end
end
end
end
function reopenBackpacks()
lstBPs = findItemsInArray(config.list)
for _, container in pairs(g_game.getContainers()) do g_game.close(container) end
bpItem = getBack()
if bpItem ~= nil then
g_game.open(bpItem)
end
schedule(500, function()
local delay = 200
if config.purse then
local item = getPurse()
if item then
use(item)
end
end
for i=1,#lstBPs do
schedule(delay, function()
openContainer(lstBPs[i])
end)
delay = delay + 250
end
end)
end
rootWidget = g_ui.getRootWidget()
if rootWidget then
contListWindow = UI.createWindow('ContListsWindow', rootWidget)
contListWindow:hide()
contListWindow.onGeometryChange = function(widget, old, new)
if old.height == 0 then return end
config.height = new.height
end
contListWindow:setHeight(config.height or 170)
renameContui.editContList.onClick = function(widget)
contListWindow:show()
contListWindow:raise()
contListWindow:focus()
end
renameContui.reopenCont.onClick = function(widget)
reopenBackpacks()
end
renameContui.minimiseCont.onClick = function(widget)
for i, container in ipairs(getContainers()) do
local containerWindow = container.window
containerWindow:setContentHeight(34)
end
end
renameContui.title:setOn(config.enabled)
renameContui.title.onClick = function(widget)
config.enabled = not config.enabled
widget:setOn(config.enabled)
end
contListWindow.closeButton.onClick = function(widget)
contListWindow:hide()
end
contListWindow.purse.onClick = function(widget)
config.purse = not config.purse
contListWindow.purse:setChecked(config.purse)
end
contListWindow.purse:setChecked(config.purse)
contListWindow.sort.onClick = function(widget)
config.sort = not config.sort
contListWindow.sort:setChecked(config.sort)
end
contListWindow.sort:setChecked(config.sort)
contListWindow.forceOpen.onClick = function(widget)
config.forceOpen = not config.forceOpen
contListWindow.forceOpen:setChecked(config.forceOpen)
end
contListWindow.forceOpen:setChecked(config.forceOpen)
contListWindow.lootBag.onClick = function(widget)
config.lootBag = not config.lootBag
contListWindow.lootBag:setChecked(config.lootBag)
end
contListWindow.lootBag:setChecked(config.lootBag)
local function refreshSortList(k, t)
t = t or {}
UI.Container(function()
t = contListWindow.sortList:getItems()
config.list[k].items = t
end, true, nil, contListWindow.sortList)
contListWindow.sortList:setItems(t)
end
refreshSortList(t)
local refreshContNames = function(tFocus)
local storageVal = config.list
if storageVal and #storageVal > 0 then
for i, child in pairs(contListWindow.itemList:getChildren()) do
child:destroy()
end
for k, entry in pairs(storageVal) do
local label = g_ui.createWidget("BackpackName", contListWindow.itemList)
label.onMouseRelease = function()
contListWindow.contId:setItemId(entry.item)
contListWindow.contName:setText(entry.value)
if not entry.items then
entry.items = {}
end
contListWindow.sortList:setItems(entry.items)
refreshSortList(k, entry.items)
end
label.enabled.onClick = function(widget)
entry.enabled = not entry.enabled
label.enabled:setChecked(entry.enabled)
label.enabled:setTooltip(entry.enabled and 'Disable' or 'Enable')
label.enabled:setImageColor(entry.enabled and '#00FF00' or '#FF0000')
end
label.remove.onClick = function(widget)
table.removevalue(config.list, entry)
label:destroy()
end
label.state:setChecked(entry.min)
label.state.onClick = function(widget)
entry.min = not entry.min
label.state:setChecked(entry.min)
label.state:setColor(entry.min and '#00FF00' or '#FF0000')
label.state:setTooltip(entry.min and 'Open Minimised' or 'Do not minimise')
end
label.openNext.onClick = function(widget)
entry.openNext = not entry.openNext
label.openNext:setChecked(entry.openNext)
label.openNext:setColor(entry.openNext and '#00FF00' or '#FF0000')
end
label:setText(entry.value)
label.enabled:setChecked(entry.enabled)
label.enabled:setTooltip(entry.enabled and 'Disable' or 'Enable')
label.enabled:setImageColor(entry.enabled and '#00FF00' or '#FF0000')
label.state:setColor(entry.min and '#00FF00' or '#FF0000')
label.state:setTooltip(entry.min and 'Open Minimised' or 'Do not minimise')
label.openNext:setColor(entry.openNext and '#00FF00' or '#FF0000')
if tFocus and entry.item == tFocus then
tFocus = label
end
end
if tFocus then contListWindow.itemList:focusChild(tFocus) end
end
end
contListWindow.addItem.onClick = function(widget)
local id = contListWindow.contId:getItemId()
local trigger = contListWindow.contName:getText()
if id > 100 and trigger:len() > 0 then
local ifind = findItemsInArray(config.list, id)
if ifind then
config.list[ifind] = { item = id, value = trigger, enabled = config.list[ifind].enabled, min = config.list[ifind].min, items = config.list[ifind].items}
else
table.insert(config.list, { item = id, value = trigger, enabled = true, min = false, items = {} })
end
contListWindow.contId:setItemId(0)
contListWindow.contName:setText('')
contListWindow.contName:setColor('white')
contListWindow.contName:setImageColor('#ffffff')
contListWindow.contId:setImageColor('#ffffff')
refreshContNames(id)
else
contListWindow.contId:setImageColor('red')
contListWindow.contName:setImageColor('red')
contListWindow.contName:setColor('red')
end
end
refreshContNames()
end
onContainerOpen(function(container, previousContainer)
if not container.window then return end
local containerWindow = container.window
if not previousContainer then
containerWindow:setContentHeight(34)
end
local storageVal = config.list
if storageVal and #storageVal > 0 then
for _, entry in pairs(storageVal) do
if entry.enabled and string.find(container:getContainerItem():getId(), entry.item) then
if entry.min then
containerWindow:minimize()
end
if renameContui.title:isOn() then
containerWindow:setText(entry.value)
end
if entry.openNext then
for i, item in ipairs(container:getItems()) do
if item:getId() == entry.item then
local time = #storageVal * 250
schedule(time, function()
time = time + 250
g_game.open(item)
end)
end
end
end
end
end
end
end)
local function nameContainersOnLogin()
for i, container in ipairs(getContainers()) do
if renameContui.title:isOn() then
if not container.window then return end
local containerWindow = container.window
local storageVal = config.list
if storageVal and #storageVal > 0 then
for _, entry in pairs(storageVal) do
if entry.enabled and string.find(container:getContainerItem():getId(), entry.item) then
containerWindow:setText(entry.value)
end
end
end
end
end
end
nameContainersOnLogin()
local function moveItem(item, destination)
return g_game.move(item, destination:getSlotPosition(destination:getItemsCount()), item:getCount())
end
local function properTable(t)
local r = {}
for _, entry in pairs(t) do
if type(entry) == "number" then
table.insert(r, entry)
else
table.insert(r, entry.id)
end
end
return r
end
local mainLoop = macro(150, function(macro)
if not config.sort and not config.purse then return end
local storageVal = config.list
for _, entry in pairs(storageVal) do
local dId = entry.item
local items = properTable(entry.items)
-- sorting
if config.sort then
for _, container in pairs(getContainers()) do
local cName = container:getName():lower()
if not cName:find("depot") and not cName:find("depot") and not cName:find("quiver") then
local cId = container:getContainerItem():getId()
for __, item in ipairs(container:getItems()) do
local id = item:getId()
if table.find(items, id) and cId ~= dId then
local destination = getContainerByItem(dId, true)
if destination and not containerIsFull(destination) then
return moveItem(item, destination)
end
end
end
end
end
end
-- keep open / purse 23396
if config.forceOpen then
local container = getContainerByItem(dId)
if not container then
local t = {getBack(), getAmmo(), getFinger(), getNeck(), getLeft(), getRight()}
for i=1,#t do
local slot = t[i]
if slot and slot:getId() == dId then
return g_game.open(slot)
end
end
local cItem = findItem(dId)
if cItem then
return g_game.open(cItem)
end
end
end
end
if config.purse and config.forceOpen and not getContainerByItem(23396) then
return use(getPurse())
end
if config.lootBag and config.forceOpen and not getContainerByItem(23721) then
if findItem(23721) then
g_game.open(findItem(23721), getContainerByItem(23396))
else
return use(getPurse())
end
end
macro:setOff()
end)
onContainerOpen(function(container, previousContainer)
mainLoop:setOn()
end)
onAddItem(function(container, slot, item, oldItem)
mainLoop:setOn()
end)
onPlayerInventoryChange(function(slot, item, oldItem)
mainLoop:setOn()
end)
onContainerClose(function(container)
if not container.lootContainer then
mainLoop:setOn()
end
end)