diff --git a/reframework/autorun/MHR_Overlay.lua b/reframework/autorun/MHR_Overlay.lua index accce88..db44326 100644 --- a/reframework/autorun/MHR_Overlay.lua +++ b/reframework/autorun/MHR_Overlay.lua @@ -107,6 +107,7 @@ end, function() player.update_myself_position(); quest_status.update_is_online(); + if quest_status.index < 2 then quest_status.update_is_training_area(); diff --git a/reframework/autorun/MHR_Overlay/Misc/config.lua b/reframework/autorun/MHR_Overlay/Misc/config.lua index 4386c97..fcca7de 100644 --- a/reframework/autorun/MHR_Overlay/Misc/config.lua +++ b/reframework/autorun/MHR_Overlay/Misc/config.lua @@ -10,7 +10,7 @@ config.default_config = {}; function config.init() config.default_config = { global_settings = { - language = "en-us", + language = "default", performance = { max_monster_updates_per_tick = 2, @@ -40,8 +40,12 @@ function config.init() damage_meter_UI = true } }, + + menu_font = { + size = 17 + }, - font = { + UI_font = { family = "Consolas", size = 13, bold = true, @@ -53,6 +57,7 @@ function config.init() enabled = true, settings = { + hide_dead_or_captured = true, orientation = "Horizontal" }, @@ -114,7 +119,7 @@ function config.init() text_label = { visibility = false, - text = language.current_language.UI.HP, + text = "%s", offset = { x = -25, y = 12 @@ -195,7 +200,7 @@ function config.init() text_label = { visibility = true, - text = language.current_language.UI.stamina, + text = "%s", offset = { x = 15, y = 37 @@ -276,6 +281,7 @@ function config.init() enabled = true, settings = { + hide_dead_or_captured = true, max_distance = 300, opacity_falloff = true }, @@ -323,7 +329,7 @@ function config.init() text_label = { visibility = false, - text = language.current_language.UI.HP, + text = "%s", offset = { x = -25, y = 19 @@ -390,16 +396,32 @@ function config.init() width = 200, height = 20 }, - - colors = { + + normal_colors = { foreground = 0xB974A653, background = 0xB9000000, - capture ={ - foreground = 0xB9CCCC33, - background = 0x88000000 - } + }, + + capture_colors = { + foreground = 0xB9CCCC33, + background = 0x88000000 + }, + + capture_line = { + visibility = true, + offset = { + x = 0, + y = -3 + }, + + size = { + width = 2, + height = 8 + }, + + color = 0xB9000000 } - } + }, }, stamina = { @@ -407,7 +429,7 @@ function config.init() text_label = { visibility = true, - text = language.current_language.UI.stamina, + text = "%s", offset = { x = 15, y = 37 @@ -487,7 +509,7 @@ function config.init() text_label = { visibility = true, - text = language.current_language.UI.rage, + text = "%s", offset = { x = 15, y = 61 @@ -542,6 +564,26 @@ function config.init() color = 0xFF000000 } }, + + timer_label = { + visibility = true, + text = "%.0f:%02.0f", + + offset = { + x = 157, + y = 78 + }, + color = 0xFFFFFFFF, + + shadow = { + visibility = true, + offset = { + x = 1, + y = 1 + }, + color = 0xFF000000 + } + }, bar = { visibility = true, @@ -696,6 +738,7 @@ function config.init() }, settings = { + hide_dead_or_captured = true, orientation = "Horizontal" }, @@ -742,7 +785,7 @@ function config.init() text_label = { visibility = false, - text = language.current_language.UI.HP, + text = "%s", offset = { x = -25, y = 19 @@ -809,14 +852,30 @@ function config.init() width = 200, height = 20 }, - - colors = { + + normal_colors = { foreground = 0xB974A653, background = 0xB9000000, - capture ={ - foreground = 0xB9CCCC33, - background = 0x88000000 - } + }, + + capture_colors = { + foreground = 0xB9CCCC33, + background = 0x88000000 + }, + + capture_line = { + visibility = true, + offset = { + x = 0, + y = -3 + }, + + size = { + width = 2, + height = 8 + }, + + color = 0xB9000000 } } }, @@ -826,7 +885,7 @@ function config.init() text_label = { visibility = true, - text = language.current_language.UI.stamina, + text = "%s", offset = { x = 15, y = 37 @@ -906,7 +965,7 @@ function config.init() text_label = { visibility = true, - text = language.current_language.UI.rage, + text = "%s", offset = { x = 15, y = 61 @@ -961,6 +1020,26 @@ function config.init() color = 0xFF000000 } }, + + timer_label = { + visibility = true, + text = "%.0f:%02.0f", + + offset = { + x = 157, + y = 78 + }, + color = 0xFFFFFFFF, + + shadow = { + visibility = true, + offset = { + x = 1, + y = 1 + }, + color = 0xFF000000 + } + }, bar = { visibility = true, @@ -1259,7 +1338,7 @@ function config.init() total_damage_label = { visibility = true, - text = "Total Damage", + text = "%s", offset = { x = 5, y = 0 @@ -1361,7 +1440,7 @@ function config.init_module() config.init(); config.load(); - config.current_config.version = "v1.7"; + config.current_config.version = "v1.7.1"; language.update(table_helpers.find_index(language.language_names, config.current_config.global_settings.language, false)); diff --git a/reframework/autorun/MHR_Overlay/Misc/language.lua b/reframework/autorun/MHR_Overlay/Misc/language.lua index 58cd703..1dd6228 100644 --- a/reframework/autorun/MHR_Overlay/Misc/language.lua +++ b/reframework/autorun/MHR_Overlay/Misc/language.lua @@ -4,6 +4,7 @@ local table_helpers; language.language_folder = "MHR Overlay\\languages\\"; language.default_language = { + font_name = "NotoSansKR-Bold.otf", parts = { head = "Head", neck = "Neck", @@ -62,7 +63,9 @@ language.default_language = { rage = "Rage:", gold = "Gold", silver = "Silver", - mini = "Mini" + mini = "Mini", + total_damage = "Total Damage", + player = "Player" }, customization_menu = { @@ -89,9 +92,10 @@ language.default_language = { max_monster_updates_per_tick = "Max Monster Updates per Tick", prioritize_large_monsters = "Large Monsters on High Priority"; - font_notice = "Any changes to the font require script reload!", + UI_font_notice = "Any changes to the font require script reload!", - font = "Font", + menu_font = "Menu Font", + UI_font = "UI Font", family = "Family", size = "Size", bold = "Bold", @@ -109,6 +113,8 @@ language.default_language = { static_orientation = "Static Orientation", + hide_dead_or_captured = "Hide dead or captured", + opacity_falloff = "Opacity Falloff", max_distance = "Max Distance", world_offset = "World Offset", @@ -146,6 +152,8 @@ language.default_language = { foreground = "Foreground", background = "Background", + capture_line = "Capture Line", + dynamically_positioned = "Dynamically Positioned", statically_positioned = "Statically Positioned", @@ -168,6 +176,7 @@ language.default_language = { spacing = "Spacing", sorting = "Sorting", + timer_label = "Timer Label", part_name_label = "Part Name Label", time_label = "Time Label", @@ -190,7 +199,7 @@ language.default_language = { hide_total_if_total_damage_is_zero = "Hide Total if Total Damage is 0", total_damage_offset_is_relative = "Total Damage Offset is Relative", - higlighted_bar = "Highlighted Bar", + highlighted_bar = "Highlighted Bar", me = "Me", top_damage = "Top Damage", none = "None", @@ -234,26 +243,28 @@ function language.load() return; end - for i, language_file in ipairs(language_files) do - local language_name = language_file:gsub(language.language_folder, ""):gsub(".json", ""); + for i, language_file_name in ipairs(language_files) do + local language_name = language_file_name:gsub(language.language_folder, ""):gsub(".json", ""); - -- v will be something like `my-cool-mod\config-file-1.json`; - local loaded_language = json.load_file(language_file); + -- language_file will be something like `my-cool-mod\config-file-1.json`; + local loaded_language = json.load_file(language_file_name); if loaded_language ~= nil then log.info("[MHR Overlay] " .. language_name .. ".json loaded successfully"); table.insert(language.language_names, language_name); - table.insert(language.languages, loaded_language); + + local merged_language = table_helpers.merge(language.default_language, loaded_language); + table.insert(language.languages, merged_language); + + language.save(language_file_name, merged_language); + else log.error("[MHR Overlay] Failed to load " .. language_name .. ".json"); end end - - end -function language.save_default() - -- save current config to disk, replacing any existing file - local success = json.dump_file(language.language_folder .. "en-us.json", language.default_language); +function language.save(file_name, language_table) + local success = json.dump_file(file_name, language_table); if success then log.info('[MHR Overlay] en-us.json saved successfully'); else @@ -261,6 +272,10 @@ function language.save_default() end end +function language.save_default(); + language.save(language.language_folder .. "en-us.json", language.default_language) +end + function language.update(index) language.current_language = table_helpers.deep_copy(language.languages[index]); @@ -271,7 +286,6 @@ function language.init_module() language.save_default(); language.load(); language.current_language = table_helpers.deep_copy(language.default_language); - end return language; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua b/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua index 125167e..4ebc9ea 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua @@ -24,7 +24,11 @@ function large_monster.new(enemy) monster.max_health = 999999; monster.health_percentage = 0; monster.missing_health = 0; + monster.capture_health = 0; + monster.capture_percentage = 0; + + monster.dead_or_captured = false; monster.stamina = 0; monster.max_stamina = 1000; @@ -47,6 +51,7 @@ function large_monster.new(enemy) monster.game_object = nil monster.transform = nil monster.position = Vector3f.new(0, 0, 0); + monster.distance = 0; monster.name = "Large Monster"; monster.size = 1; @@ -150,6 +155,8 @@ function large_monster.init_static_UI(monster) config.current_config.large_monster_UI.static.health.percentage_label ); + monster.health_static_UI.bar.colors = config.current_config.large_monster_UI.static.health.bar.normal_colors; + monster.stamina_static_UI = stamina_UI_entity.new( config.current_config.large_monster_UI.static.stamina.visibility, config.current_config.large_monster_UI.static.stamina.bar, @@ -163,7 +170,8 @@ function large_monster.init_static_UI(monster) config.current_config.large_monster_UI.static.rage.bar, config.current_config.large_monster_UI.static.rage.text_label, config.current_config.large_monster_UI.static.rage.value_label, - config.current_config.large_monster_UI.static.rage.percentage_label + config.current_config.large_monster_UI.static.rage.percentage_label, + config.current_config.large_monster_UI.static.rage.timer_label ); for REpart, part in pairs(monster.parts) do @@ -182,6 +190,9 @@ function large_monster.init_dynamic_UI(monster) config.current_config.large_monster_UI.dynamic.health.percentage_label ); + monster.health_dynamic_UI.bar.colors = config.current_config.large_monster_UI.dynamic.health.bar.normal_colors; + + monster.stamina_dynamic_UI = stamina_UI_entity.new( config.current_config.large_monster_UI.dynamic.stamina.visibility, config.current_config.large_monster_UI.dynamic.stamina.bar, @@ -195,7 +206,8 @@ function large_monster.init_dynamic_UI(monster) config.current_config.large_monster_UI.dynamic.rage.bar, config.current_config.large_monster_UI.dynamic.rage.text_label, config.current_config.large_monster_UI.dynamic.rage.value_label, - config.current_config.large_monster_UI.dynamic.rage.percentage_label + config.current_config.large_monster_UI.dynamic.rage.percentage_label, + config.current_config.large_monster_UI.static.rage.timer_label ); for REpart, part in pairs(monster.parts) do @@ -207,6 +219,7 @@ local physical_param_field = enemy_character_base_type_def:get_field("k__BackingField") local stamina_param_field = enemy_character_base_type_def:get_field("k__BackingField") local anger_param_field = enemy_character_base_type_def:get_field("k__BackingField") +local check_die_method = enemy_character_base_type_def:get_method("checkDie"); local physical_param_type = physical_param_field:get_type(); local get_vital_method = physical_param_type:get_method("getVital") @@ -299,9 +312,14 @@ function large_monster.update(enemy) return; end - local health = get_current_method:call(vital_param) - local max_health = get_max_method:call(vital_param) - local capture_health = get_capture_hp_vital_method:call(physical_param) + local health = get_current_method:call(vital_param); + local max_health = get_max_method:call(vital_param); + local capture_health = get_capture_hp_vital_method:call(physical_param); + + local dead_or_captured = check_die_method:call(enemy); + if dead_or_captured == nil then + return; + end local stamina_param = stamina_param_field:get_data(enemy) if stamina_param == nil then @@ -309,23 +327,23 @@ function large_monster.update(enemy) return; end - local stamina = get_stamina_method:call(stamina_param) - local max_stamina = get_max_stamina_method:call(stamina_param) + local stamina = get_stamina_method:call(stamina_param); + local max_stamina = get_max_stamina_method:call(stamina_param); - local anger_param = anger_param_field:get_data(enemy) + local anger_param = anger_param_field:get_data(enemy); if anger_param == nil then customization_menu.status = "No anger param"; return; end - local is_in_rage = is_anger_method:call(anger_param) - local rage_point = get_anger_point_method:call(anger_param) - local rage_limit = get_limit_anger_method:call(anger_param) - local rage_timer = anger_param_get_timer_method:call(anger_param) - local rage_duration = get_timer_anger_method:call(anger_param) - local rage_count = get_count_anger_method:call(anger_param) + local is_in_rage = is_anger_method:call(anger_param); + local rage_point = get_anger_point_method:call(anger_param); + local rage_limit = get_limit_anger_method:call(anger_param); + local rage_timer = anger_param_get_timer_method:call(anger_param); + local rage_duration = get_timer_anger_method:call(anger_param); + local rage_count = get_count_anger_method:call(anger_param); - local vital_list = vital_list_field:get_data(physical_param) + local vital_list = vital_list_field:get_data(physical_param); if vital_list == nil then customization_menu.status = "No vital list"; return; @@ -349,7 +367,6 @@ function large_monster.update(enemy) return; end - local last_REpart = part_list:call("get_Item", part_list_count - 1); local last_REpart_health = 9999999; if last_REpart ~= nil then @@ -414,6 +431,16 @@ function large_monster.update(enemy) end end + if max_health ~= nil and capture_health ~= nil then + if max_health ~= 0 then + monster.capture_percentage = capture_health / max_health; + end + end + + if dead_or_captured ~= nil then + monster.dead_or_captured = dead_or_captured; + end + if stamina ~= nil then monster.stamina = stamina; end @@ -491,9 +518,17 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale) 100 * monster.big_border, 100 * monster.king_border); end + if monster.health < monster.capture_health then + monster.health_dynamic_UI.bar.colors = config.current_config.large_monster_UI.dynamic.health.bar.capture_colors; + else + monster.health_dynamic_UI.bar.colors = config.current_config.large_monster_UI.dynamic.health.bar.normal_colors; + end + drawing.draw_label(monster.dynamic_name_label, position_on_screen, opacity_scale, monster_name_text); health_UI_entity.draw(monster, monster.health_dynamic_UI, position_on_screen, opacity_scale); + drawing.draw_capture_line(monster.health_dynamic_UI.bar, position_on_screen, opacity_scale, monster.capture_percentage); + stamina_UI_entity.draw(monster, monster.stamina_dynamic_UI, position_on_screen, opacity_scale); rage_UI_entity.draw(monster, monster.rage_dynamic_UI, position_on_screen, opacity_scale); @@ -568,9 +603,18 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale) 100 * monster.big_border, 100 * monster.king_border); end + if monster.health < monster.capture_health then + monster.health_static_UI.bar.colors = config.current_config.large_monster_UI.static.health.bar.capture_colors; + else + monster.health_static_UI.bar.colors = config.current_config.large_monster_UI.static.health.bar.normal_colors; + end + drawing.draw_label(monster.static_name_label, position_on_screen, opacity_scale, monster_name_text); + health_UI_entity.draw(monster, monster.health_static_UI, position_on_screen, opacity_scale); + drawing.draw_capture_line(monster.health_static_UI.bar, position_on_screen, opacity_scale, monster.capture_percentage); + stamina_UI_entity.draw(monster, monster.stamina_static_UI, position_on_screen, opacity_scale); rage_UI_entity.draw(monster, monster.rage_static_UI, position_on_screen, opacity_scale); diff --git a/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua b/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua index 9f0d404..53a70af 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua @@ -74,7 +74,7 @@ function monster.update_monster(enemy) if is_large then large_monster.update_position(enemy); if not config.current_config.global_settings.performance.prioritize_large_monsters then - return + return; end else small_monster.update_position(enemy); @@ -101,16 +101,25 @@ function monster.update_monster(enemy) end end - updates_this_tick = updates_this_tick + 1; - last_update_tick = tick_count; - num_updated_monsters = num_updated_monsters + 1; - updated_monsters[enemy] = true; + -- actually update the enemy now. we don't do this very often -- due to how much CPU time it takes to update each monster. if is_large then + if not config.current_config.global_settings.performance.prioritize_large_monsters then + updates_this_tick = updates_this_tick + 1; + last_update_tick = tick_count; + num_updated_monsters = num_updated_monsters + 1; + updated_monsters[enemy] = true; + end + large_monster.update(enemy); else + updates_this_tick = updates_this_tick + 1; + last_update_tick = tick_count; + num_updated_monsters = num_updated_monsters + 1; + updated_monsters[enemy] = true; + small_monster.update(enemy); end end diff --git a/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua b/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua index ac1bd8f..8885f6c 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua @@ -28,6 +28,7 @@ function small_monster.new(enemy) monster.game_object = nil monster.transform = nil monster.position = Vector3f.new(0, 0, 0); + monster.distance = 0; monster.name = "Small Monster"; @@ -82,10 +83,11 @@ function small_monster.init_UI(monster) ); end -local enemy_character_base_type = sdk.find_type_definition("snow.enemy.EnemyCharacterBase") -local physical_param_field = enemy_character_base_type:get_field("k__BackingField"); -local status_param_field = enemy_character_base_type:get_field("k__BackingField") -local stamina_param_field = enemy_character_base_type:get_field("k__BackingField") +local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase") +local physical_param_field = enemy_character_base_type_def:get_field("k__BackingField"); +local status_param_field = enemy_character_base_type_def:get_field("k__BackingField") +local stamina_param_field = enemy_character_base_type_def:get_field("k__BackingField") +local check_die_method = enemy_character_base_type_def:get_method("checkDie"); local physical_param_type = physical_param_field:get_type() local get_vital_method = physical_param_type:get_method("getVital") @@ -181,6 +183,11 @@ function small_monster.update(enemy) local stamina = get_stamina_method:call(stamina_param) local max_stamina = get_max_stamina_method:call(stamina_param) + local dead_or_captured = check_die_method:call(enemy); + if dead_or_captured == nil then + return; + end + small_monster.update_position(enemy) local monster = small_monster.get_monster(enemy); @@ -204,6 +211,10 @@ function small_monster.update(enemy) end end + if dead_or_captured ~= nil then + monster.dead_or_captured = dead_or_captured; + end + if stamina ~= nil then monster.stamina = stamina; end diff --git a/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua b/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua index 65b4f2e..41413e8 100644 --- a/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua +++ b/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua @@ -6,6 +6,7 @@ local player; local quest_status; local screen; local drawing; +local language; damage_meter_UI.last_displayed_players = {}; damage_meter_UI.freeze_displayed_players = false; @@ -207,7 +208,7 @@ function damage_meter_UI.draw() position_on_screen = screen.calculate_absolute_coordinates(config.current_config.damage_meter_UI.position); end - drawing.draw_label(config.current_config.damage_meter_UI.total_damage_label, position_on_screen, 1); + drawing.draw_label(config.current_config.damage_meter_UI.total_damage_label, position_on_screen, 1, language.current_language.UI.total_damage); drawing.draw_label(config.current_config.damage_meter_UI.total_damage_value_label, position_on_screen, 1, player.total.display.total_damage); end @@ -220,6 +221,7 @@ function damage_meter_UI.init_module() quest_status = require("MHR_Overlay.Game_Handler.quest_status"); screen = require("MHR_Overlay.Game_Handler.screen"); drawing = require("MHR_Overlay.UI.drawing"); + language = require("MHR_Overlay.Misc.language"); end return damage_meter_UI; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua b/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua index 7d8b9ed..7a69adf 100644 --- a/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua +++ b/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua @@ -31,26 +31,36 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled) local enemy = get_boss_enemy_method:call(singletons.enemy_manager, i); if enemy == nil then customization_menu.status = "No enemy"; - break + goto continue; end local monster = large_monster.list[enemy]; if monster == nil then customization_menu.status = "No monster hp entry"; - break + goto continue; end table.insert(displayed_monsters, monster); + ::continue:: + end + + if dynamic_enabled or config.current_config.large_monster_UI.static.sorting.type == "Distance" then + for _, monster in ipairs(displayed_monsters) do + monster.distance = (player.myself_position - monster.position):length(); + end end if dynamic_enabled then local i = 0; for _, monster in ipairs(displayed_monsters) do - if config.current_config.large_monster_UI.dynamic.settings.max_distance == 0 then break; end + if monster.dead_or_captured and config.current_config.large_monster_UI.dynamic.settings.hide_dead_or_captured then + goto continue; + end + local position_on_screen = {}; local world_offset = Vector3f.new(config.current_config.large_monster_UI.dynamic.world_offset.x, config.current_config.large_monster_UI.dynamic.world_offset.y, config.current_config.large_monster_UI.dynamic.world_offset.z); @@ -65,13 +75,12 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled) position_on_screen.y = position_on_screen.y + config.current_config.large_monster_UI.dynamic.viewport_offset.y; local opacity_scale = 1; - local distance = (player.myself_position - monster.position):length(); - if distance > config.current_config.large_monster_UI.dynamic.settings.max_distance then + if monster.distance > config.current_config.large_monster_UI.dynamic.settings.max_distance then goto continue; end if config.current_config.large_monster_UI.dynamic.settings.opacity_falloff then - opacity_scale = 1 - (distance / config.current_config.large_monster_UI.dynamic.settings.max_distance); + opacity_scale = 1 - (monster.distance / config.current_config.large_monster_UI.dynamic.settings.max_distance); end large_monster.draw_dynamic(monster, position_on_screen, opacity_scale); @@ -111,12 +120,26 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled) return left.health_percentage < right.health_percentage; end); end + elseif config.current_config.large_monster_UI.static.sorting.type == "Distance" then + if config.current_config.large_monster_UI.static.sorting.reversed_order then + table.sort(displayed_monsters, function(left, right) + return left.distance > right.distance; + end); + else + table.sort(displayed_monsters, function(left, right) + return left.distance < right.distance; + end); + end end local position_on_screen = screen.calculate_absolute_coordinates(config.current_config.large_monster_UI.static.position); local i = 0; for _, monster in ipairs(displayed_monsters) do + if monster.dead_or_captured and config.current_config.large_monster_UI.static.settings.hide_dead_or_captured then + goto continue; + end + local monster_position_on_screen = { x = position_on_screen.x, y = position_on_screen.y @@ -131,6 +154,7 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled) large_monster.draw_static(monster, monster_position_on_screen, 1); i = i + 1; + ::continue:: end end end diff --git a/reframework/autorun/MHR_Overlay/UI/Modules/small_monster_UI.lua b/reframework/autorun/MHR_Overlay/UI/Modules/small_monster_UI.lua index 46cea22..3725878 100644 --- a/reframework/autorun/MHR_Overlay/UI/Modules/small_monster_UI.lua +++ b/reframework/autorun/MHR_Overlay/UI/Modules/small_monster_UI.lua @@ -31,21 +31,32 @@ function small_monster_UI.draw() local enemy = get_zako_enemy_method:call(singletons.enemy_manager, i); if enemy == nil then customization_menu.status = "No enemy"; - break + goto continue; end local monster = small_monster.list[enemy]; if monster == nil then customization_menu.status = "No monster hp entry"; - break + goto continue; + end + + if monster.dead_or_captured and config.current_config.small_monster_UI.settings.hide_dead_or_captured then + goto continue; end table.insert(displayed_monsters, monster); + ::continue:: + end + + if config.current_config.small_monster_UI.dynamic_positioning.enabled + or (not config.current_config.small_monster_UI.dynamic_positioning.enabled and config.current_config.small_monster_UI.static_sorting.type == "Distance") then + for _, monster in ipairs(displayed_monsters) do + monster.distance = (player.myself_position - monster.position):length(); + end end if not config.current_config.small_monster_UI.dynamic_positioning.enabled then -- sort here - if config.current_config.small_monster_UI.static_sorting.type == "Normal" and config.current_config.small_monster_UI.static_sorting.reversed_order then local reversed_monsters = {}; for i = #displayed_monsters, 1, -1 do @@ -74,6 +85,16 @@ function small_monster_UI.draw() return left.health_percentage < right.health_percentage; end); end + elseif config.current_config.small_monster_UI.static_sorting.type == "Distance" then + if config.current_config.small_monster_UI.static_sorting.reversed_order then + table.sort(displayed_monsters, function(left, right) + return left.distance > right.distance; + end); + else + table.sort(displayed_monsters, function(left, right) + return left.distance < right.distance; + end); + end end end @@ -109,14 +130,12 @@ function small_monster_UI.draw() return; end - local distance = (player.myself_position - monster.position):length(); - - if distance > config.current_config.small_monster_UI.dynamic_positioning.max_distance then + if monster.distance > config.current_config.small_monster_UI.dynamic_positioning.max_distance then goto continue; end if config.current_config.small_monster_UI.dynamic_positioning.opacity_falloff then - opacity_scale = 1 - (distance / config.current_config.small_monster_UI.dynamic_positioning.max_distance); + opacity_scale = 1 - (monster.distance / config.current_config.small_monster_UI.dynamic_positioning.max_distance); end end diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua index 4856dbb..8740361 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua @@ -3,6 +3,7 @@ local table_helpers; local drawing; local config; local player; +local language; function damage_UI_entity.new(bar, highlighted_bar, player_name_label, value_label, percentage_label) local entity = {}; @@ -30,7 +31,7 @@ function damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_d end if player_include.word_player then - player_name_text = player_name_text .. "Player "; + player_name_text = player_name_text .. language.current_config.UI.player .. " "; end if player_include.player_id then @@ -48,7 +49,7 @@ function damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_d local player_damage_bar_percentage = 0; if config.current_config.damage_meter_UI.settings.damage_bar_relative_to == "Total Damage" then - if _player.total.display.total_damage ~= 0 then + if player.total.display.total_damage ~= 0 then player_damage_bar_percentage = _player.display.total_damage / player.total.display.total_damage; end else @@ -75,6 +76,7 @@ function damage_UI_entity.init_module() drawing = require("MHR_Overlay.UI.drawing"); config = require("MHR_Overlay.Misc.config"); player = require("MHR_Overlay.Damage_Meter.player"); + language = require("MHR_Overlay.Misc.language"); end return damage_UI_entity; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/health_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/health_UI_entity.lua index ea0d30b..9e8d61b 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/health_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/health_UI_entity.lua @@ -1,6 +1,7 @@ local health_UI_entity = {}; local table_helpers; local drawing; +local language; function health_UI_entity.new(visibility, bar, text_label, value_label, percentage_label) local entity = {}; @@ -21,7 +22,7 @@ function health_UI_entity.draw(monster, health_UI, position_on_screen, opacity_s drawing.draw_bar(health_UI.bar, position_on_screen, opacity_scale, monster.health_percentage); - drawing.draw_label(health_UI.text_label, position_on_screen, opacity_scale); + drawing.draw_label(health_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.HP); drawing.draw_label(health_UI.value_label, position_on_screen, opacity_scale, monster.health, monster.max_health); drawing.draw_label(health_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.health_percentage); end @@ -29,6 +30,7 @@ end function health_UI_entity.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); drawing = require("MHR_Overlay.UI.drawing"); + language = require("MHR_Overlay.Misc.language"); end return health_UI_entity; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/rage_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/rage_UI_entity.lua index 8a924ba..c995f53 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/rage_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/rage_UI_entity.lua @@ -1,8 +1,9 @@ local rage_UI_entity = {}; local table_helpers; local drawing; +local language; -function rage_UI_entity.new(visibility, bar, text_label, value_label, percentage_label) +function rage_UI_entity.new(visibility, bar, text_label, value_label, percentage_label, timer_label) local entity = {}; entity.visibility = visibility; @@ -10,9 +11,8 @@ function rage_UI_entity.new(visibility, bar, text_label, value_label, percentage entity.text_label = table_helpers.deep_copy(text_label); entity.value_label = table_helpers.deep_copy(value_label); entity.percentage_label = table_helpers.deep_copy(percentage_label); - entity.timer_label = table_helpers.deep_copy(percentage_label); + entity.timer_label = table_helpers.deep_copy(timer_label); - entity.timer_label.text = "%.0f:%02.0f"; return entity; end @@ -24,13 +24,12 @@ function rage_UI_entity.draw(monster, rage_UI, position_on_screen, opacity_scale if monster.is_in_rage then drawing.draw_bar(rage_UI.bar, position_on_screen, opacity_scale, monster.rage_timer_percentage); - drawing.draw_label(rage_UI.text_label, position_on_screen, opacity_scale); - drawing.draw_label(rage_UI.value_label, position_on_screen, opacity_scale, monster.rage_point, monster.rage_limit); + drawing.draw_label(rage_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.rage); drawing.draw_label(rage_UI.timer_label, position_on_screen, opacity_scale, monster.rage_minutes_left, monster.rage_seconds_left); else drawing.draw_bar(rage_UI.bar, position_on_screen, opacity_scale, monster.rage_percentage); - drawing.draw_label(rage_UI.text_label, position_on_screen, opacity_scale); + drawing.draw_label(rage_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.rage); drawing.draw_label(rage_UI.value_label, position_on_screen, opacity_scale, monster.rage_point, monster.rage_limit); drawing.draw_label(rage_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.rage_percentage); end @@ -39,6 +38,7 @@ end function rage_UI_entity.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); drawing = require("MHR_Overlay.UI.drawing"); + language = require("MHR_Overlay.Misc.language"); end return rage_UI_entity; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/stamina_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/stamina_UI_entity.lua index 7fd0d96..ab9c8ea 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/stamina_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/stamina_UI_entity.lua @@ -1,6 +1,7 @@ local stamina_UI_entity = {}; local table_helpers; local drawing; +local language; function stamina_UI_entity.new(visibility, bar, text_label, value_label, percentage_label) local entity = {}; @@ -21,7 +22,7 @@ function stamina_UI_entity.draw(monster, stamina_UI, position_on_screen, opacity drawing.draw_bar(stamina_UI.bar, position_on_screen, opacity_scale, monster.stamina_percentage); - drawing.draw_label(stamina_UI.text_label, position_on_screen, opacity_scale); + drawing.draw_label(stamina_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.stamina); drawing.draw_label(stamina_UI.value_label, position_on_screen, opacity_scale, monster.stamina, monster.max_stamina); drawing.draw_label(stamina_UI.percentage_label, position_on_screen, opacity_scale, 100 * monster.stamina_percentage); end @@ -29,6 +30,7 @@ end function stamina_UI_entity.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); drawing = require("MHR_Overlay.UI.drawing"); + language = require("MHR_Overlay.Misc.language"); end return stamina_UI_entity; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua index 704d877..5e4730e 100644 --- a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua +++ b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua @@ -7,6 +7,10 @@ local player; local large_monster; local small_monster; local language; +local part_names; + +customization_menu.font = nil; +customization_menu.font_range = { 0x1, 0xFFFF, 0 }; customization_menu.is_opened = false; customization_menu.status = "OK"; @@ -18,7 +22,6 @@ customization_menu.window_flags = 0x10120; customization_menu.color_picker_flags = 327680; - customization_menu.selected_language_index = 1; customization_menu.displayed_orientation_types = {}; @@ -75,9 +78,13 @@ customization_menu.large_monster_UI_anchor_index = 1; customization_menu.time_UI_anchor_index = 1; customization_menu.damage_meter_UI_anchor_index = 1; -customization_menu.selected_font_index = 9; +customization_menu.selected_UI_font_index = 9; function customization_menu.init() + customization_menu.font = imgui.load_font(language.current_language.font_name, config.current_config.global_settings.menu_font.size, customization_menu.font_range); + + customization_menu.selected_language_index = table_helpers.find_index(language.language_names, config.current_config.global_settings.language, false); + customization_menu.displayed_orientation_types = {language.current_language.customization_menu.horizontal, language.current_language.customization_menu.vertical}; customization_menu.displayed_anchor_types = {language.current_language.customization_menu.top_left, language.current_language.customization_menu.top_right, language.current_language.customization_menu.bottom_left, language.current_language.customization_menu.bottom_right}; @@ -138,7 +145,7 @@ function customization_menu.init() customization_menu.damage_meter_UI_sorting_types, config.current_config.damage_meter_UI.sorting.type, false); customization_menu.selected_font_index = table_helpers.find_index(customization_menu.fonts, - config.current_config.global_settings.font.family, false); + config.current_config.global_settings.UI_font.family, false); customization_menu.small_monster_UI_anchor_index = table_helpers.find_index(customization_menu.anchor_types, config.current_config.small_monster_UI.static_position.anchor, false); @@ -157,15 +164,17 @@ function customization_menu.draw() imgui.set_next_window_pos(customization_menu.window_position, 1 << 3, customization_menu.window_pivot); imgui.set_next_window_size(customization_menu.window_size, 1 << 3); - customization_menu.is_opened = imgui.begin_window(language.current_language.customization_menu.mod_name .. " " .. config.current_config.version, - customization_menu.is_opened, customization_menu.window_flags); + imgui.push_font(customization_menu.font); + + customization_menu.is_opened = imgui.begin_window(language.current_language.customization_menu.mod_name .. " " .. config.current_config.version, customization_menu.is_opened, customization_menu.window_flags); if not customization_menu.is_opened then return; end local config_changed = false; - local changed; + local changed = false; + local status_string = tostring(customization_menu.status); imgui.text(language.current_language.customization_menu.status .. ": " .. status_string); @@ -198,12 +207,16 @@ function customization_menu.draw() changed, customization_menu.selected_language_index = imgui.combo(language.current_language.customization_menu.language, customization_menu.selected_language_index, language.language_names); config_changed = config_changed or changed; if changed then - config.current_config.global_settings.language = language.language_names[customization_menu.selected_font_index]; - - large_monster.init_list(); - + config.current_config.global_settings.language = language.language_names[customization_menu.selected_language_index]; language.update(customization_menu.selected_language_index); + imgui.pop_font(customization_menu.font); + customization_menu.init(); + imgui.push_font(customization_menu.font); + + part_names.init(); + large_monster.init_list(); + for _, monster in pairs(small_monster.list) do small_monster.init_UI(monster); end @@ -213,6 +226,77 @@ function customization_menu.draw() end end + if imgui.tree_node(language.current_language.customization_menu.menu_font) then + changed, config.current_config.global_settings.menu_font.size = + imgui.slider_int(" ", config.current_config.global_settings.menu_font.size, 5, 100); + config_changed = config_changed or changed; + imgui.same_line(); + + if changed then + imgui.pop_font(customization_menu.font); + customization_menu.font = imgui.load_font(language.current_language.font_name, config.current_config.global_settings.menu_font.size, customization_menu.font_range); + imgui.push_font(customization_menu.font); + end + + changed = imgui.button("-"); + imgui.same_line(); + + if changed then + config.current_config.global_settings.menu_font.size = config.current_config.global_settings.menu_font.size - 1; + if config.current_config.global_settings.menu_font.size < 5 then + config.current_config.global_settings.menu_font.size = 10; + end + + imgui.pop_font(customization_menu.font); + customization_menu.font = imgui.load_font(language.current_language.font_name, config.current_config.global_settings.menu_font.size, customization_menu.font_range); + imgui.push_font(customization_menu.font); + end + + changed = imgui.button("+"); + imgui.same_line(); + + if changed then + config.current_config.global_settings.menu_font.size = config.current_config.global_settings.menu_font.size + 1; + if config.current_config.global_settings.menu_font.size > 100 then + config.current_config.global_settings.menu_font.size = 100; + end + + imgui.pop_font(customization_menu.font); + customization_menu.font = imgui.load_font(language.current_language.font_name, config.current_config.global_settings.menu_font.size, customization_menu.font_range); + imgui.push_font(customization_menu.font); + end + + + imgui.text(language.current_language.customization_menu.size); + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.UI_font) then + imgui.text(language.current_language.customization_menu.UI_font_notice); + + changed, customization_menu.selected_UI_font_index = imgui.combo(language.current_language.customization_menu.family, customization_menu.selected_UI_font_index, + customization_menu.fonts); + config_changed = config_changed or changed; + if changed then + config.current_config.global_settings.uUI_font.family = customization_menu.fonts[customization_menu.selected_UI_font_index]; + end + + changed, config.current_config.global_settings.UI_font.size = + imgui.slider_int(language.current_language.customization_menu.size, config.current_config.global_settings.UI_font.size, 1, 100); + config_changed = config_changed or changed; + + changed, config.current_config.global_settings.UI_font.bold = + imgui.checkbox(language.current_language.customization_menu.bold, config.current_config.global_settings.UI_font.bold); + config_changed = config_changed or changed; + + changed, config.current_config.global_settings.UI_font.italic = + imgui.checkbox(language.current_language.customization_menu.italic, config.current_config.global_settings.UI_font.italic); + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + if imgui.tree_node(language.current_language.customization_menu.performance) then changed, config.current_config.global_settings.performance.max_monster_updates_per_tick = imgui.slider_int(language.current_language.customization_menu.max_monster_updates_per_tick, config.current_config.global_settings.performance.max_monster_updates_per_tick, 1, 150); @@ -307,31 +391,6 @@ function customization_menu.draw() imgui.tree_pop(); end - if imgui.tree_node(language.current_language.customization_menu.font) then - imgui.text(language.current_language.customization_menu.font_notice); - - changed, customization_menu.selected_font_index = imgui.combo(language.current_language.customization_menu.family, customization_menu.selected_font_index, - customization_menu.fonts); - config_changed = config_changed or changed; - if changed then - config.current_config.global_settings.font.family = customization_menu.fonts[customization_menu.selected_font_index]; - end - - changed, config.current_config.global_settings.font.size = - imgui.slider_int(language.current_language.customization_menu.size, config.current_config.global_settings.font.size, 1, 100); - config_changed = config_changed or changed; - - changed, config.current_config.global_settings.font.bold = - imgui.checkbox(language.current_language.customization_menu.bold, config.current_config.global_settings.font.bold); - config_changed = config_changed or changed; - - changed, config.current_config.global_settings.font.italic = - imgui.checkbox(language.current_language.customization_menu.italic, config.current_config.global_settings.font.italic); - config_changed = config_changed or changed; - - imgui.tree_pop(); - end - imgui.tree_pop(); end @@ -342,6 +401,10 @@ function customization_menu.draw() config_changed = config_changed or changed; if imgui.tree_node(language.current_language.customization_menu.settings) then + changed, config.current_config.small_monster_UI.settings.hide_dead_or_captured = imgui.checkbox(language.current_language.customization_menu.hide_dead_or_captured, config.current_config + .small_monster_UI.settings.hide_dead_or_captured); + config_changed = config_changed or changed; + changed, customization_menu.small_monster_UI_orientation_index = imgui.combo(language.current_language.customization_menu.static_orientation, customization_menu.small_monster_UI_orientation_index, customization_menu.displayed_orientation_types); @@ -1068,6 +1131,10 @@ function customization_menu.draw() large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; if imgui.tree_node(language.current_language.customization_menu.settings) then + changed, config.current_config.large_monster_UI.dynamic.settings.hide_dead_or_captured = imgui.checkbox(language.current_language.customization_menu.hide_dead_or_captured, config.current_config. + large_monster_UI.dynamic.settings.hide_dead_or_captured); + config_changed = config_changed or changed; + changed, config.current_config.large_monster_UI.dynamic.settings.opacity_falloff = imgui.checkbox(language.current_language.customization_menu.opacity_falloff, config.current_config.large_monster_UI.dynamic.settings.opacity_falloff); config_changed = config_changed or changed; @@ -1452,7 +1519,7 @@ function customization_menu.draw() if imgui.tree_node(language.current_language.customization_menu.colors) then if imgui.tree_node(language.current_language.customization_menu.foreground) then - changed, config.current_config.large_monster_UI.dynamic.health.bar.colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.colors.foreground, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.dynamic.health.bar.normal_colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.normal_colors.foreground, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; @@ -1460,7 +1527,7 @@ function customization_menu.draw() end if imgui.tree_node(language.current_language.customization_menu.background) then - changed, config.current_config.large_monster_UI.dynamic.health.bar.colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.colors.background, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.dynamic.health.bar.normal_colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.normal_colors.background, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; @@ -1469,7 +1536,7 @@ function customization_menu.draw() if imgui.tree_node(language.current_language.customization_menu.monster_can_be_captured) then if imgui.tree_node(language.current_language.customization_menu.foreground) then - changed, config.current_config.large_monster_UI.dynamic.health.bar.colors.capture.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.colors.capture.foreground, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.capture_colors.foreground, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; @@ -1477,7 +1544,7 @@ function customization_menu.draw() end if imgui.tree_node(language.current_language.customization_menu.background) then - changed, config.current_config.large_monster_UI.dynamic.health.bar.colors.capture.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.colors.capture.background, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.capture_colors.background, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; @@ -1488,6 +1555,51 @@ function customization_menu.draw() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.capture_line) then + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.visibility = imgui.checkbox(language.current_language.customization_menu.visible, + config.current_config.large_monster_UI.dynamic.health.bar.capture_line.visibility); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.dynamic.health.bar.capture_line.offset.x, 0.1, -screen.width, screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.dynamic.health.bar.capture_line.offset.y, 0.1, -screen.height, screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.size) then + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.size.width = imgui.drag_float(language.current_language.customization_menu.width, + config.current_config.large_monster_UI.dynamic.health.bar.capture_line.size.width, 0.1, 0, screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.size.height = imgui.drag_float(language.current_language.customization_menu.height, + config.current_config.large_monster_UI.dynamic.health.bar.capture_line.size.height, 0.1, 0, screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.dynamic.health.bar.capture_line.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.health.bar.capture_line.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + imgui.tree_pop(); end @@ -1974,6 +2086,74 @@ function customization_menu.draw() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.timer_label) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.visibility = imgui.checkbox(language.current_language.customization_menu.visible, + config.current_config.large_monster_UI.dynamic.rage.timer_label.visibility); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + -- add text format + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.dynamic.rage.timer_label.offset.x, 0.1, -screen.width, screen.width, + "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.dynamic.rage.timer_label.offset.y, 0.1, -screen.height, screen.height, + "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.rage.timer_label.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.shadow) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.visibility = imgui.checkbox( + language.current_language.customization_menu.visible, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.visibility); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.offset.x = imgui.drag_float( + language.current_language.customization_menu.x, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.offset.x, 0.1, -screen.width, + screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.offset.y = imgui.drag_float( + language.current_language.customization_menu.y, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.offset.y, 0.1, -screen.height, + screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.dynamic.rage.timer_label.shadow.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_dynamic_UI_changed = large_monster_dynamic_UI_changed or changed; + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + if imgui.tree_node(language.current_language.customization_menu.bar) then changed, config.current_config.large_monster_UI.dynamic.rage.bar.visibility = imgui.checkbox(language.current_language.customization_menu.visible, config.current_config.large_monster_UI.dynamic.rage.bar.visibility); @@ -2459,6 +2639,10 @@ function customization_menu.draw() large_monster_static_UI_changed = large_monster_static_UI_changed or changed; if imgui.tree_node(language.current_language.customization_menu.settings) then + changed, config.current_config.large_monster_UI.static.settings.hide_dead_or_captured = imgui.checkbox(language.current_language.customization_menu.hide_dead_or_captured, config.current_config. + large_monster_UI.static.settings.hide_dead_or_captured); + config_changed = config_changed or changed; + changed, customization_menu.large_monster_UI_orientation_index = imgui.combo(language.current_language.customization_menu.orientation, customization_menu.large_monster_UI_orientation_index, customization_menu.displayed_orientation_types); config_changed = config_changed or changed; @@ -2864,7 +3048,7 @@ function customization_menu.draw() if imgui.tree_node(language.current_language.customization_menu.colors) then if imgui.tree_node(language.current_language.customization_menu.foreground) then - changed, config.current_config.large_monster_UI.static.health.bar.colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.colors.foreground, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.static.health.bar.normal_colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.normal_colors.foreground, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_static_UI_changed = large_monster_static_UI_changed or changed; @@ -2872,7 +3056,7 @@ function customization_menu.draw() end if imgui.tree_node(language.current_language.customization_menu.background) then - changed, config.current_config.large_monster_UI.static.health.bar.colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.colors.background, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.static.health.bar.normal_colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.normal_colors.background, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_static_UI_changed = large_monster_static_UI_changed or changed; @@ -2881,7 +3065,7 @@ function customization_menu.draw() if imgui.tree_node(language.current_language.customization_menu.monster_can_be_captured) then if imgui.tree_node(language.current_language.customization_menu.foreground) then - changed, config.current_config.large_monster_UI.static.health.bar.colors.capture.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.colors.capture.foreground, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.static.health.bar.capture_colors.foreground = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.capture_colors.foreground, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_static_UI_changed = large_monster_static_UI_changed or changed; @@ -2889,7 +3073,7 @@ function customization_menu.draw() end if imgui.tree_node(language.current_language.customization_menu.background) then - changed, config.current_config.large_monster_UI.static.health.bar.colors.capture.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.colors.capture.background, customization_menu.color_picker_flags); + changed, config.current_config.large_monster_UI.static.health.bar.capture_colors.background = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.capture_colors.background, customization_menu.color_picker_flags); config_changed = config_changed or changed; large_monster_static_UI_changed = large_monster_static_UI_changed or changed; @@ -2900,6 +3084,51 @@ function customization_menu.draw() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.capture_line) then + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.visibility = imgui.checkbox(language.current_language.customization_menu.visible, + config.current_config.large_monster_UI.static.health.bar.capture_line.visibility); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.static.health.bar.capture_line.offset.x, 0.1, -screen.width, screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.static.health.bar.capture_line.offset.y, 0.1, -screen.height, screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.size) then + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.size.width = imgui.drag_float(language.current_language.customization_menu.width, + config.current_config.large_monster_UI.static.health.bar.capture_line.size.width, 0.1, 0, screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.size.height = imgui.drag_float(language.current_language.customization_menu.height, + config.current_config.large_monster_UI.static.health.bar.capture_line.size.height, 0.1, 0, screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.static.health.bar.capture_line.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.health.bar.capture_line.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + imgui.tree_pop(); end @@ -3384,6 +3613,74 @@ function customization_menu.draw() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.timer_label) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.visibility = imgui.checkbox(language.current_language.customization_menu.visible, + config.current_config.large_monster_UI.static.rage.timer_label.visibility); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + -- add text format + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.static.rage.timer_label.offset.x, 0.1, -screen.width, screen.width, + "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + changed, config.current_config.large_monster_UI.static.rage.timer_label.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.static.rage.timer_label.offset.y, 0.1, -screen.height, screen.height, + "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.rage.timer_label.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.shadow) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.shadow.visibility = imgui.checkbox( + language.current_language.customization_menu.visible, config.current_config.large_monster_UI.static.rage.timer_label.shadow.visibility); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.shadow.offset.x = imgui.drag_float( + language.current_language.customization_menu.x, config.current_config.large_monster_UI.static.rage.timer_label.shadow.offset.x, 0.1, -screen.width, + screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + changed, config.current_config.large_monster_UI.static.rage.timer_label.shadow.offset.y = imgui.drag_float( + language.current_language.customization_menu.y, config.current_config.large_monster_UI.static.rage.timer_label.shadow.offset.y, 0.1, -screen.height, + screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.large_monster_UI.static.rage.timer_label.shadow.color = imgui.color_picker_argb("", config.current_config.large_monster_UI.static.rage.timer_label.shadow.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + large_monster_static_UI_changed = large_monster_static_UI_changed or changed; + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + if imgui.tree_node(language.current_language.customization_menu.bar) then changed, config.current_config.large_monster_UI.static.rage.bar.visibility = imgui.checkbox(language.current_language.customization_menu.visible, config.current_config.large_monster_UI.static.rage.bar.visibility); @@ -4649,6 +4946,8 @@ function customization_menu.draw() imgui.end_window(); + imgui.pop_font(customization_menu.font); + if config_changed then config.save(); end @@ -4662,6 +4961,7 @@ function customization_menu.init_module() player = require("MHR_Overlay.Damage_Meter.player"); small_monster = require("MHR_Overlay.Monsters.small_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster"); + part_names = require("MHR_Overlay.Misc.part_names"); customization_menu.init(); end diff --git a/reframework/autorun/MHR_Overlay/UI/drawing.lua b/reframework/autorun/MHR_Overlay/UI/drawing.lua index 4d17e40..ac77af9 100644 --- a/reframework/autorun/MHR_Overlay/UI/drawing.lua +++ b/reframework/autorun/MHR_Overlay/UI/drawing.lua @@ -4,7 +4,7 @@ local config; drawing.font = nil; function drawing.init_font() - drawing.font = d2d.Font.new(config.current_config.global_settings.font.family, config.current_config.global_settings.font.size, config.current_config.global_settings.font.bold, config.current_config.global_settings.font.italic); + drawing.font = d2d.Font.new(config.current_config.global_settings.UI_font.family, config.current_config.global_settings.UI_font.size, config.current_config.global_settings.UI_font.bold, config.current_config.global_settings.UI_font.italic); end function drawing.color_to_argb(color) @@ -30,11 +30,9 @@ function drawing.scale_color_opacity(color, scale) end function drawing.scale_bar_opacity(bar, scale) - if bar == nil or scale == nil then - return; - end - - if not bar.visibility then + if bar == nil + or scale == nil + or not bar.visibility then return; end @@ -43,20 +41,19 @@ function drawing.scale_bar_opacity(bar, scale) end function drawing.scale_label_opacity(label, scale) - if label == nil or scale == nil then + if label == nil + or scale == nil + or not label.visibility then return; end - if not label.visibility then - return; - end - label.color = drawing.scale_color_opacity(label.color, scale); label.shadow.color = drawing.scale_color_opacity(label.shadow.color, scale); end function drawing.draw_label(label, position, opacity_scale, ...) - if label == nil or not label.visibility then + if label == nil + or not label.visibility then return; end @@ -82,11 +79,8 @@ function drawing.draw_label(label, position, opacity_scale, ...) end function drawing.draw_bar(bar, position, opacity_scale, percentage) - if bar == nil then - return; - end - - if not bar.visibility then + if bar == nil + or not bar.visibility then return; end @@ -113,6 +107,30 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage) d2d.fill_rect(position_x + foreground_width, position_y, background_width, bar.size.height, new_background_color); end +function drawing.draw_capture_line(bar, position, opacity_scale, percentage) + if bar == nil + or bar.capture_line == nil + or not bar.visibility + or not bar.capture_line.visibility + or percentage >= 1 + or percentage <= 0 then + return; + end + + + local position_x = position.x + bar.offset.x + bar.capture_line.offset.x + bar.size.width * percentage; + local position_y = position.y + bar.offset.y + bar.capture_line.offset.y; + + local color = bar.capture_line.color; + + if opacity_scale < 1 then + color = drawing.scale_color_opacity(color, opacity_scale); + end + + d2d.fill_rect(position_x, position_y, bar.capture_line.size.width, bar.capture_line.size.height, color); + +end + function drawing.init_module() config = require("MHR_Overlay.Misc.config"); end diff --git a/reframework/data/MHR Overlay/languages/en-us.json b/reframework/data/MHR Overlay/languages/en-us.json index b8c1ef6..f55cb3a 100644 --- a/reframework/data/MHR Overlay/languages/en-us.json +++ b/reframework/data/MHR Overlay/languages/en-us.json @@ -3,11 +3,15 @@ "HP": "HP:", "gold": "Gold", "mini": "Mini", + "player": "Player", "rage": "Rage:", "silver": "Silver", - "stamina": "Stamina:" + "stamina": "Stamina:", + "total_damage": "Total Damage" }, "customization_menu": { + "UI_font": "UI Font", + "UI_font_notice": "Any changes to the font require script reload!", "anchor": "Anchor", "background": "Background", "bar": "Bar", @@ -17,6 +21,7 @@ "bottom_left": "Bottom-Left", "bottom_right": "Bottom-Right", "break_count": "Break Count", + "capture_line": "Capture Line", "color": "Color", "colors": "Colors", "crown": "Crown", @@ -34,19 +39,18 @@ "enabled": "Enabled", "family": "Family", "first": "First", - "font": "Font", - "font_notice": "Any changes to the font require script reload!", "foreground": "Foreground", "global_settings": "Global Settings", "health": "Health", "health_percentage": "Health Percentage", "height": "Height", + "hide_dead_or_captured": "Hide dead or captured", "hide_module_if_total_damage_is_zero": "Hide Module if Total Damage is 0", "hide_player_if_player_damage_is_zero": "Hide Player if Player Damage is 0", "hide_total_if_total_damage_is_zero": "Hide Total if Total Damage is 0", "hide_undamaged_parts": "Hide Undamaged Parts", + "highlighted_bar": "Highlighted Bar", "highlighted_damage_bar": "Highlighted Damage Bar", - "higlighted_bar": "Highlighted Bar", "horizontal": "Horizontal", "hunter_rank": "Hunter Rank", "include": "Include", @@ -62,6 +66,7 @@ "max_distance": "Max Distance", "max_monster_updates_per_tick": "Max Monster Updates per Tick", "me": "Me", + "menu_font": "Menu Font", "mod_name": "MHR Overlay", "module_visibility_on_different_screens": "Module Visibility on Different Screens", "modules": "Modules", @@ -107,6 +112,7 @@ "text_label": "Text Label", "time_UI": "Time UI", "time_label": "Time Label", + "timer_label": "Timer Label", "top_damage": "Top Damage", "top_left": "Top-Left", "top_right": "Top-Right", @@ -129,6 +135,7 @@ "y": "Y", "z": "Z" }, + "font_name": "NotoSansKR-Bold.otf", "parts": { "abdomen": "Abdomen", "arms": "Arms", diff --git a/reframework/data/MHR Overlay/languages/ko-kr.json b/reframework/data/MHR Overlay/languages/ko-kr.json new file mode 100644 index 0000000..9856e72 --- /dev/null +++ b/reframework/data/MHR Overlay/languages/ko-kr.json @@ -0,0 +1,181 @@ +{ + "UI": { + "HP": "체력:", + "gold": "금관", + "mini": "미니", + "player": "Player", + "rage": "분노:", + "silver": "은관", + "stamina": "스태미나:", + "total_damage": "Total Damage" + }, + "customization_menu": { + "UI_font": "글꼴", + "UI_font_notice": "Any changes to the font require script reload!", + "anchor": "앵커", + "background": "배경", + "bar": "막대", + "body_parts": "몸통 부위", + "bold": "굵게", + "bomb_damage": "폭탄 대미지", + "bottom_left": "좌하단", + "bottom_right": "우하단", + "break_count": "파괴 횟수", + "capture_line": "Capture Line", + "color": "색상", + "colors": "색상", + "crown": "금관", + "crown_thresholds": "금관 기준", + "damage": "대미지", + "damage_bar": "대미지 막대", + "damage_bars_are_relative_to": "대미지 막대의 상대적 위치", + "damage_meter_UI": "대미지 미터 UI", + "damage_percentage_label": "대미지 퍼센트 라벨", + "damage_value_label": "대미지 값 라벨", + "distance": "거리", + "during_quest": "퀘스트 중", + "dynamic_positioning": "유동 위치", + "dynamically_positioned": "유동적으로 위치함", + "enabled": "사용함", + "family": "모음", + "first": "처음", + "font_notice": "글꼴 설정은 모듈 리로딩이 필요합니다!", + "foreground": "전경색", + "global_settings": "전역 설정", + "health": "체력", + "health_percentage": "체력 퍼센트", + "height": "높이", + "hide_dead_or_captured": "Hide dead or captured", + "hide_module_if_total_damage_is_zero": "총 대미지가 0이면 모듈 숨김", + "hide_player_if_player_damage_is_zero": "헌터 대미지가 0이면 헌터 숨김", + "hide_total_if_total_damage_is_zero": "총 대미지가 0이면 모두 숨김", + "hide_undamaged_parts": "피해를 입히지 않은 부위 숨김", + "highlighted_bar": "강조 막대", + "highlighted_damage_bar": "강조된 대미지 막대", + "horizontal": "가로", + "hunter_rank": "헌터 랭크", + "include": "포함", + "installation_damage": "설치 대미지", + "italic": "기울임", + "kunai_damage": "쿠나이 대미지", + "language": "언어", + "large_monster_UI": "대형 몬스터 UI", + "large_monster_dynamic_UI": "대형 몬스터 유동 UI", + "large_monster_static_UI": "대형 몬스터 고정 UI", + "large_monsters": "대형 몬스터", + "last": "마지막", + "max_distance": "최대 거리", + "max_monster_updates_per_tick": "틱당 최대 몬스터 갱신", + "me": "나", + "menu_font": "Menu Font", + "mod_name": "MHR Overlay", + "module_visibility_on_different_screens": "다른 화면에서 모듈 표시", + "modules": "모듈", + "monster_can_be_captured": "몬스터 포획 가능", + "monster_damage": "몬스터 대미지", + "monster_name": "몬스터명", + "monster_name_label": "몬스터명 라벨", + "my_damage_bar_location": "내 대미지 막대 위치", + "none": "없음", + "normal": "보통", + "offset": "옵셋", + "opacity_falloff": "투명도 저하", + "orientation": "방향", + "other_players": "다른 헌터", + "otomo_damage": "동반자 대미지", + "part_name": "부위명", + "part_name_label": "부위 라벨", + "percentage_label": "퍼센트 라벨", + "performance": "성능", + "player_damage": "헌터 대미지", + "player_id": "헌터 ID", + "player_name": "헌터명", + "player_name_label": "헌터명 라벨", + "position": "위치", + "prioritize_large_monsters": "우선 순위의 대형 몬스터", + "quest_summary_screen": "퀘스트 요약 화면", + "rage": "분노", + "reversed_order": "역순", + "settings": "Settings", + "shadow": "Shadow", + "size": "Size", + "small_monster_UI": "소형 몬스터 UI", + "small_monsters": "소형 몬스터", + "sorting": "정렬", + "spacing": "간격", + "stamina": "스태미나", + "static_orientation": "고정 방향", + "static_position": "고정 위치", + "static_sorting": "고정 정렬", + "static_spacing": "고정 간격", + "statically_positioned": "고정적으로 위치함", + "status": "상태", + "text_label": "텍스트 라벨", + "time_UI": "시간 UI", + "time_label": "시간 라벨", + "timer_label": "Timer Label", + "top_damage": "최고 대미지", + "top_left": "좌상단", + "top_right": "우상단", + "total_damage": "총 대미지", + "total_damage_label": "총 대미지 라벨", + "total_damage_offset_is_relative": "총 대미지 옵셋은 상대적", + "total_damage_value_label": "총 대미지 값 라벨", + "tracked_damage_types": "대미지 종류별 추적", + "tracked_monster_types": "몬스터 타입별 추적", + "training_area": "훈련장", + "type": "타입", + "value_label": "값 라벨", + "vertical": "세로", + "viewport_offset": "뷰포트 옵셋", + "visible": "보임", + "width": "너비", + "word_player": "\"헌터\" 명칭", + "world_offset": "전역 옵셋", + "x": "X", + "y": "Y", + "z": "Z" + }, + "font_name": "NotoSansKR-Bold.otf", + "parts": { + "abdomen": "배", + "arms": "팔", + "back": "등", + "back_windsac": "등 (바람주머니)", + "body": "몸", + "carapace": "갑각", + "chest_windsac": "가슴 (바람주머니)", + "claw": "발톱", + "dorsal_fin": "등지느러미", + "head": "머리", + "head_mud": "머리 (진흙)", + "large_mudbulb": "대형 진흙덩어리", + "left_arm": "왼팔", + "left_arm_ice": "왼팔 (얼음)", + "left_cutwing": "왼날개절단", + "left_leg": "왼다리", + "left_legs": "왼다리", + "left_wing": "왼날개", + "legs": "다리", + "lower_back": "아랫등", + "lower_body": "아랫몸", + "mane": "갈기", + "neck": "목", + "rear": "엉덩이", + "right_arm": "오른팔", + "right_arm_ice": "오른팔 (얼음)", + "right_cutwing": "오른날개절단", + "right_leg": "오른 다리", + "right_legs": "오른 다리", + "right_wing": "오른 날개", + "rock": "바위", + "spinning": "회전", + "tail": "꼬리", + "tail_mud": "꼬리 (진흙)", + "tail_windsac": "꼬리 (바람주머니)", + "torso": "몸통", + "upper_back": "윗등", + "upper_body": "윗몸", + "wings": "날개" + } +} \ No newline at end of file diff --git a/reframework/fonts/NotoSans-Bold.ttf b/reframework/fonts/NotoSans-Bold.ttf new file mode 100644 index 0000000..b6c6f6b Binary files /dev/null and b/reframework/fonts/NotoSans-Bold.ttf differ diff --git a/reframework/fonts/NotoSansHK-Bold.otf b/reframework/fonts/NotoSansHK-Bold.otf new file mode 100644 index 0000000..31c38b9 Binary files /dev/null and b/reframework/fonts/NotoSansHK-Bold.otf differ diff --git a/reframework/fonts/NotoSansJP-Bold.otf b/reframework/fonts/NotoSansJP-Bold.otf new file mode 100644 index 0000000..e5b538d Binary files /dev/null and b/reframework/fonts/NotoSansJP-Bold.otf differ diff --git a/reframework/fonts/NotoSansKR-Bold.otf b/reframework/fonts/NotoSansKR-Bold.otf new file mode 100644 index 0000000..be388bf Binary files /dev/null and b/reframework/fonts/NotoSansKR-Bold.otf differ diff --git a/reframework/fonts/NotoSansSC-Bold.otf b/reframework/fonts/NotoSansSC-Bold.otf new file mode 100644 index 0000000..172eb67 Binary files /dev/null and b/reframework/fonts/NotoSansSC-Bold.otf differ diff --git a/reframework/fonts/NotoSansTC-Bold.otf b/reframework/fonts/NotoSansTC-Bold.otf new file mode 100644 index 0000000..6f0c8be Binary files /dev/null and b/reframework/fonts/NotoSansTC-Bold.otf differ diff --git a/reframework/fonts/unifont_jp-14.0.01.ttf b/reframework/fonts/unifont_jp-14.0.01.ttf new file mode 100644 index 0000000..446a790 Binary files /dev/null and b/reframework/fonts/unifont_jp-14.0.01.ttf differ