947 lines
29 KiB
Plaintext
947 lines
29 KiB
Plaintext
|
bar_list = {
|
||
|
["condition_progess_bar"] = { min= {255,196,18,18,0}, mid= {255,255,255,118,0.5}, max= {255,107,207,119,1}, background= true},
|
||
|
["power_progess_bar"] = { def= GetARGB(255,86,196,209), background= true },
|
||
|
["uses_progess_bar"] = { def= GetARGB(255,255,255,255), background= false },
|
||
|
}
|
||
|
local lerp_color = utils_xml.lerp_color
|
||
|
local gc = game.translate_string
|
||
|
local string_find = string.find
|
||
|
utjan_xml = nil
|
||
|
|
||
|
base_init = utils_ui.UICellItem.InitControls
|
||
|
function utils_ui.UICellItem:InitControls(path, st)
|
||
|
self.disable_bar_og = self.disable_bar -- save original game setting for disabling bar in case user toggles bar visibility
|
||
|
base_init(self, path, st)
|
||
|
end
|
||
|
|
||
|
base_pbar = utils_ui.UICellItem.Add_ProgressBar
|
||
|
function utils_ui.UICellItem:Add_ProgressBar(xml, obj, sec, clsid)
|
||
|
local hide_non_equipped = settings.cond_text.hide_bar and not (self.path == "equipment:cont_equ")
|
||
|
local hide_on_magazine = settings.mag_info.hide_bar and magazine_binder and magazine_binder.is_magazine(sec)
|
||
|
if not IsItem("multiuse", sec) and (hide_non_equipped or hide_on_magazine) then
|
||
|
self.disable_bar = true
|
||
|
else
|
||
|
self.disable_bar = self.disable_bar_og
|
||
|
end
|
||
|
|
||
|
base_pbar(self, xml, obj, sec, clsid)
|
||
|
|
||
|
Add_Parts_Bars(self, xml, obj, sec, clsid)
|
||
|
|
||
|
Add_Mag_Icon_Text(self, xml, obj, sec, clsid)
|
||
|
|
||
|
Add_Condition_Text(self, xml, obj, sec, clsid)
|
||
|
end
|
||
|
|
||
|
base_counter = utils_ui.UICellItem.Add_Counter
|
||
|
function utils_ui.UICellItem:Add_Counter(xml, obj, sec)
|
||
|
base_counter(self, xml, obj, sec)
|
||
|
|
||
|
Add_Ammo_Short_Name_Text(self, xml, obj, sec)
|
||
|
|
||
|
Add_Money_Text(self, xml, obj, sec)
|
||
|
|
||
|
Add_Recipe_Icon_Text(self, xml, obj, sec)
|
||
|
|
||
|
Add_Weapon_Name(self, xml, obj, sec)
|
||
|
|
||
|
Add_Repair_Icon(self, xml, obj, sec)
|
||
|
end
|
||
|
|
||
|
base_reset = utils_ui.UICellItem.Reset
|
||
|
function utils_ui.UICellItem:Reset()
|
||
|
base_reset(self)
|
||
|
if (self.manual) then
|
||
|
if self.parts_indicators then
|
||
|
for k,v in pairs(self.parts_indicators) do
|
||
|
self.parts_indicators[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if self.cond_text then
|
||
|
self.cond_text:Show(false)
|
||
|
end
|
||
|
if self.cond_text_bg then
|
||
|
self.cond_text_bg:Show(false)
|
||
|
end
|
||
|
if self.wpn_name then
|
||
|
self.wpn_name:Show(false)
|
||
|
end
|
||
|
if self.gun_repair_icon then
|
||
|
self.gun_repair_icon:Show(false)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
valid_wpn_kinds = {
|
||
|
["w_rifle"] = true,
|
||
|
["w_smg"] = true,
|
||
|
["w_pistol"] = true,
|
||
|
["w_shotgun"] = true,
|
||
|
["w_sniper"] = true,
|
||
|
["w_explosive"] = true,
|
||
|
["w_melee"] = true,
|
||
|
}
|
||
|
|
||
|
grenade_classes = {
|
||
|
["G_F1"] = true,
|
||
|
["G_F1_S"] = true,
|
||
|
["G_RGD5_S"] = true,
|
||
|
}
|
||
|
|
||
|
main_slot_indexes = {
|
||
|
[2] = true,
|
||
|
[3] = true,
|
||
|
}
|
||
|
|
||
|
-- AlphaLion wpn name
|
||
|
function Add_Weapon_Name(self, xml, obj, sec)
|
||
|
if self.wpn_name then
|
||
|
self.wpn_name:Show(false)
|
||
|
end
|
||
|
|
||
|
if not settings.wpn_info.show_wpn_name then return end
|
||
|
|
||
|
local class = SYS_GetParam(0, sec, "class")
|
||
|
if not settings.wpn_info.show_grenade_name and grenade_classes[class] then return end
|
||
|
|
||
|
local kind = SYS_GetParam(0, sec, "kind")
|
||
|
if not valid_wpn_kinds[kind] then return end
|
||
|
|
||
|
if not settings.wpn_info.show_melee and kind == "w_melee" then return end
|
||
|
|
||
|
local wpn_name_short = SYS_GetParam(0, sec, "inv_name_short")
|
||
|
if not wpn_name_short then return end
|
||
|
|
||
|
local is_equipped = self.path == "equipment:cont_equ"
|
||
|
if settings.wpn_info.main_slots_only and is_equipped and not main_slot_indexes[self.indx] then return end
|
||
|
|
||
|
self.wpn_name = self.wpn_name or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
self.wpn_name:SetEllipsis(true)
|
||
|
|
||
|
local name = game.translate_string(wpn_name_short)
|
||
|
self.wpn_name:SetText(name)
|
||
|
self.wpn_name:AdjustHeightToText()
|
||
|
self.wpn_name:AdjustWidthToText()
|
||
|
|
||
|
local x_offset = self.bar and self.bar:IsShown() and self.bar:GetWndPos().x + self.bar:GetWidth() or 0
|
||
|
if self.parts_indicators then
|
||
|
for k,v in pairs(self.parts_indicators) do
|
||
|
local part_x_edge = self.parts_indicators[k]:IsShown() and self.parts_indicators[k]:GetWndPos().x + self.parts_indicators[k]:GetWidth() or 0
|
||
|
if part_x_edge > x_offset then
|
||
|
x_offset = part_x_edge
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if self.cond_text and self.cond_text:IsShown() then
|
||
|
local cond_text_x_edge = self.cond_text:GetWndPos().x + self.cond_text:GetWidth()
|
||
|
if cond_text_x_edge > x_offset then
|
||
|
x_offset = cond_text_x_edge
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local cell_h = self.cell:GetHeight()
|
||
|
local cell_w = self.cell:GetWidth()
|
||
|
|
||
|
if not is_equipped then
|
||
|
self.wpn_name:SetTextAlignment(1)
|
||
|
self.wpn_name:SetWndRect(Frect():set(0, 0, cell_w - (x_offset + 2),self.wpn_name:GetHeight() + 2))
|
||
|
self.wpn_name:SetWndPos(vector2():set(x_offset, cell_h - self.wpn_name:GetHeight()))
|
||
|
else
|
||
|
self.wpn_name:SetTextAlignment(2)
|
||
|
self.wpn_name:SetWndRect(Frect():set(0, 0, cell_w, self.wpn_name:GetHeight() + 2))
|
||
|
self.wpn_name:SetWndPos(vector2():set(0, 3))
|
||
|
end
|
||
|
|
||
|
self.wpn_name:Show(true)
|
||
|
end
|
||
|
|
||
|
function set_text_rect(ele, padding_w, padding_h, text)
|
||
|
if text then
|
||
|
ele:SetText(text)
|
||
|
end
|
||
|
ele:AdjustHeightToText()
|
||
|
ele:AdjustWidthToText()
|
||
|
local width = ele:GetWidth()
|
||
|
local height = ele:GetHeight()
|
||
|
ele:SetWndRect(Frect():set(0, 0, width + padding_w, height + padding_h))
|
||
|
end
|
||
|
|
||
|
-- MONEY TEXT
|
||
|
function Add_Money_Text(self, xml, obj, sec)
|
||
|
if self.money_text then
|
||
|
self.money_text:Show(false)
|
||
|
end
|
||
|
if self.money_text_bg then
|
||
|
self.money_text_bg:Show(false)
|
||
|
end
|
||
|
|
||
|
if not settings.money_text.enable then return end
|
||
|
|
||
|
local money_amount = IsItem("money", sec) or parse_list(ini_sys, sec, "money_value") -- money_value is used for Lootboxes cash stacks
|
||
|
if not (money_amount and money_amount[1]) then return end
|
||
|
|
||
|
local show_bg = not settings.money_text.hide_bg
|
||
|
if show_bg then
|
||
|
self.money_text_bg = self.money_text_bg or utjan_xml:InitStatic("background", self.cell)
|
||
|
end
|
||
|
self.money_text = self.money_text or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
|
||
|
local text
|
||
|
if money_amount[2] then
|
||
|
text = gc("ui_utjan_ruble") .. ((money_amount[1] + money_amount[2]) / 2) .. "~"
|
||
|
else
|
||
|
text = gc("ui_utjan_ruble") .. money_amount[1]
|
||
|
end
|
||
|
|
||
|
local text_padding_w = settings.money_text.padding + 1
|
||
|
local text_padding_h = settings.money_text.padding
|
||
|
set_text_rect(self.money_text, text_padding_w, text_padding_h, text)
|
||
|
local text_height = self.money_text:GetHeight()
|
||
|
local cell_h = self.cell:GetHeight()
|
||
|
|
||
|
self.money_text:SetWndPos( vector2():set( 0 , cell_h - text_height) )
|
||
|
|
||
|
if show_bg then
|
||
|
self.money_text_bg:SetWndRect(Frect():set(0, 0, self.money_text:GetWidth(), self.money_text:GetHeight()))
|
||
|
self.money_text_bg:SetWndPos( self.money_text:GetWndPos() )
|
||
|
self.money_text_bg:Show(true)
|
||
|
end
|
||
|
|
||
|
self.money_text:Show(true)
|
||
|
end
|
||
|
-- MONEY TEXT END
|
||
|
|
||
|
-- ADD CONDITION TEXT
|
||
|
arty_table = {
|
||
|
["i_arty_junk"] = true,
|
||
|
["i_arty"] = true,
|
||
|
["i_arty_cont"] = true,
|
||
|
}
|
||
|
|
||
|
function Add_Condition_Text(self, xml, obj, sec, clsid)
|
||
|
if self.cond_text then
|
||
|
self.cond_text:Show(false)
|
||
|
end
|
||
|
if self.cond_text_bg then
|
||
|
self.cond_text_bg:Show(false)
|
||
|
end
|
||
|
|
||
|
if not settings.cond_text.enable then return end
|
||
|
|
||
|
if self.disable_bar_og then return end -- dont show condition when the vanilla scripts hide the condition bar
|
||
|
|
||
|
local is_equipped = self.path == "equipment:cont_equ"
|
||
|
if not settings.cond_text.enable_equipped and is_equipped then return end
|
||
|
if IsItem("multiuse",sec) then return end
|
||
|
|
||
|
local has_cond = utils_item.is_degradable(obj, sec) or IsWeapon(nil,clsid) or IsOutfit(nil,clsid) or IsHeadgear(nil,clsid)
|
||
|
if (not has_cond) then return end
|
||
|
|
||
|
if magazine_binder and magazine_binder.is_magazine(sec) then return end
|
||
|
|
||
|
local show_bg = not settings.cond_text.hide_bg
|
||
|
if show_bg and not is_equipped then
|
||
|
self.cond_text_bg = self.cond_text_bg or utjan_xml:InitStatic("background", self.cell)
|
||
|
end
|
||
|
|
||
|
self.cond_text = self.cond_text or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
|
||
|
local cond = obj:condition()
|
||
|
local str = SYS_GetParam(0,sec, "condition_bar","condition_progess_bar")
|
||
|
local props = bar_list[str]
|
||
|
local color = props.def or lerp_color( cond , props.min , props.mid , props.max )
|
||
|
if color then
|
||
|
self.cond_text:SetTextColor( color )
|
||
|
end
|
||
|
|
||
|
local text = math.ceil(cond * 100) .. "%"
|
||
|
local text_padding_w = is_equipped and 0 or settings.cond_text.padding + 1
|
||
|
local text_padding_h = is_equipped and 0 or settings.cond_text.padding
|
||
|
set_text_rect(self.cond_text, text_padding_w, text_padding_h, text)
|
||
|
|
||
|
local text_height = self.cond_text:GetHeight()
|
||
|
local kind = SYS_GetParam(0, sec, "kind", "na")
|
||
|
|
||
|
if arty_table[kind] then
|
||
|
local alt_artefact_pos = settings.cond_text.alt_artefact_pos
|
||
|
if alt_artefact_pos == 0 then
|
||
|
self.cond_text:SetWndPos( vector2():set( 0 , self.cell:GetHeight() - text_height) )
|
||
|
elseif alt_artefact_pos == 1 then
|
||
|
self.cond_text:SetWndPos( vector2():set( self.cell:GetWidth() - self.cond_text:GetWidth() , self.cell:GetHeight() - text_height) )
|
||
|
elseif alt_artefact_pos == 2 then
|
||
|
self.cond_text:SetWndPos( vector2():set( self.cell:GetWidth() - self.cond_text:GetWidth() , 0) )
|
||
|
end
|
||
|
elseif is_equipped and settings.cond_text.enable_equipped then
|
||
|
local pos_adjusted = false
|
||
|
local bar_pos = self.bar and self.bar:IsShown() and self.bar:GetWndPos()
|
||
|
if self.parts_indicators then -- Adjust position if part dots are shown
|
||
|
for k,v in pairs(self.parts_indicators) do
|
||
|
if self.parts_indicators[k]:IsShown() then
|
||
|
self.cond_text:SetWndPos( vector2():set( bar_pos.x , self.parts_indicators[k]:GetWndPos().y - text_height) )
|
||
|
pos_adjusted = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if not pos_adjusted then
|
||
|
self.cond_text:SetWndPos( vector2():set( bar_pos.x , bar_pos.y - text_height) )
|
||
|
end
|
||
|
elseif settings.part_dots.enable and (settings.part_dots.position == 1 or (settings.part_dots.position == 2 and is_short_gun(obj, clsid, sec))) then
|
||
|
local part_y = self.cell:GetHeight()
|
||
|
if self.parts_indicators then
|
||
|
for k,v in pairs(self.parts_indicators) do
|
||
|
if self.parts_indicators[k]:IsShown() then
|
||
|
part_y = self.parts_indicators[k]:GetWndPos().y
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.cond_text:SetWndPos( vector2():set( 0 , part_y - text_height) )
|
||
|
else
|
||
|
local bar_h = self.bar and self.bar:IsShown() and self.bar:GetHeight() or 0
|
||
|
self.cond_text:SetWndPos( vector2():set( 0 , self.cell:GetHeight() - bar_h - text_height) )
|
||
|
end
|
||
|
|
||
|
if show_bg and not is_equipped then
|
||
|
self.cond_text_bg:SetWndRect(Frect():set(0, 0, self.cond_text:GetWidth(), self.cond_text:GetHeight()))
|
||
|
self.cond_text_bg:SetWndPos( self.cond_text:GetWndPos() )
|
||
|
self.cond_text_bg:Show(true)
|
||
|
end
|
||
|
|
||
|
self.cond_text:Show(true)
|
||
|
end
|
||
|
-- END ADD CONDITION TEXT
|
||
|
|
||
|
-- ADD PART CONDITION BARS
|
||
|
function is_short_gun(obj, clsid, sec)
|
||
|
if IsWeapon(obj, clsid) and SYS_GetParam(2, sec, "inv_grid_width") == 2 then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- WPO colors
|
||
|
clr_r = GetARGB(255,196,18,18)
|
||
|
clr_o = utils_xml.get_color("d_orange", true)
|
||
|
clr_y = GetARGB(255,255,255,118)
|
||
|
clr_g = GetARGB(255,107,207,119)
|
||
|
clr_missing = GetARGB(255,70,60,60) -- Missing part color
|
||
|
|
||
|
local ini_parts = itms_manager.ini_parts
|
||
|
function has_parts(obj)
|
||
|
if not obj then return end
|
||
|
local sec = SYS_GetParam(0, obj:section(), "parent_section") or obj:section()
|
||
|
local parts = ini_parts:r_string_ex("con_parts_list", sec)
|
||
|
return parts ~= nil
|
||
|
end
|
||
|
|
||
|
function Add_Parts_Bars(self, xml, obj, sec, clsid)
|
||
|
if self.parts_indicators then
|
||
|
for k,v in pairs(self.parts_indicators) do
|
||
|
self.parts_indicators[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not settings.part_dots.enable then return end
|
||
|
if not has_parts(obj) then return end
|
||
|
|
||
|
local is_equipped = self.path == "equipment:cont_equ"
|
||
|
if not settings.part_dots.show_on_equipped and is_equipped then return end
|
||
|
|
||
|
if not settings.part_dots.show_on_wpn and IsWeapon(nil, clsid) then return end
|
||
|
if not settings.part_dots.show_on_armor and (IsHeadgear(nil, clsid) or IsOutfit(nil, clsid)) then return end
|
||
|
|
||
|
local se_parts = item_parts.get_parts_con(obj, nil, true)
|
||
|
if is_empty(se_parts) then return end
|
||
|
local parts = dup_table(se_parts)
|
||
|
|
||
|
self.parts_indicators = self.parts_indicators or {}
|
||
|
|
||
|
for part, v in pairs(parts) do
|
||
|
if SYS_GetParam(1, part, "cond_part") then
|
||
|
self.parts_indicators[part] = self.parts_indicators[part] or utjan_xml:InitStatic("cond_dot", self.cell)
|
||
|
else
|
||
|
parts[part] = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Added by Sota
|
||
|
local ratio = utils_xml.screen_ratio()
|
||
|
|
||
|
local bar_shown = self.bar and self.bar:IsShown()
|
||
|
local bar_h = bar_shown and self.bar:GetHeight() or 0
|
||
|
local bar_w = bar_shown and self.bar:GetWidth() or 0
|
||
|
local props = bar_list.condition_progess_bar
|
||
|
local i = 0
|
||
|
for part, condition in spairs(parts, parts_sort) do
|
||
|
local bar_pos = bar_shown and self.bar:GetWndPos()
|
||
|
local cond_dot_h = 4 --self.parts_indicators[part]:GetHeight()
|
||
|
-- Edited by Sota
|
||
|
--local cond_dot_w = cond_dot_h * 0.75
|
||
|
local cond_dot_w = cond_dot_h * ratio
|
||
|
|
||
|
cond_dot_h = cond_dot_h * settings.part_dots.size_mult
|
||
|
cond_dot_w = cond_dot_w * settings.part_dots.size_mult
|
||
|
local cond_text_w = self.cond_text and self.cond_text:GetWidth() or 0
|
||
|
local separator_width = settings.part_dots.separator_width
|
||
|
|
||
|
self.parts_indicators[part]:SetWndRect( Frect():set(0, 0, cond_dot_w, cond_dot_h) )
|
||
|
|
||
|
if is_equipped then
|
||
|
self.parts_indicators[part]:SetWndPos( vector2():set( bar_pos.x + (cond_dot_w + separator_width) * i, bar_pos.y - cond_dot_h * 1.5))
|
||
|
else
|
||
|
if settings.part_dots.position == 1 or (settings.part_dots.position == 2 and is_short_gun(obj, clsid, sec)) then
|
||
|
if bar_shown then
|
||
|
self.parts_indicators[part]:SetWndPos( vector2():set( (cond_dot_w + separator_width) * i, self.cell:GetHeight() - bar_h - cond_dot_h * 1.5))
|
||
|
else
|
||
|
self.parts_indicators[part]:SetWndPos( vector2():set( 1 + (cond_dot_w + separator_width) * i, self.cell:GetHeight() - cond_dot_h * 1.5))
|
||
|
end
|
||
|
else
|
||
|
if bar_shown then
|
||
|
self.parts_indicators[part]:SetWndPos( vector2():set( bar_w + 1 + (cond_dot_w + separator_width) * i, self.cell:GetHeight() - cond_dot_h * 1.5))
|
||
|
else
|
||
|
self.parts_indicators[part]:SetWndPos( vector2():set( cond_text_w + 1 + (cond_dot_w + separator_width) * i, self.cell:GetHeight() - cond_dot_h * 1.5))
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local color
|
||
|
if settings.part_dots.wpo_mode and IsWeapon(nil, clsid) then -- Weapon Parts Overhaul Colors
|
||
|
color = clr_missing
|
||
|
if condition >= settings.part_dots.wpo_green then color = clr_g
|
||
|
elseif condition >= settings.part_dots.wpo_yellow then color = clr_y
|
||
|
elseif condition >= settings.part_dots.wpo_orange then color = clr_o
|
||
|
elseif condition > -1 then color = clr_r end
|
||
|
else
|
||
|
if condition >= 0 then
|
||
|
local cond = clamp(condition / 99, 0, 1)
|
||
|
color = props.def or lerp_color( cond , props.min , props.mid , props.max )
|
||
|
else
|
||
|
color = clr_missing
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if color then
|
||
|
self.parts_indicators[part]:SetTextureColor( color )
|
||
|
end
|
||
|
self.parts_indicators[part]:Show(true)
|
||
|
|
||
|
i = i + 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
unique_mapping = {
|
||
|
["prt_w_gas_tube_9"] = "extractor",
|
||
|
["prt_w_gas_tube_10"] = "extractor",
|
||
|
["prt_w_gas_tube_8"] = "ejector",
|
||
|
["prt_w_gas_tube_2"] = "pump",
|
||
|
["prt_w_bolt_11"] = "hammers",
|
||
|
["prt_w_bolt_12"] = "hammers",
|
||
|
["prt_w_bolt_carrier_8"] = "chock",
|
||
|
["prt_w_bolt_carrier_9"] = "chock",
|
||
|
}
|
||
|
|
||
|
name_mapping = {
|
||
|
["barrel"] = 1,
|
||
|
["trigger"] = 2,
|
||
|
["bolt"] = 3,
|
||
|
["bolt_carrier"] = 4,
|
||
|
["chock"] = 5,
|
||
|
["ejector"] = 6,
|
||
|
["extractor"] = 7,
|
||
|
["gas_tube"] = 8,
|
||
|
["hammers"] = 9,
|
||
|
["pump"] = 10,
|
||
|
["spring"] = 11,
|
||
|
}
|
||
|
|
||
|
function parts_sort(t, a, b)
|
||
|
if not (a and b) then return false end
|
||
|
|
||
|
local a_map
|
||
|
if unique_mapping[a] then
|
||
|
a_map = name_mapping[unique_mapping[a]]
|
||
|
else
|
||
|
for k,v in pairs(name_mapping) do
|
||
|
if string_find(a, k) then
|
||
|
a_map = v
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local b_map
|
||
|
if unique_mapping[b] then
|
||
|
b_map = name_mapping[unique_mapping[b]]
|
||
|
else
|
||
|
for k,v in pairs(name_mapping) do
|
||
|
if string_find(b, k) then
|
||
|
b_map = v
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if not (a_map and b_map) then return false end
|
||
|
return a_map < b_map
|
||
|
end
|
||
|
-- ADD PART CONDITION BARS END
|
||
|
|
||
|
-- ADD AMMO ITEM SHORT NAME TEXT
|
||
|
valid_ammo_class = {
|
||
|
["AMMO"] = true,
|
||
|
["AMMO_S"] = true,
|
||
|
}
|
||
|
|
||
|
valid_exlosive_ammo = {
|
||
|
["S_M209"] = true,
|
||
|
["S_VOG25"] = true,
|
||
|
["S_OG7B"] = true,
|
||
|
}
|
||
|
|
||
|
function Add_Ammo_Short_Name_Text(self, xml, obj, sec)
|
||
|
if self.ammo_name_bg then
|
||
|
for k,v in pairs(self.ammo_name_bg)do
|
||
|
self.ammo_name_bg[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
if self.ammo_name then
|
||
|
for k,v in pairs(self.ammo_name)do
|
||
|
self.ammo_name[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local class = SYS_GetParam(0, sec, "class")
|
||
|
if not (valid_ammo_class[class] or valid_exlosive_ammo[class]) then return end
|
||
|
if not settings.ammo_name.enable and valid_ammo_class[class] then return end
|
||
|
if not settings.ammo_name.show_expl and valid_exlosive_ammo[class] then return end
|
||
|
|
||
|
local is_component = SYS_GetParam(1, sec, "is_component")
|
||
|
if is_component then return end -- Ammo maker compat
|
||
|
|
||
|
local ammo_name_short = SYS_GetParam(0, sec, "inv_name_short")
|
||
|
if not ammo_name_short then return end
|
||
|
|
||
|
self.ammo_name = {}
|
||
|
self.ammo_name_bg = {}
|
||
|
|
||
|
local gc_name = gc(ammo_name_short)
|
||
|
local i = 1
|
||
|
local name_cutoff = ""
|
||
|
|
||
|
while i > 0 do
|
||
|
self.ammo_name_bg[i] = self.ammo_name_bg[i] or utjan_xml:InitStatic("background", self.cell)
|
||
|
self.ammo_name[i] = self.ammo_name[i] or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
|
||
|
local text_padding = settings.ammo_name.padding
|
||
|
set_text_rect(self.ammo_name[i], text_padding, text_padding, gc_name)
|
||
|
|
||
|
local incr_i = false
|
||
|
while (self.ammo_name[i]:GetWidth() > self.cell:GetWidth()) do
|
||
|
local str_table = str_explode(gc_name, " ")
|
||
|
if #str_table == 1 then
|
||
|
break
|
||
|
end
|
||
|
|
||
|
if name_cutoff == "" then
|
||
|
name_cutoff = str_table[1]
|
||
|
else
|
||
|
name_cutoff = name_cutoff .. " " .. str_table[1]
|
||
|
end
|
||
|
|
||
|
gc_name = ""
|
||
|
for i = 2, #str_table do
|
||
|
gc_name = gc_name .. str_table[i]
|
||
|
if #str_table > i then
|
||
|
gc_name = gc_name .. " "
|
||
|
end
|
||
|
end
|
||
|
|
||
|
set_text_rect(self.ammo_name[i], text_padding, text_padding, gc_name)
|
||
|
incr_i = true
|
||
|
end
|
||
|
|
||
|
local name_h = self.ammo_name[i]:GetHeight()
|
||
|
local name_w = self.ammo_name[i]:GetWidth()
|
||
|
|
||
|
self.ammo_name[i]:SetWndPos( vector2():set( 0 , self.H - (name_h * i)) )
|
||
|
-- Edited by Sota
|
||
|
--local bg_padding = name_w * 0.08
|
||
|
local bg_padding = name_w * 0.025
|
||
|
|
||
|
self.ammo_name_bg[i]:SetWndRect(Frect():set(0, 0, name_w + (bg_padding * 2), name_h))
|
||
|
local name_pos = self.ammo_name[i]:GetWndPos()
|
||
|
self.ammo_name_bg[i]:SetWndPos( vector2():set(name_pos.x - bg_padding , name_pos.y ) )
|
||
|
|
||
|
if valid_ammo_class[class] and settings.ammo_name.bad_color or
|
||
|
valid_exlosive_ammo[class] and settings.ammo_name.expl_bad_color then
|
||
|
if string.find(sec, "_verybad") then
|
||
|
self.ammo_name[i]:SetTextColor( clr_r )
|
||
|
elseif string.find(sec, "_bad") then
|
||
|
self.ammo_name[i]:SetTextColor( clr_o )
|
||
|
else
|
||
|
self.ammo_name[i]:SetTextColor( clr_g )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Check if ammo icon is dimmed in crafting list
|
||
|
local craft_gui = ui_workshop.GUI and ui_workshop.GUI:IsShown() and ui_workshop.GUI.dlg_craft
|
||
|
if craft_gui then
|
||
|
local menu = craft_gui.list_menu:GetSelectedItem()
|
||
|
local last_type = menu and menu.idx
|
||
|
local r = last_type and craft_gui.recipes[last_type] or {}
|
||
|
local rsp_sec
|
||
|
for k,v in pairs(r) do
|
||
|
if r[k].sec == sec then
|
||
|
rsp_sec = r[k].rsp
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if rsp_sec and not craft_gui.recipes_items[rsp_sec] then
|
||
|
local txt_clr = self.ammo_name[i]:GetTextColor()
|
||
|
self.ammo_name[i]:SetTextColor( change_alpha(txt_clr, 140) )
|
||
|
local bg_clr = self.ammo_name_bg[i]:GetTextureColor()
|
||
|
self.ammo_name_bg[i]:SetTextureColor( change_alpha(bg_clr, 140) )
|
||
|
end
|
||
|
end
|
||
|
|
||
|
self.ammo_name_bg[i]:Show(true)
|
||
|
self.ammo_name[i]:Show(true)
|
||
|
|
||
|
if incr_i then
|
||
|
i = i + 1
|
||
|
gc_name = name_cutoff
|
||
|
name_cutoff = ""
|
||
|
else
|
||
|
i = 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function change_alpha(clr, a)
|
||
|
if not clr and a ~= nil then return end
|
||
|
|
||
|
local b = bit.band(clr, 255)
|
||
|
local g = bit.band(bit.rshift(clr, 8), 255)
|
||
|
local r = bit.band(bit.rshift(clr, 16), 255)
|
||
|
|
||
|
return GetARGB(a, r, g, b)
|
||
|
end
|
||
|
-- ADD AMMO ITEM SHORT NAME TEXT END
|
||
|
|
||
|
-- ADD RECIPE READ/UNREAD TEXT
|
||
|
one_use_recipes = {
|
||
|
recipe_cooking_1 = true,
|
||
|
}
|
||
|
|
||
|
workshop_autoinject_known_recipes = {}
|
||
|
|
||
|
functor_table_readable = {
|
||
|
["item_recipe.func_recipe"] = true,
|
||
|
["item_recipe.func_letter"] = true,
|
||
|
}
|
||
|
|
||
|
function Add_Recipe_Icon_Text(self, xml, obj, sec)
|
||
|
if self.recipe_text then
|
||
|
self.recipe_text:Show(false)
|
||
|
end
|
||
|
if self.recipe_text_bg then
|
||
|
self.recipe_text_bg:Show(false)
|
||
|
end
|
||
|
|
||
|
if not settings.recipe_text.enable then return end
|
||
|
if not sec then return end
|
||
|
|
||
|
local use_map = SYS_GetParam(0, sec, "use_map")
|
||
|
local functor = SYS_GetParam(0, sec, "use1_action_functor", "na")
|
||
|
local has_encyclopedia = functor_table_readable[functor]
|
||
|
local is_pda = functor == "ui_pda_npc_tab.use_view"
|
||
|
if not (has_encyclopedia or is_pda or use_map or one_use_recipes[sec]) then return end
|
||
|
|
||
|
if not settings.recipe_text.show_on_pda and is_pda then return end
|
||
|
|
||
|
local has_stash
|
||
|
if is_pda and obj then
|
||
|
local pda_info = se_load_var(obj:id(), obj:name(), "info")
|
||
|
if pda_info and pda_info.msg then
|
||
|
for k,v in pairs(pda_info.msg) do
|
||
|
if pda_info.msg[k].stash and not pda_info.msg[k].stash_read then
|
||
|
has_stash = true
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if is_pda and not has_stash then return end
|
||
|
|
||
|
local recipe_is_known
|
||
|
if use_map then
|
||
|
local maps = game_statistics.actor_anomaly_maps or {}
|
||
|
recipe_is_known = maps[use_map] or false
|
||
|
else
|
||
|
workshop_autoinject_known_recipes = workshop_autoinject and workshop_autoinject.known_recipe or workshop_autoinject_known_recipes
|
||
|
recipe_is_known = workshop_autoinject_known_recipes[sec] or ui_pda_encyclopedia_tab.is_unlocked_note("encyclopedia__notes_" .. sec)
|
||
|
end
|
||
|
|
||
|
self.recipe_text_bg = self.recipe_text_bg or utjan_xml:InitStatic("background", self.cell)
|
||
|
self.recipe_text = self.recipe_text or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
|
||
|
local text
|
||
|
if recipe_is_known then
|
||
|
text = gc("ui_utjan_recipe_read")
|
||
|
self.recipe_text:SetTextColor( GetARGB(255, 185, 162, 138))
|
||
|
elseif has_stash then
|
||
|
text = "(???)"
|
||
|
self.recipe_text:SetTextColor( GetARGB(255, 255, 232, 208))
|
||
|
else
|
||
|
text = gc("ui_utjan_recipe_unread")
|
||
|
self.recipe_text:SetTextColor( GetARGB(255, 255, 232, 208))
|
||
|
end
|
||
|
|
||
|
local text_padding = settings.recipe_text.padding
|
||
|
set_text_rect(self.recipe_text, text_padding + 1, text_padding, text)
|
||
|
|
||
|
local name_h = self.recipe_text:GetHeight()
|
||
|
local name_w = self.recipe_text:GetWidth()
|
||
|
if has_stash then
|
||
|
local bar_h = self.bar and self.bar:IsShown() and self.bar:GetHeight() or 0
|
||
|
local cond_text_h = self.cond_text and self.cond_text:IsShown() and self.cond_text:GetHeight() or 0
|
||
|
self.recipe_text:SetWndPos( vector2():set( 0 , self.H - bar_h - cond_text_h - name_h) )
|
||
|
else
|
||
|
self.recipe_text:SetWndPos( vector2():set( 0 , self.H - name_h) )
|
||
|
end
|
||
|
-- Edited by Sota
|
||
|
--local bg_padding = name_w * 0.08
|
||
|
local bg_padding = name_w * 0.025
|
||
|
|
||
|
self.recipe_text_bg:SetWndRect(Frect():set(0, 0, name_w + (bg_padding * 2), name_h))
|
||
|
local name_pos = self.recipe_text:GetWndPos()
|
||
|
self.recipe_text_bg:SetWndPos( vector2():set(name_pos.x - bg_padding , name_pos.y ) )
|
||
|
|
||
|
self.recipe_text_bg:Show(true)
|
||
|
self.recipe_text:Show(true)
|
||
|
end
|
||
|
|
||
|
if workshop_autoinject and not workshop_autoinject.known_recipe then
|
||
|
base_wai_load = workshop_autoinject.load_state
|
||
|
function workshop_autoinject.load_state(mdata)
|
||
|
base_wai_load(mdata)
|
||
|
workshop_autoinject_known_recipes = mdata.known_recipe or {}
|
||
|
end
|
||
|
end
|
||
|
-- ADD RECIPE READ/UNREAD TEXT END
|
||
|
|
||
|
-- ADD MAGS REDUX ITEM TEXT
|
||
|
function Add_Mag_Icon_Text(self, xml, obj, sec, clsid)
|
||
|
if not magazine_binder then return end
|
||
|
|
||
|
if self.mag_ammo_count then
|
||
|
self.mag_ammo_count:Show(false)
|
||
|
end
|
||
|
if self.mag_ammo_count_bg then
|
||
|
self.mag_ammo_count_bg:Show(false)
|
||
|
end
|
||
|
if self.mag_ammo_name_bg then
|
||
|
for k,v in pairs(self.mag_ammo_name_bg)do
|
||
|
self.mag_ammo_name_bg[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
if self.mag_ammo_name then
|
||
|
for k,v in pairs(self.mag_ammo_name)do
|
||
|
self.mag_ammo_name[k]:Show(false)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not settings.mag_info.enable then return end
|
||
|
if not magazine_binder.is_magazine(sec) then return end
|
||
|
if (not self.ID) or self.manual then return end
|
||
|
local mag_data = magazine_binder.get_data(self.ID)
|
||
|
if not mag_data then return end
|
||
|
|
||
|
if self.cond_text then
|
||
|
self.cond_text:Show(false)
|
||
|
end
|
||
|
if self.cond_text_bg then
|
||
|
self.cond_text_bg:Show(false)
|
||
|
end
|
||
|
|
||
|
local count_h
|
||
|
local bar_h = self.bar and self.bar:IsShown() and self.bar:GetHeight() or 0
|
||
|
|
||
|
if settings.mag_info.show_ammo_count then
|
||
|
self.mag_ammo_count_bg = self.mag_ammo_count_bg or utjan_xml:InitStatic("background", self.cell)
|
||
|
self.mag_ammo_count = self.mag_ammo_count or utjan_xml:InitTextWnd("condition_text", self.cell)
|
||
|
|
||
|
local mag_capacity = SYS_GetParam(2, sec, "max_mag_size")
|
||
|
local text = #mag_data.loaded .. "/" .. mag_capacity
|
||
|
local text_padding = settings.mag_info.padding
|
||
|
set_text_rect(self.mag_ammo_count, text_padding + 1, text_padding, text)
|
||
|
|
||
|
count_h = self.mag_ammo_count:GetHeight() + bar_h
|
||
|
local count_w = self.mag_ammo_count:GetWidth()
|
||
|
self.mag_ammo_count:SetWndPos( vector2():set( 0 , self.H - count_h) )
|
||
|
self.mag_ammo_count_bg:SetWndRect(Frect():set(0, 0, count_w, count_h))
|
||
|
self.mag_ammo_count_bg:SetWndPos( self.mag_ammo_count:GetWndPos() )
|
||
|
|
||
|
local props = bar_list["condition_progess_bar"]
|
||
|
local cond = #mag_data.loaded / mag_capacity
|
||
|
local color = props.def or lerp_color( cond , props.min , props.mid , props.max )
|
||
|
if color then
|
||
|
self.mag_ammo_count:SetTextColor( color )
|
||
|
end
|
||
|
|
||
|
self.mag_ammo_count_bg:Show(true)
|
||
|
self.mag_ammo_count:Show(true)
|
||
|
else
|
||
|
count_h = 0
|
||
|
end
|
||
|
|
||
|
if not settings.mag_info.show_ammo_name then return end
|
||
|
if not (#mag_data.loaded > 0) then return end
|
||
|
|
||
|
self.mag_ammo_name = {}
|
||
|
self.mag_ammo_name_bg = {}
|
||
|
|
||
|
local last_bullet_sec
|
||
|
for k,v in pairs(mag_data.loaded) do
|
||
|
last_bullet_sec = v
|
||
|
end
|
||
|
local inv_short_name = SYS_GetParam(0, last_bullet_sec, "inv_name_short", "Bullet?")
|
||
|
local gc_name = gc(inv_short_name)
|
||
|
|
||
|
local i = 1
|
||
|
local name_cutoff = ""
|
||
|
|
||
|
while i > 0 do
|
||
|
self.mag_ammo_name_bg[i] = self.mag_ammo_name_bg[i] or utjan_xml:InitStatic("background", self.cell)
|
||
|
self.mag_ammo_name[i] = self.mag_ammo_name[i] or utjan_xml:InitTextWnd("counter_text", self.cell)
|
||
|
|
||
|
local text_padding = settings.mag_info.padding
|
||
|
set_text_rect(self.mag_ammo_name[i], text_padding, text_padding, gc_name)
|
||
|
|
||
|
local incr_i = false
|
||
|
while (self.mag_ammo_name[i]:GetWidth() > self.cell:GetWidth()) do
|
||
|
local str_table = str_explode(gc_name, " ")
|
||
|
if #str_table == 1 then
|
||
|
break
|
||
|
end
|
||
|
|
||
|
if name_cutoff == "" then
|
||
|
name_cutoff = str_table[1]
|
||
|
else
|
||
|
name_cutoff = name_cutoff .. " " .. str_table[1]
|
||
|
end
|
||
|
|
||
|
gc_name = ""
|
||
|
for i = 2, #str_table do
|
||
|
gc_name = gc_name .. str_table[i]
|
||
|
if #str_table > i then
|
||
|
gc_name = gc_name .. " "
|
||
|
end
|
||
|
end
|
||
|
|
||
|
set_text_rect(self.mag_ammo_name[i], text_padding, text_padding, gc_name)
|
||
|
incr_i = true
|
||
|
end
|
||
|
|
||
|
local name_h = self.mag_ammo_name[i]:GetHeight()
|
||
|
local name_w = self.mag_ammo_name[i]:GetWidth()
|
||
|
|
||
|
self.mag_ammo_name[i]:SetWndPos( vector2():set( 0 , self.H - count_h - (name_h * i)) )
|
||
|
-- Edited by Sota
|
||
|
--local bg_padding = name_w * 0.08
|
||
|
local bg_padding = name_w * 0.025
|
||
|
|
||
|
self.mag_ammo_name_bg[i]:SetWndRect(Frect():set(0, 0, name_w + (bg_padding * 2), name_h))
|
||
|
local name_pos = self.mag_ammo_name[i]:GetWndPos()
|
||
|
self.mag_ammo_name_bg[i]:SetWndPos( vector2():set(name_pos.x - bg_padding , name_pos.y ) )
|
||
|
|
||
|
self.mag_ammo_name_bg[i]:Show(true)
|
||
|
self.mag_ammo_name[i]:Show(true)
|
||
|
|
||
|
if incr_i then
|
||
|
i = i + 1
|
||
|
gc_name = name_cutoff
|
||
|
name_cutoff = ""
|
||
|
else
|
||
|
i = 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
-- ADD MAGS REDUX ITEM TEXT END
|
||
|
|
||
|
function Add_Repair_Icon(self, xml, obj, sec)
|
||
|
if self.gun_repair_icon then
|
||
|
self.gun_repair_icon:Show(false)
|
||
|
end
|
||
|
|
||
|
if not settings.wpn_info.show_gun_repair_type then return end
|
||
|
|
||
|
local repair_type = SYS_GetParam(0, sec, "repair_type")
|
||
|
if not repair_type then return end
|
||
|
|
||
|
local icon_texture = repair_type_texture_tbl[repair_type]
|
||
|
if not icon_texture then return end
|
||
|
|
||
|
local is_equipped = self.path == "equipment:cont_equ"
|
||
|
|
||
|
self.gun_repair_icon = self.gun_repair_icon or utjan_xml:InitStatic("gun_repair_icon", self.cell)
|
||
|
self.gun_repair_icon:InitTexture(icon_texture)
|
||
|
local y_offset = (not is_equipped) and self.wpn_name and self.wpn_name:IsShown() and self.wpn_name:GetHeight() or 2
|
||
|
local x_offset = is_equipped and -4 or -1
|
||
|
self.gun_repair_icon:SetWndPos(vector2():set(self.cell:GetWidth() - self.gun_repair_icon:GetWidth() + x_offset, self.cell:GetHeight() - self.gun_repair_icon:GetHeight() - y_offset))
|
||
|
self.gun_repair_icon:Show(true)
|
||
|
end
|
||
|
|
||
|
repair_type_texture_tbl = {
|
||
|
pistol = "ui_dyn_eq_repair_blue",
|
||
|
shotgun = "ui_dyn_eq_repair_green",
|
||
|
rifle_5 = "ui_dyn_eq_repair_red",
|
||
|
rifle_7 = "ui_dyn_eq_repair_yellow",
|
||
|
}
|
||
|
|
||
|
-- MCM
|
||
|
function load_defaults()
|
||
|
local t = {}
|
||
|
local op = item_icon_info_mcm.op
|
||
|
for i, v in ipairs(op.gr) do
|
||
|
if v.gr then
|
||
|
t[v.id] = {}
|
||
|
for ii, vv in ipairs(v.gr) do
|
||
|
if vv.def ~= nil then
|
||
|
t[v.id][vv.id] = vv.def
|
||
|
end
|
||
|
end
|
||
|
elseif v.def ~= nil then
|
||
|
t[v.id] = v.def
|
||
|
end
|
||
|
end
|
||
|
return t
|
||
|
end
|
||
|
|
||
|
settings = load_defaults()
|
||
|
|
||
|
function load_settings()
|
||
|
settings = load_defaults()
|
||
|
if ui_mcm then
|
||
|
for k, v in pairs(settings) do
|
||
|
if type(settings[k]) == "table" then
|
||
|
for kk, vv in pairs(settings[k]) do
|
||
|
settings[k][kk] = ui_mcm.get("item_icon_info/" .. k .. "/" .. kk)
|
||
|
end
|
||
|
else
|
||
|
settings[k] = ui_mcm.get("item_icon_info/" .. k)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return settings
|
||
|
end
|
||
|
|
||
|
function on_game_start()
|
||
|
RegisterScriptCallback("actor_on_first_update", load_settings)
|
||
|
RegisterScriptCallback("on_option_change", load_settings)
|
||
|
|
||
|
utjan_xml = CScriptXmlInit()
|
||
|
utjan_xml:ParseFile("ui_utjan_icon_info.xml")
|
||
|
end
|