From 575b46c70da563891ba1c0469778c540f823098c Mon Sep 17 00:00:00 2001 From: GreenComfyTea Date: Mon, 2 Jan 2023 11:46:10 +0200 Subject: [PATCH] Added Buddies to Damage Meter UI --- reframework/autorun/MHR_Overlay.lua | 9 +- .../MHR_Overlay/Damage_Meter/damage_hook.lua | 86 ++++-- .../MHR_Overlay/Damage_Meter/non_players.lua | 273 +++++++++++++++--- .../MHR_Overlay/Damage_Meter/player.lua | 254 ++++++++++++---- .../MHR_Overlay/Game_Handler/quest_status.lua | 2 - .../MHR_Overlay/Game_Handler/singletons.lua | 14 + .../autorun/MHR_Overlay/Game_Handler/time.lua | 80 ++--- .../autorun/MHR_Overlay/Misc/config.lua | 48 ++- .../autorun/MHR_Overlay/Misc/language.lua | 17 +- .../MHR_Overlay/Misc/unicode_helpers.lua | 30 +- .../UI/Modules/damage_meter_UI.lua | 114 +------- ...age_UI_entity.lua => damage_UI_entity.lua} | 129 +++++---- .../non_player_damage_UI_entity.lua | 116 -------- .../MHR_Overlay/UI/customization_menu.lua | 227 ++++++++++++--- .../data/MHR Overlay/languages/en-us.json | 12 +- .../data/MHR Overlay/languages/ja-jp.json | 11 + .../data/MHR Overlay/languages/ko-kr.json | 11 + .../data/MHR Overlay/languages/ru-ru.json | 11 + .../data/MHR Overlay/languages/zh-cn.json | 11 + .../data/MHR Overlay/languages/zh-tw.json | 11 + 20 files changed, 949 insertions(+), 517 deletions(-) rename reframework/autorun/MHR_Overlay/UI/UI_Entities/{player_damage_UI_entity.lua => damage_UI_entity.lua} (57%) delete mode 100644 reframework/autorun/MHR_Overlay/UI/UI_Entities/non_player_damage_UI_entity.lua diff --git a/reframework/autorun/MHR_Overlay.lua b/reframework/autorun/MHR_Overlay.lua index c48034e..ec6255a 100644 --- a/reframework/autorun/MHR_Overlay.lua +++ b/reframework/autorun/MHR_Overlay.lua @@ -36,8 +36,7 @@ local time_UI = require("MHR_Overlay.UI.Modules.time_UI"); local env_creature_UI = require("MHR_Overlay.UI.Modules.env_creature_UI"); local body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity"); -local player_damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.player_damage_UI_entity"); -local non_player_damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.non_player_damage_UI_entity"); +local damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity"); local health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity"); local stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity"); local rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity"); @@ -73,8 +72,7 @@ language.init_module(); config.init_module(); part_names.init_module(); -player_damage_UI_entity.init_module(); -non_player_damage_UI_entity.init_module(); +damage_UI_entity.init_module(); health_UI_entity.init_module(); stamina_UI_entity.init_module(); rage_UI_entity.init_module(); @@ -186,9 +184,6 @@ local function main_loop() --quest_status.update_is_quest_host(); time.tick(); - player.update_player_list(quest_status.index >= 2); - non_players.update_servant_list(); - if quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then local large_monster_UI_config = config.current_config.large_monster_UI; diff --git a/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua b/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua index 3b2d819..a2b6d76 100644 --- a/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua +++ b/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua @@ -83,19 +83,17 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info) end local attacker_id = get_attacker_id_method:call(enemy_calc_damage_info); + local otomo_id = attacker_id; local attacker_type = get_damage_attacker_type_method:call(enemy_calc_damage_info); local is_marionette_attack = is_marionette_attack_method:call(enemy_calc_damage_info) - -- 4 is virtual player in singleplayer that "owns" 2nd otomo - if not quest_status.is_online and attacker_id == 4 then - --attacker_id = player.myself.id; - end + local is_otomo_attack = attacker_type >= 21 and attacker_type <= 23; if is_marionette_attack then large_monster.update_all_riders(); for enemy, monster in pairs(large_monster.list) do if monster.unique_id == attacker_id then - --attacker_id = monster.rider_id; + attacker_id = monster.rider_id; break end end @@ -154,24 +152,6 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info) local damage_source_type = damage_hook.get_damage_source_type(attacker_type, is_marionette_attack); - local attacking_player = non_players.get_servant(attacker_id); - if attacking_player == nil then - attacking_player = player.get_player(attacker_id); - end - - --[[xy = xy .. "\nPlayer: " .. tostring(attacker_id) .. - " " .. tostring(attacking_player.name) .. - " Damage: " .. tostring(damage_object.total_damage) .. - " Type: (" .. tostring(attacker_type) .. - ") " .. - " Condition Damage: " .. tostring(condition_damage) .. - " Condition Type: (" .. tostring(attacker_type) .. - ") " .. tostring(condition_type); - - if string.len(xy) > 2300 then - xy = ""; - end--]] - local monster; if is_large_monster then monster = large_monster.get_monster(enemy); @@ -179,24 +159,70 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info) monster = small_monster.get_monster(enemy); end - local stun_damage = stun_damage_field:get_data(enemy_calc_damage_info); - if attacking_player ~= nil then - ailments.apply_ailment_buildup(monster, attacker_id, ailments.stun_id, stun_damage); + local attacking_player = nil; + local attacking_otomo = nil; - ailments.apply_ailment_buildup(monster, attacker_id, condition_type, condition_damage); - ailments.apply_ailment_buildup(monster, attacker_id, condition_type2, condition_damage2); - ailments.apply_ailment_buildup(monster, attacker_id, condition_type3, condition_damage3); + if not is_otomo_attack then + attacking_player = player.get_player(attacker_id); + + if attacking_player == nil then + attacking_player = non_players.get_servant(attacker_id); + end + + local stun_damage = stun_damage_field:get_data(enemy_calc_damage_info); + if attacking_player ~= nil then + ailments.apply_ailment_buildup(monster, attacker_id, ailments.stun_id, stun_damage); + + ailments.apply_ailment_buildup(monster, attacker_id, condition_type, condition_damage); + ailments.apply_ailment_buildup(monster, attacker_id, condition_type2, condition_damage2); + ailments.apply_ailment_buildup(monster, attacker_id, condition_type3, condition_damage3); + end + else + if attacker_id < 4 then + attacking_player = player.get_player(attacker_id); + attacking_otomo = non_players.get_otomo(attacker_id); + elseif attacker_id == 4 then + attacking_player = player.myself + attacking_otomo = non_players.get_otomo(non_players.my_second_otomo_id); + else + attacking_player = non_players.get_servant(attacker_id - 1); + attacking_otomo = non_players.get_otomo(attacker_id - 1); + end + + player.update_damage(attacking_otomo, damage_source_type, is_large_monster, damage_object); end player.update_damage(player.total, damage_source_type, is_large_monster, damage_object); player.update_damage(attacking_player, damage_source_type, is_large_monster, damage_object); + + --xy = xy .. "\nPlayer: " .. tostring(attacker_id) .. + --" " .. tostring(attacking_player.name) .. + --" Damage: " .. tostring(damage_object.total_damage) .. + --" Type: (" .. tostring(attacker_type); + --") " .. + --" Condition Damage: " .. tostring(condition_damage) .. + --" Condition Type: (" .. tostring(attacker_type) .. + --") " .. tostring(condition_type); + + if is_otomo_attack then + --xy = xy .. "\nOtomo Master: " .. tostring(attacking_player.id) .. + --" " .. tostring(attacking_player.name) .. + --" Damage: " .. tostring(damage_object.total_damage); + + --xy = xy .. "\nOtomo: " .. tostring(attacking_otomo.id) .. + --" " .. tostring(attacking_otomo.name) .. + --" Damage: " .. tostring(damage_object.total_damage); + end + + if string.len(xy) > 2700 then + --xy = ""; + end end --function damage_hook.on_mystery_core_break(enemy) --end --- Coavins code function damage_hook.cart(dead_player_id, flag_cat_skill_insurance) -- flag_cat_skill_insurance = 0 -- flag_cat_skill_insurance = 1 diff --git a/reframework/autorun/MHR_Overlay/Damage_Meter/non_players.lua b/reframework/autorun/MHR_Overlay/Damage_Meter/non_players.lua index 06bf08c..187f118 100644 --- a/reframework/autorun/MHR_Overlay/Damage_Meter/non_players.lua +++ b/reframework/autorun/MHR_Overlay/Damage_Meter/non_players.lua @@ -3,23 +3,28 @@ local config; local table_helpers; local singletons; local customization_menu; -local non_player_damage_UI_entity; +local damage_UI_entity; local time; local quest_status; local drawing; local language; +local unicode_helpers; local player; non_players.servant_list = {}; non_players.otomo_list = {}; -function non_players.new(id, name, is_otomo) +non_players.my_second_otomo_id = -1; + +function non_players.new(id, name, level, is_otomo, is_servant) local non_player = {}; non_player.id = id; non_player.name = name; + non_player.level = level; non_player.is_player = false; non_player.is_otomo = is_otomo; + non_player.is_servant = is_servant; non_player.join_time = -1; non_player.first_hit_time = -1; @@ -56,9 +61,9 @@ local servant_manager_type_def = sdk.find_type_definition("snow.ai.ServantManage local get_quest_servant_id_list_method = servant_manager_type_def:get_method("getQuestServantIdList"); local get_ai_control_by_servant_id_method = servant_manager_type_def:get_method("getAIControlByServantID"); -local list_type_def = get_quest_servant_id_list_method:get_return_type(); -local get_count_method = list_type_def:get_method("get_Count"); -local get_item_method = list_type_def:get_method("get_Item"); +local servant_list_type_def = get_quest_servant_id_list_method:get_return_type(); +local servant_get_count_method = servant_list_type_def:get_method("get_Count"); +local servant_get_item_method = servant_list_type_def:get_method("get_Item"); local ai_control_type_def = get_ai_control_by_servant_id_method:get_return_type(); local get_servant_info_method = ai_control_type_def:get_method("get_ServantInfo"); @@ -67,7 +72,36 @@ local servant_info_type_def = get_servant_info_method:get_return_type(); local get_servant_name_method = servant_info_type_def:get_method("get_ServantName"); local get_servant_player_index_method = servant_info_type_def:get_method("get_ServantPlayerIndex"); +local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager"); +local quest_otomo_info_field = lobby_manager_type_def:get_field("_questOtomoInfo"); +local otomo_info_field = lobby_manager_type_def:get_field("_OtomoInfo"); + +local otomo_manager_type_def = sdk.find_type_definition("snow.otomo.OtomoManager"); +local get_master_otomo_info_method = otomo_manager_type_def:get_method("getMasterOtomoInfo"); + +local otomo_create_data_type_def = get_master_otomo_info_method:get_return_type(); +local otomo_create_data_name_field = otomo_create_data_type_def:get_field("Name"); +local otomo_create_data_level_field = otomo_create_data_type_def:get_field("Level"); + +local get_servant_otomo_list_method = otomo_manager_type_def:get_method("getServantOtomoList"); + +local otomo_list_type_def = get_servant_otomo_list_method:get_return_type(); +local otomo_get_count_method = otomo_list_type_def:get_method("get_Count"); +local otomo_get_item_method = otomo_list_type_def:get_method("get_Item"); + +local otomo_info_list_type_def = quest_otomo_info_field:get_type(); +local otomo_info_get_count_method = otomo_info_list_type_def:get_method("get_Count"); +local otomo_info_get_item_method = otomo_info_list_type_def:get_method("get_Item"); + + +local otomo_info_type_def = otomo_info_get_item_method:get_return_type(); +local otomo_info_name_field = otomo_info_type_def:get_field("_Name"); +local otomo_info_level_field = otomo_info_type_def:get_field("_Level"); +local otomo_info_order_field = otomo_info_type_def:get_field("_Order"); + function non_players.update_servant_list() + local cached_config = config.current_config.damage_meter_UI; + if singletons.servant_manager == nil then return; end @@ -77,47 +111,220 @@ function non_players.update_servant_list() return; end - local servant_count = get_count_method:call(quest_servant_id_list); + local servant_count = servant_get_count_method:call(quest_servant_id_list); if servant_count == nil then customization_menu.status = "No quest servant id list count"; return; end + for i = 0, servant_count - 1 do - local servant_id = get_item_method:call(quest_servant_id_list, i); + local servant_id = servant_get_item_method:call(quest_servant_id_list, i); if servant_id == nil then goto continue; end - local servant_name = "Follower"; - local player_id = -1; local ai_control = get_ai_control_by_servant_id_method:call(singletons.servant_manager, servant_id); - - if ai_control ~= nil then - local servant_info = get_servant_info_method:call(ai_control); - if servant_info ~= nil then - local name = get_servant_name_method:call(servant_info); - - if name ~= nil then - servant_name = name; - end + if ai_control == nil then + customization_menu.status = "No quest servant ai control"; + goto continue; + end - local id = get_servant_player_index_method:call(servant_info); - - if id == nil then - goto continue; - end + local servant_info = get_servant_info_method:call(ai_control); + if servant_info == nil then + customization_menu.status = "No quest servant info"; + goto continue; + end - player_id = id; + local name = get_servant_name_method:call(servant_info); + if name == nil then + goto continue; + end + + local id = get_servant_player_index_method:call(servant_info); + if id == nil then + goto continue; + end + + if non_players.servant_list[id] == nil then + local servant = non_players.new(id, name, 0, false, true); + non_players.servant_list[id] = servant; + end + + if not cached_config.settings.hide_servants then + table.insert(player.display_list, non_players.servant_list[id]); + end + + ::continue:: + end +end + +function non_players.update_otomo_list(is_on_quest, is_online) + if is_online then + if is_on_quest then + --non_players.update_my_otomos(); + non_players.update_otomos(quest_otomo_info_field); + else + non_players.update_otomos(otomo_info_field); + end + + + else + if is_on_quest then + non_players.update_my_otomos(); + non_players.update_servant_otomos(); + else + non_players.update_my_otomos(); + end + + end +end + +function non_players.update_my_otomos() + local cached_config = config.current_config.damage_meter_UI; + + local first_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 0); + if first_otomo ~= nil then + local name = otomo_create_data_name_field:get_data(first_otomo); + if name ~= nil and name ~= "" then + local level = otomo_create_data_level_field:get_data(first_otomo) or 0; + + if non_players.otomo_list[0] == nil then + non_players.otomo_list[0] = non_players.new(0, name, level, true, false); + end + + if cached_config.settings.show_my_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[0]); + end + end + end + + local second_otomo = get_master_otomo_info_method:call(singletons.otomo_manager, 1); + if second_otomo ~= nil then + local name = otomo_create_data_name_field:get_data(second_otomo); + if name ~= nil and name ~= "" then + local level = otomo_create_data_level_field:get_data(second_otomo) or 0; + + -- the secondary otomo is actually the 4th one! + if non_players.otomo_list[non_players.my_second_otomo_id] == nil then + non_players.otomo_list[non_players.my_second_otomo_id] = non_players.new(non_players.my_second_otomo_id, name, level, true, false); + end + + if cached_config.settings.show_my_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[non_players.my_second_otomo_id]); + end + end + end +end + +function non_players.update_servant_otomos() + local cached_config = config.current_config.damage_meter_UI; + + local servant_otomo_list = get_servant_otomo_list_method:call(singletons.otomo_manager); + if servant_otomo_list == nil then + customization_menu.status = "No servant otomo list"; + return; + end + + local count = otomo_get_count_method:call(servant_otomo_list); + if count == nil then + customization_menu.status = "No servant otomo list count"; + return; + end + + for i = 0, count - 1 do + local servant_otomo = otomo_get_item_method:call(servant_otomo_list, i); + if servant_otomo == nil then + goto continue + end + + local otomo_create_data = servant_otomo:call("get_OtCreateData"); + if otomo_create_data ~= nil then + local name = otomo_create_data_name_field:get_data(otomo_create_data); + local level = otomo_create_data_level_field:get_data(otomo_create_data) or 0; + local member_id = otomo_create_data:get_field("MemberID"); + + if name == nil then + goto continue; + end + + --name = unicode_helpers.sub(name, 13); + + if non_players.otomo_list[member_id] == nil then + non_players.otomo_list[member_id] = non_players.new(member_id, name, level, true, true); + end + + if cached_config.settings.show_servant_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[member_id]); end end - if non_players.servant_list[player_id] == nil then - local servant = non_players.new(player_id, servant_name, false); - non_players.servant_list[player_id] = servant; + ::continue:: + end + +end + +function non_players.update_otomos(otomo_info_field_) + local cached_config = config.current_config.damage_meter_UI; + + if singletons.lobby_manager == nil then + return; + end + + -- other players + local otomo_info_list = otomo_info_field_:get_data(singletons.lobby_manager); + if otomo_info_list == nil then + customization_menu.status = "No otomo info list"; + return; + end + + local count = otomo_info_get_count_method:call(otomo_info_list); + if count == nil then + customization_menu.status = "No otomo info list count"; + return; + end + + for id = 0, count - 1 do + local otomo_info = otomo_info_get_item_method:call(otomo_info_list, id); + if otomo_info == nil then + goto continue; end + local is_servant = false; + if id >= 4 then + is_servant = true; + end + + + local name = otomo_info_name_field:get_data(otomo_info); + if name == nil then + goto continue; + end + + local level = otomo_info_level_field:get_data(otomo_info) or 0; + + local otomo_in_list = non_players.otomo_list[id]; + + if otomo_in_list == nil or (otomo_in_list.name ~= name and otomo_in_list.level) then + local otomo = non_players.new(id, name, level, true, is_servant); + non_players.otomo_list[id] = otomo; + end + + if id == player.myself.id then + if cached_config.settings.show_my_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[id]); + end + elseif is_servant then + if cached_config.settings.show_servant_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[id]); + end + else + if cached_config.settings.show_other_player_otomos_separately then + table.insert(player.display_list, non_players.otomo_list[id]); + end + end + ::continue:: end end @@ -125,14 +332,13 @@ end function non_players.init_UI(non_player) local cached_config = config.current_config.damage_meter_UI; - non_player.damage_UI = non_player_damage_UI_entity.new(cached_config.damage_bar, - cached_config.highlighted_damage_bar, cached_config.player_name_label, cached_config.dps_label, - cached_config.damage_value_label, cached_config.damage_percentage_label); - + non_player.damage_UI = damage_UI_entity.new(cached_config.damage_bar, cached_config.highlighted_damage_bar, + cached_config.player_name_label, cached_config.dps_label, cached_config.master_hunter_rank_label, + cached_config.damage_value_label, cached_config.damage_percentage_label, cached_config.cart_count_label); end function non_players.draw(non_player, position_on_screen, opacity_scale, top_damage, top_dps) - non_player_damage_UI_entity.draw(non_player, position_on_screen, opacity_scale, top_damage, top_dps); + damage_UI_entity.draw(non_player, position_on_screen, opacity_scale, top_damage, top_dps); end function non_players.init_module() @@ -140,12 +346,13 @@ function non_players.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); singletons = require("MHR_Overlay.Game_Handler.singletons"); customization_menu = require("MHR_Overlay.UI.customization_menu"); - non_player_damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.non_player_damage_UI_entity"); + damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity"); time = require("MHR_Overlay.Game_Handler.time"); quest_status = require("MHR_Overlay.Game_Handler.quest_status"); drawing = require("MHR_Overlay.UI.drawing"); language = require("MHR_Overlay.Misc.language"); player = require("MHR_Overlay.Damage_Meter.player"); + unicode_helpers = require("MHR_Overlay.Misc.unicode_helpers"); non_players.init(); end diff --git a/reframework/autorun/MHR_Overlay/Damage_Meter/player.lua b/reframework/autorun/MHR_Overlay/Damage_Meter/player.lua index 503e3a1..6e49dc9 100644 --- a/reframework/autorun/MHR_Overlay/Damage_Meter/player.lua +++ b/reframework/autorun/MHR_Overlay/Damage_Meter/player.lua @@ -3,21 +3,23 @@ local config; local table_helpers; local singletons; local customization_menu; -local player_damage_UI_entity; +local damage_UI_entity; local time; local quest_status; local drawing; local language; +local non_players; player.list = {}; player.myself = nil; player.myself_position = Vector3f.new(0, 0, 0); player.total = nil; -function player.new(id, guid, name, master_rank, hunter_rank) +player.display_list = {} + +function player.new(id, name, master_rank, hunter_rank) local new_player = {}; new_player.id = id; - new_player.guid = guid; new_player.name = name; -- 齁ODO new_player.hunter_rank = hunter_rank; new_player.master_rank = master_rank; @@ -188,7 +190,42 @@ function player.update_display(_player) end if cached_config.tracked_damage_types.otomo_damage then - player.merge_damage(_player.display, _player.small_monsters.otomo); + if _player.is_otomo then + if _player.id == player.myself.id or _player.id == non_players.my_second_otomo_id then + + if cached_config.settings.show_my_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + elseif _player.is_servant then + + if cached_config.settings.show_servant_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + else + + if cached_config.settings.show_other_player_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + end + else + if _player == player.myself then + + if not cached_config.settings.show_my_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + elseif _player.is_servant then + + if not cached_config.settings.show_servant_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + else + + if not cached_config.settings.show_other_player_otomos_separately then + player.merge_damage(_player.display, _player.small_monsters.otomo); + end + end + + end end if cached_config.tracked_damage_types.wyvern_riding_damage then @@ -230,7 +267,42 @@ function player.update_display(_player) end if cached_config.tracked_damage_types.otomo_damage then - player.merge_damage(_player.display, _player.large_monsters.otomo); + if _player.is_otomo then + if _player.id == player.myself.id or _player.id == non_players.my_second_otomo_id then + + if cached_config.settings.show_my_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + elseif _player.is_servant then + + if cached_config.settings.show_servant_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + else + + if cached_config.settings.show_other_player_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + end + else + if _player == player.myself then + + if not cached_config.settings.show_my_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + elseif _player.is_servant then + + if not cached_config.settings.show_servant_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + else + + if not cached_config.settings.show_other_player_otomos_separately then + player.merge_damage(_player.display, _player.large_monsters.otomo); + end + end + + end end if cached_config.tracked_damage_types.wyvern_riding_damage then @@ -264,6 +336,99 @@ function player.merge_damage(first, second) return first; end +function player.update_dps(bypass_freeze) + local cached_config = config.current_config.damage_meter_UI.settings; + + if cached_config.freeze_dps_on_quest_end and quest_status.flow_state >= quest_status.flow_states.KILLCAM and not bypass_freeze then + return; + end + + player.total.dps = 0; + for _, _player in pairs(player.list) do + player.update_player_dps(_player); + end + + for _, servant in pairs(non_players.servant_list) do + player.update_player_dps(servant); + end + + for _, otomo in pairs(non_players.otomo_list) do + player.update_player_dps(otomo); + end +end + +function player.update_player_dps(_player) + local cached_config = config.current_config.damage_meter_UI.settings; + + if _player.join_time == -1 then + _player.join_time = time.total_elapsed_script_seconds; + end + + if cached_config.dps_mode == "Quest Time" then + if time.total_elapsed_seconds > 0 then + _player.dps = _player.display.total_damage / time.total_elapsed_seconds; + end + elseif cached_config.dps_mode == "Join Time" then + if time.total_elapsed_script_seconds - _player.join_time > 0 then + _player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.join_time); + end + elseif cached_config.dps_mode == "First Hit" then + if time.total_elapsed_script_seconds - _player.first_hit_time > 0 then + _player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.first_hit_time); + end + end + + player.total.dps = player.total.dps + _player.dps; +end + +function player.sort_players() + local cached_config = config.current_config.damage_meter_UI; + + if cached_config.settings.my_damage_bar_location == "Normal" then + table.insert(player.display_list, player.myself); + end + + -- sort here + if cached_config.sorting.type == "Normal" then + if cached_config.sorting.reversed_order then + table.sort(player.display_list, function(left, right) + return left.id > right.id; + end); + else + table.sort(player.display_list, function(left, right) + return left.id < right.id; + end); + end + elseif cached_config.sorting.type == "DPS" then + if cached_config.sorting.reversed_order then + table.sort(player.display_list, function(left, right) + return left.dps < right.dps; + end); + else + table.sort(player.display_list, function(left, right) + return left.dps > right.dps; + end); + end + else + if cached_config.sorting.reversed_order then + table.sort(player.display_list, function(left, right) + return left.display.total_damage < right.display.total_damage; + end); + else + table.sort(player.display_list, function(left, right) + return left.display.total_damage > right.display.total_damage; + end); + end + end + + if cached_config.settings.my_damage_bar_location == "First" then + table.insert(player.display_list, 1, player.myself); + + elseif cached_config.settings.my_damage_bar_location == "Last" then + table.insert(player.display_list, player.myself); + end +end + local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager"); local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer"); @@ -290,8 +455,9 @@ end function player.init() player.list = {}; - player.total = player.new(0, -2, "Total", 0, 0); - player.myself = player.new(-1, -1, "Dummy", -1, -1); + player.display_list = {}; + player.total = player.new(0, "Total", 0, 0); + player.myself = player.new(-1, "Dummy", -1, -1); end local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager"); @@ -330,6 +496,8 @@ function player.update_player_list(is_on_quest) end function player.update_player_list_(hunter_info_field_) + local cached_config = config.current_config.damage_meter_UI; + if singletons.lobby_manager == nil then return; end @@ -354,33 +522,16 @@ function player.update_player_list_(hunter_info_field_) local myself_hunter_rank = get_hunter_rank_method:call(singletons.progress_manager) or 0; local myself_master_rank = get_master_rank_method:call(singletons.progress_manager) or 0; - local myself_id = get_master_player_id_method:call(singletons.player_manager) or -1; - -- if quest_status.is_online then - -- myself_id = get_master_player_id_method:call(singletons.player_manager) or -1; - -- else - -- myself_id = myself_quest_index_field:call(singletons.lobby_manager) or -1; - -- end + local myself_id = get_master_player_id_method:call(singletons.player_manager); if myself_id == nil then customization_menu.status = "No myself player id"; return; end - local myself_guid = hunter_unique_id_field:get_data(myself_player_info); - if myself_guid == nil then - customization_menu.status = "No myself guid"; - return; - end - - -- local myself_guid_string = guid_tostring_method:call(myself_guid); - -- if myself_guid_string == nil then - -- customization_menu.status = "No myself guid string"; - -- return; - -- end - - if myself_id ~= player.myself.id then + if player.myself == nil or myself_id ~= player.myself.id then player.list[player.myself.id] = nil; - player.myself = player.new(myself_id, myself_guid, myself_player_name, myself_master_rank, myself_hunter_rank); + player.myself = player.new(myself_id, myself_player_name, myself_master_rank, myself_hunter_rank); player.list[myself_id] = player.myself; end @@ -403,43 +554,35 @@ function player.update_player_list_(hunter_info_field_) goto continue end - local player_id = member_index_field:get_data(player_info); + local id = member_index_field:get_data(player_info); - if player_id == nil then + if id == nil then goto continue end - local player_guid = hunter_unique_id_field:get_data(player_info); - if player_guid == nil then - customization_menu.status = "No player guid"; - return; - end + local hunter_rank = hunter_rank_field:get_data(player_info) or 0; + local master_rank = master_rank_field:get_data(player_info) or 0; - -- local player_guid_string = guid_tostring_method:call(player_guid); - -- if player_guid_string == nil then - -- customization_menu.status = "No player guid string"; - -- return; - -- end - - local player_hunter_rank = hunter_rank_field:get_data(player_info) or 0; - local player_master_rank = master_rank_field:get_data(player_info) or 0; - - local player_name = name_field:get_data(player_info); - if player_name == nil then + local name = name_field:get_data(player_info); + if name == nil then goto continue end - if player.list[player_id] == nil or not guid_equals_method:call(player.list[player_id].guid, player_guid) -- player.list[player_id].guid ~= player_guid - then - local _player = player.new(player_id, player_guid, player_name, player_master_rank, player_hunter_rank); - player.list[player_id] = _player; + local player_in_list = player.list[id]; - if player_name == player.myself.name and player_hunter_rank == player.myself.hunter_rank and player_master_rank == - player.myself.master_rank then - player.myself = _player; + if player_in_list == nil or (player_in_list.name ~= name and player_in_list.hunter_rank ~= hunter_rank and player_in_list.master_rank ~= master_rank) then + local _player = player.new(id, name, master_rank, hunter_rank); + player.list[id] = _player; + + if player_in_list.name == player.myself.name then + player.myself = _player end end + if player_in_list ~= player.myself then + table.insert(player.display_list, player_in_list); + end + ::continue:: end end @@ -447,7 +590,7 @@ end function player.init_UI(_player) local cached_config = config.current_config.damage_meter_UI; - _player.damage_UI = player_damage_UI_entity.new(cached_config.damage_bar, cached_config.highlighted_damage_bar, + _player.damage_UI = damage_UI_entity.new(cached_config.damage_bar, cached_config.highlighted_damage_bar, cached_config.player_name_label, cached_config.dps_label, cached_config.master_hunter_rank_label, cached_config.damage_value_label, cached_config.damage_percentage_label, cached_config.cart_count_label); end @@ -479,7 +622,7 @@ function player.init_total_UI(_player) end function player.draw(_player, position_on_screen, opacity_scale, top_damage, top_dps) - player_damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_damage, top_dps); + damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_damage, top_dps); end function player.draw_total(position_on_screen, opacity_scale) @@ -497,11 +640,12 @@ function player.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); singletons = require("MHR_Overlay.Game_Handler.singletons"); customization_menu = require("MHR_Overlay.UI.customization_menu"); - player_damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.player_damage_UI_entity"); + damage_UI_entity = require("MHR_Overlay.UI.UI_Entities.damage_UI_entity"); time = require("MHR_Overlay.Game_Handler.time"); quest_status = require("MHR_Overlay.Game_Handler.quest_status"); drawing = require("MHR_Overlay.UI.drawing"); language = require("MHR_Overlay.Misc.language"); + non_players = require("MHR_Overlay.Damage_Meter.non_players"); player.init(); end diff --git a/reframework/autorun/MHR_Overlay/Game_Handler/quest_status.lua b/reframework/autorun/MHR_Overlay/Game_Handler/quest_status.lua index 0a32e19..4197929 100644 --- a/reframework/autorun/MHR_Overlay/Game_Handler/quest_status.lua +++ b/reframework/autorun/MHR_Overlay/Game_Handler/quest_status.lua @@ -102,10 +102,8 @@ function quest_status.set_flow_state(new_flow_state) if quest_status.flow_state >= quest_status.flow_states.KILLCAM then damage_meter_UI.freeze_displayed_players = true; - quest_status.is_quest_end = true; else damage_meter_UI.freeze_displayed_players = false; - quest_status.is_quest_end = false; end if quest_status.flow_state == quest_status.flow_states.IN_LOBBY or quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then diff --git a/reframework/autorun/MHR_Overlay/Game_Handler/singletons.lua b/reframework/autorun/MHR_Overlay/Game_Handler/singletons.lua index 9533b63..c1d1055 100644 --- a/reframework/autorun/MHR_Overlay/Game_Handler/singletons.lua +++ b/reframework/autorun/MHR_Overlay/Game_Handler/singletons.lua @@ -25,6 +25,7 @@ function singletons.init() singletons.init_scene_manager(); singletons.init_game_manager(); singletons.init_servant_manager(); + singletons.init_otomo_manager(); end function singletons.init_message_manager() @@ -185,6 +186,19 @@ function singletons.init_servant_manager() return singletons.servant_manager; end +function singletons.init_otomo_manager() + if singletons.otomo_manager ~= nil then + return; + end + + singletons.otomo_manager = sdk.get_managed_singleton("snow.otomo.OtomoManager"); + if singletons.otomo_manager == nil then + --log.error("[MHR Overlay] No enemy manager"); + end + + return singletons.otomo_manager; +end + function singletons.init_module() singletons.init(); end diff --git a/reframework/autorun/MHR_Overlay/Game_Handler/time.lua b/reframework/autorun/MHR_Overlay/Game_Handler/time.lua index 65ec132..8d2e603 100644 --- a/reframework/autorun/MHR_Overlay/Game_Handler/time.lua +++ b/reframework/autorun/MHR_Overlay/Game_Handler/time.lua @@ -30,83 +30,37 @@ function time.tick() end local quest_time_elapsed_minutes = get_quest_elapsed_time_min_method:call(singletons.quest_manager); - if quest_time_elapsed_minutes == nil then + if quest_time_elapsed_minutes ~= nil then customization_menu.status = "No quest time elapsed minutes"; - return; + time.elapsed_minutes = quest_time_elapsed_minutes; end - time.elapsed_minutes = quest_time_elapsed_minutes; + local quest_time_total_elapsed_seconds = get_quest_elapsed_time_sec_method:call(singletons.quest_manager); - if quest_time_total_elapsed_seconds == nil then + if quest_time_total_elapsed_seconds ~= nil then customization_menu.status = "No quest time total elapsed seconds"; - return; + time.total_elapsed_seconds = quest_time_total_elapsed_seconds; end - time.total_elapsed_seconds = quest_time_total_elapsed_seconds; + time.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60; - if time.total_elapsed_script_seconds - time.last_elapsed_script_seconds > 1 then + if time.total_elapsed_script_seconds - time.last_elapsed_script_seconds > 0.5 then time.last_elapsed_script_seconds = time.total_elapsed_script_seconds; - time.update_players_dps(); + + local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA; + + player.display_list = {}; + player.update_player_list(is_on_quest); + non_players.update_servant_list(); + non_players.update_otomo_list(is_on_quest, quest_status.is_online); + + player.update_dps(false); + player.sort_players(); end end -function time.update_players_dps() - local cached_config = config.current_config.damage_meter_UI.settings; - - if cached_config.freeze_dps_on_quest_end and quest_status.is_quest_end then - return; - end - - local new_total_dps = 0; - for _, _player in pairs(player.list) do - if _player.join_time == -1 then - _player.join_time = time.total_elapsed_script_seconds; - end - - if cached_config.dps_mode == "Quest Time" then - if time.total_elapsed_seconds > 0 then - _player.dps = _player.display.total_damage / time.total_elapsed_seconds; - end - elseif cached_config.dps_mode == "Join Time" then - if time.total_elapsed_script_seconds - _player.join_time > 0 then - _player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.join_time); - end - elseif cached_config.dps_mode == "First Hit" then - if time.total_elapsed_script_seconds - _player.first_hit_time > 0 then - _player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.first_hit_time); - end - end - - new_total_dps = new_total_dps + _player.dps; - end - - for _, servant in pairs(non_players.servant_list) do - if servant.join_time == -1 then - servant.join_time = time.total_elapsed_script_seconds; - end - - if cached_config.dps_mode == "Quest Time" then - if time.total_elapsed_seconds > 0 then - servant.dps = servant.display.total_damage / time.total_elapsed_seconds; - end - elseif cached_config.dps_mode == "Join Time" then - if time.total_elapsed_script_seconds - servant.join_time > 0 then - servant.dps = servant.display.total_damage / (time.total_elapsed_script_seconds - servant.join_time); - end - elseif cached_config.dps_mode == "First Hit" then - if time.total_elapsed_script_seconds - servant.first_hit_time > 0 then - servant.dps = servant.display.total_damage / (time.total_elapsed_script_seconds - servant.first_hit_time); - end - end - - new_total_dps = new_total_dps + servant.dps; - end - - player.total.dps = new_total_dps; -end - function time.init_module() player = require("MHR_Overlay.Damage_Meter.player"); singletons = require("MHR_Overlay.Game_Handler.singletons"); diff --git a/reframework/autorun/MHR_Overlay/Misc/config.lua b/reframework/autorun/MHR_Overlay/Misc/config.lua index de5306f..40abc41 100644 --- a/reframework/autorun/MHR_Overlay/Misc/config.lua +++ b/reframework/autorun/MHR_Overlay/Misc/config.lua @@ -4208,6 +4208,7 @@ function config.init() hide_myself = false, hide_other_players = false, + hide_servants = false, hide_total_damage = false, hide_module_if_total_damage_is_zero = false, @@ -4218,8 +4219,10 @@ function config.init() freeze_dps_on_quest_end = true, show_my_otomos_separately = true, - show_other_otomos_separately = true, - show_followers_separately = true, + show_other_player_otomos_separately = true, + show_servant_otomos_separately = true, + + orientation = "Vertical", -- "Vertical" or "Horizontal" highlighted_bar = "Me", @@ -4263,7 +4266,36 @@ function config.init() type = false, id = false, name = true + }, + + servants = { + type = false, + id = false, + name = true + }, + + my_otomos = { + level = true, + type = false, + id = false, + name = true + }, + + other_player_otomos = { + level = true, + type = false, + id = false, + name = true + }, + + servant_otomos = { + level = true, + type = false, + id = false, + name = true } + + }, text = "%s", @@ -4295,6 +4327,18 @@ function config.init() others = { master_rank = true, hunter_rank = true + }, + + my_otomos = { + level = true, + }, + + other_player_otomos = { + level = true, + }, + + servant_otomos = { + level = true } }, diff --git a/reframework/autorun/MHR_Overlay/Misc/language.lua b/reframework/autorun/MHR_Overlay/Misc/language.lua index a57e815..bc5482b 100644 --- a/reframework/autorun/MHR_Overlay/Misc/language.lua +++ b/reframework/autorun/MHR_Overlay/Misc/language.lua @@ -317,9 +317,9 @@ language.default_language = { id = "ID", name = "Name", - show_my_otomos_separately = "Show my Buddies separately", - show_other_otomos_separately = "Show other Buddies separately", - show_followers_separately = "Show Followers separately", + show_my_otomos_separately = "Show My Buddies separately", + show_other_player_otomos_separately = "Show Other Player Buddies separately", + show_servant_otomos_separately = "Show Follower Buddies separately", dps_mode = "DPS Mode", dps = "DPS", @@ -394,6 +394,7 @@ language.default_language = { hide_myself = "Hide Myself", hide_other_players = "Hide Other Players", + hide_servants = "Hide Followers", hide_total_damage = "Hide Total Damage", player_name_size_limit = "Player Name Size Limit", @@ -433,6 +434,12 @@ language.default_language = { highest_health_percentage = "Highest Health Percentage", reframework_outdated = "Installed REFramework version is outdated. Please, update. Otherwise, MHR Overlay won't work correctly.", + + servants = "Followers", + my_otomos = "My Buddies", + other_player_otomos = "Other Player Buddies", + servant_otomos = "Servant Buddies", + level = "Level" } }; @@ -449,9 +456,7 @@ function language.load() end for i, language_file_name in ipairs(language_files) do - local language_name = language_file_name:gsub(language.language_folder, ""):gsub(".json" - , - ""); + local language_name = language_file_name:gsub(language.language_folder, ""):gsub(".json",""); local loaded_language = json.load_file(language_file_name); if loaded_language ~= nil then diff --git a/reframework/autorun/MHR_Overlay/Misc/unicode_helpers.lua b/reframework/autorun/MHR_Overlay/Misc/unicode_helpers.lua index 9aa997b..739711e 100644 --- a/reframework/autorun/MHR_Overlay/Misc/unicode_helpers.lua +++ b/reframework/autorun/MHR_Overlay/Misc/unicode_helpers.lua @@ -39,7 +39,7 @@ function unicode_helpers.map(s, f, no_subs) for b, e in s:gmatch("()" .. pattern .. "()") do i = i + 1; local c = e - b; - f(i, c, b) + f(i, c, b); end else for b, c in s:gmatch("()(" .. pattern .. ")") do @@ -51,6 +51,34 @@ end -- THE REST +-- returns the number of characters in a UTF-8 string +function unicode_helpers.len(s) + -- count the number of non-continuing bytes + return select(2, s:gsub('[^\128-\193]', '')); +end + +-- replace all utf8 chars with mapping +function unicode_helpers.replace(s, map) + return s:gsub(pattern, map); +end + +-- reverse a utf8 string +function unicode_helpers.reverse(s) + -- reverse the individual greater-than-single-byte characters + s = s:gsub(pattern,function (c) + return #c > 1 and c:reverse() + end); + + return s:reverse(); +end + +-- strip non-ascii characters from a utf8 string +function unicode_helpers.strip(s) + return s:gsub(pattern, function(c) + return #c > 1 and ''; + end); +end + -- generator for the above -- to iterate over all utf8 chars function unicode_helpers.chars(s, no_subs) return coroutine.wrap(function() diff --git a/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua b/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua index 032431e..0a8f8a2 100644 --- a/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua +++ b/reframework/autorun/MHR_Overlay/UI/Modules/damage_meter_UI.lua @@ -24,56 +24,6 @@ local get_item_method = quest_hunter_info_type_def:get_method("get_Item"); local hunter_info_type_def = sdk.find_type_definition("snow.LobbyManager.HunterInfo"); local member_index_field = hunter_info_type_def:get_field("_memberIndex"); -function damage_meter_UI.get_players(player_info_list) - local cached_config = config.current_config.damage_meter_UI; - - -- other players - if player_info_list == nil then - customization_menu.status = "No player info list"; - return {}; - end - - local quest_players = {}; - - local count = get_count_method:call(player_info_list); - - if count == nil then - customization_menu.status = "No player info list count"; - return {}; - end - - for i = 0, count - 1 do - local player_info = get_item_method:call(player_info_list, i); - - if player_info == nil then - goto continue - end - - local player_id = member_index_field:get_data(player_info); - if player_id == nil then - goto continue - end - - local _player = player.get_player(player_id); - if _player ~= nil then - if _player == player.myself and cached_config.settings.my_damage_bar_location ~= "Normal" then - goto continue - end - table.insert(quest_players, _player); - end - - ::continue:: - end - - if cached_config.settings.show_followers_separately then - for id, non_player in pairs(non_players.servant_list) do - table.insert(quest_players, non_player); - end - end - - return quest_players; -end - function damage_meter_UI.draw() local cached_config = config.current_config.damage_meter_UI; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; @@ -84,60 +34,15 @@ function damage_meter_UI.draw() local quest_players = {}; + --damage_meter_UI.freeze_displayed_players = true; + if damage_meter_UI.freeze_displayed_players and not table_helpers.is_empty(damage_meter_UI.last_displayed_players) then quest_players = damage_meter_UI.last_displayed_players; - elseif quest_status.flow_state == quest_status.flow_states.IN_LOBBY or quest_status.flow_state == quest_status.flow_states.IN_TRAINING_AREA then - local player_info_list = hunter_info_field:get_data(singletons.lobby_manager); - quest_players = damage_meter_UI.get_players(player_info_list); else - local player_info_list = quest_hunter_info_field:get_data(singletons.lobby_manager); - quest_players = damage_meter_UI.get_players(player_info_list); + quest_players = player.display_list; end - if not damage_meter_UI.freeze_displayed_players or table_helpers.is_empty(damage_meter_UI.last_displayed_players) then - if #quest_players ~= 0 then - -- sort here - if cached_config.sorting.type == "Normal" then - if cached_config.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; - end - elseif cached_config.sorting.type == "DPS" then - if cached_config.sorting.reversed_order then - table.sort(quest_players, function(left, right) - return left.dps < right.dps; - end); - else - table.sort(quest_players, function(left, right) - return left.dps > right.dps; - end); - end - else - if cached_config.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 - end - - if cached_config.settings.my_damage_bar_location == "First" then - table.insert(quest_players, 1, player.myself); - elseif cached_config.settings.my_damage_bar_location == "Last" then - table.insert(quest_players, #quest_players + 1, player.myself); - elseif #player.list == 0 then - table.insert(quest_players, player.myself); - end - - damage_meter_UI.last_displayed_players = quest_players; - end + damage_meter_UI.last_displayed_players = quest_players; local top_damage = 0; local top_dps = 0; @@ -178,6 +83,7 @@ function damage_meter_UI.draw() end for _, _player in ipairs(quest_players) do + if _player.display.total_damage == 0 and cached_config.settings.hide_player_if_player_damage_is_zero then goto continue end @@ -186,8 +92,14 @@ function damage_meter_UI.draw() if cached_config.settings.hide_myself then goto continue end - elseif cached_config.settings.hide_other_players then - goto continue + elseif _player.is_servant then + if cached_config.settings.hide_servants and not _player.is_otomo then + goto continue + end + else + if cached_config.settings.hide_other_players and not _player.is_otomo then + goto continue + end end if _player.is_player then diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/player_damage_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua similarity index 57% rename from reframework/autorun/MHR_Overlay/UI/UI_Entities/player_damage_UI_entity.lua rename to reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua index 248f158..a2d4189 100644 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/player_damage_UI_entity.lua +++ b/reframework/autorun/MHR_Overlay/UI/UI_Entities/damage_UI_entity.lua @@ -1,13 +1,14 @@ -local player_damage_UI_entity = {}; +local damage_UI_entity = {}; local table_helpers; local drawing; local config; local player; local language; local quest_status; +local non_players; -function player_damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label, hunter_rank_label, value_label, - percentage_label, cart_count_label) +function damage_UI_entity.new(bar, highlighted_bar, name_label, dps_label, + hunter_rank_label, value_label, percentage_label, cart_count_label) local entity = {}; local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; @@ -15,12 +16,12 @@ function player_damage_UI_entity.new(bar, highlighted_bar, player_name_label, dp --entity.visibility = visibility; entity.bar = table_helpers.deep_copy(bar); entity.highlighted_bar = table_helpers.deep_copy(highlighted_bar); - entity.player_name_label = table_helpers.deep_copy(player_name_label); + entity.name_label = table_helpers.deep_copy(name_label); entity.dps_label = table_helpers.deep_copy(dps_label); entity.hunter_rank_label = table_helpers.deep_copy(hunter_rank_label); - entity.cart_count_label = table_helpers.deep_copy(cart_count_label); entity.value_label = table_helpers.deep_copy(value_label); entity.percentage_label = table_helpers.deep_copy(percentage_label); + entity.cart_count_label = table_helpers.deep_copy(cart_count_label); entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier; entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier; @@ -36,8 +37,8 @@ function player_damage_UI_entity.new(bar, highlighted_bar, player_name_label, dp entity.highlighted_bar.outline.thickness = entity.highlighted_bar.outline.thickness * global_scale_modifier; entity.highlighted_bar.outline.offset = entity.highlighted_bar.outline.offset * global_scale_modifier; - entity.player_name_label.offset.x = entity.player_name_label.offset.x * global_scale_modifier; - entity.player_name_label.offset.y = entity.player_name_label.offset.y * global_scale_modifier; + entity.name_label.offset.x = entity.name_label.offset.x * global_scale_modifier; + entity.name_label.offset.y = entity.name_label.offset.y * global_scale_modifier; entity.player_name_size_limit = config.current_config.damage_meter_UI.settings.player_name_size_limit * global_scale_modifier; @@ -60,38 +61,67 @@ function player_damage_UI_entity.new(bar, highlighted_bar, player_name_label, dp return entity; end -function player_damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_damage, top_dps) +function damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_damage, top_dps) local cached_config = config.current_config.damage_meter_UI; - local player_include = cached_config.player_name_label.include.others; - if _player.id == player.myself.id then - player_include = cached_config.player_name_label.include.myself; + local name_include; + local type; + local is_myself = false; + local hunter_rank_include; + + if _player.is_player then + type = language.current_language.UI.player; + if _player.id == player.myself.id then + name_include = cached_config.player_name_label.include.myself; + hunter_rank_include = cached_config.master_hunter_rank_label.include.myself; + is_myself = true; + else + name_include = cached_config.player_name_label.include.others; + hunter_rank_include = cached_config.master_hunter_rank_label.include.others; + end + elseif _player.is_otomo then + type = language.current_language.UI.otomo; + if _player.id == player.myself.id or _player.id == non_players.my_second_otomo_id then + name_include = cached_config.player_name_label.include.my_otomos; + hunter_rank_include = cached_config.master_hunter_rank_label.include.my_otomos; + elseif _player.is_servant then + name_include = cached_config.player_name_label.include.servant_otomos; + hunter_rank_include = cached_config.master_hunter_rank_label.include.servant_otomos; + else + name_include = cached_config.player_name_label.include.other_player_otomos; + hunter_rank_include = cached_config.master_hunter_rank_label.include.other_player_otomos; + end + else + type = language.current_language.UI.servant; + name_include = cached_config.player_name_label.include.servants; end - local player_name_text = ""; + local name_text = ""; - if player_include.master_rank and player_include.hunter_rank then - player_name_text = string.format("[%d:%d] ", _player.master_rank, _player.hunter_rank); - elseif player_include.master_rank then - player_name_text = string.format("[%d] ", _player.master_rank); - elseif player_include.hunter_rank then - player_name_text = string.format("[%d] ", _player.hunter_rank); + if name_include.master_rank and name_include.hunter_rank then + name_text = string.format("[%d:%d] ", _player.master_rank, _player.hunter_rank); + elseif name_include.master_rank then + name_text = string.format("[%d] ", _player.master_rank); + elseif name_include.hunter_rank then + name_text = string.format("[%d] ", _player.hunter_rank); + elseif name_include.level then + name_text = string.format("[%d] ", _player.level); end - if player_include.cart_count and quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA then - player_name_text = player_name_text .. string.format("x%d ", _player.cart_count); + if name_include.cart_count and quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA then + name_text = name_text .. string.format("x%d ", _player.cart_count); end - if player_include.type then - player_name_text = player_name_text .. language.current_language.UI.player .. " "; + if name_include.type then + name_text = name_text .. type .. " "; end - if player_include.id then - player_name_text = player_name_text .. string.format("%d ", _player.id); + if name_include.id then + name_text = name_text .. string.format("%d ", _player.id); end - if player_include.name then - player_name_text = player_name_text .. _player.name; + if name_include.name then + name_text = name_text .. _player.name; end local player_damage_percentage = 0; @@ -110,9 +140,7 @@ function player_damage_UI_entity.draw(_player, position_on_screen, opacity_scale end end - - - if _player.id == player.myself.id and cached_config.settings.highlighted_bar == "Me" then + if is_myself and cached_config.settings.highlighted_bar == "Me" then drawing.draw_bar(_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage); elseif cached_config.settings.highlighted_bar == "Top Damage" and _player.display.total_damage == top_damage then drawing.draw_bar(_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage); @@ -122,51 +150,38 @@ function player_damage_UI_entity.draw(_player, position_on_screen, opacity_scale drawing.draw_bar(_player.damage_UI.bar, position_on_screen, opacity_scale, player_damage_bar_percentage); end - if _player.id == player.myself.id then - if _player.damage_UI.hunter_rank_label.include.myself.master_rank and - _player.damage_UI.hunter_rank_label.include.myself.hunter_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d:%d", _player.master_rank, _player.hunter_rank)); - elseif _player.damage_UI.hunter_rank_label.include.myself.master_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d", _player.master_rank)); - elseif _player.damage_UI.hunter_rank_label.include.myself.hunter_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d", _player.hunter_rank)); - end - else - if _player.damage_UI.hunter_rank_label.include.others.master_rank and - _player.damage_UI.hunter_rank_label.include.others.hunter_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d:%d", _player.master_rank, _player.hunter_rank)); - elseif _player.damage_UI.hunter_rank_label.include.others.master_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d", _player.master_rank)); - elseif _player.damage_UI.hunter_rank_label.include.others.hunter_rank then - drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, - string.format("%d", _player.hunter_rank)); + if hunter_rank_include ~= nil then + if hunter_rank_include.master_rank and hunter_rank_include.hunter_rank then + drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, string.format("%d:%d", _player.master_rank, _player.hunter_rank)); + elseif hunter_rank_include.master_rank then + drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, string.format("%d", _player.master_rank)); + elseif hunter_rank_include.hunter_rank then + drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, string.format("%d", _player.hunter_rank)); + elseif hunter_rank_include.level then + drawing.draw_label(_player.damage_UI.hunter_rank_label, position_on_screen, opacity_scale, string.format("%d", _player.level)); end end - player_name_text = drawing.limit_text_size(player_name_text, _player.damage_UI.player_name_size_limit); + name_text = drawing.limit_text_size(name_text, _player.damage_UI.player_name_size_limit); - drawing.draw_label(_player.damage_UI.player_name_label, position_on_screen, opacity_scale, player_name_text); + drawing.draw_label(_player.damage_UI.name_label, position_on_screen, opacity_scale, name_text); drawing.draw_label(_player.damage_UI.value_label, position_on_screen, opacity_scale, _player.display.total_damage); drawing.draw_label(_player.damage_UI.percentage_label, position_on_screen, opacity_scale, 100 * player_damage_percentage); drawing.draw_label(_player.damage_UI.dps_label, position_on_screen, opacity_scale, _player.dps); - if quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA then + if _player.is_player and quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA then drawing.draw_label(_player.damage_UI.cart_count_label, position_on_screen, opacity_scale, _player.cart_count); end end -function player_damage_UI_entity.init_module() +function damage_UI_entity.init_module() table_helpers = require("MHR_Overlay.Misc.table_helpers"); drawing = require("MHR_Overlay.UI.drawing"); config = require("MHR_Overlay.Misc.config"); player = require("MHR_Overlay.Damage_Meter.player"); language = require("MHR_Overlay.Misc.language"); quest_status = require("MHR_Overlay.Game_Handler.quest_status"); + non_players = require("MHR_Overlay.Damage_Meter.non_players"); end -return player_damage_UI_entity; +return damage_UI_entity; diff --git a/reframework/autorun/MHR_Overlay/UI/UI_Entities/non_player_damage_UI_entity.lua b/reframework/autorun/MHR_Overlay/UI/UI_Entities/non_player_damage_UI_entity.lua deleted file mode 100644 index 1dea7d0..0000000 --- a/reframework/autorun/MHR_Overlay/UI/UI_Entities/non_player_damage_UI_entity.lua +++ /dev/null @@ -1,116 +0,0 @@ -local non_player_damage_UI_entity = {}; -local table_helpers; -local drawing; -local config; -local player; -local language; - -function non_player_damage_UI_entity.new(bar, highlighted_bar, name_label, dps_label, value_label, percentage_label) - local entity = {}; - - local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier; - - - --entity.visibility = visibility; - entity.bar = table_helpers.deep_copy(bar); - entity.highlighted_bar = table_helpers.deep_copy(highlighted_bar); - entity.name_label = table_helpers.deep_copy(name_label); - entity.dps_label = table_helpers.deep_copy(dps_label); - entity.value_label = table_helpers.deep_copy(value_label); - entity.percentage_label = table_helpers.deep_copy(percentage_label); - - entity.bar.offset.x = entity.bar.offset.x * global_scale_modifier; - entity.bar.offset.y = entity.bar.offset.y * global_scale_modifier; - entity.bar.size.width = entity.bar.size.width * global_scale_modifier; - entity.bar.size.height = entity.bar.size.height * global_scale_modifier; - entity.bar.outline.thickness = entity.bar.outline.thickness * global_scale_modifier; - entity.bar.outline.offset = entity.bar.outline.offset * global_scale_modifier; - - entity.highlighted_bar.offset.x = entity.highlighted_bar.offset.x * global_scale_modifier; - entity.highlighted_bar.offset.y = entity.highlighted_bar.offset.y * global_scale_modifier; - entity.highlighted_bar.size.width = entity.highlighted_bar.size.width * global_scale_modifier; - entity.highlighted_bar.size.height = entity.highlighted_bar.size.height * global_scale_modifier; - entity.highlighted_bar.outline.thickness = entity.highlighted_bar.outline.thickness * global_scale_modifier; - entity.highlighted_bar.outline.offset = entity.highlighted_bar.outline.offset * global_scale_modifier; - - entity.name_label.offset.x = entity.name_label.offset.x * global_scale_modifier; - entity.name_label.offset.y = entity.name_label.offset.y * global_scale_modifier; - - entity.name_size_limit = config.current_config.damage_meter_UI.settings.player_name_size_limit * global_scale_modifier; - - entity.dps_label.offset.x = entity.dps_label.offset.x * global_scale_modifier; - entity.dps_label.offset.y = entity.dps_label.offset.y * global_scale_modifier; - - entity.value_label.offset.x = entity.value_label.offset.x * global_scale_modifier; - entity.value_label.offset.y = entity.value_label.offset.y * global_scale_modifier; - - entity.percentage_label.offset.x = entity.percentage_label.offset.x * global_scale_modifier; - entity.percentage_label.offset.y = entity.percentage_label.offset.y * global_scale_modifier; - - return entity; -end - -function non_player_damage_UI_entity.draw(non_player, position_on_screen, opacity_scale, top_damage, top_dps) - local cached_config = config.current_config.damage_meter_UI; - - local include = cached_config.player_name_label.include.others; - - local name_text = ""; - - if include.type then - if non_player.is_otomo then - name_text = name_text .. language.current_language.UI.otomo .. " "; - else - name_text = name_text .. language.current_language.UI.servant .. " "; - end - end - - if include.id then - name_text = name_text .. string.format("%d ", non_player.id); - end - - if include.name then - name_text = name_text .. non_player.name; - end - - local player_damage_percentage = 0; - if player.total.display.total_damage ~= 0 then - player_damage_percentage = non_player.display.total_damage / player.total.display.total_damage; - end - - local player_damage_bar_percentage = 0; - if cached_config.settings.damage_bar_relative_to == "Total Damage" then - if player.total.display.total_damage ~= 0 then - player_damage_bar_percentage = non_player.display.total_damage / player.total.display.total_damage; - end - else - if top_damage ~= 0 then - player_damage_bar_percentage = non_player.display.total_damage / top_damage; - end - end - - if cached_config.settings.highlighted_bar == "Top Damage" and non_player.display.total_damage == top_damage then - drawing.draw_bar(non_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage); - elseif cached_config.settings.highlighted_bar == "Top DPS" and non_player.dps == top_dps then - drawing.draw_bar(non_player.damage_UI.highlighted_bar, position_on_screen, opacity_scale, player_damage_bar_percentage); - else - drawing.draw_bar(non_player.damage_UI.bar, position_on_screen, opacity_scale, player_damage_bar_percentage); - end - - name_text = drawing.limit_text_size(name_text, non_player.damage_UI.name_size_limit); - - drawing.draw_label(non_player.damage_UI.name_label, position_on_screen, opacity_scale, name_text); - drawing.draw_label(non_player.damage_UI.value_label, position_on_screen, opacity_scale, non_player.display.total_damage); - drawing.draw_label(non_player.damage_UI.percentage_label, position_on_screen, opacity_scale, 100 * player_damage_percentage); - drawing.draw_label(non_player.damage_UI.dps_label, position_on_screen, opacity_scale, non_player.dps); -end - -function non_player_damage_UI_entity.init_module() - table_helpers = require("MHR_Overlay.Misc.table_helpers"); - drawing = require("MHR_Overlay.UI.drawing"); - config = require("MHR_Overlay.Misc.config"); - player = require("MHR_Overlay.Damage_Meter.player"); - language = require("MHR_Overlay.Misc.language"); -end - -return non_player_damage_UI_entity; diff --git a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua index a30b268..4c4cdb9 100644 --- a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua +++ b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua @@ -12,6 +12,7 @@ local part_names; local time_UI; local keyboard; local non_players; +local quest_status; local label_customization; local bar_customization; @@ -565,6 +566,10 @@ function customization_menu.draw() non_players.init_UI(servant); end + for _, otomo in pairs(non_players.otomo_list) do + non_players.init_UI(otomo); + end + player.init_total_UI(player.total); end @@ -1391,6 +1396,7 @@ end function customization_menu.draw_damage_meter_UI() local changed = false; local config_changed = false; + local damage_display_changed = false; local index = 1; if imgui.tree_node(language.current_language.customization_menu.damage_meter_UI) then @@ -1412,6 +1418,11 @@ function customization_menu.draw_damage_meter_UI() config_changed = config_changed or changed; + changed, cached_config.settings.hide_servants = imgui.checkbox( + language.current_language.customization_menu.hide_servants, cached_config.settings.hide_servants); + + config_changed = config_changed or changed; + changed, cached_config.settings.hide_total_damage = imgui.checkbox( language.current_language.customization_menu.hide_total_damage, cached_config.settings.hide_total_damage); @@ -1446,16 +1457,19 @@ function customization_menu.draw_damage_meter_UI() language.current_language.customization_menu.show_my_otomos_separately, cached_config.settings.show_my_otomos_separately); config_changed = config_changed or changed; + damage_display_changed = damage_display_changed or changed; - changed, cached_config.settings.show_other_otomos_separately = imgui.checkbox( - language.current_language.customization_menu.show_other_otomos_separately, cached_config.settings.show_other_otomos_separately); + changed, cached_config.settings.show_other_player_otomos_separately = imgui.checkbox( + language.current_language.customization_menu.show_other_player_otomos_separately, cached_config.settings.show_other_player_otomos_separately); config_changed = config_changed or changed; + damage_display_changed = damage_display_changed or changed; - changed, cached_config.settings.show_followers_separately = imgui.checkbox( - language.current_language.customization_menu.show_followers_separately, cached_config.settings.show_followers_separately); + changed, cached_config.settings.show_servant_otomos_separately = imgui.checkbox( + language.current_language.customization_menu.show_servant_otomos_separately, cached_config.settings.show_servant_otomos_separately); config_changed = config_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, index = imgui.combo( language.current_language.customization_menu.orientation, @@ -1537,99 +1551,78 @@ function customization_menu.draw_damage_meter_UI() language.current_language.customization_menu.small_monsters, cached_config.tracked_monster_types.small_monsters); config_changed = config_changed or changed; + damage_display_changed = damage_display_changed or changed; - tracked_monster_types_changed = tracked_monster_types_changed or changed; changed, cached_config.tracked_monster_types.large_monsters = imgui.checkbox( language.current_language.customization_menu.large_monsters, cached_config.tracked_monster_types.large_monsters); config_changed = config_changed or changed; - tracked_monster_types_changed = tracked_monster_types_changed or changed; - - if tracked_monster_types_changed then - for player_id, _player in pairs(player.list) do - _player.update_display(player); - end - - player.update_display(player.total); - end + damage_display_changed = damage_display_changed or changed; imgui.tree_pop(); end if imgui.tree_node(language.current_language.customization_menu.tracked_damage_types) then - local tracked_damage_types_changed = false; changed, cached_config.tracked_damage_types.player_damage = imgui.checkbox( language.current_language.customization_menu.player_damage, cached_config.tracked_damage_types.player_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.bomb_damage = imgui.checkbox( language.current_language.customization_menu.bomb_damage, cached_config.tracked_damage_types.bomb_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.kunai_damage = imgui.checkbox( language.current_language.customization_menu.kunai_damage, cached_config.tracked_damage_types.kunai_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.installation_damage = imgui.checkbox( language.current_language.customization_menu.installation_damage, cached_config.tracked_damage_types.installation_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.otomo_damage = imgui.checkbox( language.current_language.customization_menu.otomo_damage, cached_config.tracked_damage_types.otomo_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.wyvern_riding_damage = imgui.checkbox( language.current_language.customization_menu.wyvern_riding_damage, cached_config.tracked_damage_types.wyvern_riding_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.poison_damage = imgui.checkbox( language.current_language.customization_menu.poison_damage, cached_config.tracked_damage_types.poison_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.blast_damage = imgui.checkbox( language.current_language.customization_menu.blast_damage, cached_config.tracked_damage_types.blast_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.endemic_life_damage = imgui.checkbox( language.current_language.customization_menu.endemic_life_damage, cached_config.tracked_damage_types.endemic_life_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; + damage_display_changed = damage_display_changed or changed; changed, cached_config.tracked_damage_types.other_damage = imgui.checkbox( language.current_language.customization_menu.other_damage, cached_config.tracked_damage_types.other_damage); config_changed = config_changed or changed; - tracked_damage_types_changed = tracked_damage_types_changed or changed; - - if tracked_damage_types_changed then - for _, _player in pairs(player.list) do - player.update_display(_player); - end - - for _, servant in pairs(non_players.servant_list) do - player.update_display(servant); - end - - player.update_display(player.total); - end + damage_display_changed = damage_display_changed or changed; imgui.tree_pop(); end @@ -1768,6 +1761,100 @@ function customization_menu.draw_damage_meter_UI() imgui.tree_pop(); end + if imgui.tree_node(language.current_language.customization_menu.servants) then + changed, cached_config.player_name_label.include.servants.type = imgui.checkbox( + language.current_language.customization_menu.type, cached_config.player_name_label.include.servants.type); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.servants.id = imgui.checkbox( + language.current_language.customization_menu.id, cached_config.player_name_label.include.servants.id); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.servants.name = imgui.checkbox( + language.current_language.customization_menu.name, cached_config.player_name_label.include.servants.name); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.my_otomos) then + changed, cached_config.player_name_label.include.my_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.player_name_label.include.my_otomos.level); + + config_changed = config_changed or changed; + + + changed, cached_config.player_name_label.include.my_otomos.type = imgui.checkbox( + language.current_language.customization_menu.type, cached_config.player_name_label.include.my_otomos.type); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.my_otomos.id = imgui.checkbox( + language.current_language.customization_menu.id, cached_config.player_name_label.include.my_otomos.id); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.my_otomos.name = imgui.checkbox( + language.current_language.customization_menu.name, cached_config.player_name_label.include.my_otomos.name); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.other_player_otomos) then + changed, cached_config.player_name_label.include.other_player_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.player_name_label.include.other_player_otomos.level); + + config_changed = config_changed or changed; + + + changed, cached_config.player_name_label.include.other_player_otomos.type = imgui.checkbox( + language.current_language.customization_menu.type, cached_config.player_name_label.include.other_player_otomos.type); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.other_player_otomos.id = imgui.checkbox( + language.current_language.customization_menu.id, cached_config.player_name_label.include.other_player_otomos.id); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.other_player_otomos.name = imgui.checkbox( + language.current_language.customization_menu.name, cached_config.player_name_label.include.other_player_otomos.name); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.servant_otomos) then + changed, cached_config.player_name_label.include.servant_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.player_name_label.include.servant_otomos.level); + + config_changed = config_changed or changed; + + + changed, cached_config.player_name_label.include.servant_otomos.type = imgui.checkbox( + language.current_language.customization_menu.type, cached_config.player_name_label.include.servant_otomos.type); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.servant_otomos.id = imgui.checkbox( + language.current_language.customization_menu.id, cached_config.player_name_label.include.servant_otomos.id); + + config_changed = config_changed or changed; + + changed, cached_config.player_name_label.include.servant_otomos.name = imgui.checkbox( + language.current_language.customization_menu.name, cached_config.player_name_label.include.servant_otomos.name); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + imgui.tree_pop(); end @@ -1839,12 +1926,12 @@ function customization_menu.draw_damage_meter_UI() if imgui.tree_node(language.current_language.customization_menu.me) then changed, cached_config.master_hunter_rank_label.include.myself.master_rank = imgui.checkbox( - language.current_language.customization_menu.master_rank, cached_config.player_name_label.include.myself.master_rank); + language.current_language.customization_menu.master_rank, cached_config.master_hunter_rank_label.include.myself.master_rank); config_changed = config_changed or changed; changed, cached_config.master_hunter_rank_label.include.myself.hunter_rank = imgui.checkbox( - language.current_language.customization_menu.hunter_rank, cached_config.player_name_label.include.myself.hunter_rank); + language.current_language.customization_menu.hunter_rank, cached_config.master_hunter_rank_label.include.myself.hunter_rank); config_changed = config_changed or changed; @@ -1853,12 +1940,39 @@ function customization_menu.draw_damage_meter_UI() if imgui.tree_node(language.current_language.customization_menu.other_players) then changed, cached_config.master_hunter_rank_label.include.others.master_rank = imgui.checkbox( - language.current_language.customization_menu.master_rank, cached_config.player_name_label.include.others.master_rank); + language.current_language.customization_menu.master_rank, cached_config.master_hunter_rank_label.include.others.master_rank); config_changed = config_changed or changed; changed, cached_config.master_hunter_rank_label.include.others.hunter_rank = imgui.checkbox( - language.current_language.customization_menu.hunter_rank, cached_config.player_name_label.include.others.hunter_rank); + language.current_language.customization_menu.hunter_rank, cached_config.master_hunter_rank_label.include.others.hunter_rank); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.my_otomos) then + changed, cached_config.master_hunter_rank_label.include.my_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.master_hunter_rank_label.include.my_otomos.level); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.other_player_otomos) then + changed, cached_config.master_hunter_rank_label.include.other_player_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.master_hunter_rank_label.include.other_player_otomos.level); + + config_changed = config_changed or changed; + + imgui.tree_pop(); + end + + if imgui.tree_node(language.current_language.customization_menu.servant_otomos) then + changed, cached_config.master_hunter_rank_label.include.servant_otomos.level = imgui.checkbox( + language.current_language.customization_menu.level, cached_config.master_hunter_rank_label.include.servant_otomos.level); config_changed = config_changed or changed; @@ -1957,6 +2071,36 @@ function customization_menu.draw_damage_meter_UI() changed = bar_customization.draw(language.current_language.customization_menu.highlighted_damage_bar, cached_config.highlighted_damage_bar); config_changed = config_changed or changed; + if config_changed then + local is_on_quest = quest_status.flow_state ~= quest_status.flow_states.IN_LOBBY and quest_status.flow_state ~= quest_status.flow_states.IN_TRAINING_AREA; + + player.display_list = {}; + player.update_player_list(is_on_quest); + non_players.update_servant_list(); + non_players.update_otomo_list(is_on_quest, quest_status.is_online); + end + + if damage_display_changed then + for _, _player in pairs(player.list) do + player.update_display(_player); + end + + for _, servant in pairs(non_players.servant_list) do + player.update_display(servant); + end + + for _, otomo in pairs(non_players.otomo_list) do + player.update_display(otomo); + end + + player.update_display(player.total); + player.update_dps(true); + end + + if config_changed then + player.sort_players(); + end + imgui.tree_pop(); end @@ -2051,6 +2195,7 @@ function customization_menu.init_module() time_UI = require("MHR_Overlay.UI.Modules.time_UI"); keyboard = require("MHR_Overlay.Game_Handler.keyboard"); non_players = require("MHR_Overlay.Damage_Meter.non_players"); + quest_status = require("MHR_Overlay.Game_Handler.quest_status"); label_customization = require("MHR_Overlay.UI.Customizations.label_customization"); bar_customization = require("MHR_Overlay.UI.Customizations.bar_customization"); diff --git a/reframework/data/MHR Overlay/languages/en-us.json b/reframework/data/MHR Overlay/languages/en-us.json index 2236c9b..56539f6 100644 --- a/reframework/data/MHR Overlay/languages/en-us.json +++ b/reframework/data/MHR Overlay/languages/en-us.json @@ -128,6 +128,7 @@ "hide_myself": "Hide Myself", "hide_other_players": "Hide Other Players", "hide_player_if_player_damage_is_zero": "Hide Player if Player Damage is 0", + "hide_servants": "Hide Followers", "hide_total_damage": "Hide Total Damage", "hide_total_if_total_damage_is_zero": "Hide Total if Total Damage is 0", "hide_undamaged_parts": "Hide Undamaged Parts", @@ -158,6 +159,7 @@ "large_monster_static_UI": "Large Monster Static UI", "large_monsters": "Large Monsters", "last": "Last", + "level": "Level", "loading_quest": "Loading Quest", "loss_health": "Sever Health", "loss_health_percentage": "Sever Health Percentage", @@ -180,6 +182,7 @@ "monster_name": "Monster Name", "monster_name_label": "Monster Name Label", "my_damage_bar_location": "My Damage Bar Location", + "my_otomos": "My Buddies", "name": "Name", "none": "None", "normal": "Normal", @@ -188,6 +191,7 @@ "opacity_falloff": "Opacity Falloff", "orientation": "Orientation", "other_damage": "Other Damage", + "other_player_otomos": "Other Player Buddies", "other_players": "Other Players", "otomo_damage": "Buddy Damage", "outline": "Outline", @@ -219,12 +223,14 @@ "renderer": "Renderer", "reversed_order": "Reversed Order", "reward_screen": "Reward Screen", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "Settings", "severe_filter": "Severe", "shadow": "Shadow", - "show_followers_separately": "Show Followers separately", - "show_my_otomos_separately": "Show my Buddies separately", - "show_other_otomos_separately": "Show other Buddies separately", + "show_my_otomos_separately": "Show My Buddies separately", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", "size": "Size", "small_monster_UI": "Small Monster UI", "small_monsters": "Small Monsters", diff --git a/reframework/data/MHR Overlay/languages/ja-jp.json b/reframework/data/MHR Overlay/languages/ja-jp.json index 01d9536..ba9cda6 100644 --- a/reframework/data/MHR Overlay/languages/ja-jp.json +++ b/reframework/data/MHR Overlay/languages/ja-jp.json @@ -128,6 +128,7 @@ "hide_myself": "自分自身の表示を隠す", "hide_other_players": "ほかのプレイヤーの表示を隠す", "hide_player_if_player_damage_is_zero": "プレイヤーのダメージが0の場合、プレイヤーの表示を隠す", + "hide_servants": "Hide Followers", "hide_total_damage": "合計ダメージの表示を隠す", "hide_total_if_total_damage_is_zero": "合計ダメージが0の場合、合計の表示を隠す", "hide_undamaged_parts": "攻撃していない部位の表示を隠す", @@ -158,6 +159,7 @@ "large_monster_static_UI": "大型モンスターのスタティック表示UI", "large_monsters": "大型モンスター", "last": "最後", + "level": "Level", "loading_quest": "Loading Quest", "loss_health": "尻尾切断までの体力", "loss_health_percentage": "尻尾切断までの体力(%)", @@ -180,6 +182,7 @@ "monster_name": "モンスター名", "monster_name_label": "モンスター名ラベル", "my_damage_bar_location": "自身のダメージバーの場所", + "my_otomos": "My Buddies", "name": "Name", "none": "設定なし", "normal": "標準", @@ -188,6 +191,8 @@ "opacity_falloff": "透明度を上げる", "orientation": "並べ方", "other_damage": "その他のダメージ", + "other_otomos": "Other Buddies", + "other_player_otomos": "Other Player Buddies", "other_players": "他のプレイヤー", "otomo_damage": "オトモのダメージ", "outline": "Outline", @@ -219,12 +224,18 @@ "renderer": "Renderer", "reversed_order": "逆順", "reward_screen": "Reward Screen", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "設定", "severe_filter": "Severe", "shadow": "影", "show_followers_separately": "Show Followers separately", "show_my_otomos_separately": "Show my Buddies separately", "show_other_otomos_separately": "Show other Buddies separately", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", + "show_servant_separately": "Show Followers separately", + "show_servants_separately": "Show Followers separately", "size": "サイズ", "small_monster_UI": "小型モンスターUI", "small_monsters": "小型モンスター", diff --git a/reframework/data/MHR Overlay/languages/ko-kr.json b/reframework/data/MHR Overlay/languages/ko-kr.json index c761a98..4461ff9 100644 --- a/reframework/data/MHR Overlay/languages/ko-kr.json +++ b/reframework/data/MHR Overlay/languages/ko-kr.json @@ -128,6 +128,7 @@ "hide_myself": "내 정보 숨김", "hide_other_players": "다른 헌터 정보 숨김", "hide_player_if_player_damage_is_zero": "헌터 대미지가 0이면 헌터 숨김", + "hide_servants": "Hide Followers", "hide_total_damage": "모든 대미지 숨김", "hide_total_if_total_damage_is_zero": "총 대미지가 0이면 모두 숨김이 높은", "hide_undamaged_parts": "피해를 입히지 않은 부위 숨김", @@ -158,6 +159,7 @@ "large_monster_static_UI": "대형 몬스터 고정 UI", "large_monsters": "대형 몬스터", "last": "마지막", + "level": "Level", "loading_quest": "Loading Quest", "loss_health": "절단 수치", "loss_health_percentage": "절단 수치 비율", @@ -180,6 +182,7 @@ "monster_name": "몬스터명", "monster_name_label": "몬스터명 정보", "my_damage_bar_location": "내 대미지 바 위치", + "my_otomos": "My Buddies", "name": "Name", "none": "없음", "normal": "보통", @@ -188,6 +191,8 @@ "opacity_falloff": "투명도 감소", "orientation": "방향", "other_damage": "기타 대미지", + "other_otomos": "Other Buddies", + "other_player_otomos": "Other Player Buddies", "other_players": "다른 헌터", "otomo_damage": "동반자 대미지", "outline": "외곽선", @@ -219,12 +224,18 @@ "renderer": "Renderer", "reversed_order": "역순", "reward_screen": "Reward Screen", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "설정", "severe_filter": "절단", "shadow": "그림자", "show_followers_separately": "Show Followers separately", "show_my_otomos_separately": "Show my Buddies separately", "show_other_otomos_separately": "Show other Buddies separately", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", + "show_servant_separately": "Show Followers separately", + "show_servants_separately": "Show Followers separately", "size": "크기", "small_monster_UI": "소형 몬스터 UI", "small_monsters": "소형 몬스터", diff --git a/reframework/data/MHR Overlay/languages/ru-ru.json b/reframework/data/MHR Overlay/languages/ru-ru.json index d3450a3..d467e42 100644 --- a/reframework/data/MHR Overlay/languages/ru-ru.json +++ b/reframework/data/MHR Overlay/languages/ru-ru.json @@ -128,6 +128,7 @@ "hide_myself": "Скрыть себя", "hide_other_players": "Скрыть остальных игроков", "hide_player_if_player_damage_is_zero": "Скрыть игрока, если его урон равен 0", + "hide_servants": "Hide Followers", "hide_total_damage": "Скрыть общий урон", "hide_total_if_total_damage_is_zero": "Скрыть общий урон, если он равен 0", "hide_undamaged_parts": "Скрыть неповреждённые части тела", @@ -158,6 +159,7 @@ "large_monster_static_UI": "Статический интерфейс больших монстров", "large_monsters": "Большие монстры", "last": "Последний", + "level": "Level", "loading_quest": "Загрузка квеста", "loss_health": "Отсечение части", "loss_health_percentage": "Отсечение части в процентах", @@ -180,6 +182,7 @@ "monster_name": "Имя монстра", "monster_name_label": "Метка имени монстра", "my_damage_bar_location": "Позиция моей шкалы урона", + "my_otomos": "My Buddies", "name": "Name", "none": "Нет", "normal": "Обычный", @@ -188,6 +191,8 @@ "opacity_falloff": "Увеличение прозрачности от расстояния", "orientation": "Ориентация", "other_damage": "Другой урон", + "other_otomos": "Other Buddies", + "other_player_otomos": "Other Player Buddies", "other_players": "Другие игроки", "otomo_damage": "Урон от спутников", "outline": "Обводка", @@ -219,12 +224,18 @@ "renderer": "Renderer", "reversed_order": "Обратный порядок", "reward_screen": "Экран наград", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "Настройки", "severe_filter": "Отсечение", "shadow": "Тень", "show_followers_separately": "Показывать последователей отдельно", "show_my_otomos_separately": "Показывать моих спутников отдельно", "show_other_otomos_separately": "Показывать спутников других игроков отдельно", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", + "show_servant_separately": "Show Followers separately", + "show_servants_separately": "Show Followers separately", "size": "Размер", "small_monster_UI": "Интерфейс малых монстров", "small_monsters": "Малые монстры", diff --git a/reframework/data/MHR Overlay/languages/zh-cn.json b/reframework/data/MHR Overlay/languages/zh-cn.json index 22bc21c..0a764d5 100644 --- a/reframework/data/MHR Overlay/languages/zh-cn.json +++ b/reframework/data/MHR Overlay/languages/zh-cn.json @@ -128,6 +128,7 @@ "hide_myself": "Hide Myself", "hide_other_players": "Hide Other Players", "hide_player_if_player_damage_is_zero": "当玩家伤害为0时隐藏该玩家", + "hide_servants": "Hide Followers", "hide_total_damage": "Hide Total Damage", "hide_total_if_total_damage_is_zero": "当总伤害为0时隐藏总伤害", "hide_undamaged_parts": "隐藏没有受到伤害的部位", @@ -158,6 +159,7 @@ "large_monster_static_UI": "大型怪物固定UI", "large_monsters": "大型怪物群", "last": "最后", + "level": "Level", "loading_quest": "Loading Quest", "loss_health": "Sever Health", "loss_health_percentage": "Sever Health Percentage", @@ -180,6 +182,7 @@ "monster_name": "怪物名", "monster_name_label": "怪物名标签", "my_damage_bar_location": "我的伤害条位置", + "my_otomos": "My Buddies", "name": "Name", "none": "空", "normal": "正常", @@ -188,6 +191,8 @@ "opacity_falloff": "透明度增加", "orientation": "方向", "other_damage": "Other Damage", + "other_otomos": "Other Buddies", + "other_player_otomos": "Other Player Buddies", "other_players": "其他玩家", "otomo_damage": "随从伤害", "outline": "Outline", @@ -219,12 +224,18 @@ "renderer": "Renderer", "reversed_order": "逆向排序", "reward_screen": "Reward Screen", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "设定", "severe_filter": "Severe", "shadow": "阴影", "show_followers_separately": "Show Followers separately", "show_my_otomos_separately": "Show my Buddies separately", "show_other_otomos_separately": "Show other Buddies separately", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", + "show_servant_separately": "Show Followers separately", + "show_servants_separately": "Show Followers separately", "size": "大小", "small_monster_UI": "小型怪物UI", "small_monsters": "小型怪物群", diff --git a/reframework/data/MHR Overlay/languages/zh-tw.json b/reframework/data/MHR Overlay/languages/zh-tw.json index 7b5e959..8c040da 100644 --- a/reframework/data/MHR Overlay/languages/zh-tw.json +++ b/reframework/data/MHR Overlay/languages/zh-tw.json @@ -128,6 +128,7 @@ "hide_myself": "隱藏自己", "hide_other_players": "隱藏其他玩家", "hide_player_if_player_damage_is_zero": "當玩家傷害為0時,隱藏玩家傷害", + "hide_servants": "Hide Followers", "hide_total_damage": "隱藏總傷害", "hide_total_if_total_damage_is_zero": "當總傷害為0時,隱藏總傷害", "hide_undamaged_parts": "隱藏沒受到傷害的部位", @@ -158,6 +159,7 @@ "large_monster_static_UI": "大型魔物固定 UI", "large_monsters": "大型魔物群", "last": "最後", + "level": "Level", "loading_quest": "Loading Quest", "loss_health": "Sever Health", "loss_health_percentage": "Sever Health Percentage", @@ -180,6 +182,7 @@ "monster_name": "魔物名稱", "monster_name_label": "魔物名稱", "my_damage_bar_location": "我的傷害條", + "my_otomos": "My Buddies", "name": "Name", "none": "空", "normal": "正常", @@ -188,6 +191,8 @@ "opacity_falloff": "透明度提高", "orientation": "對齊方式", "other_damage": "其他傷害", + "other_otomos": "Other Buddies", + "other_player_otomos": "Other Player Buddies", "other_players": "其他玩家", "otomo_damage": "隨從傷害", "outline": "描邊", @@ -219,12 +224,18 @@ "renderer": "Renderer", "reversed_order": "反向排序", "reward_screen": "Reward Screen", + "servant_otomos": "Servant Buddies", + "servants": "Followers", "settings": "設定", "severe_filter": "Severe", "shadow": "陰影", "show_followers_separately": "Show Followers separately", "show_my_otomos_separately": "Show my Buddies separately", "show_other_otomos_separately": "Show other Buddies separately", + "show_other_player_otomos_separately": "Show Other Player Buddies separately", + "show_servant_otomos_separately": "Show Follower Buddies separately", + "show_servant_separately": "Show Followers separately", + "show_servants_separately": "Show Followers separately", "size": "大小", "small_monster_UI": "小型魔物 UI", "small_monsters": "小型魔物群",