Removed EGUI in favor of UI Rework by Sota Added in GTR Optimized for higher res textures, over Zone Reality Remade and removed all files that conflicted from ZRR to save storage space.
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 |