1
0
Fork 0

improve containers

master
Henrique Santiago 12 anos atrás
commit ea70f90e92

@ -14,5 +14,7 @@ Module
require 'uitabbar'
require 'uipopupmenu'
require 'uiwindow'
require 'uiitem'
require 'tooltip/tooltip'
require 'messagebox/messagebox'
require 'messagebox/messagebox'

@ -0,0 +1,6 @@
function UIItem:onMouseRelease(mousePosition, mouseButton)
local item = self:getItem()
if not item or not self:containsPoint(mousePosition) then return false end
return Game.processMouseAction(mousePosition, mouseButton, nil, item, item, nil, item)
end

@ -7,11 +7,12 @@ Module
dependencies:
- game_healthbar
- game_inventory
- game_skills
//- game_skills
- game_textmessage
- game_viplist
- game_console
- game_outfit
- game_containers
onLoad: |
require 'game'

@ -1,4 +1,15 @@
function Thing:isInsideContainer()
local pos = self:getPos()
return (pos and pos.x == 65535 and pos.y >= 64)
end
function Thing:getContainerId()
local pos = self:getPos()
if not pos then return 0 end
return pos.y - 64
end
-- public functions
function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing, useThing, creatureThing, multiUseThing)
local keyboardModifiers = g_window.getKeyboardModifiers()
@ -18,7 +29,7 @@ function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing,
if mouseButton == MouseLeftButton and selectedThing then
Game.useWith(Game.getSelectedThing(), useThing)
Game.setSelectedThing(nil)
-- restore cursor
restoreCursor()
return true
elseif keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then
Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing)
@ -28,7 +39,11 @@ function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing,
return true
elseif useThing and keyboardModifiers == KeyboardCtrlModifier and (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then
if useThing:isContainer() then
print "open"
if useThing:isInsideContainer() then
Game.open(useThing, useThing:getContainerId())
else
Game.open(useThing, Containers.getFreeContainerId())
end
elseif useThing:isMultiUse() then
Game.setSelectedThing(useThing)
setTargetCursor()
@ -50,12 +65,16 @@ function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing,
if multiUseThing:asCreature() then
Game.attack(multiUseThing:asCreature())
elseif multiUseThing:isContainer() then
print "open"
if multiUseThing:isInsideContainer() then
Game.open(multiUseThing, multiUseThing:getContainerId())
else
Game.open(multiUseThing, Containers.getFreeContainerId())
end
elseif multiUseThing:isMultiUse() then
Game.setSelectedThing(multiUseThing)
setTargetCursor()
else
Game.use(useThing)
Game.use(multiUseThing)
end
return true
elseif lookThing and keyboardModifiers == KeyboardShiftModifier and (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then
@ -81,15 +100,17 @@ function Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing)
menu:addOption('Look', function() Game.look(lookThing) end)
end
-- Open or Use, depending if thing is a container
if useThing then
if useThing:isContainer() then
-- check for open in new window
menu:addOption('Open', function() print('open') end)
if useThing:isInsideContainer() then
menu:addOption('Open', function() Game.open(useThing, useThing:getContainerId()) end)
menu:addOption('Open in new window', function() Game.open(useThing, Containers.getFreeContainerId()) end)
else
menu:addOption('Open', function() Game.open(useThing, Containers.getFreeContainerId()) end)
end
else
if useThing:isMultiUse() then
setTargetCursor()
menu:addOption('Use with ...', function() Game.setSelectedThing(useThing) end)
menu:addOption('Use with ...', function() Game.setSelectedThing(useThing) setTargetCursor() end)
else
menu:addOption('Use', function() Game.use(useThing) end)
end
@ -179,3 +200,4 @@ function Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing)
menu:display(menuPosition)
end

@ -0,0 +1,13 @@
MiniWindow
size: 200 186
padding-top: 30
padding-left: 10
layout:
type: grid
cell-size: 32 32
cell-spacing: 5
num-columns: 4
num-lines: 5

@ -0,0 +1,79 @@
Containers = {}
-- private variables
local m_containers = {}
-- public functions
function Containers.clean()
m_containers = {}
end
function Containers.getFreeContainerId()
for i=0,15 do
if not m_containers[i] then
return i
end
end
return 0
end
-- hooked events
function Containers.onContainerOpen(containerId, itemId, name, capacity, hasParent)
local container = m_containers[containerId]
if container then
Game.gameRightPanel:removeChild(container)
end
container = displayUI('container.otui', { parent = Game.gameRightPanel })
container:setText(name)
-- set icon, itemid
-- closebutton
-- resize
if hasParent then
-- parent button
end
container.itemCount = 0
container.capacity = capacity
for i=1,capacity do
local item = UIItem.create()
item:setStyle('Item')
container:addChild(item)
end
m_containers[containerId] = container
print("opencid ".. containerId)
end
function Containers.onContainerClose(containerId)
print("closecid ".. containerId)
local container = m_containers[containerId]
if container then
Game.gameRightPanel:removeChild(container)
end
m_containers[containerId] = nil
end
function Containers.onContainerAddItem(containerId, item)
print("addcid ".. containerId)
local container = m_containers[containerId]
if not container or not item or container.itemCount >= container.capacity then return end
-- maybe this has to be moved to client internal's files
local pos = item:getPos()
pos.z = container.itemCount
item:setPos(pos)
local itemWidget = container:getChildByIndex(container.itemCount + 1)
itemWidget:setItem(item)
container.itemCount = container.itemCount + 1
end
connect(Game, { onLogin = Containers.clean,
onLogout = Containers.clean,
onContainerOpen = Containers.onContainerOpen,
onContainerClose = Containers.onContainerClose,
onContainerAddItem = Containers.onContainerAddItem })

@ -0,0 +1,7 @@
Module
name: game_containers
description: Manage containers
author: OTClient team
website: https://github.com/edubart/otclient
onLoad: |
require 'containers'

@ -29,12 +29,6 @@ function Inventory.onSoulChange(soul)
widget:setText("Soul:\n" .. soul)
end
function Inventory.onInventoryItemMouseRelease(itemWidget, mousePosition, mouseButton)
local item = itemWidget:getItem()
if not item or not itemWidget:containsPoint(mousePosition) then return false end
return Game.processMouseAction(mousePosition, mouseButton, nil, item, item, nil, item)
end
connect(Game, { onLogin = Inventory.create,
onLogout = Inventory.destroy,
onInventoryChange = Inventory.onInventoryChange,

@ -1,6 +1,3 @@
InvetoryItem < Item
&onMouseRelease: Inventory.onInventoryItemMouseRelease
UIWindow
width: 192
height: 148
@ -9,34 +6,34 @@ UIWindow
margin-right: 6
move-policy: free updated
InvetoryItem
Item
// head
id: slot1
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
InvetoryItem
Item
// armor
id: slot4
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// legs
id: slot7
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// feet
id: slot8
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// necklace
id: slot2
anchors.top: parent.top
@ -44,21 +41,21 @@ UIWindow
margin-top: 10
margin-right: 5
InvetoryItem
Item
// left
id: slot6
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// ring
id: slot9
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// backpack
id: slot3
anchors.top: parent.top
@ -66,14 +63,14 @@ UIWindow
margin-top: 10
margin-left: 5
InvetoryItem
Item
// right
id: slot5
anchors.top: prev.bottom
anchors.horizontalCenter: prev.horizontalCenter
margin-top: 5
InvetoryItem
Item
// ammo
id: slot10
anchors.top: prev.bottom

@ -125,7 +125,7 @@ void Game::processTextMessage(const std::string& type, const std::string& messag
void Game::processContainerAddItem(int containerId, const ItemPtr& item)
{
if(item)
item->setPos(Position(65535, containerId, 0));
item->setPos(Position(65535, containerId + 0x40, 0));
g_lua.callGlobalField("Game", "onContainerAddItem", containerId, item);
}
@ -250,6 +250,16 @@ void Game::look(const ThingPtr& thing)
m_protocolGame->sendLookAt(thing->getPos(), thing->getId(), stackpos);
}
void Game::open(const ThingPtr& thing, int containerId)
{
if(!m_online || !thing || !checkBotProtection())
return;
int stackpos = getThingStackpos(thing);
if(stackpos != -1)
m_protocolGame->sendUseItem(thing->getPos(), thing->getId(), stackpos, containerId);
}
void Game::use(const ThingPtr& thing)
{
if(!m_online || !thing || !checkBotProtection())
@ -257,7 +267,7 @@ void Game::use(const ThingPtr& thing)
int stackpos = getThingStackpos(thing);
if(stackpos != -1)
m_protocolGame->sendUseItem(thing->getPos(), thing->getId(), stackpos, 0);// last 0 has something to do with container
m_protocolGame->sendUseItem(thing->getPos(), thing->getId(), stackpos, 0);
}
void Game::useWith(const ThingPtr& fromThing, const ThingPtr& toThing)

@ -57,6 +57,7 @@ public:
void walk(Otc::Direction direction);
void turn(Otc::Direction direction);
void look(const ThingPtr& thing);
void open(const ThingPtr& thing, int containerId);
void use(const ThingPtr& thing);
void useWith(const ThingPtr& fromThing, const ThingPtr& toThing);
void attack(const CreaturePtr& creature);

@ -179,6 +179,7 @@ void OTClient::registerLuaFunctions()
g_lua.bindClassStaticFunction<Game>("openOutfitWindow", std::bind(&Game::openOutfitWindow, &g_game));
g_lua.bindClassStaticFunction<Game>("setOutfit", std::bind(&Game::setOutfit, &g_game, _1));
g_lua.bindClassStaticFunction<Game>("look", std::bind(&Game::look, &g_game, _1));
g_lua.bindClassStaticFunction<Game>("open", std::bind(&Game::open, &g_game, _1, _2));
g_lua.bindClassStaticFunction<Game>("use", std::bind(&Game::use, &g_game, _1));
g_lua.bindClassStaticFunction<Game>("useWith", std::bind(&Game::useWith, &g_game, _1, _2));
g_lua.bindClassStaticFunction<Game>("attack", std::bind(&Game::attack, &g_game, _1));

@ -441,7 +441,7 @@ void ProtocolGame::parseOpenContainer(InputMessage& msg)
for(int i = 0; i < itemCount; i++) {
ItemPtr item = internalGetItem(msg);
g_lua.callGlobalField("Game", "onContainerAddItem", containerId, item);
g_game.processContainerAddItem(containerId, item);
}
}
@ -455,7 +455,7 @@ void ProtocolGame::parseContainerAddItem(InputMessage& msg)
{
int containerId = msg.getU8();
ItemPtr item = internalGetItem(msg);
g_lua.callGlobalField("Game", "onContainerAddItem", containerId, item);
g_game.processContainerAddItem(containerId, item);
}
void ProtocolGame::parseContainerUpdateItem(InputMessage& msg)
@ -470,7 +470,7 @@ void ProtocolGame::parseContainerRemoveItem(InputMessage& msg)
{
int containerId = msg.getU8();
int slot = msg.getU8();
g_lua.callGlobalField("Game", "onContainerUpdateItem", containerId, slot);
g_lua.callGlobalField("Game", "onContainerRemoveItem", containerId, slot);
}
void ProtocolGame::parseAddInventoryItem(InputMessage& msg)

@ -98,7 +98,7 @@ public:
return Otc::InvalidDirection;
}
bool isValid() const { return x >= 0 && y >= 0 && z >= 0 && x < 65536 && y < 65536 && z < 16; }
bool isValid() const { return x >= 0 && y >= 0 && z >= 0 && x <= 65535 && y <= 65535 && z <= 255; }
Position operator+(const Position& other) const { return Position(x + other.x, y + other.y, z + other.z); }
Position& operator+=(const Position& other) { x+=other.x; y+=other.y; z +=other.z; return *this; }

Carregando…
Cancelar
Salvar