diff --git a/BUGS b/BUGS index bd464b09..ec80fb07 100644 --- a/BUGS +++ b/BUGS @@ -11,11 +11,10 @@ hotkeys works while windows are locked, it shouldnt some animated hits are displayed as 2 hits instead of one numpad on windows doesn't work correctly skulls is rendering outside map bounds -these are some issues when skill progressbar is 0% or 100% paste on x11 platform does not work correctly when doing ctrl+c in google chrome +party options does not work when relogging inside a party -walk animation doesnt reset when leaving invisible -non tiles are no black +chamaleon doesnt animate items drop items in container background can view ocean in underground floors diff --git a/TODO b/TODO index a8a80815..aee91c45 100644 --- a/TODO +++ b/TODO @@ -12,13 +12,9 @@ adjust interface design display exit box when exiting from game attack modes player status icons (poison, etc) -container windows -move items -use with move count itens -open/close vip/skills move windows, go back in containers open private chat reopen channels diff --git a/modules/addon_terminal/commands.lua b/modules/addon_terminal/commands.lua index 8bd241f0..3d588dc0 100644 --- a/modules/addon_terminal/commands.lua +++ b/modules/addon_terminal/commands.lua @@ -32,4 +32,4 @@ end function quit() exit() -end \ No newline at end of file +end diff --git a/modules/addon_terminal/terminal.lua b/modules/addon_terminal/terminal.lua index fb951aed..c5fd92dc 100644 --- a/modules/addon_terminal/terminal.lua +++ b/modules/addon_terminal/terminal.lua @@ -107,7 +107,7 @@ function Terminal.init() terminalWidget = displayUI('terminal.otui') terminalWidget:setVisible(false) - terminalButton = TopMenu.addButton('terminalButton', 'Terminal (Ctrl + T)', '/core_styles/icons/terminal.png', Terminal.toggle) + terminalButton = TopMenu.addButton('terminalButton', 'Terminal (Ctrl + T)', 'terminal.png', Terminal.toggle) Hotkeys.bindKeyDown('Ctrl+T', Terminal.toggle) commandHistory = Settings.getList('terminal-history') diff --git a/modules/addon_terminal/terminal.png b/modules/addon_terminal/terminal.png new file mode 100644 index 00000000..768c2e9e Binary files /dev/null and b/modules/addon_terminal/terminal.png differ diff --git a/modules/client_about/about.lua b/modules/client_about/about.lua index c1d33df3..1dd86699 100644 --- a/modules/client_about/about.lua +++ b/modules/client_about/about.lua @@ -5,7 +5,7 @@ local aboutButton -- public functions function About.init() - aboutButton = TopMenu.addRightButton('aboutButton', 'About', '/core_styles/icons/about.png', About.display) + aboutButton = TopMenu.addRightButton('aboutButton', 'About', 'about.png', About.display) end function About.display() diff --git a/modules/client_about/about.png b/modules/client_about/about.png new file mode 100644 index 00000000..5e30545c Binary files /dev/null and b/modules/client_about/about.png differ diff --git a/modules/client_options/options.lua b/modules/client_options/options.lua index 8f617452..fb78b545 100644 --- a/modules/client_options/options.lua +++ b/modules/client_options/options.lua @@ -24,7 +24,7 @@ function Options.init() optionsWindow = displayUI('options.otui') optionsWindow:setVisible(false) - optionsButton = TopMenu.addButton('settingsButton', 'Options (Ctrl+O)', '/core_styles/icons/settings.png', Options.toggle) + optionsButton = TopMenu.addButton('optionsButton', 'Options (Ctrl+O)', 'options.png', Options.toggle) Hotkeys.bindKeyDown('Ctrl+O', Options.toggle) end diff --git a/modules/client_options/options.png b/modules/client_options/options.png new file mode 100644 index 00000000..3a8aaf7a Binary files /dev/null and b/modules/client_options/options.png differ diff --git a/modules/client_topmenu/topmenu.lua b/modules/client_topmenu/topmenu.lua index 62ec86b4..e031a145 100644 --- a/modules/client_topmenu/topmenu.lua +++ b/modules/client_topmenu/topmenu.lua @@ -63,11 +63,11 @@ function TopMenu.addGameButton(id, description, icon, callback) end function TopMenu.addLeftButton(id, description, icon, callback) - return TopMenu.addButton(id, description, icon, callback, false) + return TopMenu.addButton(id, description, resolvepath(icon, 2), callback, false) end function TopMenu.addRightButton(id, description, icon, callback) - return TopMenu.addButton(id, description, icon, callback, true) + return TopMenu.addButton(id, description, resolvepath(icon, 2), callback, true) end function TopMenu.removeButton(param) diff --git a/modules/core_styles/images/tabbutton.png b/modules/core_styles/images/tabbutton.png new file mode 100644 index 00000000..2b67bbd1 Binary files /dev/null and b/modules/core_styles/images/tabbutton.png differ diff --git a/modules/core_styles/styles/buttons.otui b/modules/core_styles/styles/buttons.otui index d89362c4..d20ab2c8 100644 --- a/modules/core_styles/styles/buttons.otui +++ b/modules/core_styles/styles/buttons.otui @@ -20,7 +20,7 @@ Button < UIButton ConsoleButton < UIButton size: 20 20 - image-source: /core_styles/images/consolebutton.png + image-source: /core_styles/images/tabbutton.png image-color: white image-clip: 0 0 20 20 image-border: 2 diff --git a/modules/core_styles/styles/items.otui b/modules/core_styles/styles/items.otui index cef4c48c..2c99b081 100644 --- a/modules/core_styles/styles/items.otui +++ b/modules/core_styles/styles/items.otui @@ -2,3 +2,4 @@ Item < UIItem size: 34 34 image-source: /core_styles/images/item.png font: verdana-11px-rounded + border-color: white \ No newline at end of file diff --git a/modules/core_styles/styles/tabbars.otui b/modules/core_styles/styles/tabbars.otui index 61f63e25..3876dd16 100644 --- a/modules/core_styles/styles/tabbars.otui +++ b/modules/core_styles/styles/tabbars.otui @@ -2,7 +2,7 @@ TabBar < UITabBar TabBarPanel < Panel TabBarButton < UIButton size: 20 20 - image-source: /core_styles/images/consolebutton.png + image-source: /core_styles/images/tabbutton.png image-color: white image-clip: 0 0 20 20 image-border: 2 diff --git a/modules/core_widgets/uiitem.lua b/modules/core_widgets/uiitem.lua index 5aca0a49..70dac2bf 100644 --- a/modules/core_widgets/uiitem.lua +++ b/modules/core_widgets/uiitem.lua @@ -1,9 +1,8 @@ function UIItem:onDragEnter(mousePos) local item = self:getItem() if not item then return false end - - self:setBorderWidth('1') - self:setBorderColor('#ffffff') + + self:setBorderWidth(1) self.currentDragThing = item setTargetCursor() @@ -13,7 +12,7 @@ end function UIItem:onDragLeave(widget, mousePos) self.currentDragThing = nil restoreCursor() - self:setBorderWidth('0') + self:setBorderWidth(0) return true end @@ -24,9 +23,20 @@ function UIItem:onDrop(widget, mousePos) local count = widget.currentDragThing:getData() Game.move(widget.currentDragThing, pos, count) + self:setBorderWidth(0) return true end +function UIItem:onHoverChange(hovered) + if g_ui.getDraggingWidget() and self ~= g_ui.getDraggingWidget() then + if hovered then + self:setBorderWidth(1) + else + self:setBorderWidth(0) + end + end +end + function UIItem:onMouseRelease(mousePosition, mouseButton) local item = self:getItem() if not item or not self:containsPoint(mousePosition) then return false end diff --git a/modules/game/game.lua b/modules/game/game.lua index 5a98490d..26be96fd 100644 --- a/modules/game/game.lua +++ b/modules/game/game.lua @@ -1,3 +1,6 @@ +-- private variables +local m_mouseGrabberWidget + -- private functions local function onGameKeyPress(self, keyCode, keyboardModifiers, wouldFilter) if wouldFilter then return end @@ -13,7 +16,34 @@ local function onGameKeyPress(self, keyCode, keyboardModifiers, wouldFilter) return false end +local function onUseWithMouseRelease(self, mousePosition, mouseButton) + if Game.selectedThing == nil then return false end + if mouseButton == MouseLeftButton then + local clickedWidget = Game.gameUi:recursiveGetChildByPos(mousePosition) + if clickedWidget then + if clickedWidget.getTile then + local tile = clickedWidget:getTile(mousePosition) + if tile then + Game.useWith(Game.selectedThing, tile:getTopMultiUseThing()) + end + elseif clickedWidget.getItem then + Game.useWith(Game.selectedThing, clickedWidget:getItem()) + end + end + end + Game.selectedThing = nil + restoreCursor() + self:ungrabMouse() + return true +end + -- public functions +function Game.startUseWith(thing) + Game.selectedThing = thing + m_mouseGrabberWidget:grabMouse() + setTargetCursor() +end + function Game.createInterface() Background.hide() CharacterList.destroyLoadBox() @@ -33,7 +63,9 @@ function Game.createInterface() Game.gameMapPanel = Game.gameUi:getChildById('gameMapPanel') Game.gameRightPanel = Game.gameUi:getChildById('gameRightPanel') Game.gameBottomPanel = Game.gameUi:getChildById('gameBottomPanel') - Game.gameUi.onKeyPress = onGameKeyPress + m_mouseGrabberWidget = Game.gameUi:getChildById('mouseGrabber') + connect(Game.gameUi, { onKeyPress = onGameKeyPress }) + connect(m_mouseGrabberWidget, { onMouseRelease = onUseWithMouseRelease }) end function Game.destroyInterface() diff --git a/modules/game/game.otui b/modules/game/game.otui index e81d41b4..3a357bfc 100644 --- a/modules/game/game.otui +++ b/modules/game/game.otui @@ -26,3 +26,6 @@ UIGame anchors.bottom: gameBottomPanel.top focusable: false + UIWidget + id: mouseGrabber + focusable: false \ No newline at end of file diff --git a/modules/game/map.lua b/modules/game/map.lua index 47376732..f366b4e1 100644 --- a/modules/game/map.lua +++ b/modules/game/map.lua @@ -1,7 +1,7 @@ function UIMap:onDragEnter(mousePos) local tile = self:getTile(mousePos) if not tile then return false end - + local thing = tile:getTopMoveThing() if not thing then return false end @@ -18,11 +18,11 @@ end function UIMap:onDrop(widget, mousePos) if not widget or not widget.currentDragThing then return false end - + local tile = self:getTile(mousePos) if not tile then return false end - local count = 1 -- todo make a window for it - + local count = widget.currentDragThing:getData() + Game.move(widget.currentDragThing, tile:getPos(), count) return true end diff --git a/modules/game/thing.lua b/modules/game/thing.lua index 3444a7c8..e96c7b1b 100644 --- a/modules/game/thing.lua +++ b/modules/game/thing.lua @@ -14,24 +14,13 @@ end function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing, useThing, creatureThing, multiUseThing) local keyboardModifiers = g_window.getKeyboardModifiers() - local selectedThing = Game.getSelectedThing() - if mouseButton == MouseRightButton and selectedThing then - Game.setSelectedThing(nil) - return true - end - - if autoWalk and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseLeftButton and not Game.getSelectedThing() then + if autoWalk and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseLeftButton then -- todo auto walk return true end if not Options.classicControl then - if mouseButton == MouseLeftButton and selectedThing then - Game.useWith(Game.getSelectedThing(), multiUseThing) - Game.setSelectedThing(nil) - restoreCursor() - return true - elseif keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then + if keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing) return true elseif lookThing and keyboardModifiers == KeyboardShiftModifier and (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then @@ -41,14 +30,17 @@ function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing, if useThing:isContainer() then if useThing:isInsideContainer() then Game.open(useThing, useThing:getContainerId()) + return true else Game.open(useThing, Containers.getFreeContainerId()) + return true end elseif useThing:isMultiUse() then - Game.setSelectedThing(useThing) - setTargetCursor() + Game.startUseWith(useThing) + return true else Game.use(useThing) + return true end return true elseif creatureThing and keyboardModifiers == KeyboardAltModifier and (mouseButton == MouseLeftButton or mouseButton == MouseRightButton) then @@ -56,23 +48,21 @@ function Game.processMouseAction(menuPosition, mouseButton, autoWalk, lookThing, return true end else - if mouseButton == MouseLeftButton and selectedThing then - Game.useWith(Game.getSelectedThing(), multiUseThing) - Game.setSelectedThing(nil) - restoreCursor() - return true - elseif multiUseThing and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then + if multiUseThing and keyboardModifiers == KeyboardNoModifier and mouseButton == MouseRightButton then if multiUseThing:asCreature() then Game.attack(multiUseThing:asCreature()) + return true elseif multiUseThing:isContainer() then if multiUseThing:isInsideContainer() then Game.open(multiUseThing, multiUseThing:getContainerId()) + return true else Game.open(multiUseThing, Containers.getFreeContainerId()) + return true end elseif multiUseThing:isMultiUse() then - Game.setSelectedThing(multiUseThing) - setTargetCursor() + Game.startUseWith(multiUseThing) + return true else Game.use(multiUseThing) end @@ -110,7 +100,7 @@ function Game.createThingMenu(menuPosition, lookThing, useThing, creatureThing) end else if useThing:isMultiUse() then - menu:addOption('Use with ...', function() Game.setSelectedThing(useThing) setTargetCursor() end) + menu:addOption('Use with ...', function() Game.startUseWith(useThing) end) else menu:addOption('Use', function() Game.use(useThing) end) end diff --git a/modules/game_combatcontrols/combatcontrols.lua b/modules/game_combatcontrols/combatcontrols.lua new file mode 100644 index 00000000..ed909851 --- /dev/null +++ b/modules/game_combatcontrols/combatcontrols.lua @@ -0,0 +1,8 @@ +CombatControls = {} + +function CombatControls.init() +end + + +function CombatControls.terminate() +end \ No newline at end of file diff --git a/modules/game_combatcontrols/combatcontrols.otmod b/modules/game_combatcontrols/combatcontrols.otmod new file mode 100644 index 00000000..e7297d82 --- /dev/null +++ b/modules/game_combatcontrols/combatcontrols.otmod @@ -0,0 +1,7 @@ +Module + name: game_combatcontrols + description: Combat controls window + author: OTClient team + website: https://github.com/edubart/otclient + onLoad: | + require 'combatcontrols' diff --git a/modules/game_combatcontrols/combatcontrols.otui b/modules/game_combatcontrols/combatcontrols.otui new file mode 100644 index 00000000..e69de29b diff --git a/modules/game_combatcontrols/combatcontrols.png b/modules/game_combatcontrols/combatcontrols.png new file mode 100644 index 00000000..f39523e4 Binary files /dev/null and b/modules/game_combatcontrols/combatcontrols.png differ diff --git a/modules/game_healthbar/healthbar.lua b/modules/game_healthbar/healthbar.lua index d6e74241..458fd1ed 100644 --- a/modules/game_healthbar/healthbar.lua +++ b/modules/game_healthbar/healthbar.lua @@ -1,7 +1,7 @@ HealthBar = {} -- private variables -local healthManaPanel +local healthBarWindow local healthBar local manaBar local healthLabel @@ -9,22 +9,32 @@ local manaLabel -- public functions function HealthBar.create() - healthManaPanel = displayUI('healthbar.otui', { parent = Game.gameRightPanel }) - healthBar = healthManaPanel:getChildById('healthBar') - manaBar = healthManaPanel:getChildById('manaBar') - healthLabel = healthManaPanel:getChildById('healthLabel') - manaLabel = healthManaPanel:getChildById('manaLabel') + healthBarWindow = displayUI('healthbar.otui', { parent = Game.gameRightPanel }) + healthBarButton = TopMenu.addGameButton('healthBarButton', 'Healh Bar', 'healthbar.png', HealthBar.toggle) + healthBarButton:setOn(true) + healthBar = healthBarWindow:getChildById('healthBar') + manaBar = healthBarWindow:getChildById('manaBar') + healthLabel = healthBarWindow:getChildById('healthLabel') + manaLabel = healthBarWindow:getChildById('manaLabel') end function HealthBar.destroy() - healthManaPanel:destroy() - healthManaPanel = nil + healthBarWindow:destroy() + healthBarWindow = nil + healthBarButton:destroy() + healthBarButton = nil healthBar = nil manaBar = nil healthLabel = nil manaLabel = nil end +function HealthBar.toggle() + local visible = not healthBarWindow:isExplicitlyVisible() + healthBarWindow:setVisible(visible) + healthBarButton:setOn(visible) +end + -- hooked events function HealthBar.onHealthChange(health, maxHealth) healthLabel:setText(health .. ' / ' .. maxHealth) diff --git a/modules/game_healthbar/healthbar.png b/modules/game_healthbar/healthbar.png new file mode 100644 index 00000000..c398bf66 Binary files /dev/null and b/modules/game_healthbar/healthbar.png differ diff --git a/modules/game_inventory/inventory.lua b/modules/game_inventory/inventory.lua index 0a2d1367..08129f14 100644 --- a/modules/game_inventory/inventory.lua +++ b/modules/game_inventory/inventory.lua @@ -1,31 +1,42 @@ Inventory = {} -- private variables -local window = nil +local inventoryWindow +local inventoryButton -- public functions function Inventory.create() - window = displayUI('inventory.otui', { parent = Game.gameRightPanel }) + inventoryWindow = displayUI('inventory.otui', { parent = Game.gameRightPanel }) + inventoryButton = TopMenu.addGameButton('inventoryButton', 'Skills (Ctrl+I)', 'inventory.png', Inventory.toggle) + inventoryButton:setOn(true) end function Inventory.destroy() - window:destroy() - window = nil + inventoryWindow:destroy() + inventoryWindow = nil + inventoryButton:destroy() + inventoryButton = nil +end + +function Inventory.toggle() + local visible = not inventoryWindow:isExplicitlyVisible() + inventoryWindow:setVisible(visible) + inventoryButton:setOn(visible) end -- hooked events function Inventory.onInventoryChange(slot, item) - local itemWidget = window:getChildById('slot' .. slot) + local itemWidget = inventoryWindow:getChildById('slot' .. slot) itemWidget:setItem(item) end function Inventory.onFreeCapacityChange(freeCapacity) - local widget = window:getChildById('capacity') + local widget = inventoryWindow:getChildById('capacity') widget:setText("Cap:\n" .. freeCapacity) end function Inventory.onSoulChange(soul) - local widget = window:getChildById('soul') + local widget = inventoryWindow:getChildById('soul') widget:setText("Soul:\n" .. soul) end diff --git a/modules/game_inventory/inventory.png b/modules/game_inventory/inventory.png new file mode 100644 index 00000000..27876d9e Binary files /dev/null and b/modules/game_inventory/inventory.png differ diff --git a/modules/game_miniwindow/miniwindow.lua b/modules/game_miniwindow/miniwindow.lua new file mode 100644 index 00000000..e69de29b diff --git a/modules/game_miniwindow/miniwindow.otmod b/modules/game_miniwindow/miniwindow.otmod new file mode 100644 index 00000000..e69de29b diff --git a/modules/game_miniwindow/miniwindow.otui b/modules/game_miniwindow/miniwindow.otui new file mode 100644 index 00000000..e69de29b diff --git a/modules/game_textmessage/textmessage.lua b/modules/game_textmessage/textmessage.lua index dc69742b..4cda34c1 100644 --- a/modules/game_textmessage/textmessage.lua +++ b/modules/game_textmessage/textmessage.lua @@ -6,7 +6,7 @@ importStyle 'textmessage.otui' -- private variables local MessageTypes = { consoleRed = { color = '#F55E5E', consoleTab = 'Server Log' }, - eventOrange = { color = '#FE6500', consoleTab = 'Default' , windowLocation = 'center', consoleOption = 'showEventMessagesInConsole' }, + eventOrange = { color = '#FE6500', consoleTab = 'Default' }, consoleOrange = { color = '#FE6500', consoleTab = 'Default' }, warning = { color = '#F55E5E', consoleTab = 'Server Log', windowLocation = 'center' }, eventAdvance = { color = '#FFFFFF', consoleTab = 'Server Log', windowLocation = 'center', consoleOption = 'showEventMessagesInConsole' }, diff --git a/modules/game_viplist/viplist.lua b/modules/game_viplist/viplist.lua index 8e2f9a0f..ac496c3c 100644 --- a/modules/game_viplist/viplist.lua +++ b/modules/game_viplist/viplist.lua @@ -9,7 +9,7 @@ local addVipWindow function VipList.create() vipWindow = displayUI('viplist.otui', { parent = Game.gameRightPanel }) vipWindow:hide() - vipButton = TopMenu.addGameButton('vipListButton', 'VIP list', '/core_styles/icons/viplist.png', VipList.toggle) + vipButton = TopMenu.addGameButton('vipListButton', 'VIP list', 'viplist.png', VipList.toggle) end function VipList.destroy() diff --git a/modules/game_viplist/viplist.png b/modules/game_viplist/viplist.png new file mode 100644 index 00000000..2bedcaff Binary files /dev/null and b/modules/game_viplist/viplist.png differ diff --git a/src/framework/graphics/framebuffer.cpp b/src/framework/graphics/framebuffer.cpp index 737d8d53..4dafd5af 100644 --- a/src/framework/graphics/framebuffer.cpp +++ b/src/framework/graphics/framebuffer.cpp @@ -28,6 +28,8 @@ uint FrameBuffer::boundFbo = 0; FrameBuffer::FrameBuffer(const Size& size) { + m_clearColor = Fw::alpha; + glGenFramebuffers(1, &m_fbo); if(!m_fbo) logFatal("Unable to create framebuffer object"); @@ -68,8 +70,10 @@ void FrameBuffer::bind(bool clear) g_painter.setProjectionMatrix(projectionMatrix); g_graphics.setViewportSize(m_texture->getSize()); - if(clear) + if(clear) { + glClearColor(m_clearColor.rF(), m_clearColor.gF(), m_clearColor.bF(), m_clearColor.aF()); glClear(GL_COLOR_BUFFER_BIT); + } } void FrameBuffer::release() diff --git a/src/framework/graphics/framebuffer.h b/src/framework/graphics/framebuffer.h index b43a7710..bd81d6a4 100644 --- a/src/framework/graphics/framebuffer.h +++ b/src/framework/graphics/framebuffer.h @@ -30,12 +30,14 @@ class FrameBuffer public: FrameBuffer(const Size& size); virtual ~FrameBuffer(); - + void resize(const Size& size); void bind(bool clear = true); void release(); void draw(const Rect& dest); + void setClearColor(const Color& color) { m_clearColor = color; } + TexturePtr getTexture() { return m_texture; } private: @@ -48,6 +50,7 @@ private: Size m_oldViewportSize; uint m_fbo; uint m_prevBoundFbo; + Color m_clearColor; static uint boundFbo; }; diff --git a/src/framework/graphics/graphics.cpp b/src/framework/graphics/graphics.cpp index d7dc549d..d4e26986 100644 --- a/src/framework/graphics/graphics.cpp +++ b/src/framework/graphics/graphics.cpp @@ -43,7 +43,6 @@ void Graphics::init() #endif glEnable(GL_BLEND); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); logInfo("GPU ", glGetString(GL_RENDERER)); logInfo("OpenGL ", glGetString(GL_VERSION)); @@ -93,6 +92,7 @@ void Graphics::resize(const Size& size) void Graphics::beginRender() { + glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); } diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index b3d240d7..44899235 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -435,6 +435,7 @@ void Application::registerLuaFunctions() g_lua.bindClassStaticFunction("g_ui", "getStyleClass", std::bind(&UIManager::getStyleClass, &g_ui, _1)); g_lua.bindClassStaticFunction("g_ui", "loadUI", std::bind(&UIManager::loadUI, &g_ui, _1, _2)); g_lua.bindClassStaticFunction("g_ui", "getRootWidget", std::bind(&UIManager::getRootWidget, &g_ui)); + g_lua.bindClassStaticFunction("g_ui", "getDraggingWidget", std::bind(&UIManager::getDraggingWidget, &g_ui)); g_lua.bindClassStaticFunction("g_ui", "setDebugBoxesDrawing", std::bind(&UIManager::setDebugBoxesDrawing, &g_ui, _1)); g_lua.bindClassStaticFunction("g_ui", "isDrawingDebugBoxes", std::bind(&UIManager::setDebugBoxesDrawing, &g_ui, _1)); diff --git a/src/framework/math/color.h b/src/framework/math/color.h index 529cdd4d..743a1455 100644 --- a/src/framework/math/color.h +++ b/src/framework/math/color.h @@ -40,6 +40,11 @@ public: uint8 g() const { return m_g; } uint8 r() const { return m_r; } + float aF() const { return m_a/255.0f; } + float bF() const { return m_b/255.0f; } + float gF() const { return m_g/255.0f; } + float rF() const { return m_r/255.0f; } + uint32 rgba() const { return m_rgba; } const uint8* rgbaPtr() const { return (const uint8*)&m_rgba; } diff --git a/src/framework/ui/uimanager.cpp b/src/framework/ui/uimanager.cpp index 927ba502..0f46cf4e 100644 --- a/src/framework/ui/uimanager.cpp +++ b/src/framework/ui/uimanager.cpp @@ -72,7 +72,7 @@ void UIManager::inputEvent(const InputEvent& event) m_keyboardReceiver->propagateOnKeyUp(event.keyCode, event.keyboardModifiers); break; case Fw::MousePressInputEvent: - m_keyboardReceiver->propagateOnMousePress(event.mousePos, event.mouseButton); + m_mouseReceiver->propagateOnMousePress(event.mousePos, event.mouseButton); break; case Fw::MouseReleaseInputEvent: m_mouseReceiver->propagateOnMouseRelease(event.mousePos, event.mouseButton); diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index 123f9e19..472d00b4 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -830,10 +830,11 @@ UIWidgetPtr UIWidget::recursiveGetChildById(const std::string& id) UIWidgetPtr UIWidget::recursiveGetChildByPos(const Point& childPos) { for(const UIWidgetPtr& child : m_children) { - if(child->containsPoint(childPos)) { + if(child->isExplicitlyVisible() && child->containsPoint(childPos)) { if(UIWidgetPtr subChild = child->recursiveGetChildByPos(childPos)) return subChild; - return child; + else if(!child->isPhantom()) + return child; } } return nullptr; @@ -1113,7 +1114,7 @@ bool UIWidget::onMousePress(const Point& mousePos, Fw::MouseButton button) return callLuaField("onMousePress", mousePos, button); } -void UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) +bool UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) { if(isPressed() && getRect().contains(mousePos)) callLuaField("onClick"); @@ -1125,7 +1126,7 @@ void UIWidget::onMouseRelease(const Point& mousePos, Fw::MouseButton button) draggedWidget->setDragging(false); } - callLuaField("onMouseRelease", mousePos, button); + return callLuaField("onMouseRelease", mousePos, button); } bool UIWidget::onMouseMove(const Point& mousePos, const Point& mouseMoved) @@ -1260,16 +1261,16 @@ bool UIWidget::propagateOnMousePress(const Point& mousePos, Fw::MouseButton butt // only non phatom widgets receives mouse press events if(!isPhantom()) { - onMousePress(mousePos, button); + bool ret = onMousePress(mousePos, button); if(button == Fw::MouseLeftButton && !isPressed()) setPressed(true); - return true; + return ret; } return false; } -void UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button) +bool UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button) { // do a backup of children list, because it may change while looping it UIWidgetList children; @@ -1283,13 +1284,16 @@ void UIWidget::propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton bu } for(const UIWidgetPtr& child : children) { - child->propagateOnMouseRelease(mousePos, button); + if(child->propagateOnMouseRelease(mousePos, button)) + return true; } - onMouseRelease(mousePos, button); + bool ret = onMouseRelease(mousePos, button); if(isPressed() && button == Fw::MouseLeftButton) setPressed(false); + + return ret; } bool UIWidget::propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved) diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 230aaac0..c0157de6 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -173,7 +173,7 @@ protected: virtual bool onKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter); virtual bool onKeyUp(uchar keyCode, int keyboardModifiers); virtual bool onMousePress(const Point& mousePos, Fw::MouseButton button); - virtual void onMouseRelease(const Point& mousePos, Fw::MouseButton button); + virtual bool onMouseRelease(const Point& mousePos, Fw::MouseButton button); virtual bool onMouseMove(const Point& mousePos, const Point& mouseMoved); virtual bool onMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction); @@ -182,7 +182,7 @@ protected: bool propagateOnKeyPress(uchar keyCode, int keyboardModifiers, bool wouldFilter); bool propagateOnKeyUp(uchar keyCode, int keyboardModifiers); bool propagateOnMousePress(const Point& mousePos, Fw::MouseButton button); - void propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button); + bool propagateOnMouseRelease(const Point& mousePos, Fw::MouseButton button); bool propagateOnMouseMove(const Point& mousePos, const Point& mouseMoved); bool propagateOnMouseWheel(const Point& mousePos, Fw::MouseWheelDirection direction); diff --git a/src/otclient/core/creature.cpp b/src/otclient/core/creature.cpp index cf45df24..17e4ae22 100644 --- a/src/otclient/core/creature.cpp +++ b/src/otclient/core/creature.cpp @@ -245,12 +245,13 @@ void Creature::stopWalk() void Creature::updateWalkAnimation(int totalPixelsWalked) { // update outfit animation - if(m_outfit.getCategory() == ThingsType::Creature) { - if(totalPixelsWalked == 32 || totalPixelsWalked == 0 || m_type->dimensions[ThingType::AnimationPhases] <= 1) - m_animation = 0; - else if(m_type->dimensions[ThingType::AnimationPhases] > 1) - m_animation = 1 + ((totalPixelsWalked * 4) / Map::NUM_TILE_PIXELS) % (m_type->dimensions[ThingType::AnimationPhases] - 1); - } + if(m_outfit.getCategory() != ThingsType::Creature) + return; + + if(totalPixelsWalked == 32 || totalPixelsWalked == 0 || m_type->dimensions[ThingType::AnimationPhases] <= 1) + m_animation = 0; + else if(m_type->dimensions[ThingType::AnimationPhases] > 1) + m_animation = 1 + ((totalPixelsWalked * 4) / Map::NUM_TILE_PIXELS) % (m_type->dimensions[ThingType::AnimationPhases] - 1); } void Creature::updateWalkOffset(int totalPixelsWalked) @@ -373,11 +374,12 @@ void Creature::setDirection(Otc::Direction direction) void Creature::setOutfit(const Outfit& outfit) { - if(m_outfit.getCategory() != ThingsType::Effect && outfit.getCategory() == ThingsType::Effect) { - auto self = asCreature(); - g_dispatcher.scheduleEvent([self]() { - self->updateInvisibleAnimation(); - }, INVISIBLE_TICKS); + m_outfit = outfit; + m_type = getType(); + m_animation = 0; + + if(m_outfit.getCategory() == ThingsType::Effect) { + updateInvisibleAnimation(); m_xPattern = 0; m_yPattern = 0; @@ -387,11 +389,7 @@ void Creature::setOutfit(const Outfit& outfit) m_yPattern = 0; } - m_outfit = outfit; - m_type = getType(); - if(m_outfit.getCategory() == ThingsType::Creature && m_type->dimensions[ThingType::Layers] == 1) { - m_animation = 0; m_outfit.resetClothes(); } } @@ -453,6 +451,9 @@ void Creature::addVolatileSquare(uint8 color) void Creature::updateInvisibleAnimation() { + if(!g_game.isOnline() || m_outfit.getCategory() != ThingsType::Effect) + return; + if(m_animation == 1) m_animation = 2; else if(m_animation == 2) @@ -462,12 +463,10 @@ void Creature::updateInvisibleAnimation() else m_animation = 1; - if(g_game.isOnline() && m_outfit.getCategory() == ThingsType::Effect) { - auto self = asCreature(); - g_dispatcher.scheduleEvent([self]() { - self->updateInvisibleAnimation(); - }, INVISIBLE_TICKS); - } + auto self = asCreature(); + g_dispatcher.scheduleEvent([self]() { + self->updateInvisibleAnimation(); + }, INVISIBLE_TICKS); } void Creature::updateShield() diff --git a/src/otclient/core/game.cpp b/src/otclient/core/game.cpp index a6ae1a29..9d1d3c7e 100644 --- a/src/otclient/core/game.cpp +++ b/src/otclient/core/game.cpp @@ -36,7 +36,6 @@ Game g_game; void Game::loginWorld(const std::string& account, const std::string& password, const std::string& worldHost, int worldPort, const std::string& characterName) { m_dead = false; - m_selectedThing = nullptr; m_protocolGame = ProtocolGamePtr(new ProtocolGame); m_protocolGame->login(account, password, worldHost, (uint16)worldPort, characterName); } diff --git a/src/otclient/core/game.h b/src/otclient/core/game.h index 110cee1d..58451d5b 100644 --- a/src/otclient/core/game.h +++ b/src/otclient/core/game.h @@ -107,9 +107,6 @@ public: bool isOnline() { return !!m_localPlayer; } bool isDead() { return m_dead; } - void setSelectedThing(const ThingPtr& thing) { m_selectedThing = thing; } - ThingPtr getSelectedThing() { return m_selectedThing; } - void setServerBeat(int serverBeat) { m_serverBeat = serverBeat; } int getServerBeat() { return m_serverBeat; } @@ -122,7 +119,6 @@ private: ProtocolGamePtr m_protocolGame; bool m_dead; int m_serverBeat; - ThingPtr m_selectedThing; }; extern Game g_game; diff --git a/src/otclient/core/map.cpp b/src/otclient/core/map.cpp index 74d3b9b6..b269faea 100644 --- a/src/otclient/core/map.cpp +++ b/src/otclient/core/map.cpp @@ -46,6 +46,7 @@ void Map::draw(const Rect& rect) if(!m_framebuffer) { Size fboSize(m_visibleSize.width() * NUM_TILE_PIXELS, m_visibleSize.height() * NUM_TILE_PIXELS); m_framebuffer = FrameBufferPtr(new FrameBuffer(fboSize)); + m_framebuffer->setClearColor(Fw::black); m_shaderProgram = PainterShaderProgramPtr(new PainterShaderProgram); diff --git a/src/otclient/luafunctions.cpp b/src/otclient/luafunctions.cpp index 7f6c9d81..3571b58f 100644 --- a/src/otclient/luafunctions.cpp +++ b/src/otclient/luafunctions.cpp @@ -224,8 +224,6 @@ void OTClient::registerLuaFunctions() g_lua.bindClassStaticFunction("getLocalPlayer", std::bind(&Game::getLocalPlayer, &g_game)); g_lua.bindClassStaticFunction("getProtocolVersion", std::bind(&Game::getProtocolVersion, &g_game)); g_lua.bindClassStaticFunction("getProtocolGame", std::bind(&Game::getProtocolGame, &g_game)); - g_lua.bindClassStaticFunction("setSelectedThing", std::bind(&Game::setSelectedThing, &g_game, _1)); - g_lua.bindClassStaticFunction("getSelectedThing", std::bind(&Game::getSelectedThing, &g_game)); g_lua.registerClass(); g_lua.bindClassStaticFunction("create", []{ return UIItemPtr(new UIItem); } );