mirror of
https://github.com/mehah/otclient
synced 2026-08-15 16:29:06 -04:00
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.
232 lines
6.2 KiB
Lua
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
|