Add Anomaly Core Break Damage to Total Damage

This commit is contained in:
GreenComfyTea
2023-06-05 19:36:55 +03:00
parent 8bcd5e0c4a
commit 59f11c4933
12 changed files with 133 additions and 129 deletions

View File

@@ -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)

View File

@@ -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 = {};
@@ -99,77 +115,14 @@ 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

View File

@@ -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
},

View File

@@ -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",

View File

@@ -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

View File

@@ -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);

View File

@@ -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",

View File

@@ -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",

View File

@@ -211,6 +211,7 @@
"my_damage_bar_location": "내 대미지 막대 위치",
"my_otomos": "내 동반자",
"myself": "나",
"mystery_core_damage": "Anomaly Core Damage",
"name": "이름",
"name_label": "이름 정보",
"new": "새",

View File

@@ -211,6 +211,7 @@
"my_damage_bar_location": "Позиция моей шкалы урона",
"my_otomos": "Мои спутники",
"myself": "Я",
"mystery_core_damage": "Anomaly Core Damage",
"name": "Имя",
"name_label": "Метка имени",
"new": "Создать",

View File

@@ -211,6 +211,7 @@
"my_damage_bar_location": "我的伤害条位置",
"my_otomos": "我的随从",
"myself": "我自己",
"mystery_core_damage": "Anomaly Core Damage",
"name": "名称",
"name_label": "名字标签",
"new": "新建",

View File

@@ -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",