--------------------CUSTOMIZATION SECTION-------------------- -- #region local default_config = { global_settings = { module_visibility = { during_quest = { small_monster_UI = true, large_monster_UI = true, time_UI = true, damage_meter_UI = true }, quest_summary_screen = { time_UI = true, damage_meter_UI = true }, training_area = { large_monster_UI = true, damage_meter_UI = true } }, font = { family = "Consolas", size = 13, bold = true, italic = false }, }, small_monster_UI = { enabled = true, spacing = { x = 110, y = 40 }, settings = { orientation = "Horizontal" }, dynamic_positioning = { enabled = true, viewport_offset = { x = -50, y = -100 }, max_distance = 15000, opacity_falloff = true }, sorting = { type = "Normal", reversed_order = false }, position = { x = 0, y = 0, anchor = "Top-Left" }, monster_name_label = { visibility = true, text = "%s", offset = { x = 5, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_label = { visibility = false, text = "HP:", offset = { x = -25, y = 12 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_value_label = { visibility = true, text = "%.0f/%.0f", -- current_health/max_health offset = { x = 50, y = 25 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_percentage_label = { visibility = false, text = "%5.1f%%", offset = { x = 55, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_bar = { visibility = true, offset = { x = 0, y = 17 }, size = { width = 100, height = 7 }, colors = { foreground = 0xB974A652, background = 0xB9000000, capture_health = 0xB9CCCC33 } } }, large_monster_UI = { enabled = true, spacing = { x = 220, y = 40, }, settings = { orientation = "Horizontal" }, dynamic_positioning = { enabled = false, viewport_offset = { x = -100, y = -200 }, max_distance = 15000, opacity_falloff = true }, sorting = { type = "Normal", reversed_order = false }, position = { x = 525, y = 44, anchor = "Bottom-Left" }, monster_name_label = { visibility = true, text = "%s", include = { monster_name = true, crown = true, size = true, crown_thresholds = false }, offset = { x = 5, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_label = { visibility = false, text = "HP:", offset = { x = -25, y = 19 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_value_label = { visibility = true, text = "%.0f/%.0f", -- current_health/max_health offset = { x = 5, y = 19 }, color = 0xFFFFFFFF, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_percentage_label = { visibility = true, text = "%5.1f%%", offset = { x = 150, y = 19 }, color = 0xFFFFFFFF, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, health_bar = { visibility = true, offset = { x = 0, y = 17 }, size = { width = 200, height = 20 }, colors = { foreground = 0xB974A652, background = 0xB9000000, capture ={ foreground = 0xB9CCCC33, background = 0xB9000000 } } } }, time_UI = { enabled = true, position = { x = 65, y = 189, anchor = "Top-Left" }, time_label = { visibility = true, text = "%02d:%06.3f", offset = { x = 0, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } } }, damage_meter_UI = { enabled = true, tracked_monster_types = { small_monsters = true, large_monsters = true }, tracked_damage_types = { player_damage = true, bomb_damage = true, kunai_damage = true, installation_damage = true, -- hunting_installations like ballista, cannon, etc. otomo_damage = true, monster_damage = true }, -- note that installations during narwa fight are counted as monster damage spacing = { x = 270, y = 24 }, settings = { orientation = "Vertical", -- "Vertical" or "Horizontal" hide_module_if_total_damage_is_zero = false, hide_player_if_player_damage_is_zero = false, total_damage_offset_is_relative = true, highlighted_bar = "Me", damage_bar_relative_to = "Top Damage", -- "total damage" or "top damage" my_damage_bar_location = "First" -- "normal" or "first" or "last" }, sorting = { type = "Damage", -- "normal" or "damage" reversed_order = false }, position = { x = 525, y = 225, -- Possible values: "Top-Left", "Top-Right", "Bottom-Left", "Bottom-Right" anchor = "Bottom-Left" }, player_name_label = { visibility = true, include = { myself = { hunter_rank = true, word_player = false, player_id = false, player_name = true }, others = { hunter_rank = true, word_player = false, player_id = false, player_name = true } }, text = "%s", offset = { x = 5, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, damage_value_label = { visibility = true, text = "%.0f", offset = { x = 145, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, damage_percentage_label = { visibility = true, text = "%5.1f%%", offset = { x = 205, y = 0 }, color = 0xFFCCF4E1, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, total_damage_label = { visibility = true, text = "Total Damage", offset = { x = 5, y = 0 }, color = 0xFFFF7373, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, total_damage_value_label = { visibility = true, text = "%.0f", offset = { x = 145, y = 0 }, color = 0xFFFF7373, shadow = { visibility = true, offset = { x = 1, y = 1 }, color = 0xFF000000 } }, damage_bar = { visibility = true, offset = { x = 0, y = 17 }, size = { width = 250, height = 5 }, colors = { foreground = 0xA7CCA3F4, background = 0xA7000000 } }, highlighted_damage_bar = { visibility = true, offset = { x = 0, y = 17 }, size = { width = 250, height = 5 }, colors = { foreground = 0xA7F4D5A3, background = 0xA7000000 } } } }; -- #endregion ----------------------CUSTOMIZATION END---------------------- --------------------FUNCTION DEFINITIONS--------------------- -- #region local init; local init_singletons; local init_message_manager; local init_enemy_manager; local init_lobby_manager; local init_progress_manager; local init_quest_manager; local init_player_manager; local init_village_area_manager; local table_deep_copy; local table_find_index; local table_merge; local save_config; local load_config; local customization_ui; local get_window_size; local calculate_screen_coordinates; local is_in_training_area; local draw_label; local draw_bar; local old_draw_label; local old_draw_bar; local init_monster; local update_monster; local small_monster_data; local large_monster_data; local quest_time; local init_player; local merge_damage; local get_player; local update_player_damage; local update_player_display; local damage_meter; -- #endregion --------------------FUNCTION DEFINITIONS--------------------- --------------------VARIABLE DEFINITIONS--------------------- -- #region local config_file_name; local config; local font; local fonts; local selected_font_index; local is_customization_window_opened; local status; local x; local screen_size; local quest_status; local large_monsters; local small_monsters; local players; local total; local is_quest_online; local last_displayed_players; local master_player_id; local master_player_position; -- Singletons local message_manager; local enemy_manager; local lobby_manager; local progress_manager; local quest_manager; local player_manager; local village_area_manager; -- #endregion --------------------VARIABLE DEFINITIONS--------------------- -----------------------TABLE HELPERS------------------------- -- #region table_deep_copy = function(original, copies) copies = copies or {}; local original_type = type(original); local copy; if original_type == 'table' then if copies[original] then copy = copies[original]; else copy = {}; copies[original] = copy; for original_key, original_value in next, original, nil do copy[table_deep_copy(original_key, copies)] = table_deep_copy(original_value, copies); end setmetatable(copy, table_deep_copy(getmetatable(original), copies)); end else -- number, string, boolean, etc copy = original; end return copy; end table_find_index = function(table, value, nullable) for i = 1, #table do if table[i] == value then return i; end end if not nullable then return 1; end return nil; end table_merge = function(...) local tables_to_merge = {...}; assert(#tables_to_merge > 1, "There should be at least two tables to merge them"); for key, table in ipairs(tables_to_merge) do assert(type(table) == "table", string.format("Expected a table as function parameter %d", key)); end local result = table_deep_copy(tables_to_merge[1]); for i = 2, #tables_to_merge do local from = tables_to_merge[i]; for key, value in pairs(from) do if type(value) == "table" then result[key] = result[key] or {}; assert(type(result[key]) == "table", string.format("Expected a table: '%s'", key)); result[key] = table_merge(result[key], value); else result[key] = value; end end end return result; end table_tostring = function(table) local cache, stack, output = {}, {}, {}; local depth = 1; local output_string = "{\n"; while true do local size = 0; for key, value in pairs(table) do size = size + 1; end local current_index = 1; for key, value in pairs(table) do if (cache[table] == nil) or (current_index >= cache[table]) then if (string.find(output_string, "}", output_string:len())) then output_string = output_string .. ",\n"; elseif not (string.find(output_string, "\n",output_stringr:len())) then output_string = output_string .. "\n"; end -- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings table.insert(output, output_string); output_string = ""; local key; if (type(key) == "number" or type(key) == "boolean") then key = "[" .. tostring(key) .. "]"; else key = "['" .. tostring(key) .. "']"; end if (type(value) == "number" or type(value) == "boolean") then output_string = output_string .. string.rep('\t', depth) .. key .. " = " .. tostring(value); elseif (type(value) == "table") then output_string = output_string .. string.rep('\t', depth) .. key .. " = {\n"; table.insert(stack, table); table.insert(stack, value); cache[table] = current_index + 1; break else output_string = output_string .. string.rep('\t', depth) .. key .. " = '" .. tostring(value) .. "'"; end if (current_index == size) then output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}"; else output_string = output_string .. ","; end else -- close the table if (current_index == size) then output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}"; end end current_index = current_index + 1; end if (size == 0) then output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}"; end if (#stack > 0) then table = stack[#stack]; stack[#stack] = nil; depth = cache[table] == nil and depth + 1 or depth - 1; else break; end end -- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings table.insert(output, output_string); output_string = table.concat(output); return output_string; end -- #endregion -----------------------TABLE HELPERS------------------------- ----------------------CONFIG LOAD/SAVE----------------------- -- #region load_config = function() local loaded_config = json.load_file(config_file_name); if loaded_config ~= nil then log.info('[MHR Overlay] config.json loaded successfully'); config = table_merge(config, loaded_config); end end save_config = function() -- save current config to disk, replacing any existing file local success = json.dump_file(config_file_name, config); if success then log.info('[MHR Overlay] config.json saved successfully'); else log.error('[MHR Overlay] Failed to save config.json'); end end -- #endregion ----------------------CONFIG LOAD/SAVE----------------------- ----------------------------INIT----------------------------- -- #region config_file_name = 'MHR Overlay/config.json'; init = function() config = table_deep_copy(default_config); load_config(); init_singletons(); status = "OK"; x = ""; quest_status = 0; if quest_manager ~= nil then local _quest_status = quest_manager:call("getStatus"); if _quest_status == nil then status = "No quest status"; else quest_status = _quest_status; end end screen_size = { width = 1920, height = 1080 }; master_player_position = { x = 0, y = 0 } large_monsters = {}; small_monsters = {}; players = {}; total = init_player(0, "Total", 0); is_quest_online = false; last_displayed_players = {}; master_player_id = 0; log.info("[MHR Overlay] loaded"); orientation_types = {"Horizontal", "Vertical"}; monster_UI_orientation_index = table_find_index(orientation_types, config.large_monster_UI.settings.orientation, false); monster_UI_sort_types = {"Normal", "Health", "Health Percentage"}; monster_UI_sort_type_index = table_find_index(monster_UI_sort_types, config.large_monster_UI.sorting.type, false); damage_meter_UI_orientation_index = table_find_index(orientation_types, config.damage_meter_UI.settings.orientation, false); damage_meter_UI_highlighted_bar_types = {"Me", "Top Damage", "None"}; damage_meter_UI_highlighted_bar_index = table_find_index(damage_meter_UI_highlighted_bar_types, config.damage_meter_UI.settings.highlighted_bar, false); damage_meter_UI_damage_bar_relative_types = {"Total Damage", "Top Damage"}; damage_meter_UI_damage_bar_relative_index = table_find_index(damage_meter_UI_damage_bar_relative_types, config.damage_meter_UI.settings.damage_bar_relative_to, false); damage_meter_UI_my_damage_bar_location_types = {"Normal", "First", "Last"}; damage_meter_UI_my_damage_bar_location_index = table_find_index(damage_meter_UI_my_damage_bar_location_types, config.damage_meter_UI.settings.my_damage_bar_location, false); damage_meter_UI_sort_types = {"Normal", "Damage"}; damage_meter_UI_sort_type_index = table_find_index(damage_meter_UI_sort_types, config.damage_meter_UI.sorting.type, false); is_customization_window_opened = false; fonts = {"Arial", "Arial Black", "Bahnschrift", "Calibri", "Cambria", "Cambria Math", "Candara", "Comic Sans MS", "Consolas", "Constantia", "Corbel", "Courier New", "Ebrima", "Franklin Gothic Medium", "Gabriola", "Gadugi", "Georgia", "HoloLens MDL2 Assets", "Impact", "Ink Free", "Javanese Text", "Leelawadee UI", "Lucida Console", "Lucida Sans Unicode", "Malgun Gothic", "Marlett", "Microsoft Himalaya", "Microsoft JhengHei", "Microsoft New Tai Lue", "Microsoft PhagsPa", "Microsoft Sans Serif", "Microsoft Tai Le", "Microsoft YaHei", "Microsoft Yi Baiti", "MingLiU-ExtB", "Mongolian Baiti", "MS Gothic", "MV Boli", "Myanmar Text", "Nirmala UI", "Palatino Linotype", "Segoe MDL2 Assets", "Segoe Print", "Segoe Script", "Segoe UI", "Segoe UI Historic", "Segoe UI Emoji", "Segoe UI Symbol", "SimSun", "Sitka", "Sylfaen", "Symbol", "Tahoma", "Times New Roman", "Trebuchet MS", "Verdana", "Webdings", "Wingdings", "Yu Gothic"}; selected_font_index = table_find_index(fonts, config.global_settings.font.family, false); return true; end init_singletons = function() init_message_manager(); init_enemy_manager(); init_lobby_manager() init_progress_manager(); init_quest_manager(); init_player_manager(); init_village_area_manager(); end init_message_manager = function() if message_manager ~= nil then return; end message_manager = sdk.get_managed_singleton("snow.gui.MessageManager"); if message_manager == nil then log.error("[MHR Overlay] No message manager"); end end init_enemy_manager = function() if enemy_manager ~= nil then return; end enemy_manager = sdk.get_managed_singleton("snow.enemy.EnemyManager"); if enemy_manager == nil then log.error("[MHR Overlay] No enemy manager"); end end init_lobby_manager = function() if lobby_manager ~= nil then return; end lobby_manager = sdk.get_managed_singleton("snow.LobbyManager"); if lobby_manager == nil then log.error("[MHR Overlay] No lobby manager"); return false; end end init_progress_manager = function() if progress_manager ~= nil then return; end progress_manager = sdk.get_managed_singleton("snow.progress.ProgressManager"); if progress_manager == nil then log.error("[MHR Overlay] No progress manager"); return false; end end init_quest_manager = function() if quest_manager ~= nil then return; end quest_manager = sdk.get_managed_singleton("snow.QuestManager"); if quest_manager == nil then log.error("[MHR Overlay] No quest manager"); end end init_player_manager = function() if player_manager ~= nil then return; end player_manager = sdk.get_managed_singleton("snow.player.PlayerManager"); if player_manager == nil then log.error("[MHR Overlay] No player manager"); end end init_village_area_manager = function() if village_area_manager ~= nil then return; end village_area_manager = sdk.get_managed_singleton("snow.VillageAreaManager"); if village_area_manager == nil then log.error("[MHR Overlay] No village manager"); end end -- #endregion ----------------------------INIT----------------------------- --------------------------RE_IMGUI--------------------------- -- #region re.on_draw_ui(function() if imgui.button('MHR Overlay') then is_customization_window_opened = not is_customization_window_opened; end end); re.on_frame(function() if not reframework:is_drawing_ui() then is_customization_window_opened = false; end if is_customization_window_opened then customization_ui(); end draw.text("x: " .. tostring(x), 450, 50, 0xFFFFFFFF); end); -- #endregion --------------------------RE_IMGUI--------------------------- ----------------------------D2D------------------------------ -- #region d2d.register(function() font = d2d.create_font(config.global_settings.font.family, config.global_settings.font.size, config.global_settings.font.bold, config.global_settings.font.italic); end, function() status = "OK"; get_window_size(); init_singletons(); if quest_status < 2 then if is_in_training_area() then if config.large_monster_UI.enabled and config.global_settings.module_visibility.training_area.large_monster_UI then large_monster_data(); end if config.damage_meter_UI.enabled and config.global_settings.module_visibility.training_area.damage_meter_UI then damage_meter(); end end elseif quest_status == 2 then if config.small_monster_UI.enabled and config.global_settings.module_visibility.during_quest.small_monster_UI then small_monster_data(); end if config.large_monster_UI.enabled and config.global_settings.module_visibility.during_quest.large_monster_UI then large_monster_data(); end if config.time_UI.enabled and config.global_settings.module_visibility.during_quest.time_UI then quest_time(); end if config.damage_meter_UI.enabled and config.global_settings.module_visibility.during_quest.damage_meter_UI then damage_meter(); end elseif quest_status > 2 then if config.time_UI.enabled and config.global_settings.module_visibility.quest_summary_screen.time_UI then quest_time(); end if config.damage_meter_UI.enabled and config.global_settings.module_visibility.quest_summary_screen.damage_meter_UI then damage_meter(); end end end); calculate_screen_coordinates = function (position) if position.anchor == "Top-Left" then return {x = position.x, y = position.y}; end if position.anchor == "Top-Right" then local screen_x = screen_size.width - position.x; return {x = screen_x, y = position.y}; end if position.anchor == "Bottom-Left" then local screen_y = screen_size.height - position.y; return {x = position.x, y = screen_y}; end if position.anchor == "Bottom-Right" then local screen_x = screen_size.width - position.x; local screen_y = screen_size.height - position.y; return {x = screen_x, y = screen_y}; end return {x = position.x, y = position.y}; end get_window_size = function() local width, height = d2d.surface_size(); if width ~= nil then screen_size.width = width; end if height ~= nil then screen_size.height = height; end end -- #endregion ----------------------------D2D------------------------------ ----------------------CUSTOMIZATION UI----------------------- -- #region customization_ui = function() is_customization_window_opened = imgui.begin_window("MHR Overlay", is_customization_window_opened, 0x10120); if not is_customization_window_opened then return; end local config_changed = false; local changed; local status_string = tostring(status); imgui.text("Status: " .. status_string); if imgui.tree_node("Modules") then changed, config.small_monster_UI.enabled = imgui.checkbox("Small Monster UI", config.small_monster_UI.enabled); config_changed = config_changed or changed; imgui.same_line(); changed, config.large_monster_UI.enabled = imgui.checkbox("Large Monster UI", config.large_monster_UI.enabled); config_changed = config_changed or changed; changed, config.time_UI.enabled = imgui.checkbox("Time UI", config.time_UI.enabled); config_changed = config_changed or changed; imgui.same_line(); changed, config.damage_meter_UI.enabled = imgui.checkbox("Damage Meter UI", config.damage_meter_UI.enabled); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Global Settings") then if imgui.tree_node("Module Visibility on Different Screens") then if imgui.tree_node("During Quest") then changed, config.global_settings.module_visibility.during_quest.small_monster_UI = imgui.checkbox("Small Monster UI", config.global_settings.module_visibility.during_quest.small_monster_UI); config_changed = config_changed or changed; imgui.same_line(); changed, config.global_settings.module_visibility.during_quest.large_monster_UI = imgui.checkbox("Large Monster UI", config.global_settings.module_visibility.during_quest.large_monster_UI); config_changed = config_changed or changed; changed, config.global_settings.module_visibility.during_quest.time_UI = imgui.checkbox("Time UI", config.global_settings.module_visibility.during_quest.time_UI); config_changed = config_changed or changed; imgui.same_line(); changed, config.global_settings.module_visibility.during_quest.damage_meter_UI = imgui.checkbox("Damage Meter UI", config.global_settings.module_visibility.during_quest.damage_meter_UI); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Quest Summary Screen") then changed, config.global_settings.module_visibility.quest_summary_screen.time_UI = imgui.checkbox("Time UI", config.global_settings.module_visibility.quest_summary_screen.time_UI); config_changed = config_changed or changed; imgui.same_line(); changed, config.global_settings.module_visibility.quest_summary_screen.damage_meter_UI = imgui.checkbox("Damage Meter UI", config.global_settings.module_visibility.quest_summary_screen.damage_meter_UI); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Training Area") then changed, config.global_settings.module_visibility.training_area.large_monster_UI = imgui.checkbox("Large Monster UI", config.global_settings.module_visibility.training_area.large_monster_UI); config_changed = config_changed or changed; imgui.same_line(); changed, config.global_settings.module_visibility.training_area.damage_meter_UI = imgui.checkbox("Damage Meter UI", config.global_settings.module_visibility.training_area.damage_meter_UI); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Font") then imgui.text("Any changes to the font require script reload!"); changed, selected_font_index = imgui.combo("Family", selected_font_index, fonts); config_changed = config_changed or changed; if changed then config.global_settings.font.family = fonts[selected_font_index]; end changed, config.global_settings.font.size = imgui.slider_int("Size", config.global_settings.font.size, 1, 100); config_changed = config_changed or changed; changed, config.global_settings.font.bold = imgui.checkbox("Bold", config.global_settings.font.bold); config_changed = config_changed or changed; changed, config.global_settings.font.italic = imgui.checkbox("Italic", config.global_settings.font.italic); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Small Monster UI") then changed, config.small_monster_UI.enabled = imgui.checkbox("Enabled", config.small_monster_UI.enabled); config_changed = config_changed or changed; if imgui.tree_node("Spacing") then changed, config.small_monster_UI.spacing.y = imgui.drag_float("X", config.small_monster_UI.spacing.y, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.spacing.y = imgui.drag_float("Y", config.small_monster_UI.spacing.y, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Settings") then changed, monster_UI_orientation_index = imgui.combo("Orientation", monster_UI_orientation_index, orientation_types); config_changed = config_changed or changed; if changed then config.small_monster_UI.settings.orientation = orientation_types[monster_UI_orientation_index]; end imgui.tree_pop(); end if imgui.tree_node("Dynamic Positioning") then changed, config.small_monster_UI.dynamic_positioning.enabled = imgui.checkbox("Enabled", config.small_monster_UI.dynamic_positioning.enabled); config_changed = config_changed or changed; if imgui.tree_node("Viewport Offset") then changed, config.small_monster_UI.dynamic_positioning.viewport_offset.x = imgui.drag_float("X", config.small_monster_UI.dynamic_positioning.viewport_offset.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.dynamic_positioning.viewport_offset.y = imgui.drag_float("Y", config.small_monster_UI.dynamic_positioning.viewport_offset.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Position") then changed, config.small_monster_UI.position.x = imgui.drag_float("X", config.small_monster_UI.position.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.position.y = imgui.drag_float("Y", config.small_monster_UI.position.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Sorting") then changed, monster_UI_sort_type_index = imgui.combo("Type", monster_UI_sort_type_index, monster_UI_sort_types); config_changed = config_changed or changed; if changed then config.small_monster_UI.sorting.type = monster_UI_sort_types[monster_UI_sort_type_index]; end changed, config.small_monster_UI.sorting.reversed_order = imgui.checkbox("Reversed Order", config.small_monster_UI.sorting.reversed_order); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Monster Name Label") then changed, config.small_monster_UI.monster_name_label.visibility = imgui.checkbox("Visible", config.small_monster_UI.monster_name_label.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.monster_name_label.offset.x = imgui.drag_float("X", config.small_monster_UI.monster_name_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.monster_name_label.offset.y = imgui.drag_float("Y", config.small_monster_UI.monster_name_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.monster_name_label.color = imgui.color_picker_argb("", config.small_monster_UI.monster_name_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.small_monster_UI.monster_name_label.shadow.visibility = imgui.checkbox("Enable", config.small_monster_UI.monster_name_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.monster_name_label.shadow.offset.x = imgui.drag_float("X", config.small_monster_UI.monster_name_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.monster_name_label.shadow.offset.y = imgui.drag_float("Y", config.small_monster_UI.monster_name_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.monster_name_label.shadow.color = imgui.color_picker_argb("", config.small_monster_UI.monster_name_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Label") then changed, config.small_monster_UI.health_label.visibility = imgui.checkbox("Visible", config.small_monster_UI.health_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_label.offset.x = imgui.drag_float("X", config.small_monster_UI.health_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_label.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_label.color = imgui.color_picker_argb("", config.small_monster_UI.health_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.small_monster_UI.health_label.shadow.visibility = imgui.checkbox("Enable", config.small_monster_UI.health_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_label.shadow.offset.x = imgui.drag_float("X", config.small_monster_UI.health_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_label.shadow.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_label.shadow.offset.y, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_label.shadow.color = imgui.color_picker_argb("", config.small_monster_UI.health_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Value Label") then changed, config.small_monster_UI.health_value_label.visibility = imgui.checkbox("Visible", config.small_monster_UI.health_value_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_value_label.offset.x = imgui.drag_float("X", config.small_monster_UI.health_value_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_value_label.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_value_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_value_label.color = imgui.color_picker_argb("", config.small_monster_UI.health_value_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.small_monster_UI.health_value_label.shadow.visibility = imgui.checkbox("Enable", config.small_monster_UI.health_value_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_value_label.shadow.offset.x = imgui.drag_float("X", config.small_monster_UI.health_value_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_value_label.shadow.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_value_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_value_label.shadow.color = imgui.color_picker_argb("", config.small_monster_UI.health_value_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Percentage Label") then changed, config.small_monster_UI.health_percentage_label.visibility = imgui.checkbox("Visible", config.small_monster_UI.health_percentage_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_percentage_label.offset.x = imgui.drag_float("X", config.small_monster_UI.health_percentage_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_percentage_label.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_percentage_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_percentage_label.color = imgui.color_picker_argb("", config.small_monster_UI.health_percentage_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.small_monster_UI.health_percentage_label.shadow.visibility = imgui.checkbox("Enable", config.small_monster_UI.health_percentage_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_percentage_label.shadow.offset.x = imgui.drag_float("X", config.small_monster_UI.health_percentage_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_percentage_label.shadow.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_percentage_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.small_monster_UI.health_percentage_label.shadow.color = imgui.color_picker_argb("", config.small_monster_UI.health_percentage_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Bar") then changed, config.small_monster_UI.health_bar.visibility = imgui.checkbox("Visible", config.small_monster_UI.health_bar .visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.small_monster_UI.health_bar.offset.x = imgui.drag_float("X", config.small_monster_UI.health_bar .offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_bar.offset.y = imgui.drag_float("Y", config.small_monster_UI.health_bar .offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Size") then changed, config.small_monster_UI.health_bar.size.width = imgui.drag_float("Width", config.small_monster_UI.health_bar.size.width, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.small_monster_UI.health_bar.size.height = imgui.drag_float("Height", config.small_monster_UI.health_bar.size.height, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Colors") then if imgui.tree_node("Foreground") then changed, config.small_monster_UI.health_bar.colors.foreground = imgui.color_picker_argb("", config.small_monster_UI.health_bar.colors.foreground, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Background") then changed, config.small_monster_UI.health_bar.colors.background = imgui.color_picker_argb("", config.small_monster_UI.health_bar.colors.background, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Large Monster UI") then changed, config.large_monster_UI.enabled = imgui.checkbox("Enabled", config.large_monster_UI.enabled); config_changed = config_changed or changed; if imgui.tree_node("Spacing") then changed, config.large_monster_UI.spacing.x = imgui.drag_float("X", config.large_monster_UI.spacing.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.spacing.y = imgui.drag_float("Y", config.large_monster_UI.spacing.y, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Settings") then changed, monster_UI_orientation_index = imgui.combo("Orientation", monster_UI_orientation_index, orientation_types); config_changed = config_changed or changed; if changed then config.large_monster_UI.settings.orientation = orientation_types[monster_UI_orientation_index]; end imgui.tree_pop(); end if imgui.tree_node("Dynamic Positioning") then changed, config.large_monster_UI.dynamic_positioning.enabled = imgui.checkbox("Enabled", config.large_monster_UI.dynamic_positioning.enabled); config_changed = config_changed or changed; if imgui.tree_node("Viewport Offset") then changed, config.large_monster_UI.dynamic_positioning.viewport_offset.x = imgui.drag_float("X", config.large_monster_UI.dynamic_positioning.viewport_offset.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.dynamic_positioning.viewport_offset.y = imgui.drag_float("Y", config.large_monster_UI.dynamic_positioning.viewport_offset.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Position") then changed, config.large_monster_UI.position.x = imgui.drag_float("X", config.large_monster_UI.position.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.position.y = imgui.drag_float("Y", config.large_monster_UI.position.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Sorting") then changed, monster_UI_sort_type_index = imgui.combo("Type", monster_UI_sort_type_index, monster_UI_sort_types); config_changed = config_changed or changed; if changed then config.large_monster_UI.sorting.type = monster_UI_sort_types[monster_UI_sort_type_index]; end changed, config.large_monster_UI.sorting.reversed_order = imgui.checkbox("Reversed Order", config.large_monster_UI.sorting.reversed_order); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Monster Name Label") then changed, config.large_monster_UI.monster_name_label.visibility = imgui.checkbox("Visible", config.large_monster_UI.monster_name_label.visibility); config_changed = config_changed or changed; if imgui.tree_node("Include") then changed, config.large_monster_UI.monster_name_label.include.monster_name = imgui.checkbox("Monster Name", config.large_monster_UI.monster_name_label.include.monster_name); config_changed = config_changed or changed; changed, config.large_monster_UI.monster_name_label.include.crown = imgui.checkbox("Crown", config.large_monster_UI.monster_name_label.include.crown); config_changed = config_changed or changed; changed, config.large_monster_UI.monster_name_label.include.size = imgui.checkbox("Size", config.large_monster_UI.monster_name_label.include.size); config_changed = config_changed or changed; changed, config.large_monster_UI.monster_name_label.include.scrown_thresholds = imgui.checkbox( "Crown Thresholds", config.large_monster_UI.monster_name_label.include.scrown_thresholds); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Offset") then changed, config.large_monster_UI.monster_name_label.offset.x = imgui.drag_float("X", config.large_monster_UI.monster_name_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.monster_name_label.offset.y = imgui.drag_float("Y", config.large_monster_UI.monster_name_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.monster_name_label.color = imgui.color_picker_argb("", config.large_monster_UI.monster_name_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.large_monster_UI.monster_name_label.shadow.visibility = imgui.checkbox("Enable", config.large_monster_UI.monster_name_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.large_monster_UI.monster_name_label.shadow.offset.x = imgui.drag_float("X", config.large_monster_UI.monster_name_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.monster_name_label.shadow.offset.y = imgui.drag_float("Y", config.large_monster_UI.monster_name_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.monster_name_label.shadow.color = imgui.color_picker_argb("", config.large_monster_UI.monster_name_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Label") then changed, config.large_monster_UI.health_label.visibility = imgui.checkbox("Visible", config.large_monster_UI.health_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_label.offset.x = imgui.drag_float("X", config.large_monster_UI.health_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_label.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_label.color = imgui.color_picker_argb("", config.large_monster_UI.health_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.large_monster_UI.health_label.shadow.visibility = imgui.checkbox("Enable", config.large_monster_UI.health_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_label.shadow.offset.x = imgui.drag_float("X", config.large_monster_UI.health_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_label.shadow.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_label.shadow.offset.y, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_label.shadow.color = imgui.color_picker_argb("", config.large_monster_UI.health_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Value Label") then changed, config.large_monster_UI.health_value_label.visibility = imgui.checkbox("Visible", config.large_monster_UI.health_value_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_value_label.offset.x = imgui.drag_float("X", config.large_monster_UI.health_value_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_value_label.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_value_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_value_label.color = imgui.color_picker_argb("", config.large_monster_UI.health_value_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.large_monster_UI.health_value_label.shadow.visibility = imgui.checkbox("Enable", config.large_monster_UI.health_value_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_value_label.shadow.offset.x = imgui.drag_float("X", config.large_monster_UI.health_value_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_value_label.shadow.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_value_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_value_label.shadow.color = imgui.color_picker_argb("", config.large_monster_UI.health_value_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Percentage Label") then changed, config.large_monster_UI.health_percentage_label.visibility = imgui.checkbox("Visible", config.large_monster_UI.health_percentage_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_percentage_label.offset.x = imgui.drag_float("X", config.large_monster_UI.health_percentage_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_percentage_label.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_percentage_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_percentage_label.color = imgui.color_picker_argb("", config.large_monster_UI.health_percentage_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.large_monster_UI.health_percentage_label.shadow.visibility = imgui.checkbox("Enable", config.large_monster_UI.health_percentage_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_percentage_label.shadow.offset.x = imgui.drag_float("X", config.large_monster_UI.health_percentage_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_percentage_label.shadow.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_percentage_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.large_monster_UI.health_percentage_label.shadow.color = imgui.color_picker_argb("", config.large_monster_UI.health_percentage_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Health Bar") then changed, config.large_monster_UI.health_bar.visibility = imgui.checkbox("Visible", config.large_monster_UI.health_bar .visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.large_monster_UI.health_bar.offset.x = imgui.drag_float("X", config.large_monster_UI.health_bar .offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_bar.offset.y = imgui.drag_float("Y", config.large_monster_UI.health_bar .offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Size") then changed, config.large_monster_UI.health_bar.size.width = imgui.drag_float("Width", config.large_monster_UI.health_bar.size.width, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.large_monster_UI.health_bar.size.height = imgui.drag_float("Height", config.large_monster_UI.health_bar.size.height, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Colors") then if imgui.tree_node("Foreground") then changed, config.large_monster_UI.health_bar.colors.foreground = imgui.color_picker_argb("", config.large_monster_UI.health_bar.colors.foreground, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Background") then changed, config.large_monster_UI.health_bar.colors.background = imgui.color_picker_argb("", config.large_monster_UI.health_bar.colors.background, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Monster can be captured") then if imgui.tree_node("Foreground") then changed, config.large_monster_UI.health_bar.colors.capture.foreground = imgui.color_picker_argb("", config.large_monster_UI.health_bar.colors.capture.foreground, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Background") then changed, config.large_monster_UI.health_bar.colors.capture.background = imgui.color_picker_argb("", config.large_monster_UI.health_bar.colors.capture.background, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end end imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Time UI") then changed, config.time_UI.enabled = imgui.checkbox("Enabled", config.time_UI.enabled); config_changed = config_changed or changed; if imgui.tree_node("Position") then changed, config.time_UI.position.x = imgui.drag_float("X", config.time_UI.position.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.time_UI.position.y = imgui.drag_float("Y", config.time_UI.position.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Time Label") then changed, config.time_UI.time_label.visibility = imgui.checkbox("Visible", config.time_UI.time_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.time_UI.time_label.offset.x = imgui.drag_float("X", config.time_UI.time_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.time_UI.time_label.offset.y = imgui.drag_float("Y", config.time_UI.time_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.time_UI.time_label.color = imgui.color_picker_argb("", config.time_UI.time_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.time_UI.time_label.shadow.visibility = imgui.checkbox("Enable", config.time_UI.time_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.time_UI.time_label.shadow.offset.x = imgui.drag_float("X", config.time_UI.time_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.time_UI.time_label.shadow.offset.y = imgui.drag_float("Y", config.time_UI.time_label.shadow.offset.y, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.time_UI.time_label.shadow.color = imgui.color_picker_argb("", config.time_UI.time_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Damage Meter UI") then changed, config.damage_meter_UI.enabled = imgui.checkbox("Enabled", config.damage_meter_UI.enabled); config_changed = config_changed or changed; if imgui.tree_node("Settings") then changed, config.damage_meter_UI.settings.hide_module_if_total_damage_is_zero = imgui.checkbox( "Hide Module if Total Damage is 0", config.damage_meter_UI.settings.hide_module_if_total_damage_is_zero); config_changed = config_changed or changed; changed, config.damage_meter_UI.settings.hide_player_if_player_damage_is_zero = imgui.checkbox( "Hide Player if Player Damage is 0", config.damage_meter_UI.settings.hide_player_if_player_damage_is_zero); config_changed = config_changed or changed; changed, config.damage_meter_UI.settings.total_damage_offset_is_relative = imgui.checkbox( "Total Damage Offset is Relative", config.damage_meter_UI.settings.total_damage_offset_is_relative); config_changed = config_changed or changed; changed, damage_meter_UI_orientation_index = imgui.combo("Orientation", damage_meter_UI_orientation_index, orientation_types); config_changed = config_changed or changed; if changed then config.damage_meter_UI.settings.orientation = orientation_types[damage_meter_UI_orientation_index]; end changed, damage_meter_UI_highlighted_bar_index = imgui.combo("Highlighted Bar", damage_meter_UI_highlighted_bar_index, damage_meter_UI_highlighted_bar_types); config_changed = config_changed or changed; if changed then config.damage_meter_UI.settings.highlighted_bar = damage_meter_UI_highlighted_bar_types[damage_meter_UI_highlighted_bar_index]; end changed, damage_meter_UI_damage_bar_relative_index = imgui.combo("Damage Bars are Relative to", damage_meter_UI_damage_bar_relative_index, damage_meter_UI_damage_bar_relative_types); config_changed = config_changed or changed; if changed then config.damage_meter_UI.settings.damage_bar_relative_to = damage_meter_UI_damage_bar_relative_types[damage_meter_UI_damage_bar_relative_index]; end changed, damage_meter_UI_my_damage_bar_location_index = imgui.combo("My Damage Bar Location", damage_meter_UI_my_damage_bar_location_index, damage_meter_UI_my_damage_bar_location_types); config_changed = config_changed or changed; if changed then config.damage_meter_UI.settings.my_damage_bar_location = damage_meter_UI_my_damage_bar_location_types[damage_meter_UI_my_damage_bar_location_index]; end imgui.tree_pop(); end if imgui.tree_node("Tracked Monster Types") then changed, config.damage_meter_UI.tracked_monster_types.small_monsters = imgui.checkbox("Small Monsters", config.damage_meter_UI.tracked_monster_types.small_monsters); config_changed = config_changed or changed; changed, config.damage_meter_UI.tracked_monster_types.large_monsters = imgui.checkbox("Large Monsters", config.damage_meter_UI.tracked_monster_types.large_monsters); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Tracked Damage Types") then local tracked_damage_changed = false; changed, config.damage_meter_UI.tracked_damage_types.player_damage = imgui.checkbox("Player Damage", config.damage_meter_UI.tracked_damage_types.player_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; changed, config.damage_meter_UI.tracked_damage_types.bomb_damage = imgui.checkbox("Bomb Damage", config.damage_meter_UI.tracked_damage_types.bomb_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; changed, config.damage_meter_UI.tracked_damage_types.kunai_damage = imgui.checkbox("Kunai Damage", config.damage_meter_UI.tracked_damage_types.kunai_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; changed, config.damage_meter_UI.tracked_damage_types.installation_damage = imgui.checkbox("Installation Damage", config.damage_meter_UI.tracked_damage_types.installation_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; changed, config.damage_meter_UI.tracked_damage_types.otomo_damage = imgui.checkbox("Otomo Damage", config.damage_meter_UI.tracked_damage_types.otomo_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; changed, config.damage_meter_UI.tracked_damage_types.monster_damage = imgui.checkbox("Monster Damage", config.damage_meter_UI.tracked_damage_types.monster_damage); config_changed = config_changed or changed; tracked_damage_changed = tracked_damage_changed or changed; if tracked_damage_changed then for player_id, player in pairs(players) do update_player_display(player); end update_player_display(total); end imgui.tree_pop(); end if imgui.tree_node("Spacing") then changed, config.damage_meter_UI.spacing.x = imgui.drag_float("X", config.damage_meter_UI.spacing.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.spacing.y = imgui.drag_float("Y", config.damage_meter_UI.spacing.y, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Position") then changed, config.damage_meter_UI.position.x = imgui.drag_float("X", config.damage_meter_UI.position.x, 0.1, 0, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.position.y = imgui.drag_float("Y", config.damage_meter_UI.position.y, 0.1, 0, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Sorting") then changed, damage_meter_UI_sort_type_index = imgui.combo("Type", damage_meter_UI_sort_type_index, damage_meter_UI_sort_types); config_changed = config_changed or changed; if changed then config.damage_meter_UI.sorting.type = damage_meter_UI_sort_types[damage_meter_UI_sort_type_index]; end changed, config.damage_meter_UI.sorting.reversed_order = imgui.checkbox("Reversed Order", config.damage_meter_UI.sorting.reversed_order); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Player Name Label") then changed, config.damage_meter_UI.player_name_label.visibility = imgui.checkbox("Visible", config.damage_meter_UI.player_name_label.visibility); config_changed = config_changed or changed; if imgui.tree_node("Include") then if imgui.tree_node("Me") then changed, config.damage_meter_UI.player_name_label.include.myself.hunter_rank = imgui.checkbox("Hunter Rank", config.damage_meter_UI.player_name_label.include.myself.hunter_rank); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.myself.word_player = imgui.checkbox("Word \"Player\"", config.damage_meter_UI.player_name_label.include.myself.word_player); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.myself.player_id = imgui.checkbox("Player ID", config.damage_meter_UI.player_name_label.include.myself.player_id); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.myself.player_name = imgui.checkbox("Player Name", config.damage_meter_UI.player_name_label.include.myself.player_name); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Other Players") then changed, config.damage_meter_UI.player_name_label.include.others.hunter_rank = imgui.checkbox("Hunter Rank", config.damage_meter_UI.player_name_label.include.others.hunter_rank); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.others.word_player = imgui.checkbox("Word \"Player\"", config.damage_meter_UI.player_name_label.include.others.word_player); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.others.player_id = imgui.checkbox("Player ID", config.damage_meter_UI.player_name_label.include.others.player_id); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.include.others.player_name = imgui.checkbox("Player Name", config.damage_meter_UI.player_name_label.include.others.player_name); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Offset") then changed, config.damage_meter_UI.player_name_label.offset.x = imgui.drag_float("X", config.damage_meter_UI.player_name_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.offset.y = imgui.drag_float("Y", config.damage_meter_UI.player_name_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.player_name_label.color = imgui.color_picker_argb("", config.damage_meter_UI.player_name_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.damage_meter_UI.player_name_label.shadow.visibility = imgui.checkbox("Enable", config.damage_meter_UI.player_name_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.player_name_label.shadow.offset.x = imgui.drag_float("X", config.damage_meter_UI.player_name_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.player_name_label.shadow.offset.y = imgui.drag_float("Y", config.damage_meter_UI.player_name_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.player_name_label.shadow.color = imgui.color_picker_argb("", config.damage_meter_UI.player_name_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Damage Value Label") then changed, config.damage_meter_UI.damage_value_label.visibility = imgui.checkbox("Visible", config.damage_meter_UI.damage_value_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.damage_meter_UI.damage_value_label.offset.x = imgui.drag_float("X", config.damage_meter_UI.damage_value_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_value_label.offset.y = imgui.drag_float("Y", config.damage_meter_UI.damage_value_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.damage_value_label.color = imgui.color_picker_argb("", config.damage_meter_UI.damage_value_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.damage_meter_UI.damage_value_label.shadow.visibility = imgui.checkbox("Enable", config.damage_meter_UI.damage_value_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.damage_value_label.shadow.offset.x = imgui.drag_float("X", config.damage_meter_UI.damage_value_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_value_label.shadow.offset.y = imgui.drag_float("Y", config.damage_meter_UI.damage_value_label.shadow.offset.y, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.damage_value_label.shadow.color = imgui.color_picker_argb("", config.damage_meter_UI.damage_value_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Damage Percentage Label") then changed, config.damage_meter_UI.damage_percentage_label.visibility = imgui.checkbox("Visible", config.damage_meter_UI.damage_percentage_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.damage_meter_UI.damage_percentage_label.offset.x = imgui.drag_float("X", config.damage_meter_UI.damage_percentage_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_percentage_label.offset.y = imgui.drag_float("Y", config.damage_meter_UI.damage_percentage_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.damage_percentage_label.color = imgui.color_picker_argb("", config.damage_meter_UI.damage_percentage_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.damage_meter_UI.damage_percentage_label.shadow.visibility = imgui.checkbox("Enable", config.damage_meter_UI.damage_percentage_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.damage_percentage_label.shadow.offset.x = imgui.drag_float("X", config.damage_meter_UI.damage_percentage_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_percentage_label.shadow.offset.y = imgui.drag_float("Y", config.damage_meter_UI.damage_percentage_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.damage_percentage_label.shadow.color = imgui.color_picker_argb("", config.damage_meter_UI.damage_percentage_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Total Damage Label") then changed, config.damage_meter_UI.total_damage_label.visibility = imgui.checkbox("Visible", config.damage_meter_UI.total_damage_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.damage_meter_UI.total_damage_label.offset.x = imgui.drag_float("X", config.damage_meter_UI.total_damage_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.total_damage_label.offset.y = imgui.drag_float("Y", config.damage_meter_UI.total_damage_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.total_damage_label.color = imgui.color_picker_argb("", config.damage_meter_UI.total_damage_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.damage_meter_UI.total_damage_label.shadow.visibility = imgui.checkbox("Enable", config.damage_meter_UI.total_damage_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.total_damage_label.shadow.offset.x = imgui.drag_float("X", config.damage_meter_UI.total_damage_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.total_damage_label.shadow.offset.y = imgui.drag_float("Y", config.damage_meter_UI.total_damage_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.total_damage_label.shadow.color = imgui.color_picker_argb("", config.damage_meter_UI.total_damage_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Total Damage Value Label") then changed, config.damage_meter_UI.total_damage_value_label.visibility = imgui.checkbox("Visible", config.damage_meter_UI.total_damage_value_label.visibility); config_changed = config_changed or changed; -- add text format if imgui.tree_node("Offset") then changed, config.damage_meter_UI.total_damage_value_label.offset.x = imgui.drag_float("X", config.damage_meter_UI.total_damage_value_label.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.total_damage_value_label.offset.y = imgui.drag_float("Y", config.damage_meter_UI.total_damage_value_label.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.total_damage_value_label.color = imgui.color_picker_argb("", config.damage_meter_UI.total_damage_value_label.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Shadow") then changed, config.damage_meter_UI.total_damage_value_label.shadow.visibility = imgui.checkbox("Enable", config.damage_meter_UI.total_damage_value_label.shadow.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.total_damage_value_label.shadow.offset.x = imgui.drag_float("X", config.damage_meter_UI.total_damage_value_label.shadow.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.total_damage_value_label.shadow.offset.y = imgui.drag_float("Y", config.damage_meter_UI.total_damage_value_label.shadow.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Color") then changed, config.damage_meter_UI.total_damage_value_label.shadow.color = imgui.color_picker_argb("", config.damage_meter_UI.total_damage_value_label.shadow.color, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Damage Bar") then changed, config.damage_meter_UI.damage_bar.visibility = imgui.checkbox("Visible", config.damage_meter_UI.damage_bar.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.damage_bar.offset.x = imgui.drag_float("X", config.damage_meter_UI.damage_bar.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_bar.offset.y = imgui.drag_float("Y", config.damage_meter_UI.damage_bar.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Size") then changed, config.damage_meter_UI.damage_bar.size.width = imgui.drag_float("Width", config.damage_meter_UI.damage_bar .size.width, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.damage_bar.size.height = imgui.drag_float("Height", config.damage_meter_UI.damage_bar.size.height, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Colors") then if imgui.tree_node("Foreground") then changed, config.damage_meter_UI.damage_bar.colors.foreground = imgui.color_picker_argb("", config.damage_meter_UI.damage_bar.colors.foreground, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Background") then changed, config.damage_meter_UI.damage_bar.colors.background = imgui.color_picker_argb("", config.damage_meter_UI.damage_bar.colors.background, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end if imgui.tree_node("Highlighted Damage Bar") then changed, config.damage_meter_UI.highlighted_damage_bar.visibility = imgui.checkbox("Visible", config.damage_meter_UI.highlighted_damage_bar.visibility); config_changed = config_changed or changed; if imgui.tree_node("Offset") then changed, config.damage_meter_UI.highlighted_damage_bar.offset.x = imgui.drag_float("X", config.damage_meter_UI.highlighted_damage_bar.offset.x, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.highlighted_damage_bar.offset.y = imgui.drag_float("Y", config.damage_meter_UI.highlighted_damage_bar.offset.y, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Size") then changed, config.damage_meter_UI.highlighted_damage_bar.size.width = imgui.drag_float("Width", config.damage_meter_UI.highlighted_damage_bar .size.width, 0.1, -screen_size.width, screen_size.width, "%.1f"); config_changed = config_changed or changed; changed, config.damage_meter_UI.highlighted_damage_bar.size.height = imgui.drag_float("Height", config.damage_meter_UI.highlighted_damage_bar.size.height, 0.1, -screen_size.height, screen_size.height, "%.1f"); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Colors") then if imgui.tree_node("Foreground") then changed, config.damage_meter_UI.highlighted_damage_bar.colors.foreground = imgui.color_picker_argb("", config.damage_meter_UI.highlighted_damage_bar.colors.foreground, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end if imgui.tree_node("Background") then changed, config.damage_meter_UI.highlighted_damage_bar.colors.background = imgui.color_picker_argb("", config.damage_meter_UI.highlighted_damage_bar.colors.background, 327680); config_changed = config_changed or changed; imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end imgui.tree_pop(); end imgui.end_window(); if config_changed then save_config(); end end -- #endregion ----------------------CUSTOMIZATION UI----------------------- ------------------------DRAW HELPERS------------------------- -- #region draw_label = function(label, position, ...) if label == nil then return; end if not label.visibility then return; end local text = string.format(label.text, table.unpack({...})); if label.shadow.visibility then d2d.text(font, text, position.x + label.offset.x + label.shadow.offset.x, position.y + label.offset.y + label.shadow.offset.y, label.shadow.color); end d2d.text(font, text, position.x + label.offset.x, position.y + label.offset.y, label.color); end draw_bar = function(bar, position, percentage) if bar == nil then return; end if not bar.visibility then return; end local foreground_width = bar.size.width * percentage; local background_width = bar.size.width - foreground_width; -- foreground d2d.fill_rect(position.x + bar.offset.x, position.y + bar.offset.y, foreground_width, bar.size.height, bar.colors.foreground); -- background d2d.fill_rect(position.x + foreground_width + bar.offset.x, position.y + bar.offset.y, background_width, bar.size.height, bar.colors.background); end old_draw_label = function(label, position, ...) if label == nil then return; end if not label.visibility then return; end local text = string.format(label.text, table.unpack({...})); if label.shadow.visibility then draw.text(text, position.x + label.offset.x + label.shadow.offset.x, position.y + label.offset.y + label.shadow.offset.y, label.shadow.color); end draw.text(text, position.x + label.offset.x, position.y + label.offset.y, label.color); end old_draw_bar = function(bar, position, percentage) if bar == nil then return; end if not bar.visibility then return; end local foreground_width = bar.size.width * percentage; local background_width = bar.size.width - foreground_width; -- foreground draw.filled_rect(position.x + bar.offset.x, position.y + bar.offset.y, foreground_width, bar.size.height, bar.colors.foreground); -- background draw.filled_rect(position.x + foreground_width + bar.offset.x, position.y + bar.offset.y, background_width, bar.size.height, bar.colors.background); end -- #endregion ------------------------DRAW HELPERS------------------------- ------------------------QUEST STATUS------------------------- -- #region local quest_manager_type_definition = sdk.find_type_definition("snow.QuestManager"); local on_changed_game_status = quest_manager_type_definition:get_method("onChangedGameStatus"); sdk.hook(on_changed_game_status, function(args) local new_quest_status = sdk.to_int64(args[3]); if new_quest_status ~= nil then if (quest_status < 2 and new_quest_status == 2) or new_quest_status <2 then players = {}; total = init_player(0, "Total", 0); small_monsters = {}; large_monsters = {}; end quest_status = new_quest_status; end end, function(retval) return retval; end); -- #endregion ------------------------QUEST STATUS------------------------- ------------------------VILLAGE AREA------------------------- -- #region is_in_training_area = function() if village_area_manager == nil then status = "No village area manager"; return false; end local is_training_area = village_area_manager:call("checkCurrentArea_TrainingArea"); if is_training_area ~= nil then return is_training_area; end return false; end -- #endregion ------------------------VILLAGE AREA------------------------- ----------------------PLAYER POSITION------------------------ -- #region local update_player_position = function() if player_manager == nil then status = "No player manager"; return; end local master_player = player_manager:call("findMasterPlayer") if master_player == nil then status = "No master player"; return; end local master_player_game_object = master_player:call("get_GameObject") if master_player_game_object == nil then status = "No master player game object"; return; end local master_player_transform = master_player_game_object:call("get_Transform") if not master_player_transform then status = "No master player transform"; return; end local _master_player_position = master_player_transform:call("get_Position") if _master_player_position == nil then status = "No masterplayer position"; return; end master_player_position = _master_player_position; end -- #endregion ----------------------PLAYER POSITION------------------------ ------------------------MONSTER HOOK------------------------- -- #region 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"); sdk.hook(enemy_character_base_type_def_update_method, function(args) update_monster(sdk.to_managed_object(args[2])); end, function(retval) return retval; end); init_monster = function(is_large) monster = {}; monster.is_large = is_large; monster.health = 0; monster.max_health = 999999; monster.health_percentage = 0; monster.missing_health = 0; monster.capture_health = 0; monster.position = { x = 0, y = 0 }; monster.name = ""; monster.size = 1; monster.small_border = 0; monster.big_border = 999; monster.crown = ""; return monster; end update_monster = function(enemy) if enemy == nil then return; end local is_boss_enemy = enemy:call("get_isBossEnemy"); if is_boss_enemy == nil then return; end local physical_param = enemy:get_field("k__BackingField"); if physical_param == nil then status = "No physical param"; return; end local vital_param = physical_param:call("getVital", 0, 0); if vital_param == nil then status = "No vital param"; return; end local health = vital_param:call("get_Current"); local max_health = vital_param:call("get_Max"); local capture_health = physical_param:call("get_CaptureHpVital"); local enemy_game_object = enemy:call("get_GameObject"); if enemy_game_object == nil then status = "No enemy game object"; return; end local enemy_transform = enemy_game_object:call("get_Transform"); if enemy_transform == nil then status = "No enemy transform"; return; end local position = enemy_transform:call("get_Position"); if not position then status = "No enemy position"; return; end local monster_list = large_monsters; if not is_boss_enemy then monster_list = small_monsters; end local monster = monster_list[enemy]; if monster == nil then monster = init_monster(is_boss_enemy); monster_list[enemy] = monster; local enemy_type = enemy:get_field("k__BackingField"); if enemy_type == nil then status = "No enemy type"; return; end local enemy_name = message_manager:call("getEnemyNameMessage", enemy_type); if enemy_name ~= nil then monster.name = enemy_name; end if is_boss_enemy then local size_info = enemy_manager:call("findEnemySizeInfo", enemy_type); if size_info ~= nil then local small_border = size_info:call("get_SmallBorder"); local big_border = size_info:call("get_BigBorder"); local king_border = size_info:call("get_KingBorder"); local size = enemy:call("get_MonsterListRegisterScale"); if small_border ~= nil then monster.small_border = small_border; end if big_border ~= nil then monster.big_border = big_border; end if king_border ~= nil then monster.king_border = king_border; end if size ~= nil then monster.size = size; end if monster.size <= monster.small_border then monster.crown = "Mini"; elseif monster.size >= monster.king_border then monster.crown = "Gold"; elseif monster.size >= monster.big_border then monster.crown = "Silver"; end end end end if health ~= nil then monster.health = health; end if max_health ~= nil then monster.max_health = max_health; end if capture_health ~= nil then monster.capture_health = capture_health; end if max_health ~= nil and health ~= nil then monster.missing_health = max_health - health; if max_health ~= 0 then monster.health_percentage = health / max_health; end end if position ~= nil then monster.position = position; end end -- #endregion ------------------------MONSTER HOOK------------------------- ----------------------SMALL MONSTER UI----------------------- -- #region small_monster_data = function() if enemy_manager == nil then status = "No enemy manager"; return; end local displayed_monsters = {}; local enemy_count = enemy_manager:call("getZakoEnemyCount"); if enemy_count == nil then status = "No enemy count"; return; end for i = 0, enemy_count - 1 do local enemy = enemy_manager:call("getZakoEnemy", i); if enemy == nil then status = "No enemy"; break end local monster = small_monsters[enemy]; if monster == nil then status = "No monster hp entry"; break end table.insert(displayed_monsters, monster); end if not config.small_monster_UI.dynamic_positioning.enabled then -- sort here if config.small_monster_UI.sorting.type == "Normal" and config.small_monster_UI.sorting.reversed_order then local reversed_monsters = {}; for i = #displayed_monsters, 1, -1 do table.insert(reversed_monsters, displayed_monsters[i]); end displayed_monsters = reversed_monsters; elseif config.small_monster_UI.sorting.type == "Health" then if config.small_monster_UI.sorting.reversed_order then table.sort(displayed_monsters, function(left, right) return left.health > right.health; end); else table.sort(displayed_monsters, function(left, right) return left.health < right.health; end); end elseif config.small_monster_UI.sorting.type == "Health Percentage" then if config.small_monster_UI.sorting.reversed_order then table.sort(displayed_monsters, function(left, right) return left.health_percentage > right.health_percentage; end); else table.sort(displayed_monsters, function(left, right) return left.health_percentage < right.health_percentage; end); end end end local i = 0; for _, monster in ipairs(displayed_monsters) do local position_on_screen; if config.small_monster_UI.dynamic_positioning.enabled then position_on_screen = draw.world_to_screen(monster.position); if position_on_screen == nil then goto continue end position_on_screen.x = position_on_screen.x + config.small_monster_UI.dynamic_positioning.viewport_offset.x; position_on_screen.y = position_on_screen.y + config.small_monster_UI.dynamic_positioning.viewport_offset.y; else position_on_screen = calculate_screen_coordinates(config.small_monster_UI.position); if config.small_monster_UI.settings.orientation == "Horizontal" then position_on_screen.x = position_on_screen.x + config.small_monster_UI.spacing.x * i; else position_on_screen.y = position_on_screen.y + config.small_monster_UI.spacing.y * i; end end -- do return end; -- remaining health --[[ if monster.health <= monster.capture_health then remaining_health_color = monster_UI.colors.health_bar.capture_health else remaining_health_color = monster_UI.colors.health_bar.remaining_health end --]] draw_bar(config.small_monster_UI.health_bar, position_on_screen, monster.health_percentage); draw_label(config.small_monster_UI.monster_name_label, position_on_screen, monster.name); draw_label(config.small_monster_UI.health_label, position_on_screen); draw_label(config.small_monster_UI.health_value_label, position_on_screen, monster.health, monster.max_health); draw_label(config.small_monster_UI.health_percentage_label, position_on_screen, 100 * monster.health_percentage); i = i + 1; ::continue:: end end -- #endregion ----------------------SMALL MONSTER UI----------------------- ----------------------LARGE MONSTER UI----------------------- -- #region large_monster_data = function() if enemy_manager == nil then status = "No enemy manager"; return; end local displayed_monsters = {}; local enemy_count = enemy_manager:call("getBossEnemyCount"); if enemy_count == nil then status = "No enemy count"; return; end for i = 0, enemy_count - 1 do local enemy = enemy_manager:call("getBossEnemy", i); if enemy == nil then status = "No enemy"; break end local monster = large_monsters[enemy]; if monster == nil then status = "No monster hp entry"; break end table.insert(displayed_monsters, monster); end if not config.large_monster_UI.dynamic_positioning.enabled then -- sort here if config.large_monster_UI.sorting.type == "Normal" and config.large_monster_UI.sorting.reversed_order then local reversed_monsters = {}; for i = #displayed_monsters, 1, -1 do table.insert(reversed_monsters, displayed_monsters[i]); end displayed_monsters = reversed_monsters; elseif config.large_monster_UI.sorting.type == "Health" then if config.large_monster_UI.sorting.reversed_order then table.sort(displayed_monsters, function(left, right) return left.health > right.health; end); else table.sort(displayed_monsters, function(left, right) return left.health < right.health; end); end elseif config.large_monster_UI.sorting.type == "Health Percentage" then if config.large_monster_UI.sorting.reversed_order then table.sort(displayed_monsters, function(left, right) return left.health_percentage > right.health_percentage; end); else table.sort(displayed_monsters, function(left, right) return left.health_percentage < right.health_percentage; end); end end end local i = 0; for _, monster in ipairs(displayed_monsters) do local position_on_screen; if config.large_monster_UI.dynamic_positioning.enabled then position_on_screen = draw.world_to_screen(monster.position); if position_on_screen == nil then goto continue end position_on_screen.x = position_on_screen.x + config.large_monster_UI.dynamic_positioning.viewport_offset.x; position_on_screen.y = position_on_screen.y + config.large_monster_UI.dynamic_positioning.viewport_offset.y; else position_on_screen = calculate_screen_coordinates(config.large_monster_UI.position); if config.large_monster_UI.settings.orientation == "Horizontal" then position_on_screen.x = position_on_screen.x + config.large_monster_UI.spacing.x * i; else position_on_screen.y = position_on_screen.y + config.large_monster_UI.spacing.y * i; end end -- remaining health --[[ if monster.health <= monster.capture_health then remaining_health_color = monster_UI.colors.health_bar.capture_health else remaining_health_color = monster_UI.colors.health_bar.remaining_health end --]] draw_bar(config.large_monster_UI.health_bar, position_on_screen, monster.health_percentage); local monster_name_text = ""; if config.large_monster_UI.monster_name_label.include.monster_name then monster_name_text = string.format("%s ", monster.name); end if config.large_monster_UI.monster_name_label.include.crown and monster.crown ~= "" then monster_name_text = monster_name_text .. string.format("%s ", monster.crown); end if config.large_monster_UI.monster_name_label.include.size then monster_name_text = monster_name_text .. string.format("#%.0f ", 100 * monster.size); end if config.large_monster_UI.monster_name_label.include.scrown_thresholds then monster_name_text = monster_name_text .. string.format("<=%.0f >=%.0f >=%.0f", 100 * monster.small_border, 100 * monster.big_border, 100 * monster.king_border); end draw_label(config.large_monster_UI.monster_name_label, position_on_screen, monster_name_text); draw_label(config.large_monster_UI.health_label, position_on_screen); draw_label(config.large_monster_UI.health_value_label, position_on_screen, monster.health, monster.max_health); draw_label(config.large_monster_UI.health_percentage_label, position_on_screen, 100 * monster.health_percentage); i = i + 1; ::continue:: end end -- #endregion ----------------------LARGE MONSTER UI----------------------- ---------------------------TIME UI--------------------------- -- #region quest_time = function() if quest_manager == nil then status = "No quest manager"; return; end local quest_time_elapsed_minutes = quest_manager:call("getQuestElapsedTimeMin"); if quest_time_elapsed_minutes == nil then status = "No quest time elapsed minutes"; return; end local quest_time_total_elapsed_seconds = quest_manager:call("getQuestElapsedTimeSec"); if quest_time_total_elapsed_seconds == nil then status = "No quest time total elapsed seconds"; return; end if quest_time_total_elapsed_seconds == 0 then return; end local quest_time_elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60; local position_on_screen = calculate_screen_coordinates(config.time_UI.position); draw_label(config.time_UI.time_label, position_on_screen, quest_time_elapsed_minutes, quest_time_elapsed_seconds); end -- #endregion ---------------------------TIME UI--------------------------- -------------------------DAMAGE HOOK------------------------- -- #region local enemy_character_base_after_calc_damage_damage_side = enemy_character_base_type_def:get_method( "afterCalcDamage_DamageSide"); sdk.hook(enemy_character_base_after_calc_damage_damage_side, function(args) local enemy = sdk.to_managed_object(args[2]); if enemy == nil then return; end local is_boss_enemy = enemy:call("get_isBossEnemy"); if is_boss_enemy == nil then return; end if not config.damage_meter_UI.tracked_monster_types.small_monsters and is_boss_enemy then return; end if not config.damage_meter_UI.tracked_monster_types.large_monsters and not is_boss_enemy then return; end local dead_or_captured = enemy:call("checkDie"); if dead_or_captured == nil then return; end if dead_or_captured then return; end local enemy_calc_damage_info = sdk.to_managed_object(args[3]); -- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide local attacker_id = enemy_calc_damage_info:call("get_AttackerID"); local attacker_type = enemy_calc_damage_info:call("get_DamageAttackerType"); if attacker_id >= 100 then return; end -- 4 is virtual player in singleplayer that 'owns' 2nd otomo if not is_quest_online and attacker_id == 4 then attacker_id = master_player_id; end local damage_object = {} damage_object.total_damage = enemy_calc_damage_info:call("get_TotalDamage"); damage_object.physical_damage = enemy_calc_damage_info:call("get_PhysicalDamage"); damage_object.elemental_damage = enemy_calc_damage_info:call("get_ElementDamage"); damage_object.ailment_damage = enemy_calc_damage_info:call("get_ConditionDamage"); -- -1 - bombs -- 0 - player -- 9 - kunai -- 11 - wyverblast -- 12 - ballista -- 13 - cannon -- 14 - machine cannon -- 16 - defender ballista/cannon -- 17 - wyvernfire artillery -- 18 - dragonator -- 19 - otomo -- 23 - monster local damage_source_type = tostring(attacker_type); if attacker_type == 0 then damage_source_type = "player"; elseif attacker_type == 1 then damage_source_type = "bomb"; elseif attacker_type == 9 then damage_source_type = "kunai"; elseif attacker_type == 11 then damage_source_type = "wyvernblast"; elseif attacker_type == 12 or attacker_type == 13 or attacker_type == 14 or attacker_type == 18 then damage_source_type = "installation"; elseif attacker_type == 19 then damage_source_type = "otomo"; elseif attacker_type == 23 then damage_source_type = "monster"; end local player = get_player(attacker_id); if player == nil then return; end -- x = x.. string.format("[attacker] %d [type] %s [dmg] %d", attacker_id, damage_source_type, damage_object.total_damage); update_player_damage(total, damage_source_type, damage_object); update_player_damage(player, damage_source_type, damage_object); end, function(retval) return retval; end); init_player = function(player_id, player_name, player_hunter_rank) local player = {}; player.id = player_id; player.name = player_name; player.hunter_rank = player_hunter_rank; player.total_damage = 0; player.physical_damage = 0; player.elemental_damage = 0; player.ailment_damage = 0; player.bombs = {}; player.bombs.total_damage = 0; player.bombs.physical_damage = 0; player.bombs.elemental_damage = 0; player.bombs.ailment_damage = 0; player.kunai = {}; player.kunai.total_damage = 0; player.kunai.physical_damage = 0; player.kunai.elemental_damage = 0; player.kunai.ailment_damage = 0; player.installations = {}; player.installations.total_damage = 0; player.installations.physical_damage = 0; player.installations.elemental_damage = 0; player.installations.ailment_damage = 0; player.otomo = {}; player.otomo.total_damage = 0; player.otomo.physical_damage = 0; player.otomo.elemental_damage = 0; player.otomo.ailment_damage = 0; player.monster = {}; player.monster.total_damage = 0; player.monster.physical_damage = 0; player.monster.elemental_damage = 0; player.monster.ailment_damage = 0; player.display = {}; player.display.total_damage = 0; player.display.physical_damage = 0; player.display.elemental_damage = 0; player.display.ailment_damage = 0; return player; end get_player = function(player_id) if players[player_id] == nil then return nil; end return players[player_id]; end update_player_damage = function(player, damage_source_type, damage_object) if player == nil then return; end if damage_source_type == "player" then merge_damage(player, damage_object); elseif damage_source_type == "bomb" then merge_damage(player.bombs, damage_object); elseif damage_source_type == "kunai" then merge_damage(player.kunai, damage_object); elseif damage_source_type == "wyvernblast" then merge_damage(player, damage_object); elseif damage_source_type == "installation" then merge_damage(player.installations, damage_object); elseif damage_source_type == "otomo" then merge_damage(player.otomo, damage_object); elseif damage_source_type == "monster" then merge_damage(player.monster, damage_object); else merge_damage(player, damage_object); end update_player_display(player); end update_player_display = function(player) if player == nil then return; end player.display.total_damage = 0; player.display.physical_damage = 0; player.display.elemental_damage = 0; player.display.ailment_damage = 0; if config.damage_meter_UI.tracked_damage_types.player_damage then merge_damage(player.display, player); end if config.damage_meter_UI.tracked_damage_types.bomb_damage then merge_damage(player.display, player.bombs); end if config.damage_meter_UI.tracked_damage_types.kunai_damage then merge_damage(player.display, player.kunai); end if config.damage_meter_UI.tracked_damage_types.installation_damage then merge_damage(player.display, player.installations); end if config.damage_meter_UI.tracked_damage_types.otomo_damage then merge_damage(player.display, player.otomo); end if config.damage_meter_UI.tracked_damage_types.monster_damage then merge_damage(player.display, player.monster); end end merge_damage = function(first, second) first.total_damage = first.total_damage + second.total_damage; first.physical_damage = first.physical_damage + second.physical_damage; first.elemental_damage = first.elemental_damage + second.elemental_damage; first.ailment_damage = first.ailment_damage + second.ailment_damage; end -- #endregion -------------------------DAMAGE HOOK------------------------- -----------------------DAMAGE METER UI----------------------- -- #region damage_meter = function() if total.display.total_damage == 0 and config.damage_meter_UI.settings.hide_module_if_total_damage_is_zero then return; end if lobby_manager == nil then status = "No lobby manager"; return; end if progress_manager == nil then status = "No progress manager"; return; end is_quest_online = lobby_manager:call("IsQuestOnline"); if is_quest_online == nil then is_quest_online = false; end -- myself player local myself_player_info = lobby_manager:get_field("_myHunterInfo"); if myself_player_info == nil then status = "No myself player info list"; return; end local myself_player_name = myself_player_info:get_field("_name"); if myself_player_name == nil then status = "No myself player name"; return; end master_player_id = 0; if is_quest_online then master_player_id = lobby_manager:get_field("_myselfQuestIndex"); if master_player_id == nil then status = "No myself player id"; return; end else master_player_id = lobby_manager:get_field("_myselfIndex"); if master_player_id == nil then status = "No myself player id"; return; end end local myself_hunter_rank = progress_manager:call("get_HunterRank"); if myself_hunter_rank == nil then status = "No myself hunter rank"; myself_hunter_rank = 0; end if players[master_player_id] == nil then players[master_player_id] = init_player(master_player_id, myself_player_name, myself_hunter_rank); end local quest_players = {}; if quest_status > 2 then quest_players = last_displayed_players; else -- other players local player_info_list = lobby_manager:get_field("_questHunterInfo"); if player_info_list == nil then status = "No player info list"; end local count = player_info_list:call("get_Count"); if count == nil then status = "No player info list count"; return; end for i = 0, count - 1 do local player_info = player_info_list:call("get_Item", i); if player_info == nil then goto continue end local player_id = player_info:get_field("_memberIndex"); if player_id == nil then goto continue end local player_hunter_rank = player_info:get_field("_hunterRank"); if player_hunter_rank == nil then goto continue end if player_id == master_player_id and config.damage_meter_UI.settings.my_damage_bar_location ~= "Normal" then players[master_player_id].hunter_rank = player_hunter_rank; goto continue end local player_name = player_info:get_field("_name"); if player_name == nil then goto continue end if players[player_id] == nil then players[player_id] = init_player(player_id, player_name, player_hunter_rank); elseif players[player_id].name ~= player_name then players[player_id] = init_player(player_id, player_name, player_hunter_rank); end table.insert(quest_players, players[player_id]); ::continue:: end -- sort here if config.damage_meter_UI.sorting.type == "Normal" and config.damage_meter_UI.sorting.reversed_order then local reversed_quest_players = {}; for i = #quest_players, 1, -1 do table.insert(reversed_quest_players, quest_players[i]); end quest_players = reversed_quest_players; elseif config.damage_meter_UI.sorting.type == "Damage" then if config.damage_meter_UI.sorting.reversed_order then table.sort(quest_players, function(left, right) return left.display.total_damage < right.display.total_damage; end); else table.sort(quest_players, function(left, right) return left.display.total_damage > right.display.total_damage; end); end end if config.damage_meter_UI.settings.my_damage_bar_location == "First" then table.insert(quest_players, 1, players[master_player_id]); elseif config.damage_meter_UI.settings.my_damage_bar_location == "Last" then table.insert(quest_players, #quest_players + 1, players[master_player_id]); elseif #quest_players == 0 then table.insert(quest_players, 1, players[master_player_id]); end last_displayed_players = quest_players; end local top_damage = 0; for _, player in ipairs(quest_players) do if player.display.total_damage > top_damage then top_damage = player.display.total_damage; end end -- draw local position_on_screen = calculate_screen_coordinates(config.damage_meter_UI.position); for _, player in ipairs(quest_players) do if player.display.total_damage == 0 and config.damage_meter_UI.settings.hide_player_if_player_damage_is_zero then goto continue1 end local player_damage_percentage = 0; if total.display.total_damage ~= 0 then player_damage_percentage = player.display.total_damage / total.display.total_damage; end local player_damage_bar_percentage = 0; if config.damage_meter_UI.settings.damage_bar_relative_to == "Total Damage" then if total.display.total_damage ~= 0 then player_damage_bar_percentage = player.display.total_damage / total.display.total_damage; end else if top_damage ~= 0 then player_damage_bar_percentage = player.display.total_damage / top_damage; end end if player.id == master_player_id and config.damage_meter_UI.settings.highlighted_bar == "Me" then draw_bar(config.damage_meter_UI.highlighted_damage_bar, position_on_screen, player_damage_bar_percentage); elseif config.damage_meter_UI.settings.highlighted_bar == "Top Damage" and player.display.total_damage == top_damage then draw_bar(config.damage_meter_UI.highlighted_damage_bar, position_on_screen, player_damage_bar_percentage); else draw_bar(config.damage_meter_UI.damage_bar, position_on_screen, player_damage_bar_percentage); end local player_name_text = ""; local player_include = config.damage_meter_UI.player_name_label.include.others; if player.id == master_player_id then player_include = config.damage_meter_UI.player_name_label.include.myself; end if player_include.hunter_rank then player_name_text = string.format("[%d] ", player.hunter_rank); end if player_include.word_player then player_name_text = player_name_text .. "Player "; end if player_include.player_id then player_name_text = player_name_text .. string.format("%d ", player.id); end if player_include.player_name then player_name_text = player_name_text .. player.name; end draw_label(config.damage_meter_UI.player_name_label, position_on_screen, player_name_text); draw_label(config.damage_meter_UI.damage_value_label, position_on_screen, player.display.total_damage); draw_label(config.damage_meter_UI.damage_percentage_label, position_on_screen, 100 * player_damage_percentage); if config.damage_meter_UI.settings.orientation == "Horizontal" then position_on_screen.x = position_on_screen.x + config.damage_meter_UI.spacing.x; else position_on_screen.y = position_on_screen.y + config.damage_meter_UI.spacing.y; end ::continue1:: end -- draw total damage if not config.damage_meter_UI.settings.total_damage_offset_is_relative then position_on_screen = calculate_screen_coordinates(config.damage_meter_UI.position); end draw_label(config.damage_meter_UI.total_damage_label, position_on_screen); draw_label(config.damage_meter_UI.total_damage_value_label, position_on_screen, total.display.total_damage); end -- #endregion -----------------------DAMAGE METER UI----------------------- -- #region if not init() then return; end -- #endregion