otclient-redemption/modules/game_interface/widgets/uiitem.lua
kokekanon 7f16fc7c73
cleanup: minor otui errors (#1692)
New Features:
- Added chat channel features: invite/exclude players, dedicated loot channel, owner channel management.
- Fist Weapons category added to market system.

Bug Fixes:
- Improved null safety for local player checks across multiple systems.
- Fixed drag-and-drop validation.
- Prevented division-by-zero errors in calculations.
- Fixed port parsing from URLs.

Improvements:
- Enhanced window toggle button synchronization.
- Refined store description rendering with icons.
- Adjusted UI layouts and spacing across. multiple windows.
- Improved console channel handling.
2026-05-16 22:15:12 -03:00

232 lines
6.2 KiB
Lua

function UIItem:onDragEnter(mousePos)
if self:isVirtual() then
return false
end
local item = self:getItem()
if not item then
return false
end
UIDragIcon:display(item)
self:setBorderWidth(1)
self.currentDragThing = item
-- Use native cursor when enabled, otherwise use custom cursor
if modules.client_options and modules.client_options.getOption('nativeCursor') then
g_window.setSystemCursor('cross')
else
g_mouse.pushCursor('target')
end
return true
end
function UIItem:onDragLeave(droppedWidget, mousePos)
if self:isVirtual() then
return false
end
self.currentDragThing = nil
-- Restore cursor
if modules.client_options and modules.client_options.getOption('nativeCursor') then
g_window.restoreMouseCursor()
else
g_mouse.popCursor('target')
end
UIDragIcon:hide()
self:setBorderWidth(0)
self.hoveredWho = nil
return true
end
function UIItem:onDrop(widget, mousePos, forced)
self:setBorderWidth(0)
if not self:canAcceptDrop(widget, mousePos) and not forced then
return false
end
local item = widget.currentDragThing
if not item or not item:isItem() then
return false
end
if self:isVirtual() then
UIDragIcon:hide()
end
local itemPos = item:getPosition()
local itemTile = item:getTile()
local toPos = self.position
if not (toPos) and self:getParent() and self:getParent().slotPosition then
toPos = self:getParent().slotPosition
end
if modules.game_actionbar and modules.game_actionbar.tryAssignActionButtonFromDrop(mousePos, widget, item:getId()) then
return true
end
if self.selectable then
if item:isPickupable() then
self:setItem(Item.create(item:getId(), item:getCountOrSubType()))
return true
end
return false
end
if not itemPos then
return false
end
if itemPos.x ~= 65535 and not itemTile then
return false
end
if itemPos.x == toPos.x and itemPos.y == toPos.y and itemPos.z == toPos.z then
return false
end
if item:getCount() > 1 then
modules.game_interface.moveStackableItem(item, toPos)
else
g_game.move(item, toPos, 1)
end
return true
end
function UIItem:onDestroy()
if self == g_ui.getDraggingWidget() and self.hoveredWho then
self.hoveredWho:setBorderWidth(0)
end
if self:isVirtual() then
UIDragIcon:hide()
end
if self.hoveredWho then
self.hoveredWho = nil
end
end
function UIItem:onHoverChange(hovered)
UIWidget.onHoverChange(self, hovered)
if self:isVirtual() or not self:isDraggable() then
local draggingWidget = g_ui.getDraggingWidget()
if not draggingWidget or draggingWidget == self then
UIDragIcon:hide()
end
return
end
local draggingWidget = g_ui.getDraggingWidget()
if draggingWidget and self ~= draggingWidget then
local gotMap = draggingWidget:getClassName() == 'UIGameMap'
local gotItem = draggingWidget:getClassName() == 'UIItem' and not draggingWidget:isVirtual()
if hovered and (gotItem or gotMap) then
self:setBorderWidth(1)
draggingWidget.hoveredWho = self
else
self:setBorderWidth(0)
draggingWidget.hoveredWho = nil
end
end
if g_game.getFeature(GameItemTooltipV8) then
local tooltip = ""
local function splitTextIntoLines(text, maxLineLength)
local words = {}
for word in text:gmatch("%S+") do
table.insert(words, word)
end
local lines = {}
local currentLine = words[1]
for i = 2, #words do
if currentLine:len() + 1 + words[i]:len() > maxLineLength then
table.insert(lines, currentLine)
currentLine = words[i]
else
currentLine = currentLine .. " " .. words[i]
end
end
table.insert(lines, currentLine)
return table.concat(lines, "\n")
end
if self:getItem() and self:getItem():getTooltip():len() > 0 then
tooltip = splitTextIntoLines(self:getItem():getTooltip(), 80)
if tooltip then
self:setTooltip(tooltip)
end
end
end
end
function UIItem:onMouseRelease(mousePosition, mouseButton)
if self.cancelNextRelease then
self.cancelNextRelease = false
return true
end
if self:isVirtual() then
UIDragIcon:hide()
return false
end
local item = self:getItem()
if not item or not self:containsPoint(mousePosition) then
return false
end
if modules.client_options.getOption('classicControl') and not g_platform.isMobile() and
((g_mouse.isPressed(MouseLeftButton) and mouseButton == MouseRightButton) or
(g_mouse.isPressed(MouseRightButton) and mouseButton == MouseLeftButton)) then
g_game.look(item)
self.cancelNextRelease = true
return true
elseif modules.game_interface.processMouseAction(mousePosition, mouseButton, nil, item, item, nil, nil) then
return true
end
return false
end
function UIItem:canAcceptDrop(widget, mousePos)
if not self.selectable and (self:isVirtual() or not self:isDraggable()) then
return false
end
if not widget or not widget.currentDragThing then
return false
end
local children = rootWidget:recursiveGetChildrenByPos(mousePos)
for i = 1, #children do
local child = children[i]
if child == self then
return true
elseif not child:isPhantom() then
return false
end
end
error('Widget ' .. self:getId() .. ' not in drop list.')
return false
end
function UIItem:onClick(mousePos)
if not self.selectable or not self.editable then
return
end
if modules.game_itemselector then
modules.game_itemselector.show(self)
end
end
function UIItem:onItemChange()
local tooltip = ""
if self:getItem() and self:getItem():getTooltip():len() > 0 then
tooltip = self:getItem():getTooltip()
end
self:setTooltip(tooltip)
end