diff --git a/reframework/autorun/MHR_Overlay.lua b/reframework/autorun/MHR_Overlay.lua index aede44d..226579e 100644 --- a/reframework/autorun/MHR_Overlay.lua +++ b/reframework/autorun/MHR_Overlay.lua @@ -15,6 +15,9 @@ local ailments = require("MHR_Overlay.Monsters.ailments"); local player = require("MHR_Overlay.Damage_Meter.player"); local damage_hook = require("MHR_Overlay.Damage_Meter.damage_hook"); +local env_creature_hook = require("MHR_Overlay.Endemic_Life.env_creature_hook"); +local env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); + local body_part = require("MHR_Overlay.Monsters.body_part"); local large_monster = require("MHR_Overlay.Monsters.large_monster"); local monster_hook = require("MHR_Overlay.Monsters.monster_hook"); @@ -31,6 +34,7 @@ local health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); local stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); local ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); +local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI"); local customization_menu = require("MHR_Overlay.UI.customization_menu"); local drawing = require("MHR_Overlay.UI.drawing"); @@ -52,16 +56,19 @@ health_UI_entity.init_module(); stamina_UI_entity.init_module(); rage_UI_entity.init_module(); ailment_UI_entity.init_module(); - damage_hook.init_module(); player.init_module(); -ailments.init_module(); + +env_creature_hook.init_module(); +env_creature.init_module(); body_part.init_module(); +ailments.init_module(); large_monster.init_module(); monster_hook.init_module(); small_monster.init_module(); + customization_menu.init_module(); body_part_UI_entity.init_module(); damage_meter_UI.init_module(); @@ -69,6 +76,7 @@ drawing.init_module(); large_monster_UI.init_module(); small_monster_UI.init_module(); time_UI.init_module(); +env_creature_UI.init_module(); keyboard.init_module(); @@ -144,6 +152,13 @@ end, function() customization_menu.status = "Damage meter drawing function threw an exception"; end end + + if config.current_config.endemic_life_UI.enabled and config.current_config.global_settings.module_visibility.training_area.endemic_life_UI then + local success = pcall(env_creature_UI.draw); + if not success then + customization_menu.status = "Endemic life drawing function threw an exception"; + end + end end elseif quest_status.is_result_screen then if config.current_config.small_monster_UI.enabled and config.current_config.global_settings.module_visibility.quest_result_screen.small_monster_UI then @@ -177,6 +192,13 @@ end, function() customization_menu.status = "Damage meter drawing function threw an exception"; end end + + if config.current_config.endemic_life_UI.enabled and config.current_config.global_settings.module_visibility.quest_result_screen.endemic_life_UI then + local success = pcall(env_creature_UI.draw); + if not success then + customization_menu.status = "Endemic life drawing function threw an exception"; + end + end elseif quest_status.index == 2 then if config.current_config.small_monster_UI.enabled and config.current_config.global_settings.module_visibility.during_quest.small_monster_UI then @@ -212,6 +234,13 @@ end, function() customization_menu.status = "Damage meter drawing function threw an exception"; end end + + if config.current_config.endemic_life_UI.enabled and config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI then + local success = pcall(env_creature_UI.draw); + if not success then + customization_menu.status = "Endemic life drawing function threw an exception"; + end + end end --snow.player.PlayerManager -> diff --git a/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature.lua b/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature.lua new file mode 100644 index 0000000..a3095a9 --- /dev/null +++ b/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature.lua @@ -0,0 +1,134 @@ +local env_creature = {}; +local drawing; +local customization_menu; +local singletons; +local config; +local table_helpers; + +env_creature.list = {}; + +function env_creature.new(REcreature) + local creature = {}; + + creature.life = 0; + creature.name = "Env Creature"; + creature.is_inactive = true; + + creature.game_object = nil; + creature.transform = nil; + creature.position = Vector3f.new(0, 0, 0); + creature.distance = 0; + + env_creature.init(creature, REcreature); + env_creature.init_UI(creature); + + if env_creature.list[REcreature] == nil then + env_creature.list[REcreature] = creature; + end + + return creature; +end + +function env_creature.get_creature(REcreature) + if env_creature.list[REcreature] == nil then + env_creature.list[REcreature] = env_creature.new(REcreature); + end + + return env_creature.list[REcreature]; +end + +local environment_creature_base_type_def = sdk.find_type_definition("snow.envCreature.EnvironmentCreatureBase"); +local creature_type_field = environment_creature_base_type_def:get_field("_Type"); +local creature_is_inactive_field = environment_creature_base_type_def:get_field("k__BackingField"); + +local message_manager_type_def = sdk.find_type_definition("snow.gui.MessageManager"); +local get_env_creature_name_message_method = message_manager_type_def:get_method("getEnvCreatureNameMessage"); + +function env_creature.init(creature, REcreature) + local creature_type = creature_type_field:get_data(REcreature); + if creature_type == nil then + customization_menu.status = "No env creature type"; + return; + end + + local creature_name = get_env_creature_name_message_method:call(singletons.message_manager, creature_type); + if creature_name ~= nil then + creature.name = creature_name; + end +end + +function env_creature.init_UI(creature) + creature.name_label = table_helpers.deep_copy(config.current_config.endemic_life_UI.creature_name_label); + + creature.name_label.offset.x = creature.name_label.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier; + creature.name_label.offset.y = creature.name_label.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier; +end + +local get_game_object_method = sdk.find_type_definition("via.Component"):get_method("get_GameObject"); +local get_transform_method = sdk.find_type_definition("via.GameObject"):get_method("get_Transform"); +local get_position_method = sdk.find_type_definition("via.Transform"):get_method("get_Position"); + +function env_creature.update(REcreature) + if REcreature == nil then + return; + end + + local creature = env_creature.get_creature(REcreature); + + if creature.game_object == nil then + creature.game_object = get_game_object_method:call(REcreature); + + if creature.game_object == nil then + customization_menu.status = "No enemy game object"; + return; + end + end + + if creature.transform == nil then + creature.transform = get_transform_method:call(creature.game_object); + if creature.transform == nil then + customization_menu.status = "No enemy transform"; + return; + end + end + + local position = get_position_method:call(creature.transform); + if position == nil then + customization_menu.status = "No enemy position"; + return; + end + + creature.position = position; + + local is_inactive = creature_is_inactive_field:get_data(REcreature); + if is_inactive ~= nil then + creature.is_inactive = is_inactive; + end +end + +function env_creature.draw(creature, position_on_screen, opacity_scale) + local text_width, text_height = drawing.font:measure(creature.name); + + position_on_screen.x = position_on_screen.x - text_width / 2; + + drawing.draw_label(creature.name_label, position_on_screen, opacity_scale, creature.name); +end + +function env_creature.init_list() + env_creature.list = {}; +end + +function env_creature.init_module() + singletons = require("MHR_Overlay.Game_Handler.singletons"); + customization_menu = require("MHR_Overlay.UI.customization_menu"); + config = require("MHR_Overlay.Misc.config"); + table_helpers = require("MHR_Overlay.Misc.table_helpers"); + --health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); + --stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); + --screen = require("MHR_Overlay.Game_Handler.screen"); + drawing = require("MHR_Overlay.UI.drawing"); + --ailments = require("MHR_Overlay.Monsters.ailments"); + --ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity"); +end + +return env_creature; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature_hook.lua b/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature_hook.lua new file mode 100644 index 0000000..1bf8c8e --- /dev/null +++ b/reframework/autorun/MHR_Overlay/Endemic_Life/env_creature_hook.lua @@ -0,0 +1,26 @@ +local env_creature_hook = {}; +local env_creature; +local config; + +local environment_creature_base_type_def = sdk.find_type_definition("snow.envCreature.EnvironmentCreatureBase"); +local environment_creature_base_update_method = environment_creature_base_type_def:get_method("update"); +sdk.hook(environment_creature_base_update_method, function(args) + pcall(env_creature_hook.update_env_creature, sdk.to_managed_object(args[2])); +end, function(retval) + return retval; +end); + +function env_creature_hook.update_env_creature(REcreature) + if not config.current_config.endemic_life_UI.enabled then + return; + end + + env_creature.update(REcreature); +end + +function env_creature_hook.init_module() + config = require("MHR_Overlay.Misc.config"); + env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); +end + +return env_creature_hook; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/Game_Handler/keyboard.lua b/reframework/autorun/MHR_Overlay/Game_Handler/keyboard.lua index 172be8c..3a8a19e 100644 --- a/reframework/autorun/MHR_Overlay/Game_Handler/keyboard.lua +++ b/reframework/autorun/MHR_Overlay/Game_Handler/keyboard.lua @@ -436,6 +436,17 @@ function keyboard.register_hotkey(hard_keyboard) return true; end end + elseif customization_menu.endemic_life_UI_waiting_for_key then + for key, key_name in pairs(keyboard.keys) do + if get_release_method:call(hard_keyboard, key) then + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.ctrl = keyboard.hotkey_modifiers_down.ctrl; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.shift = keyboard.hotkey_modifiers_down.shift; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.alt = keyboard.hotkey_modifiers_down.alt; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.key = key; + customization_menu.endemic_life_UI_waiting_for_key = false; + return true; + end + end end return false; @@ -524,6 +535,14 @@ function keyboard.check_hotkeys(hard_keyboard) config.current_config.damage_meter_UI.enabled = not config.current_config.damage_meter_UI.enabled; end end + + if not (config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.ctrl and not keyboard.hotkey_modifiers_down.ctrl) + and not (config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.shift and not keyboard.hotkey_modifiers_down.shift) + and not (config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.alt and not keyboard.hotkey_modifiers_down.alt) then + if get_release_method:call(hard_keyboard, math.tointeger(config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.key)) then + config.current_config.endemic_life_UI.enabled = not config.current_config.endemic_life_UI.enabled; + end + end end function keyboard.get_hotkey_name(hotkey) diff --git a/reframework/autorun/MHR_Overlay/Misc/config.lua b/reframework/autorun/MHR_Overlay/Misc/config.lua index e72583f..f6bee99 100644 --- a/reframework/autorun/MHR_Overlay/Misc/config.lua +++ b/reframework/autorun/MHR_Overlay/Misc/config.lua @@ -40,7 +40,8 @@ function config.init() large_monster_static_UI = true, large_monster_highlighted_UI = true, time_UI = true, - damage_meter_UI = true + damage_meter_UI = true, + endemic_life_UI = true, }, quest_result_screen = { @@ -49,14 +50,16 @@ function config.init() large_monster_static_UI = true, large_monster_highlighted_UI = true, time_UI = true, - damage_meter_UI = true + damage_meter_UI = true, + endemic_life_UI = false }, training_area = { large_monster_dynamic_UI = true, large_monster_static_UI = true, large_monster_highlighted_UI = true, - damage_meter_UI = true + damage_meter_UI = true, + endemic_life_UI = true } }, @@ -115,6 +118,13 @@ function config.init() ctrl = false, alt = false, key = 0 + }, + + endemic_life_UI = { + shift = false, + ctrl = false, + alt = false, + key = 0 } } }, @@ -977,6 +987,11 @@ function config.init() offset = { x = 10, + y = 111 + }, + + relative_offset = { + x = 0, y = 45 }, @@ -1603,6 +1618,11 @@ function config.init() offset = { x = 10, + y = 73 + }, + + relative_offset = { + x = 0, y = 45 }, @@ -2211,6 +2231,11 @@ function config.init() offset = { x = 10, + y = 111 + }, + + relative_offset = { + x = 0, y = 45 }, @@ -2226,7 +2251,7 @@ function config.init() hide_all_active_ailments = false, hide_disabled_ailments = true, offset_is_relative_to_parts = true, - time_limit = 0 + time_limit = 15 }, sorting = { @@ -2649,6 +2674,47 @@ function config.init() background = 0xA7000000 } } + }, + + endemic_life_UI = { + enabled = true, + + settings = { + hide_inactive_creatures = true, + max_distance = 300, + opacity_falloff = true, + }, + + world_offset = { + x = 0, + y = 1, + z = 0 + }, + + viewport_offset = { + x = 0, + y = 0 + }, + + creature_name_label = { + visibility = true, + text = "%s", + + offset = { + x = 0, + y = 0 + }, + color = 0xFFf4f3ab, + + shadow = { + visibility = true, + offset = { + x = 1, + y = 1 + }, + color = 0xFF000000 + } + }, } }; end diff --git a/reframework/autorun/MHR_Overlay/Misc/language.lua b/reframework/autorun/MHR_Overlay/Misc/language.lua index 713217b..fb4fa72 100644 --- a/reframework/autorun/MHR_Overlay/Misc/language.lua +++ b/reframework/autorun/MHR_Overlay/Misc/language.lua @@ -103,6 +103,7 @@ language.default_language = { large_monster_UI = "Large Monster UI", time_UI = "Time UI", damage_meter_UI = "Damage Meter UI", + endemic_life_UI = "Endemic Life UI", large_monster_dynamic_UI = "Large Monster Dynamic UI", large_monster_static_UI = "Large Monster Static UI", @@ -295,8 +296,12 @@ language.default_language = { time_limit = "Time Limit (seconds)", ailment_name_label = "Ailment Name Label", ailment_name = "Ailment Name", - activation_count = "Activation Count" + activation_count = "Activation Count", + creature_name_label = "Creature Name Label", + hide_inactive_creatures = "Hide Inactive Creatures", + + relative_offset = "Relative Offset" } }; diff --git a/reframework/autorun/MHR_Overlay/Monsters/ailments.lua b/reframework/autorun/MHR_Overlay/Monsters/ailments.lua index 728f48f..ec368e5 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/ailments.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/ailments.lua @@ -61,6 +61,9 @@ function ailments.new(_ailments, ailment_id) _ailments[ailment_id].duration = 100000; _ailments[ailment_id].timer_percentage = 0; + _ailments[ailment_id].minutes_left = 0; + _ailments[ailment_id].seconds_left = 0; + _ailments[ailment_id].is_active = false; _ailments[ailment_id].activate_count = 0; @@ -205,18 +208,34 @@ function ailments.update_ailments(enemy, monster) local is_active = get_is_active_method:call(ailment_param); if is_enable ~= nil then + if is_enable ~= monster.ailments[id].is_enable then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].is_enable = is_enable; end if activate_count ~= nil then + if activate_count ~= monster.ailments[id].activate_count then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].activate_count = activate_count; end if buildup ~= nil then + if buildup ~= monster.ailments[id].total_buildup then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].total_buildup = buildup; end if buildup_limit ~= nil then + if buildup_limit ~= monster.ailments[id].buildup_limit then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].buildup_limit = buildup_limit; end @@ -225,25 +244,64 @@ function ailments.update_ailments(enemy, monster) end if timer ~= nil then + if timer ~= monster.ailments[id].timer then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].timer = timer; end - if duration ~= nil then + if is_active ~= nil then + if is_active ~= monster.ailments[id].is_active then + ailments.update_last_change_time(monster, id); + end + + monster.ailments[id].is_active = is_active; + end + + if duration ~= nil and not monster.ailments[id].is_active then + if duration ~= monster.ailments[id].duration then + xy = tostring(monster.ailments[id].is_active) .. " " .. tostring(monster.ailments[id].duration) .. " -> " .. tostring(duration); + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].duration = duration; end - if timer ~= nil and duration ~= nil then - if duration ~= 0 then - monster.ailments[id].timer_percentage = timer / duration; + if duration ~= 0 then + monster.ailments[id].timer_percentage = timer / monster.ailments[id].duration; + end + + if is_active then + if timer < 0 then + timer = 0; end + + local minutes_left = math.floor(timer / 60); + local seconds_left = timer - 60 * minutes_left; + + if duration ~= 0 then + monster.ailments[id].timer_percentage = timer / monster.ailments[id].duration; + end + + monster.ailments[id].minutes_left = minutes_left; + monster.ailments[id].seconds_left = seconds_left; end if is_active ~= nil then + if is_active ~= monster.ailments[id].is_active then + ailments.update_last_change_time(monster, id); + end + monster.ailments[id].is_active = is_active; end end end +function ailments.update_last_change_time(monster, id) + monster.ailments[id].last_change_time = time.total_elapsed_seconds; +end + -- Code by coavins function ailments.update_poison_blast(enemy, is_large) if enemy == nil then @@ -301,11 +359,11 @@ function ailments.draw_dynamic(monster, ailments_position_on_screen, opacity_sca --sort parts here local displayed_ailments = {}; for REpart, ailment in pairs(monster.ailments) do - if config.current_config.large_monster_UI.dynamic.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 then + if config.current_config.large_monster_UI.dynamic.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 and not ailment.is_active then goto continue; end - if config.current_config.large_monster_UI.dynamic.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 then + if config.current_config.large_monster_UI.dynamic.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and not ailment.is_active then goto continue; end @@ -321,7 +379,7 @@ function ailments.draw_dynamic(monster, ailments_position_on_screen, opacity_sca goto continue; end - if config.current_config.large_monster_UI.dynamic.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.dynamic.ailments.settings.time_limit then + if config.current_config.large_monster_UI.dynamic.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.dynamic.ailments.settings.time_limit and not ailment.is_active then goto continue; end @@ -374,14 +432,15 @@ function ailments.draw_dynamic(monster, ailments_position_on_screen, opacity_sca end function ailments.draw_static(monster, ailments_position_on_screen, opacity_scale) + --sort parts here local displayed_ailments = {}; for REpart, ailment in pairs(monster.ailments) do - if config.current_config.large_monster_UI.static.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 then + if config.current_config.large_monster_UI.static.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 and not ailment.is_active then goto continue; end - if config.current_config.large_monster_UI.static.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 then + if config.current_config.large_monster_UI.static.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and not ailment.is_active then goto continue; end @@ -397,7 +456,7 @@ function ailments.draw_static(monster, ailments_position_on_screen, opacity_scal goto continue; end - if config.current_config.large_monster_UI.static.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.static.ailments.settings.time_limit then + if config.current_config.large_monster_UI.static.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.static.ailments.settings.time_limit and not ailment.is_active then goto continue; end @@ -452,11 +511,11 @@ function ailments.draw_highlighted(monster, ailments_position_on_screen, opacity --sort parts here local displayed_ailments = {}; for id, ailment in pairs(monster.ailments) do - if config.current_config.large_monster_UI.highlighted.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 then + if config.current_config.large_monster_UI.highlighted.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 and not ailment.is_active then goto continue; end - if config.current_config.large_monster_UI.highlighted.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 then + if config.current_config.large_monster_UI.highlighted.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and not ailment.is_active then goto continue; end @@ -472,7 +531,7 @@ function ailments.draw_highlighted(monster, ailments_position_on_screen, opacity goto continue; end - if config.current_config.large_monster_UI.highlighted.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.highlighted.ailments.settings.time_limit then + if config.current_config.large_monster_UI.highlighted.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.highlighted.ailments.settings.time_limit and not ailment.is_active then goto continue; end @@ -526,11 +585,11 @@ function ailments.draw_small(monster, ailments_position_on_screen, opacity_scale --sort parts here local displayed_ailments = {}; for REpart, ailment in pairs(monster.ailments) do - if config.current_config.small_monster_UI.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 then + if config.current_config.small_monster_UI.ailments.settings.hide_ailments_with_zero_buildup and ailment.total_buildup == 0 and ailment.buildup_limit ~= 0 and ailment.activate_count == 0 and not ailment.is_active then goto continue; end - if config.current_config.small_monster_UI.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 then + if config.current_config.small_monster_UI.ailments.settings.hide_inactive_ailments_with_no_buildup_support and ailment.buildup_limit == 0 and not ailment.is_active then goto continue; end @@ -546,7 +605,7 @@ function ailments.draw_small(monster, ailments_position_on_screen, opacity_scale goto continue; end - if config.current_config.small_monster_UI.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.small_monster_UI.ailments.settings.time_limit then + if config.current_config.small_monster_UI.ailments.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.small_monster_UI.ailments.settings.time_limit and not ailment.is_active then goto continue; end diff --git a/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua b/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua index 18256a8..27df30c 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/large_monster.lua @@ -54,8 +54,8 @@ function large_monster.new(enemy) monster.rage_seconds_left = 0; monster.rage_timer_percentage = 0; - monster.game_object = nil - monster.transform = nil + monster.game_object = nil; + monster.transform = nil; monster.position = Vector3f.new(0, 0, 0); monster.distance = 0; @@ -123,6 +123,7 @@ function large_monster.init(monster, enemy) if enemy_name ~= nil then monster.name = enemy_name; end + local set_info = get_set_info_method:call(enemy); if set_info ~= nil then local unique_id = get_unique_id_method:call(set_info); @@ -371,7 +372,7 @@ function large_monster.update_position(enemy) -- as these are pretty much guaranteed to stay constant -- as long as the enemy is alive if monster.game_object == nil then - monster.game_object = get_game_object_method:call(enemy) + monster.game_object = get_game_object_method:call(enemy); if monster.game_object == nil then customization_menu.status = "No enemy game object"; return; @@ -379,14 +380,14 @@ function large_monster.update_position(enemy) end if monster.transform == nil then - monster.transform = get_transform_method:call(monster.game_object) + monster.transform = get_transform_method:call(monster.game_object); if monster.transform == nil then customization_menu.status = "No enemy transform"; return; end end - local position = get_position_method:call(monster.transform) + local position = get_position_method:call(monster.transform); if not position then customization_menu.status = "No enemy position"; return; @@ -688,10 +689,11 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale) local last_part_position_on_screen = body_part.draw_dynamic(monster, parts_position_on_screen, opacity_scale); if config.current_config.large_monster_UI.dynamic.ailments.settings.offset_is_relative_to_parts then - if last_part_position_on_screen == nil then - ailments_position_on_screen = parts_position_on_screen; - else - ailments_position_on_screen.y = last_part_position_on_screen.y + config.current_config.large_monster_UI.dynamic.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier; + if last_part_position_on_screen ~= nil then + ailments_position_on_screen = { + x = last_part_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier, + y = last_part_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier + }; end end @@ -699,6 +701,7 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale) end function large_monster.draw_static(monster, position_on_screen, opacity_scale) + local monster_name_text = ""; if config.current_config.large_monster_UI.static.monster_name_label.include.monster_name then monster_name_text = string.format("%s ", monster.name); @@ -721,6 +724,7 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale) 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); @@ -758,10 +762,11 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale) local last_part_position_on_screen = body_part.draw_static(monster, parts_position_on_screen, opacity_scale); if config.current_config.large_monster_UI.static.ailments.settings.offset_is_relative_to_parts then - if last_part_position_on_screen == nil then - ailments_position_on_screen = parts_position_on_screen; - else - ailments_position_on_screen.y = last_part_position_on_screen.y + config.current_config.large_monster_UI.static.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier; + if last_part_position_on_screen ~= nil then + ailments_position_on_screen = { + x = last_part_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier, + y = last_part_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier + }; end end @@ -829,15 +834,11 @@ function large_monster.draw_highlighted(monster, position_on_screen, opacity_sca local last_part_position_on_screen = body_part.draw_highlighted(monster, parts_position_on_screen, opacity_scale); if config.current_config.large_monster_UI.highlighted.ailments.settings.offset_is_relative_to_parts then - - - if last_part_position_on_screen == nil then + if last_part_position_on_screen ~= nil then ailments_position_on_screen = { - x = position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailments.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier, - y = parts_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier + x = last_part_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier, + y = last_part_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier }; - else - ailments_position_on_screen.y = last_part_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier; end end diff --git a/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua b/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua index 1d883e9..f05ecf7 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/monster_hook.lua @@ -1,16 +1,16 @@ -local monster = {}; +local monster_hook = {}; local small_monster; local large_monster; local config; local ailments; local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"); -local enemy_character_base_type_def_update_method = enemy_character_base_type_def:get_method("update"); +local enemy_character_base_update_method = enemy_character_base_type_def:get_method("update"); local is_boss_enemy_method = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"):get_method("get_isBossEnemy"); -sdk.hook(enemy_character_base_type_def_update_method, function(args) - pcall(monster.update_monster, sdk.to_managed_object(args[2])); +sdk.hook(enemy_character_base_update_method, function(args) + pcall(monster_hook.update_monster, sdk.to_managed_object(args[2])); end, function(retval) return retval; end); @@ -47,7 +47,7 @@ re.on_pre_application_entry("UpdateBehavior", function() end end) -function monster.update_monster(enemy) +function monster_hook.update_monster(enemy) if enemy == nil then return; end @@ -71,13 +71,13 @@ function monster.update_monster(enemy) ailments.update_poison_blast(enemy, is_large); if is_large then - monster.update_large_monster(enemy); + monster_hook.update_large_monster(enemy); else - monster.update_small_monster(enemy); + monster_hook.update_small_monster(enemy); end end -function monster.update_large_monster(enemy) +function monster_hook.update_large_monster(enemy) if not config.current_config.large_monster_UI.dynamic.enabled and not config.current_config.large_monster_UI.static.enabled and not config.current_config.large_monster_UI.highlighted.enabled then @@ -111,7 +111,7 @@ function monster.update_large_monster(enemy) large_monster.update(enemy); end -function monster.update_small_monster(enemy) +function monster_hook.update_small_monster(enemy) if not config.current_config.small_monster_UI.enabled then return; end @@ -141,11 +141,11 @@ function monster.update_small_monster(enemy) small_monster.update(enemy); end -function monster.init_module() +function monster_hook.init_module() small_monster = require("MHR_Overlay.Monsters.small_monster"); large_monster = require("MHR_Overlay.Monsters.large_monster"); config = require("MHR_Overlay.Misc.config"); ailments = require("MHR_Overlay.Monsters.ailments"); end -return monster; \ No newline at end of file +return monster_hook; \ No newline at end of file diff --git a/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua b/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua index 3a39364..df1bcdb 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/small_monster.lua @@ -27,8 +27,8 @@ function small_monster.new(enemy) monster.stamina_percentage = 0; monster.missing_stamina = 0; - monster.game_object = nil - monster.transform = nil + monster.game_object = nil; + monster.transform = nil; monster.position = Vector3f.new(0, 0, 0); monster.distance = 0; @@ -54,14 +54,22 @@ function small_monster.get_monster(enemy) return small_monster.list[enemy]; end +local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"); +local enemy_type_field = enemy_character_base_type_def:get_field("k__BackingField"); + +local message_manager_type_def = sdk.find_type_definition("snow.gui.MessageManager"); +local get_enemy_name_message_method = message_manager_type_def:get_method("getEnemyNameMessage"); + function small_monster.init(monster, enemy) - local enemy_type = enemy:get_field("k__BackingField"); + local enemy_type = enemy_type_field:get_data(enemy); if enemy_type == nil then customization_menu.status = "No enemy type"; return; end - local enemy_name = singletons.message_manager:call("getEnemyNameMessage", enemy_type); + monster.id = enemy_type; + + local enemy_name = get_enemy_name_message_method:call(singletons.message_manager, enemy_type); if enemy_name ~= nil then monster.name = enemy_name; end diff --git a/reframework/autorun/MHR_Overlay/UI/Modules/env_creature_UI.lua b/reframework/autorun/MHR_Overlay/UI/Modules/env_creature_UI.lua new file mode 100644 index 0000000..0aebad9 --- /dev/null +++ b/reframework/autorun/MHR_Overlay/UI/Modules/env_creature_UI.lua @@ -0,0 +1,81 @@ +local env_creature_UI = {}; +local singletons; +local config; +local customization_menu; +local large_monster; +local screen; +local player; +local drawing; +local table_helpers; +local health_UI_entity; +local stamina_UI_entity; +local rage_UI_entity; +local env_creature; + +local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager"); +local get_boss_enemy_count_method = enemy_manager_type_def:get_method("getBossEnemyCount"); +local get_boss_enemy_method = enemy_manager_type_def:get_method("getBossEnemy"); + +function env_creature_UI.draw() + if singletons.enemy_manager == nil then + return; + end + + for _, creature in pairs(env_creature.list) do + + if config.current_config.endemic_life_UI.settings.max_distance == 0 then + break; + end + + if config.current_config.endemic_life_UI.settings.hide_inactive_creatures and creature.is_inactive then + goto continue; + end + + local position_on_screen = {}; + + local world_offset = Vector3f.new(config.current_config.endemic_life_UI.world_offset.x, config.current_config.endemic_life_UI.world_offset.y, config.current_config.endemic_life_UI.world_offset.z); + + position_on_screen = draw.world_to_screen(creature.position + world_offset); + + if position_on_screen == nil then + goto continue; + end + + position_on_screen.x = position_on_screen.x + config.current_config.endemic_life_UI.viewport_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier; + position_on_screen.y = position_on_screen.y + config.current_config.endemic_life_UI.viewport_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier; + + + creature.distance = (player.myself_position - creature.position):length(); + + local opacity_scale = 1; + if creature.distance > config.current_config.endemic_life_UI.settings.max_distance then + goto continue; + end + + if config.current_config.endemic_life_UI.settings.opacity_falloff then + opacity_scale = 1 - (creature.distance / config.current_config.endemic_life_UI.settings.max_distance); + end + + + env_creature.draw(creature, position_on_screen, opacity_scale); + ::continue:: + end +end + + +function env_creature_UI.init_module() + singletons = require("MHR_Overlay.Game_Handler.singletons"); + config = require("MHR_Overlay.Misc.config"); + customization_menu = require("MHR_Overlay.UI.customization_menu"); + large_monster = require("MHR_Overlay.Monsters.large_monster"); + screen = require("MHR_Overlay.Game_Handler.screen"); + player = require("MHR_Overlay.Damage_Meter.player"); + drawing = require("MHR_Overlay.UI.drawing"); + table_helpers = require("MHR_Overlay.Misc.table_helpers"); + health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); + stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); + rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); + env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); +end + +return env_creature_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 da3cca2..10d5e5e 100644 --- a/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua +++ b/reframework/autorun/MHR_Overlay/UI/Modules/large_monster_UI.lua @@ -15,6 +15,12 @@ local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager local get_boss_enemy_count_method = enemy_manager_type_def:get_method("getBossEnemyCount"); local get_boss_enemy_method = enemy_manager_type_def:get_method("getBossEnemy"); +local gui_manager_type_def = sdk.find_type_definition("snow.gui.GuiManager"); +local get_tg_camera_method = gui_manager_type_def:get_method("get_refGuiHud_TgCamera"); + +local tg_camera_type = get_tg_camera_method:get_return_type(); +local get_targeting_enemy_index_field = tg_camera_type:get_field("OldTargetingEmIndex"); + function large_monster_UI.draw(dynamic_enabled, static_enabled, highlighted_enabled) if singletons.enemy_manager == nil then return; @@ -27,9 +33,9 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled, highlighted_enab local highlighted_monster = nil; if singletons.gui_manager ~= nil then - local gui_hud_target_camera = singletons.gui_manager:call("get_refGuiHud_TgCamera"); + local gui_hud_target_camera = get_tg_camera_method:call(singletons.gui_manager); if gui_hud_target_camera ~= nil then - highlighted_id = gui_hud_target_camera:get_field("OldTargetingEmIndex"); + highlighted_id = get_targeting_enemy_index_field:get_data(gui_hud_target_camera); if highlighted_id == nil then highlighted_id = -1; @@ -37,6 +43,7 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled, highlighted_enab end end + local enemy_count = get_boss_enemy_count_method:call(singletons.enemy_manager); if enemy_count == nil then return; diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/ailment_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/ailment_UI_entity.lua index 5da869c..8e6ed78 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/ailment_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/ailment_UI_entity.lua @@ -56,7 +56,7 @@ function ailment_UI_entity.draw_dynamic(ailment, ailment_UI, position_on_screen, drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name); drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup); - drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, 0, ailment.timer); + drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left, ailment.seconds_left); else drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.buildup_percentage); @@ -85,7 +85,7 @@ function ailment_UI_entity.draw_static(ailment, ailment_UI, position_on_screen, drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name); drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup); - drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, 0, ailment.timer); + drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left, ailment.seconds_left); else drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.buildup_percentage); @@ -114,7 +114,7 @@ function ailment_UI_entity.draw_highlighted(ailment, ailment_UI, position_on_scr drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name); drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup); - drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, 0, ailment.timer); + drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left, ailment.seconds_left); else drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.buildup_percentage); @@ -143,7 +143,7 @@ function ailment_UI_entity.draw_small(ailment, ailment_UI, position_on_screen, o drawing.draw_label(ailment_UI.name_label, position_on_screen, opacity_scale, ailment_name); drawing.draw_label(ailment_UI.text_label, position_on_screen, opacity_scale, language.current_language.UI.buildup); - drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, 0, ailment.timer); + drawing.draw_label(ailment_UI.timer_label, position_on_screen, opacity_scale, ailment.minutes_left, ailment.seconds_left); else drawing.draw_bar(ailment_UI.bar, position_on_screen, opacity_scale, ailment.buildup_percentage); diff --git a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua index 9b22a0d..fc206c5 100644 --- a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua +++ b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua @@ -6,6 +6,7 @@ local screen; local player; local large_monster; local small_monster; +local env_creature; local language; local part_names; local time_UI; @@ -105,6 +106,7 @@ customization_menu.large_monster_highlighted_UI_waiting_for_key = false; customization_menu.time_UI_waiting_for_key = false; customization_menu.damage_meter_UI_waiting_for_key = false; +customization_menu.endemic_life_UI_waiting_for_key = false; function customization_menu.reload_font(pop_push) local success, new_font = pcall(imgui.load_font, language.current_language.font_name, config.current_config.global_settings.menu_font.size, customization_menu.font_range); @@ -266,8 +268,8 @@ function customization_menu.draw() local large_monster_static_UI_changed = false; local large_monster_highlighted_UI_changed = false; local time_UI_changed = false; - local damage_meter_UI_changed = false; + local endemic_life_UI_changed = false; local status_string = tostring(customization_menu.status); imgui.text(language.current_language.customization_menu.status .. ": " .. status_string); @@ -301,6 +303,10 @@ function customization_menu.draw() config.current_config.damage_meter_UI.enabled); config_changed = config_changed or changed; + changed, config.current_config.endemic_life_UI.enabled = imgui.checkbox(language.current_language.customization_menu.endemic_life_UI, + config.current_config.endemic_life_UI.enabled); + config_changed = config_changed or changed; + imgui.tree_pop(); end @@ -320,7 +326,8 @@ function customization_menu.draw() or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.all_UI_waiting_for_key = true; @@ -347,7 +354,8 @@ function customization_menu.draw() or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; @@ -376,7 +384,8 @@ function customization_menu.draw() or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.large_monster_UI_waiting_for_key = true; @@ -403,7 +412,8 @@ function customization_menu.draw() or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.large_monster_dynamic_UI_waiting_for_key = true; @@ -430,7 +440,8 @@ function customization_menu.draw() or customization_menu.large_monster_dynamic_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.large_monster_static_UI_waiting_for_key = true; @@ -457,7 +468,8 @@ function customization_menu.draw() or customization_menu.large_monster_dynamic_UI_waiting_for_key or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.time_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.large_monster_highlighted_UI_waiting_for_key = true; @@ -484,7 +496,8 @@ function customization_menu.draw() or customization_menu.large_monster_dynamic_UI_waiting_for_key or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key - or customization_menu.damage_meter_UI_waiting_for_key; + or customization_menu.damage_meter_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.time_UI_waiting_for_key = true; @@ -511,7 +524,8 @@ function customization_menu.draw() or customization_menu.large_monster_dynamic_UI_waiting_for_key or customization_menu.large_monster_static_UI_waiting_for_key or customization_menu.large_monster_highlighted_UI_waiting_for_key - or customization_menu.time_UI_waiting_for_key; + or customization_menu.time_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; if not is_any_other_waiting then customization_menu.damage_meter_UI_waiting_for_key = true; @@ -523,6 +537,33 @@ function customization_menu.draw() + if customization_menu.endemic_life_UI_waiting_for_key then + if imgui.button(language.current_language.customization_menu.press_any_key) then + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.key = 0; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.ctrl = false; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.shift = false; + config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI.alt = false; + customization_menu.endemic_life_UI_waiting_for_key = false; + end + elseif imgui.button(language.current_language.customization_menu.endemic_life_UI) then + local is_any_other_waiting = customization_menu.all_UI_waiting_for_key + or customization_menu.small_monster_UI_waiting_for_key + or customization_menu.large_monster_UI_waiting_for_key + or customization_menu.large_monster_dynamic_UI_waiting_for_key + or customization_menu.large_monster_static_UI_waiting_for_key + or customization_menu.large_monster_highlighted_UI_waiting_for_key + or customization_menu.time_UI_waiting_for_key + or customization_menu.endemic_life_UI_waiting_for_key; + + if not is_any_other_waiting then + customization_menu.endemic_life_UI_waiting_for_key = true; + end + end + + imgui.same_line(); + imgui.text(keyboard.get_hotkey_name(config.current_config.global_settings.hotkeys_with_modifiers.endemic_life_UI)); + + imgui.tree_pop(); end @@ -675,6 +716,11 @@ function customization_menu.draw() language.current_language.customization_menu.damage_meter_UI, config.current_config.global_settings.module_visibility.during_quest.damage_meter_UI); config_changed = config_changed or changed; + changed, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI = imgui.checkbox( + language.current_language.customization_menu.endemic_life_UI, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI); + config_changed = config_changed or changed; + + imgui.tree_pop(); end @@ -710,6 +756,10 @@ function customization_menu.draw() config.current_config.global_settings.module_visibility.quest_result_screen.damage_meter_UI); config_changed = config_changed or changed; + changed, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI = imgui.checkbox( + language.current_language.customization_menu.endemic_life_UI, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI); + config_changed = config_changed or changed; + imgui.tree_pop(); end @@ -729,6 +779,10 @@ function customization_menu.draw() language.current_language.customization_menu.damage_meter_UI, config.current_config.global_settings.module_visibility.training_area.damage_meter_UI); config_changed = config_changed or changed; + changed, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI = imgui.checkbox( + language.current_language.customization_menu.endemic_life_UI, config.current_config.global_settings.module_visibility.during_quest.endemic_life_UI); + config_changed = config_changed or changed; + imgui.tree_pop(); end @@ -3531,6 +3585,20 @@ function customization_menu.draw() imgui.tree_pop(); end + + if imgui.tree_node(language.current_language.customization_menu.relative_offset) then + changed, config.current_config.large_monster_UI.dynamic.ailments.relative_offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.dynamic.ailments.relative_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.ailments.relative_offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.dynamic.ailments.relative_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.spacing) then changed, config.current_config.large_monster_UI.dynamic.ailments.spacing.x = imgui.drag_float(language.current_language.customization_menu.x, @@ -5622,6 +5690,20 @@ function customization_menu.draw() imgui.tree_pop(); end + + if imgui.tree_node(language.current_language.customization_menu.relative_offset) then + changed, config.current_config.large_monster_UI.static.ailments.relative_offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.static.ailments.relative_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.ailments.relative_offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.static.ailments.relative_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.spacing) then changed, config.current_config.large_monster_UI.static.ailments.spacing.x = imgui.drag_float(language.current_language.customization_menu.x, @@ -7641,6 +7723,20 @@ function customization_menu.draw() imgui.tree_pop(); end + + if imgui.tree_node(language.current_language.customization_menu.relative_offset) then + changed, config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x, 0.1, -screen.width, screen.width, "%.1f"); + config_changed = config_changed or changed; + large_monster_highlighted_UI_changed = large_monster_highlighted_UI_changed or changed; + + changed, config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y, 0.1, -screen.height, screen.height, "%.1f"); + config_changed = config_changed or changed; + large_monster_highlighted_UI_changed = large_monster_highlighted_UI_changed or changed; + + imgui.tree_pop(); + end if imgui.tree_node(language.current_language.customization_menu.spacing) then changed, config.current_config.large_monster_UI.highlighted.ailments.spacing.x = imgui.drag_float(language.current_language.customization_menu.x, @@ -9149,6 +9245,133 @@ function customization_menu.draw() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.endemic_life_UI) then + changed, config.current_config.endemic_life_UI.enabled = + imgui.checkbox(language.current_language.customization_menu.enabled, config.current_config.endemic_life_UI.enabled); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.settings) then + changed, config.current_config.endemic_life_UI.settings.hide_inactive_creatures = imgui.checkbox(language.current_language.customization_menu.hide_inactive_creatures, config.current_config. + endemic_life_UI.settings.hide_inactive_creatures); + config_changed = config_changed or changed; + + changed, config.current_config.endemic_life_UI.settings.opacity_falloff = + imgui.checkbox(language.current_language.customization_menu.opacity_falloff, config.current_config.endemic_life_UI.settings.opacity_falloff); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.settings.max_distance = + imgui.drag_float(language.current_language.customization_menu.max_distance, config.current_config.endemic_life_UI.settings.max_distance, 1, 0, 10000, + "%.0f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.world_offset) then + changed, config.current_config.endemic_life_UI.world_offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.endemic_life_UI.world_offset.x, 0.1, -100, 100, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.world_offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.endemic_life_UI.world_offset.y, 0.1, -100, 100, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.world_offset.z = imgui.drag_float(language.current_language.customization_menu.z, + config.current_config.endemic_life_UI.world_offset.z, 0.1, -100, 100, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.viewport_offset) then + changed, config.current_config.endemic_life_UI.viewport_offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.endemic_life_UI.viewport_offset.x, 0.1, -screen.width, screen.width, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.viewport_offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.endemic_life_UI.viewport_offset.y, 0.1, -screen.height, screen.height, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.creature_name_label) then + changed, config.current_config.endemic_life_UI.creature_name_label.visibility = imgui.checkbox(language.current_language.customization_menu.visible, + config.current_config.endemic_life_UI.creature_name_label.visibility); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.endemic_life_UI.creature_name_label.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.endemic_life_UI.creature_name_label.offset.x, 0.1, -screen.width, screen.width, + "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.creature_name_label.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.endemic_life_UI.creature_name_label.offset.y, 0.1, -screen.height, screen.height, + "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.endemic_life_UI.creature_name_label.color = imgui.color_picker_argb("", config.current_config.endemic_life_UI.creature_name_label.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.shadow) then + changed, config.current_config.endemic_life_UI.creature_name_label.shadow.visibility = imgui.checkbox( + language.current_language.customization_menu.visible, config.current_config.endemic_life_UI.creature_name_label.shadow.visibility); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + if imgui.tree_node(language.current_language.customization_menu.offset) then + changed, config.current_config.endemic_life_UI.creature_name_label.shadow.offset.x = imgui.drag_float(language.current_language.customization_menu.x, + config.current_config.endemic_life_UI.creature_name_label.shadow.offset.x, 0.1, -screen.width, + screen.width, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + changed, config.current_config.endemic_life_UI.creature_name_label.shadow.offset.y = imgui.drag_float(language.current_language.customization_menu.y, + config.current_config.endemic_life_UI.creature_name_label.shadow.offset.y, 0.1, -screen.height, + screen.height, "%.1f"); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.color) then + changed, config.current_config.endemic_life_UI.creature_name_label.shadow.color = imgui.color_picker_argb("", config.current_config.endemic_life_UI.creature_name_label.shadow.color, customization_menu.color_picker_flags); + config_changed = config_changed or changed; + endemic_life_UI_changed = endemic_life_UI_changed or changed; + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + + imgui.tree_pop(); + end + imgui.end_window(); imgui.pop_font(customization_menu.font); @@ -9187,6 +9410,13 @@ function customization_menu.draw() end end + if endemic_life_UI_changed or modifiers_changed then + for _, creature in pairs(env_creature.list) do + env_creature.init_UI(creature); + end + end + + if config_changed then config.save(); end @@ -9200,6 +9430,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"); + env_creature = require("MHR_Overlay.Endemic_Life.env_creature"); part_names = require("MHR_Overlay.Misc.part_names"); time_UI = require("MHR_Overlay.UI.Modules.time_UI"); keyboard = require("MHR_Overlay.Game_Handler.keyboard"); diff --git a/reframework/autorun/MHR_Overlay/UI/drawing.lua b/reframework/autorun/MHR_Overlay/UI/drawing.lua index ac77af9..f1021f8 100644 --- a/reframework/autorun/MHR_Overlay/UI/drawing.lua +++ b/reframework/autorun/MHR_Overlay/UI/drawing.lua @@ -88,6 +88,10 @@ function drawing.draw_bar(bar, position, opacity_scale, percentage) percentage = 1; end + if percentage < 0 then + percentage = 0; + end + local position_x = position.x + bar.offset.x; local position_y = position.y + bar.offset.y; local foreground_width = bar.size.width * percentage; diff --git a/reframework/data/MHR Overlay/languages/en-us.json b/reframework/data/MHR Overlay/languages/en-us.json index f521b9b..32bdd93 100644 --- a/reframework/data/MHR Overlay/languages/en-us.json +++ b/reframework/data/MHR Overlay/languages/en-us.json @@ -55,6 +55,7 @@ "capture_line": "Capture Line", "color": "Color", "colors": "Colors", + "creature_name_label": "Creature Name Label", "crown": "Crown", "crown_thresholds": "Crown Thresholds", "damage": "Damage", @@ -72,6 +73,7 @@ "dynamically_positioned": "Dynamically Positioned", "enable_for": "Enable for", "enabled": "Enabled", + "endemic_life_UI": "Endemic Life UI", "family": "Family", "fight_time": "Fight Time", "first": "First", @@ -90,6 +92,7 @@ "hide_dead_or_captured": "Hide Dead or Captured", "hide_disabled_ailments": "Hide Disabled Ailments", "hide_inactive_ailments_with_no_buildup_support": "Hide Inactive Ailments with no Buildup Support", + "hide_inactive_creatures": "Hide Inactive Creatures", "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", @@ -149,6 +152,7 @@ "quest_result_screen": "Quest Result Screen", "quest_time": "Quest Time", "rage": "Rage", + "relative_offset": "Relative Offset", "render_highlighted_monster": "Render Highlighted Monster", "render_not_highlighted_monsters": "Render Not Highlighted Monsters", "reversed_order": "Reversed Order", diff --git a/reframework/data/MHR Overlay/languages/ko-kr.json b/reframework/data/MHR Overlay/languages/ko-kr.json index f14c882..ef8231e 100644 --- a/reframework/data/MHR Overlay/languages/ko-kr.json +++ b/reframework/data/MHR Overlay/languages/ko-kr.json @@ -56,6 +56,7 @@ "capture_line": "포획 표시선", "color": "색상", "colors": "색상", + "creature_name_label": "Creature Name Label", "crown": "금관", "crown_thresholds": "금관 판정값", "damage": "대미지", @@ -73,6 +74,7 @@ "dynamically_positioned": "유동 위치 UI", "enable_for": "표시 대상", "enabled": "사용함", + "endemic_life_UI": "Endemic Life UI", "family": "글꼴", "fight_time": "전투 시간", "first": "처음", @@ -93,6 +95,7 @@ "hide_dead_or_captured": "토벌되거나 포획되면 숨김", "hide_disabled_ailments": "Hide Disabled Ailments", "hide_inactive_ailments_with_no_buildup_support": "Hide Inactive Ailments with no Buildup Support", + "hide_inactive_creatures": "Hide Inactive Creatures", "hide_module_if_total_damage_is_zero": "총 대미지가 0이면 모듈 숨김", "hide_player_if_player_damage_is_zero": "헌터 대미지가 0이면 헌터 숨김", "hide_total_if_total_damage_is_zero": "총 대미지가 0이면 모두 숨김", @@ -153,6 +156,7 @@ "quest_result_screen": "퀘스트 결과 화면", "quest_time": "퀘스트 시간", "rage": "분노", + "relative_offset": "Relative Offset", "render_highlighted_monster": "타겟 몬스터 표시", "render_not_highlighted_monsters": "타겟이 아닌 몬스터 표시", "reversed_order": "역순", diff --git a/reframework/data/MHR Overlay/languages/ru-ru.json b/reframework/data/MHR Overlay/languages/ru-ru.json index 90dd7af..7964b09 100644 --- a/reframework/data/MHR Overlay/languages/ru-ru.json +++ b/reframework/data/MHR Overlay/languages/ru-ru.json @@ -57,6 +57,7 @@ "capture_line": "Линия здоровья захвата", "color": "Цвет", "colors": "Цвета", + "creature_name_label": "Creature Name Label", "crown": "Корона", "crown_thresholds": "Лимиты корон", "damage": "Урон", @@ -75,6 +76,7 @@ "dynamically_positioned": "Рассположенный динамично", "enable_for": "Показывать для", "enabled": "Включить", + "endemic_life_UI": "Endemic Life UI", "exhaust": "Exhaust", "fall_otomo_trap": "Fall Otomo Trap", "fall_trap": "Fall Trap", @@ -99,6 +101,7 @@ "hide_dead_or_captured": "Скрыть мёртвых и захваченных монстров", "hide_disabled_ailments": "Hide Disabled Ailments", "hide_inactive_ailments_with_no_buildup_support": "Hide Inactive Ailments with no Buildup Support", + "hide_inactive_creatures": "Hide Inactive Creatures", "hide_module_if_total_damage_is_zero": "Скрыть модуль, если общий урон равен 0", "hide_player_if_player_damage_is_zero": "Скрыть игрока, если его урон равен 0", "hide_total_if_total_damage_is_zero": "Скрыть общий урон, если он равен 0", @@ -164,6 +167,7 @@ "quest_time": "Время квеста", "quick_sand": "Quick Sand", "rage": "Ярость", + "relative_offset": "Relative Offset", "render_highlighted_monster": "Показывать помеченного монстра", "render_not_highlighted_monsters": "Показывать непомеченных монстров", "reversed_order": "Обратный порядок", diff --git a/reframework/data/MHR Overlay/languages/zh-tw.json b/reframework/data/MHR Overlay/languages/zh-tw.json index 2476e23..6fe78f1 100644 --- a/reframework/data/MHR Overlay/languages/zh-tw.json +++ b/reframework/data/MHR Overlay/languages/zh-tw.json @@ -57,6 +57,7 @@ "capture_line": "可捕捉標記線", "color": "調色盤", "colors": "調色盤", + "creature_name_label": "Creature Name Label", "crown": "皇冠", "crown_thresholds": "皇冠的大小判定範圍", "damage": "傷害", @@ -76,6 +77,7 @@ "enable_for": "Enable for", "enable_on": "Enable on", "enabled": "可見", + "endemic_life_UI": "Endemic Life UI", "exhaust": "Exhaust", "fall_otomo_trap": "Fall Otomo Trap", "fall_trap": "Fall Trap", @@ -100,6 +102,7 @@ "hide_dead_or_captured": "隱藏死亡或被捕獲的魔物", "hide_disabled_ailments": "Hide Disabled Ailments", "hide_inactive_ailments_with_no_buildup_support": "Hide Inactive Ailments with no Buildup Support", + "hide_inactive_creatures": "Hide Inactive Creatures", "hide_module_if_total_damage_is_zero": "當總傷害為0時,隱藏玩家輸出資訊", "hide_player_if_player_damage_is_zero": "當玩家傷害為0時,隱藏玩家傷害", "hide_total_if_total_damage_is_zero": "當總傷害為0時,隱藏總傷害", @@ -165,6 +168,7 @@ "quest_time": "Quest Time", "quick_sand": "Quick Sand", "rage": "憤怒度", + "relative_offset": "Relative Offset", "render_highlighted_monster": "Render Highlighted Monster", "render_not_highlighted_monsters": "Render Not Highlighted Monsters", "reversed_order": "逆向排序", diff --git a/reframework/fonts/NotoSans-Bold.ttf b/reframework/fonts/NotoSans-Bold.ttf deleted file mode 100644 index b6c6f6b..0000000 Binary files a/reframework/fonts/NotoSans-Bold.ttf and /dev/null differ diff --git a/reframework/fonts/NotoSansHK-Bold.otf b/reframework/fonts/NotoSansHK-Bold.otf deleted file mode 100644 index 31c38b9..0000000 Binary files a/reframework/fonts/NotoSansHK-Bold.otf and /dev/null differ diff --git a/reframework/fonts/NotoSansJP-Bold.otf b/reframework/fonts/NotoSansJP-Bold.otf deleted file mode 100644 index e5b538d..0000000 Binary files a/reframework/fonts/NotoSansJP-Bold.otf and /dev/null differ diff --git a/reframework/fonts/NotoSansKR-Bold.otf b/reframework/fonts/NotoSansKR-Bold.otf deleted file mode 100644 index be388bf..0000000 Binary files a/reframework/fonts/NotoSansKR-Bold.otf and /dev/null differ diff --git a/reframework/fonts/NotoSansSC-Bold.otf b/reframework/fonts/NotoSansSC-Bold.otf deleted file mode 100644 index 172eb67..0000000 Binary files a/reframework/fonts/NotoSansSC-Bold.otf and /dev/null differ diff --git a/reframework/fonts/NotoSansTC-Bold.otf b/reframework/fonts/NotoSansTC-Bold.otf deleted file mode 100644 index 6f0c8be..0000000 Binary files a/reframework/fonts/NotoSansTC-Bold.otf and /dev/null differ diff --git a/reframework/fonts/unifont_jp-14.0.01.ttf b/reframework/fonts/unifont_jp-14.0.01.ttf deleted file mode 100644 index 446a790..0000000 Binary files a/reframework/fonts/unifont_jp-14.0.01.ttf and /dev/null differ