diff --git a/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua b/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua index 4897097..ee15059 100644 --- a/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua +++ b/reframework/autorun/MHR_Overlay/Damage_Meter/damage_hook.lua @@ -50,6 +50,7 @@ local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBos local check_die_method = enemy_character_base_type_def:get_method("checkDie"); local stock_direct_marionette_finish_shoot_hit_parts_damage_method = enemy_character_base_type_def:get_method("stockDirectMarionetteFinishShootHitPartsDamage"); +local get_mystery_core_break_damage_rate_method = enemy_character_base_type_def:get_method("getMysteryCoreBreakDamageRate"); local enemy_calc_damage_info_type_def = sdk.find_type_definition("snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide"); local get_attacker_id_method = enemy_calc_damage_info_type_def:get_method("get_AttackerID"); @@ -69,7 +70,7 @@ local get_condition_type2_method = enemy_calc_damage_info_type_def:get_method("g local get_condition_damage3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage3"); local get_condition_type3_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamageType3"); -local stock_mystery_core_break_damage_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase.stockMysteryCoreBreakDamage"); +local stock_mystery_core_break_damage_method = enemy_character_base_type_def:get_method("stockMysteryCoreBreakDamage"); local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager"); @@ -81,22 +82,22 @@ local is_from_host_field = packet_quest_forfeit_type_def:get_field("_IsFromQuest function this.get_damage_source_type(damage_source_type_id, is_marionette_attack) if is_marionette_attack then - return "wyvern riding"; + return players.damage_types.wyvern_riding; elseif damage_source_type_id == 0 or damage_source_type_id == 7 or damage_source_type_id == 11 or damage_source_type_id == 13 then - return "player"; + return players.damage_types.player; elseif damage_source_type_id == 1 or damage_source_type_id == 8 then - return "bomb"; + return players.damage_types.bombs; elseif damage_source_type_id == 9 then - return "kunai"; + return players.damage_types.kunai; elseif damage_source_type_id >= 14 and damage_source_type_id <= 20 then - return "installation"; + return players.damage_types.installations; elseif damage_source_type_id >= 21 and damage_source_type_id <= 23 then - return "otomo"; + return players.damage_types.otomo; elseif damage_source_type_id >= 25 and damage_source_type_id <= 32 then - return "endemic life"; + return players.damage_types.endemic_life; end - return "other"; + return players.damage_types.other; end -- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide @@ -226,12 +227,35 @@ function this.update_damage(enemy, enemy_calc_damage_info) players.update_damage(players.total, damage_source_type, is_large_monster, damage_object); players.update_damage(player, damage_source_type, is_large_monster, damage_object); + + --[[xy = string.format( + + PhysicalPartsVitalDamage(): %s + PhysicalPartsBreakVitalDamage(): %s + PhysicalPartsLossVitalDamage(): %s + PhysicalMultiPartsVitalDamage(): %s + + ElementPartsVitalDamage(): %s + ElementPartsBreakVitalDamage(): %s + ElementPartsLossVitalDamage(): %s + ElementMultiPartsVitalDamage(): %s + + IsBreakPartsDamage(): %s + , + tostring(enemy_calc_damage_info:get_PhysicalPartsVitalDamage()), + tostring(enemy_calc_damage_info:get_PhysicalPartsBreakVitalDamage()), + tostring(enemy_calc_damage_info:get_PhysicalPartsLossVitalDamage()), + tostring(enemy_calc_damage_info:get_PhysicalMultiPartsVitalDamage()), + + tostring(enemy_calc_damage_info:get_ElementPartsVitalDamage()), + tostring(enemy_calc_damage_info:get_ElementPartsBreakVitalDamage()), + tostring(enemy_calc_damage_info:get_ElementPartsLossVitalDamage()), + tostring(enemy_calc_damage_info:get_ElementMultiPartsVitalDamage()), + + tostring(enemy_calc_damage_info:get_IsBreakPartsDamage()) + );]] end ---function damage_hook.on_mystery_core_break(enemy) - ---end - function this.cart(dead_player_id, flag_cat_skill_insurance) -- flag_cat_skill_insurance = 0 -- flag_cat_skill_insurance = 1 @@ -309,6 +333,28 @@ function this.on_stock_direct_marionette_finish_shoot_hit_parts_damage(enemy, da players.update_damage(player, damage_source_type, true, large_monster_damage_object); end +function this.on_mystery_core_break(enemy, part_id) + local monster = large_monster.get_monster(enemy); + if monster == nil then + return; + end + + local mystery_core_break_damage_rate = get_mystery_core_break_damage_rate_method:call(enemy); + if mystery_core_break_damage_rate == nil then + return; + end + + local mystery_core_break_damage = utils.math.round(mystery_core_break_damage_rate * monster.max_health); + + local damage_object = {}; + damage_object.total_damage = mystery_core_break_damage; + damage_object.physical_damage = 0; + damage_object.elemental_damage = 0; + damage_object.ailment_damage = mystery_core_break_damage; + + players.update_damage(players.total, players.damage_types.mystery_core, true, damage_object); +end + function this.init_module() quest_status = require("MHR_Overlay.Game_Handler.quest_status"); players = require("MHR_Overlay.Damage_Meter.players"); @@ -344,6 +390,20 @@ function this.init_module() return retval; end); + sdk.hook(stock_mystery_core_break_damage_method, function(args) + -- break core group is same as hit group? + -- break core group is part id which exploded + local enemy = sdk.to_managed_object(args[2]); + local break_core_group = sdk.to_int64(args[3]); + local hit_group = sdk.to_int64(args[4]); + + this.on_mystery_core_break(enemy, hit_group); + end, function(retval) + return retval; + end); + + --snow.enemy.EnemyCharacterBase.procDamageMystery(snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide) + --sdk.hook(stock_mystery_core_break_damage_type_def, function(args) -- pcall(damage_hook.on_mystery_core_break, sdk.to_managed_object(args[2])); --end, function(retval) diff --git a/reframework/autorun/MHR_Overlay/Damage_Meter/players.lua b/reframework/autorun/MHR_Overlay/Damage_Meter/players.lua index db82810..7f56abd 100644 --- a/reframework/autorun/MHR_Overlay/Damage_Meter/players.lua +++ b/reframework/autorun/MHR_Overlay/Damage_Meter/players.lua @@ -9,6 +9,7 @@ local quest_status; local drawing; local language; local non_players; +local utils; local sdk = sdk; local tostring = tostring; @@ -51,6 +52,22 @@ this.display_list = {}; this.highlighted_damage_UI = nil; +this.damage_types = { + ["player"] = "player", + ["bombs"] = "bombs", + ["kunai"] = "kunai", + ["installations"] = "installations", + ["otomo"] = "otomo", + ["wyvern_riding"] = "wyvern_riding", + ["poison"] = "poison", + ["otomo_poison"] = "otomo_poison", + ["blast"] = "blast", + ["otomo_blast"] = "otomo_blast", + ["endemic_life"] = "endemic_life", + ["mystery_core"] = "mystery_core", + ["other"] = "other" +}; + this.types = { ["myself"] = 0, ["other_player"] = 1, @@ -60,8 +77,7 @@ this.types = { ["servant_otomo"] = 16, ["total"] = 32, ["highlight"] = 64 - -} +}; function this.new(id, name, master_rank, hunter_rank, type) local player = {}; @@ -78,7 +94,7 @@ function this.new(id, name, master_rank, hunter_rank, type) player.first_hit_time = -1; player.dps = 0; - player.small_monsters = this.init_damage_sources() + player.small_monsters = this.init_damage_sources(); player.large_monsters = this.init_damage_sources(); player.display = {}; @@ -98,78 +114,15 @@ end function this.init_damage_sources() local monster_type = {}; - - monster_type.total_damage = 0; - monster_type.physical_damage = 0; - monster_type.elemental_damage = 0; - monster_type.ailment_damage = 0; - - monster_type.bombs = {}; - monster_type.bombs.total_damage = 0; - monster_type.bombs.physical_damage = 0; - monster_type.bombs.elemental_damage = 0; - monster_type.bombs.ailment_damage = 0; - - monster_type.kunai = {}; - monster_type.kunai.total_damage = 0; - monster_type.kunai.physical_damage = 0; - monster_type.kunai.elemental_damage = 0; - monster_type.kunai.ailment_damage = 0; - - monster_type.installations = {}; - monster_type.installations.total_damage = 0; - monster_type.installations.physical_damage = 0; - monster_type.installations.elemental_damage = 0; - monster_type.installations.ailment_damage = 0; - - monster_type.otomo = {}; - monster_type.otomo.total_damage = 0; - monster_type.otomo.physical_damage = 0; - monster_type.otomo.elemental_damage = 0; - monster_type.otomo.ailment_damage = 0; - - monster_type.wyvern_riding = {}; - monster_type.wyvern_riding.total_damage = 0; - monster_type.wyvern_riding.physical_damage = 0; - monster_type.wyvern_riding.elemental_damage = 0; - monster_type.wyvern_riding.ailment_damage = 0; - - monster_type.poison = {}; - monster_type.poison.total_damage = 0; - monster_type.poison.physical_damage = 0; - monster_type.poison.elemental_damage = 0; - monster_type.poison.ailment_damage = 0; - - monster_type.otomo_poison = {}; - monster_type.otomo_poison.total_damage = 0; - monster_type.otomo_poison.physical_damage = 0; - monster_type.otomo_poison.elemental_damage = 0; - monster_type.otomo_poison.ailment_damage = 0; - - - monster_type.blast = {}; - monster_type.blast.total_damage = 0; - monster_type.blast.physical_damage = 0; - monster_type.blast.elemental_damage = 0; - monster_type.blast.ailment_damage = 0; - - monster_type.otomo_blast = {}; - monster_type.otomo_blast.total_damage = 0; - monster_type.otomo_blast.physical_damage = 0; - monster_type.otomo_blast.elemental_damage = 0; - monster_type.otomo_blast.ailment_damage = 0; - - monster_type.endemic_life = {}; - monster_type.endemic_life.total_damage = 0; - monster_type.endemic_life.physical_damage = 0; - monster_type.endemic_life.elemental_damage = 0; - monster_type.endemic_life.ailment_damage = 0; - - monster_type.other = {}; - monster_type.other.total_damage = 0; - monster_type.other.physical_damage = 0; - monster_type.other.elemental_damage = 0; - monster_type.other.ailment_damage = 0; + + for damage_type_name, _ in pairs(this.damage_types) do + monster_type[damage_type_name] = { + total_damage = 0, + physical_damage = 0, + elemental_damage = 0, + ailment_damage = 0 + }; + end return monster_type; end @@ -191,37 +144,10 @@ function this.update_damage(player, damage_source_type, is_large_monster, damage player.first_hit_time = time.total_elapsed_script_seconds; end - local player_monster_type = player.small_monsters; if is_large_monster then - player_monster_type = player.large_monsters; - end - - if damage_source_type == "player" then - this.merge_damage(player_monster_type, damage_object); - elseif damage_source_type == "bomb" then - this.merge_damage(player_monster_type.bombs, damage_object); - elseif damage_source_type == "kunai" then - this.merge_damage(player_monster_type.kunai, damage_object); - elseif damage_source_type == "installation" then - this.merge_damage(player_monster_type.installations, damage_object); - elseif damage_source_type == "otomo" then - this.merge_damage(player_monster_type.otomo, damage_object); - elseif damage_source_type == "wyvern riding" then - this.merge_damage(player_monster_type.wyvern_riding, damage_object); - elseif damage_source_type == "poison" then - this.merge_damage(player_monster_type.poison, damage_object); - elseif damage_source_type == "blast" then - this.merge_damage(player_monster_type.blast, damage_object); - elseif damage_source_type == "otomo poison" then - this.merge_damage(player_monster_type.otomo_poison, damage_object); - elseif damage_source_type == "otomo blast" then - this.merge_damage(player_monster_type.otomo_blast, damage_object); - elseif damage_source_type == "endemic life" then - this.merge_damage(player_monster_type.endemic_life, damage_object); - elseif damage_source_type == "other" then - this.merge_damage(player_monster_type.other, damage_object); + this.merge_damage(player.large_monsters[damage_source_type], damage_object); else - this.merge_damage(player_monster_type, damage_object); + this.merge_damage(player.small_monsters[damage_source_type], damage_object); end this.update_display(player); @@ -251,7 +177,7 @@ function this.update_display(player) for _, monster_type in ipairs(monster_types) do if cached_config.tracked_damage_types.player_damage then - this.merge_damage(player.display, monster_type); + this.merge_damage(player.display, monster_type.player); end if cached_config.tracked_damage_types.bomb_damage then @@ -390,6 +316,10 @@ function this.update_display(player) this.merge_damage(player.display, monster_type.endemic_life); end + if cached_config.tracked_damage_types.mystery_core_damage then + this.merge_damage(player.display, monster_type.mystery_core); + end + if cached_config.tracked_damage_types.other_damage then this.merge_damage(player.display, monster_type.other); end @@ -702,6 +632,7 @@ function this.init_module() drawing = require("MHR_Overlay.UI.drawing"); language = require("MHR_Overlay.Misc.language"); non_players = require("MHR_Overlay.Damage_Meter.non_players"); + utils = require("MHR_Overlay.Misc.utils"); this.init(); end diff --git a/reframework/autorun/MHR_Overlay/Misc/config.lua b/reframework/autorun/MHR_Overlay/Misc/config.lua index 89db256..9c9c7b4 100644 --- a/reframework/autorun/MHR_Overlay/Misc/config.lua +++ b/reframework/autorun/MHR_Overlay/Misc/config.lua @@ -5927,6 +5927,7 @@ function this.init_default() poison_damage = true, blast_damage = true, endemic_life_damage = true, + mystery_core_damage = true, other_damage = true -- note that installations during narwa fight are counted as other damage }, diff --git a/reframework/autorun/MHR_Overlay/Misc/language.lua b/reframework/autorun/MHR_Overlay/Misc/language.lua index 5e87d84..4fcfed1 100644 --- a/reframework/autorun/MHR_Overlay/Misc/language.lua +++ b/reframework/autorun/MHR_Overlay/Misc/language.lua @@ -383,8 +383,12 @@ this.default_language = { installation_damage = "Installation Damage", otomo_damage = "Buddy Damage", monster_damage = "Monster Damage", + wyvern_riding_damage = "Wyvern Riding Damage", poison_damage = "Poison Damage", blast_damage = "Blast Damage", + endemic_life_damage = "Endemic Life Damage", + mystery_core_damage = "Anomaly Core Damage", + other_damage = "Other Damage", damage = "Damage", @@ -466,10 +470,6 @@ this.default_language = { master_rank = "Master Rank", - other_damage = "Other Damage", - wyvern_riding_damage = "Wyvern Riding Damage", - endemic_life_damage = "Endemic Life Damage", - hide_myself = "Hide Myself", hide_other_players = "Hide Other Players", hide_servants = "Hide Followers", diff --git a/reframework/autorun/MHR_Overlay/Monsters/ailments.lua b/reframework/autorun/MHR_Overlay/Monsters/ailments.lua index c50e7a7..5299aba 100644 --- a/reframework/autorun/MHR_Overlay/Monsters/ailments.lua +++ b/reframework/autorun/MHR_Overlay/Monsters/ailments.lua @@ -755,20 +755,20 @@ function this.apply_ailment_damage(monster, ailment_type, ailment_damage) return; end - local damage_source_type = ""; - local otomo_damage_source_type = ""; + local damage_source_type = players.damage_types.other; + local otomo_damage_source_type = players.damage_types.other; local buildup_share = monster.ailments[ailment_type].buildup_share; local otomo_buildup_share = monster.ailments[ailment_type].otomo_buildup_share; if ailment_type == this.poison_id then - damage_source_type = "poison"; - otomo_damage_source_type = "otomo poison"; + damage_source_type = players.damage_types.poison; + otomo_damage_source_type = players.damage_types.otomo_poison; buildup_share = monster.ailments[ailment_type].cached_buildup_share; otomo_buildup_share = monster.ailments[ailment_type].cached_otomo_buildup_share; elseif ailment_type == this.blast_id then - damage_source_type = "blast"; - otomo_damage_source_type = "otomo blast"; + damage_source_type = players.damage_types.blast; + otomo_damage_source_type = players.damage_types.otomo_blast; else return; end diff --git a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua index d0d617d..5bc61e0 100644 --- a/reframework/autorun/MHR_Overlay/UI/customization_menu.lua +++ b/reframework/autorun/MHR_Overlay/UI/customization_menu.lua @@ -1794,6 +1794,12 @@ function this.draw_damage_meter_UI() config_changed = config_changed or changed; damage_display_changed = damage_display_changed or changed; + changed, cached_config.tracked_damage_types.mystery_core_damage = imgui.checkbox( + language.current_language.customization_menu.mystery_core_damage, cached_config.tracked_damage_types.mystery_core_damage); + + config_changed = config_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); diff --git a/reframework/data/MHR Overlay/languages/en-us.json b/reframework/data/MHR Overlay/languages/en-us.json index d352b96..aca5225 100644 --- a/reframework/data/MHR Overlay/languages/en-us.json +++ b/reframework/data/MHR Overlay/languages/en-us.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "My Damage Bar Location", "my_otomos": "My Buddies", "myself": "Myself", + "mystery_core_damage": "Anomaly Core Damage", "name": "Name", "name_label": "Name Label", "new": "New", @@ -223,7 +224,7 @@ "other_damage": "Other Damage", "other_player_otomos": "Other Player Buddies", "other_players": "Other Players", - "otomo_damage": "Buddy Damage", + "otomo_damage": "Buddies Damage", "outline": "Outline", "outside": "Outside", "part_health": "Part Health", diff --git a/reframework/data/MHR Overlay/languages/ja-jp.json b/reframework/data/MHR Overlay/languages/ja-jp.json index 2dfe14a..032a637 100644 --- a/reframework/data/MHR Overlay/languages/ja-jp.json +++ b/reframework/data/MHR Overlay/languages/ja-jp.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "自身のダメージバーの場所", "my_otomos": "My Buddies", "myself": "Myself", + "mystery_core_damage": "Anomaly Core Damage", "name": "Name", "name_label": "Name Label", "new": "New", diff --git a/reframework/data/MHR Overlay/languages/ko-kr.json b/reframework/data/MHR Overlay/languages/ko-kr.json index 09d0d82..6af3dd6 100644 --- a/reframework/data/MHR Overlay/languages/ko-kr.json +++ b/reframework/data/MHR Overlay/languages/ko-kr.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "내 대미지 막대 위치", "my_otomos": "내 동반자", "myself": "나", + "mystery_core_damage": "Anomaly Core Damage", "name": "이름", "name_label": "이름 정보", "new": "새", diff --git a/reframework/data/MHR Overlay/languages/ru-ru.json b/reframework/data/MHR Overlay/languages/ru-ru.json index 48e144c..d2cf90d 100644 --- a/reframework/data/MHR Overlay/languages/ru-ru.json +++ b/reframework/data/MHR Overlay/languages/ru-ru.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "Позиция моей шкалы урона", "my_otomos": "Мои спутники", "myself": "Я", + "mystery_core_damage": "Anomaly Core Damage", "name": "Имя", "name_label": "Метка имени", "new": "Создать", diff --git a/reframework/data/MHR Overlay/languages/zh-cn.json b/reframework/data/MHR Overlay/languages/zh-cn.json index 5743f25..02dbd02 100644 --- a/reframework/data/MHR Overlay/languages/zh-cn.json +++ b/reframework/data/MHR Overlay/languages/zh-cn.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "我的伤害条位置", "my_otomos": "我的随从", "myself": "我自己", + "mystery_core_damage": "Anomaly Core Damage", "name": "名称", "name_label": "名字标签", "new": "新建", diff --git a/reframework/data/MHR Overlay/languages/zh-tw.json b/reframework/data/MHR Overlay/languages/zh-tw.json index 6c63f91..f2182a8 100644 --- a/reframework/data/MHR Overlay/languages/zh-tw.json +++ b/reframework/data/MHR Overlay/languages/zh-tw.json @@ -211,6 +211,7 @@ "my_damage_bar_location": "我的傷害條", "my_otomos": "My Buddies", "myself": "Myself", + "mystery_core_damage": "Anomaly Core Damage", "name": "Name", "name_label": "Name Label", "new": "New",