restore containers

* implemente Container class
* restore module containers
* add lua bindings for std::map
* improve grid layout
* fixes in UIItem rendering
* changes in miniwindow design
This commit is contained in:
Eduardo Bart
2012-04-02 20:09:47 -03:00
parent 231ba17ba1
commit 90d3acce2a
23 changed files with 428 additions and 178 deletions

View File

@@ -1,11 +1,35 @@
MiniWindow
size: 200 221
ContainerWindow < MiniWindow
height: 150
layout:
type: grid
cell-size: 34 34
cell-spacing: 5
num-columns: 4
num-lines: 5
UIItem
id: containerItemWidget
virtual: true
item-id: 3253
size: 32 32
anchors.top: parent.top
anchors.left: parent.left
margin-top: -6
margin-left: -6
UIButton
id: upButton
anchors.top: minimizeButton.top
anchors.right: minimizeButton.left
margin-right: 3
size: 14 14
image-source: /game/images/miniwindowbuttons.png
image-clip: 42 0 14 14
$hover:
image-clip: 42 14 14 14
$pressed:
image-clip: 42 28 14 14
MiniWindowContents
padding: 27 6 6 8
layout:
type: grid
cell-size: 34 34
flow: true
auto-spacing: true

View File

@@ -1,138 +1,90 @@
Containers = {}
-- private variables
local containers = {}
-- public functions
function Containers.clean()
containers = {}
local function refreshContainerItems(container)
for slot=0,container:getCapacity()-1 do
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
itemWidget:setItem(container:getItem(slot))
end
end
function Containers.getFreeContainerId()
for i=0,15 do
if not containers[i] then
return i
end
local function onContainerOpen(container, previousContainer)
local containerWindow
if previousContainer then
containerWindow = previousContainer.window
previousContainer.window = nil
previousContainer.itemsPanel = nil
else
containerWindow = createWidget('ContainerWindow', GameInterface.getRightPanel())
end
return 0
end
-- hooked events
function Containers.onOpenContainer(containerId, itemId, name, capacity, hasParent, items)
local container = containers[containerId]
if container then
GameInterface.getRightPanel():removeChild(container)
containerWindow:setId('container' .. container:getId())
local containerPanel = containerWindow:getChildById('contentsPanel')
local containerItemWidget = containerWindow:getChildById('containerItemWidget')
containerWindow.onClose = function()
g_game.close(container)
containerWindow:hide()
end
container = displayUI('container.otui', GameInterface.getRightPanel())
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)
container:setText(name)
containerWindow:setText(name)
-- set icon, itemid
-- closebutton
-- resize
if hasParent then
-- parent button
containerItemWidget:setItemId(container:getItemId())
containerPanel:destroyChildren()
for slot=0,container:getCapacity()-1 do
local itemWidget = createWidget('Item', containerPanel)
itemWidget:setId('item' .. slot)
itemWidget:setItem(container:getItem(slot))
itemWidget.position = container:getSlotPosition(slot)
end
container.itemCount = #items
container.capacity = capacity
for i=1,capacity do
local itemWidget = UIItem.create()
itemWidget:setStyle('Item')
container:addChild(itemWidget)
itemWidget.position = {x=65535, y=containerId+64, z=i-1}
if i <= #items then
local item = items[i]
item:setPosition(itemWidget.position)
itemWidget:setItem(item)
end
end
containers[containerId] = container
container.window = containerWindow
container.itemsPanel = containerPanel
end
function Containers.onCloseContainer(containerId)
local container = containers[containerId]
if container then
GameInterface.getRightPanel():removeChild(container)
local function onContainerClose(container)
local containerWindow = container.window
if containerWindow then
containerWindow:destroy()
end
containers[containerId] = nil
end
function Containers.onContainerAddItem(containerId, item)
local container = containers[containerId]
if not container or not item or container.itemCount >= container.capacity then return end
local function onContainerAddItem(container, slot, item)
refreshContainerItems(container)
end
local i = container.itemCount
while i >= 1 do
local itemWidget = container:getChildByIndex(i)
if not itemWidget then return end
local nextItemWidget = container:getChildByIndex(i+1)
if not nextItemWidget then return end
local swapItem = itemWidget:getItem()
if swapItem then
swapItem:setPosition(nextItemWidget.position)
nextItemWidget:setItem(swapItem)
end
i = i - 1
end
local itemWidget = container:getChildByIndex(1)
if not itemWidget then return end
item:setPosition(itemWidget.position)
local function onContainerUpdateItem(container, slot, item, oldItem)
local itemWidget = container.itemsPanel:getChildById('item' .. slot)
itemWidget:setItem(item)
container.itemCount = container.itemCount + 1
end
function Containers.onContainerUpdateItem(containerId, slot, item)
local container = containers[containerId]
if not container then return end
local itemWidget = container:getChildByIndex(slot + 1)
if not itemWidget then return end
itemWidget:setItem(item)
item:setPosition(itemWidget.position)
local function onContainerRemoveItem(container, slot, item)
refreshContainerItems(container)
end
function Containers.onContainerRemoveItem(containerId, slot)
local container = containers[containerId]
if not container then return end
function Containers.init()
importStyle 'container.otui'
local itemWidget = container:getChildByIndex(slot+1)
if not itemWidget then return end
itemWidget:setItem(nil)
for i=slot,container.itemCount-2 do
local itemWidget = container:getChildByIndex(i+1)
if not itemWidget then return end
local nextItemWidget = container:getChildByIndex(i+2)
if not nextItemWidget then return end
local item = nextItemWidget:getItem()
local pos = item:getPosition()
pos.z = pos.z - 1
item:setPosition(pos)
itemWidget:setItem(item)
nextItemWidget:setItem(nil)
end
container.itemCount = container.itemCount - 1
connect(Container, { onOpen = onContainerOpen,
onClose = onContainerClose,
onAddItem = onContainerAddItem,
onUpdateItem = onContainerUpdateItem,
onRemoveItem = onContainerRemoveItem })
end
connect(g_game, { onGameStart = Containers.clean,
onGameEnd = Containers.clean,
onOpenContainer = Containers.onOpenContainer,
onCloseContainer = Containers.onCloseContainer,
onContainerAddItem = Containers.onContainerAddItem,
onContainerUpdateItem = Containers.onContainerUpdateItem,
onContainerRemoveItem = Containers.onContainerRemoveItem })
function Containers.terminate()
disconnect(Container, { onOpen = onContainerOpen,
onClose = onContainerClose,
onAddItem = onContainerAddItem,
onUpdateItem = onContainerUpdateItem,
onRemoveItem = onContainerRemoveItem })
end
function Containers.clean()
end

View File

@@ -4,5 +4,12 @@ Module
author: OTClient team
website: https://github.com/edubart/otclient
dependecies:
- game
@onLoad: |
dofile 'containers'
Containers.init()
@onUnload: |
Containers.terminate()