mirror of
https://github.com/ErikasKontenis/SabrehavenServer.git
synced 2025-10-13 22:34:53 +02:00
fix items, map, protocls
This commit is contained in:
198
800OTClient/modules/game_containers/containers.lua
Normal file
198
800OTClient/modules/game_containers/containers.lua
Normal file
@@ -0,0 +1,198 @@
|
||||
local gameStart = 0
|
||||
|
||||
function init()
|
||||
connect(Container, { onOpen = onContainerOpen,
|
||||
onClose = onContainerClose,
|
||||
onSizeChange = onContainerChangeSize,
|
||||
onUpdateItem = onContainerUpdateItem })
|
||||
connect(g_game, {
|
||||
onGameStart = markStart,
|
||||
onGameEnd = clean
|
||||
})
|
||||
|
||||
reloadContainers()
|
||||
end
|
||||
|
||||
function terminate()
|
||||
disconnect(Container, { onOpen = onContainerOpen,
|
||||
onClose = onContainerClose,
|
||||
onSizeChange = onContainerChangeSize,
|
||||
onUpdateItem = onContainerUpdateItem })
|
||||
disconnect(g_game, {
|
||||
onGameStart = markStart,
|
||||
onGameEnd = clean
|
||||
})
|
||||
end
|
||||
|
||||
function reloadContainers()
|
||||
clean()
|
||||
for _,container in pairs(g_game.getContainers()) do
|
||||
onContainerOpen(container)
|
||||
end
|
||||
end
|
||||
|
||||
function clean()
|
||||
for containerid,container in pairs(g_game.getContainers()) do
|
||||
destroy(container)
|
||||
end
|
||||
end
|
||||
|
||||
function markStart()
|
||||
gameStart = g_clock.millis()
|
||||
end
|
||||
|
||||
function destroy(container)
|
||||
if container.window then
|
||||
container.window:destroy()
|
||||
container.window = nil
|
||||
container.itemsPanel = nil
|
||||
end
|
||||
end
|
||||
|
||||
function refreshContainerItems(container)
|
||||
for slot=0,container:getCapacity()-1 do
|
||||
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
|
||||
itemWidget:setItem(container:getItem(slot))
|
||||
end
|
||||
|
||||
if container:hasPages() then
|
||||
refreshContainerPages(container)
|
||||
end
|
||||
end
|
||||
|
||||
function toggleContainerPages(containerWindow, hasPages)
|
||||
if hasPages == containerWindow.pagePanel:isOn() then
|
||||
return
|
||||
end
|
||||
containerWindow.pagePanel:setOn(hasPages)
|
||||
if hasPages then
|
||||
containerWindow.miniwindowScrollBar:setMarginTop(containerWindow.miniwindowScrollBar:getMarginTop() + containerWindow.pagePanel:getHeight())
|
||||
containerWindow.contentsPanel:setMarginTop(containerWindow.contentsPanel:getMarginTop() + containerWindow.pagePanel:getHeight())
|
||||
else
|
||||
containerWindow.miniwindowScrollBar:setMarginTop(containerWindow.miniwindowScrollBar:getMarginTop() - containerWindow.pagePanel:getHeight())
|
||||
containerWindow.contentsPanel:setMarginTop(containerWindow.contentsPanel:getMarginTop() - containerWindow.pagePanel:getHeight())
|
||||
end
|
||||
end
|
||||
|
||||
function refreshContainerPages(container)
|
||||
local currentPage = 1 + math.floor(container:getFirstIndex() / container:getCapacity())
|
||||
local pages = 1 + math.floor(math.max(0, (container:getSize() - 1)) / container:getCapacity())
|
||||
container.window:recursiveGetChildById('pageLabel'):setText(string.format('Page %i of %i', currentPage, pages))
|
||||
|
||||
local prevPageButton = container.window:recursiveGetChildById('prevPageButton')
|
||||
if currentPage == 1 then
|
||||
prevPageButton:setEnabled(false)
|
||||
else
|
||||
prevPageButton:setEnabled(true)
|
||||
prevPageButton.onClick = function() g_game.seekInContainer(container:getId(), container:getFirstIndex() - container:getCapacity()) end
|
||||
end
|
||||
|
||||
local nextPageButton = container.window:recursiveGetChildById('nextPageButton')
|
||||
if currentPage >= pages then
|
||||
nextPageButton:setEnabled(false)
|
||||
else
|
||||
nextPageButton:setEnabled(true)
|
||||
nextPageButton.onClick = function() g_game.seekInContainer(container:getId(), container:getFirstIndex() + container:getCapacity()) end
|
||||
end
|
||||
end
|
||||
|
||||
function onContainerOpen(container, previousContainer)
|
||||
local containerWindow
|
||||
if previousContainer then
|
||||
containerWindow = previousContainer.window
|
||||
previousContainer.window = nil
|
||||
previousContainer.itemsPanel = nil
|
||||
else
|
||||
containerWindow = g_ui.createWidget('ContainerWindow', modules.game_interface.getContainerPanel())
|
||||
end
|
||||
|
||||
containerWindow:setId('container' .. container:getId())
|
||||
if gameStart + 1000 < g_clock.millis() then
|
||||
containerWindow:clearSettings()
|
||||
end
|
||||
|
||||
local containerPanel = containerWindow:getChildById('contentsPanel')
|
||||
local containerItemWidget = containerWindow:getChildById('containerItemWidget')
|
||||
containerWindow.onClose = function()
|
||||
g_game.close(container)
|
||||
containerWindow:hide()
|
||||
end
|
||||
containerWindow.onDrop = function(container, widget, mousePos)
|
||||
if containerPanel:getChildByPos(mousePos) then
|
||||
return false
|
||||
end
|
||||
local child = containerPanel:getChildByIndex(-1)
|
||||
if child then
|
||||
child:onDrop(widget, mousePos, true)
|
||||
end
|
||||
end
|
||||
|
||||
-- this disables scrollbar auto hiding
|
||||
local scrollbar = containerWindow:getChildById('miniwindowScrollBar')
|
||||
scrollbar:mergeStyle({ ['$!on'] = { }})
|
||||
|
||||
local upButton = containerWindow:getChildById('upButton')
|
||||
upButton.onClick = function()
|
||||
g_game.openParent(container)
|
||||
end
|
||||
upButton:setVisible(container:hasParent())
|
||||
|
||||
local name = container:getName()
|
||||
name = name:sub(1,1):upper() .. name:sub(2)
|
||||
containerWindow:setText(name)
|
||||
|
||||
containerItemWidget:setItem(container:getContainerItem())
|
||||
|
||||
containerPanel:destroyChildren()
|
||||
for slot=0,container:getCapacity()-1 do
|
||||
local itemWidget = g_ui.createWidget('Item', containerPanel)
|
||||
itemWidget:setId('item' .. slot)
|
||||
itemWidget:setItem(container:getItem(slot))
|
||||
itemWidget:setMargin(0)
|
||||
itemWidget.position = container:getSlotPosition(slot)
|
||||
|
||||
if not container:isUnlocked() then
|
||||
itemWidget:setBorderColor('red')
|
||||
end
|
||||
end
|
||||
|
||||
container.window = containerWindow
|
||||
container.itemsPanel = containerPanel
|
||||
|
||||
toggleContainerPages(containerWindow, container:hasPages())
|
||||
refreshContainerPages(container)
|
||||
|
||||
local layout = containerPanel:getLayout()
|
||||
local cellSize = layout:getCellSize()
|
||||
containerWindow:setContentMinimumHeight(cellSize.height)
|
||||
containerWindow:setContentMaximumHeight(cellSize.height*layout:getNumLines())
|
||||
|
||||
if container:hasPages() then
|
||||
local height = containerWindow.miniwindowScrollBar:getMarginTop() + containerWindow.pagePanel:getHeight()+17
|
||||
if containerWindow:getHeight() < height then
|
||||
containerWindow:setHeight(height)
|
||||
end
|
||||
end
|
||||
|
||||
if not previousContainer then
|
||||
local filledLines = math.max(math.ceil(container:getItemsCount() / layout:getNumColumns()), 1)
|
||||
containerWindow:setContentHeight(filledLines*cellSize.height)
|
||||
end
|
||||
|
||||
containerWindow:setup()
|
||||
end
|
||||
|
||||
function onContainerClose(container)
|
||||
destroy(container)
|
||||
end
|
||||
|
||||
function onContainerChangeSize(container, size)
|
||||
if not container.window then return end
|
||||
refreshContainerItems(container)
|
||||
end
|
||||
|
||||
function onContainerUpdateItem(container, slot, item, oldItem)
|
||||
if not container.window then return end
|
||||
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
|
||||
itemWidget:setItem(item)
|
||||
end
|
9
800OTClient/modules/game_containers/containers.otmod
Normal file
9
800OTClient/modules/game_containers/containers.otmod
Normal file
@@ -0,0 +1,9 @@
|
||||
Module
|
||||
name: game_containers
|
||||
description: Manage containers
|
||||
author: edubart, baxnie
|
||||
website: https://github.com/edubart/otclient
|
||||
sandboxed: true
|
||||
scripts: [containers]
|
||||
@onLoad: init()
|
||||
@onUnload: terminate()
|
Reference in New Issue
Block a user