mirror of
https://github.com/mehah/otclient
synced 2026-08-15 16:29:06 -04:00
204 lines
5.7 KiB
Lua
204 lines
5.7 KiB
Lua
-- to-do
|
|
-- change to ItemsDatabase.setTier(UIitem) to UIitem:setTier()
|
|
ItemsDatabase = {}
|
|
|
|
ItemsDatabase.rarityColors = {
|
|
["yellow"] = TextColors.yellow,
|
|
["purple"] = TextColors.purple,
|
|
["blue"] = TextColors.blue,
|
|
["green"] = TextColors.green,
|
|
["grey"] = TextColors.grey,
|
|
}
|
|
|
|
local function getColorForValue(value)
|
|
if value >= 1000000 then
|
|
return "yellow"
|
|
elseif value >= 100000 then
|
|
return "purple"
|
|
elseif value >= 10000 then
|
|
return "blue"
|
|
elseif value >= 1000 then
|
|
return "green"
|
|
elseif value >= 50 then
|
|
return "grey"
|
|
else
|
|
return "white"
|
|
end
|
|
end
|
|
|
|
local function clipfunction(value)
|
|
if value >= 1000000 then
|
|
return "128 0 32 32"
|
|
elseif value >= 100000 then
|
|
return "96 0 32 32"
|
|
elseif value >= 10000 then
|
|
return "64 0 32 32"
|
|
elseif value >= 1000 then
|
|
return "32 0 32 32"
|
|
elseif value >= 50 then
|
|
return "0 0 32 32"
|
|
end
|
|
return ""
|
|
end
|
|
|
|
function ItemsDatabase.getClipAndImagePath(item)
|
|
if not item then
|
|
return nil, nil, nil
|
|
end
|
|
|
|
local frameOption = modules.client_options.getOption('framesRarity')
|
|
if frameOption == "none" then
|
|
return nil, nil, nil
|
|
end
|
|
local imagePath = '/images/ui/item'
|
|
local clip = nil
|
|
|
|
if type(item) == "number" then
|
|
item = g_things.getThingType(item, ThingCategoryItem)
|
|
end
|
|
|
|
if not item then
|
|
return nil, nil, nil
|
|
end
|
|
|
|
if item then
|
|
local price = type(item) == "number" and item or (item and item:getMeanPrice()) or 0
|
|
local itemRarity = getColorForValue(price)
|
|
if itemRarity then
|
|
clip = clipfunction(price)
|
|
if clip ~= "" then
|
|
if frameOption == "frames" then
|
|
imagePath = "/images/ui/rarity_frames"
|
|
elseif frameOption == "corners" then
|
|
imagePath = "/images/ui/containerslot-coloredges"
|
|
end
|
|
else
|
|
clip = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
local clipObject = nil
|
|
if clip then
|
|
local x, y, w, h = clip:match("(%d+) (%d+) (%d+) (%d+)")
|
|
clipObject = { x = tonumber(x), y = tonumber(y), width = tonumber(w), height = tonumber(h) }
|
|
end
|
|
|
|
return clip, imagePath, clipObject
|
|
end
|
|
|
|
function ItemsDatabase.setRarityItem(widget, item, style)
|
|
if not g_game.getFeature(GameColorizedLootValue) or not widget then
|
|
return
|
|
end
|
|
|
|
local clip, imagePath = ItemsDatabase.getClipAndImagePath(item)
|
|
|
|
if not imagePath then
|
|
-- no frame applies (empty slot or frames disabled): clear a frame left by a previous item,
|
|
-- but only if this widget is currently showing one, to avoid clobbering custom backgrounds
|
|
local currentSource = widget:getImageSource()
|
|
if currentSource == "/images/ui/rarity_frames" or currentSource == "/images/ui/containerslot-coloredges" then
|
|
widget:setImageClip(nil)
|
|
widget:setImageSource('/images/ui/item')
|
|
end
|
|
return
|
|
end
|
|
|
|
widget:setImageClip(clip)
|
|
widget:setImageSource(imagePath)
|
|
if style then
|
|
widget:setStyle(style)
|
|
end
|
|
end
|
|
|
|
function ItemsDatabase.getColorForRarity(rarity)
|
|
return ItemsDatabase.rarityColors[rarity] or TextColors.white
|
|
end
|
|
|
|
function ItemsDatabase.setColorLootMessage(text)
|
|
local function coloringLootName(match)
|
|
local id, itemName = match:match("(%d+)|(.+)")
|
|
if not id or not itemName then
|
|
-- If pattern doesn't match itemId|itemName format, return the original match with braces
|
|
return "{" .. match .. "}"
|
|
end
|
|
|
|
local itemId = tonumber(id)
|
|
if not itemId then
|
|
return itemName or match
|
|
end
|
|
|
|
local thingType = g_things.getThingType(itemId, ThingCategoryItem)
|
|
if not thingType then
|
|
return itemName
|
|
end
|
|
|
|
local itemInfo = thingType:getMeanPrice()
|
|
if itemInfo then
|
|
local color = ItemsDatabase.getColorForRarity(getColorForValue(itemInfo))
|
|
return "{" .. itemName .. ", " .. color .. "}"
|
|
else
|
|
return itemName
|
|
end
|
|
end
|
|
return text:gsub("{(.-)}", coloringLootName)
|
|
end
|
|
|
|
function ItemsDatabase.getTierClip(tier)
|
|
local xOffset = (math.min(math.max(tier, 1), 10) - 1) * 9
|
|
return {
|
|
x = xOffset,
|
|
y = 0,
|
|
width = 10,
|
|
height = 9
|
|
}
|
|
end
|
|
|
|
function ItemsDatabase.setTier(widget, item, isSmall)
|
|
if not g_game.getFeature(GameThingUpgradeClassification) or not widget or not widget.tier then
|
|
return
|
|
end
|
|
if isSmall == nil then
|
|
isSmall = true
|
|
end
|
|
local tier = type(item) == "number" and item or (item and item:getTier()) or 0
|
|
if tier <= 0 then
|
|
widget.tier:setVisible(false)
|
|
return
|
|
end
|
|
local config
|
|
if isSmall then
|
|
local normalizedTier = math.min(math.max(tier, 1), 10)
|
|
config = {
|
|
xOffset = (normalizedTier - 1) * 9,
|
|
width = 10,
|
|
height = 9,
|
|
size = "10 9",
|
|
source = '/images/inventory/tiers-strip'
|
|
}
|
|
else
|
|
local normalizedTier = math.min(math.max(tier, 1), 18)
|
|
local xOffset = (normalizedTier - 1) * 18 + 1
|
|
config = {
|
|
xOffset = xOffset,
|
|
width = 18,
|
|
height = 16,
|
|
size = "18 16",
|
|
source = '/images/inventory/tiers-strip-big'
|
|
}
|
|
end
|
|
|
|
widget.tier:setImageClip({
|
|
x = config.xOffset,
|
|
y = 0,
|
|
width = config.width,
|
|
height = config.height
|
|
})
|
|
widget.tier:setSize(config.size)
|
|
widget.tier:setImageSource(config.source)
|
|
widget.tier:setImageSize(config.size)
|
|
widget.tier:setVisible(true)
|
|
end
|
|
|
|
|