---==================================================================================================================--- --- --- --- Original Author(s) : NLTP_ASHES --- --- Edited : N/A --- --- Date : 19/06/2023 --- --- License : Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) --- --- --- --- Script used to handle the UI for the Rangefinder. --- --- --- ---==================================================================================================================--- -- --------------------------------------------------------------------------------------------------------------------- -- Constants, global variables and imported functions -- --------------------------------------------------------------------------------------------------------------------- -- Imported functions local dbg_printf = western_goods_utils.dbg_printf -- Singleton GUI = nil -- instance, don't touch -- --------------------------------------------------------------------------------------------------------------------- -- General Functions -- --------------------------------------------------------------------------------------------------------------------- --- Function used to get the UI singleton for the UIRangefinder class. --- @return UIRangefinder function get_ui() if (not GUI) then GUI = UIRangefinder() end return GUI end -- --------------------------------------------------------------------------------------------------------------------- -- UI Class -- --------------------------------------------------------------------------------------------------------------------- class "UIRangefinder" (CUIScriptWnd) function UIRangefinder:__init() super() dbg_printf("[WG] UI Rangefinder | Constructing GUI...") self:Show(true) self:Enable(true) -- Build UI self.m_xml = CScriptXmlInit() self.m_xml:ParseFile("ui_western_goods_rangefinder.xml") self.m_xml:InitWindow("rangefinder", 0, self) self.m_los1 = self.m_xml:InitStatic("rangefinder:los1", self) self.m_los2 = self.m_xml:InitStatic("rangefinder:los2", self) self.m_los3 = self.m_xml:InitStatic("rangefinder:los3", self) self.m_hcd1 = self.m_xml:InitStatic("rangefinder:hcd1", self) self.m_hcd2 = self.m_xml:InitStatic("rangefinder:hcd2", self) self.m_hcd3 = self.m_xml:InitStatic("rangefinder:hcd3", self) self.m_reticule = self.m_xml:InitStatic("rangefinder:reticule", self) -- Sound effects self.m_sfx_btn = sound_object([[western_goods_tech\rangefinder_btn]]) -- Build variables self.m_hud_fov = nil self.m_update_timer = 0 self.m_update_freq = 222 self.m_night_vision = false self.m_valid_sections = { "wg_rangefinder" } -- Callbacks RegisterScriptCallback("actor_on_weapon_zoom_in", self) RegisterScriptCallback("actor_on_weapon_zoom_out", self) end function UIRangefinder:__finalize() GUI = nil end function UIRangefinder:Update() CUIScriptWnd.Update(self) local tg = time_global() if (tg < self.m_update_timer) then return else self.m_update_timer = tg + self.m_update_freq end -- Line Of Sight Distance local los1, los2, los3 = self:GetLOSTextures() -- Horizontal Compensation Distance Distance local hcd1, hcd2, hcd3 = self:GetHCDTextures() -- Reticule local ret = "rf_reticule" -- Night Vision local nv = self:GetNightVisionSuffix() self.m_los1:InitTextureEx(los1..nv, [[hud\p3d]]) self.m_los2:InitTextureEx(los2..nv, [[hud\p3d]]) self.m_los3:InitTextureEx(los3..nv, [[hud\p3d]]) self.m_hcd1:InitTextureEx(hcd1..nv, [[hud\p3d]]) self.m_hcd2:InitTextureEx(hcd2..nv, [[hud\p3d]]) self.m_hcd3:InitTextureEx(hcd3..nv, [[hud\p3d]]) self.m_reticule:InitTextureEx(ret..nv, [[hud\p3d]]) end function UIRangefinder:GetNightVisionSuffix() return self.m_night_vision and "_g" or "_r" end function UIRangefinder:GetLOSTextures() local los = math.floor(level.get_target_dist()) -- Get LOS number as a 3 char string (5 -> "005") local s_los = western_goods_utils.as_string(los, 3) -- Max range at 999m if los > 999 then return "rf_dash", "rf_dash", "rf_dash" end -- Line Of Sight format local los1 = strformat("rf_num_%s", s_los:sub(1, 1)) local los2 = strformat("rf_num_%s", s_los:sub(2, 2)) local los3 = strformat("rf_num_%s", s_los:sub(3, 3)) return los1, los2, los3 end function UIRangefinder:GetHCDTextures() local los_pos = vector():mad(device().cam_pos, device().cam_dir, level.get_target_dist()) local hcd_pos = vector():set(los_pos.x, db.actor:position().y , los_pos.z) local hcd = math.floor(western_goods_utils.get_distance(device().cam_pos, hcd_pos)) -- Get HCD number as a 3 char string (5 -> "005") local s_hcd = western_goods_utils.as_string(hcd, 3) -- Max range at 999m if hcd > 999 then return "rf_dash", "rf_dash", "rf_dash" end -- Horizontal Compensation Distance format local hcd1 = strformat("rf_num_%s", s_hcd:sub(1, 1)) local hcd2 = strformat("rf_num_%s", s_hcd:sub(2, 2)) local hcd3 = strformat("rf_num_%s", s_hcd:sub(3, 3)) return hcd1, hcd2, hcd3 end function UIRangefinder:actor_on_weapon_zoom_in(wpn) if not western_goods_utils.table_contains(self.m_valid_sections, wpn:section()) then return end local old_hud_fov = ui_options.get("video/basic/hud_fov") local new_hud_fov = ini_sys:r_float_ex(wpn:section(),"scope_hud_fov") exec_console_cmd("hud_fov ".. new_hud_fov) self.m_hud_fov = old_hud_fov RegisterScriptCallback("on_key_press", self) dbg_printf("[WG] UI Rangefinder | Changed 'hud_fov' from '%s' to '%s'", old_hud_fov, new_hud_fov) end function UIRangefinder:actor_on_weapon_zoom_out(wpn) if not western_goods_utils.table_contains(self.m_valid_sections, wpn:section()) then return end local old_hud_fov = ui_options.get("video/basic/hud_fov") local new_hud_fov = self.m_hud_fov exec_console_cmd("hud_fov " .. new_hud_fov) self.m_hud_fov = nil UnregisterScriptCallback("on_key_press", self) dbg_printf("[WG] UI Rangefinder | Restored 'hud_fov' from '%s' to '%s'", old_hud_fov, new_hud_fov) end function UIRangefinder:on_key_press(dik) if dik ~= western_goods_mcm.get_config("rangefinder_nv") then return end local active_item = db.actor:active_item() if not active_item or not western_goods_utils.table_contains(self.m_valid_sections, active_item:section()) then return end GUI.m_night_vision = not GUI.m_night_vision GUI.m_sfx_btn:play(db.actor, 0, sound_object.s2d) end