local this = {}; local buffs; local buff_UI_entity; local config; local singletons; local players; local utils; local language; local error_handler; local sdk = sdk; local tostring = tostring; local pairs = pairs; local ipairs = ipairs; local tonumber = tonumber; local require = require; local pcall = pcall; local table = table; local string = string; local Vector3f = Vector3f; local d2d = d2d; local math = math; local json = json; local log = log; local fs = fs; local next = next; local type = type; local setmetatable = setmetatable; local getmetatable = getmetatable; local assert = assert; local select = select; local coroutine = coroutine; local utf8 = utf8; local re = re; local imgui = imgui; local draw = draw; local Vector2f = Vector2f; local reframework = reframework; local os = os; local ValueType = ValueType; local package = package; this.list = { dango_adrenaline = nil, dango_booster = nil, dango_bulker = nil, dango_insurance = nil, dango_insurance_defense_up = nil, dango_glutton = nil, dango_flyer = nil, dango_defender = nil, dango_hunter = nil, dango_connector = nil, super_recovery_dango = nil }; local dango_ids = { dango_polisher = 1, dango_rider = 2, dango_adrenaline = 3, dango_carver_lo = 4, dango_carver_hi = 5, dango_medic_lo = 6, dango_medic_hi = 7, dango_fighter = 8, dango_pyro = 9, dango_specialist = 10, dango_defender_lo = 11, dango_defender_hi = 12, dango_harvester = 13, dango_marksman = 14, dango_fortune_caller = 15, dango_miracle_worker = 16, dango_deflector = 17, dango_weakener = 18, dango_calculator = 19, dango_temper = 20, dango_wall_runner = 21, dango_slugger = 22, dango_money_maker = 23, dango_bombardier = 24, dango_moxie = 25, dango_immunizer = 26, dango_trainer = 27, dango_booster = 28, dango_feet = 29, dango_bulker = 30, dango_insurance = 31, dango_reviver = 32, dango_summoner = 33, dango_hurler = 34, dango_fire_res_lo = 35, dango_fire_res_hi = 36, dango_water_res_lo = 37, dango_water_res_hi = 38, dango_thunder_res_lo = 39, dango_thunder_res_hi = 40, dango_ice_res_lo = 41, dango_ice_res_hi = 42, dango_dragon_res_lo = 43, dango_dragon_res_hi = 44, dango_gatherer = 45, dango_glutton = 46, dango_bird_caller = 47, dango_flyer = 48, dango_defender = 49, enhanced_dango_fighter = 50, dango_driver = 51, dango_hunter = 52, dango_guard = 53, dango_shifter = 54, dango_connector = 55, super_recovery_dango = 56 }; this.is_dango_adrenaline_active = false; local dangos_type_name = "dangos"; local dango_bulker_attack_up = 15; local previous_super_recovery_dango_timer = 0; local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager"); local get_player_data_method = player_manager_type_def:get_method("get_PlayerData"); local get_player_skill_method = player_manager_type_def:get_method("get_PlayerSkill"); local get_ref_item_parameter_method = player_manager_type_def:get_method("get_RefItemParameter"); local player_user_data_item_parameter_type_def = get_ref_item_parameter_method:get_return_type(); local player_data_type_def = sdk.find_type_definition("snow.player.PlayerData"); -- Dango Defender local is_enable_kitchen_skill_048_reduce_method = player_data_type_def:get_field("_IsEnable_KitchenSkill048_Reduce"); -- Dango Booster local kitchen_skill_027_timer_field = player_data_type_def:get_field("_KitchenSkill027Timer"); -- Dango Glutton local kitchen_skill_045_timer_field = player_data_type_def:get_field("_KitchenSkill045Timer"); -- Dango Bulker local atk_up_buff_second_field = player_data_type_def:get_field("_AtkUpBuffSecond"); local atk_up_buff_second_timer_field = player_data_type_def:get_field("_AtkUpBuffSecondTimer"); -- Dango Insurance local kitchen_skill_insurance_def_up_lv3_field = player_data_type_def:get_field("_KitchenSkill_Insurance_DefUp_Lv3"); local kitchen_skill_insurance_def_up_lv4_field = player_data_type_def:get_field("_KitchenSkill_Insurance_DefUp_Lv4"); -- Dango Hunter local kitchen_skill_051_atk_up_timer_field = player_data_type_def:get_field("_KitchenSkill051_AtkUpTimer"); -- Dango Connector local kitchen_skill_054_timer_field = player_data_type_def:get_field("_KitchenSkill054_Timer"); local player_base_type_def = sdk.find_type_definition("snow.player.PlayerBase"); -- Dango Adrenaline local is_kitchen_skill_predicament_powerup_method = player_base_type_def:get_method("isKitchenSkillPredicamentPowerUp"); -- Dango Flyer local get_is_kitchen_skill_wire_stop_heal_spd_method = player_base_type_def:get_method("get_IsKitchenSkill_WireStop_HealSpd"); local get_is_kitchen_skill_wire_stop_regene_method = player_base_type_def:get_method("get_IsKitchenSkill_WireStop_Regene"); -- Super Recovery Dango local get_kitchen_skill_surume_regene_timer_method = player_base_type_def:get_method("get_KitchenSkill_Surume_RegeneTimer"); local player_quest_base_type_def = sdk.find_type_definition("snow.player.PlayerQuestBase"); local player_skill_list_type_def = sdk.find_type_definition("snow.player.PlayerSkillList"); local has_kitchen_skill_method = player_skill_list_type_def:get_method("hasKitchenSkill"); local data_shortcut_type_def = sdk.find_type_definition("snow.data.DataShortcut"); local get_name_method = data_shortcut_type_def:get_method("getName(snow.data.DataDef.PlKitchenSkillId)"); local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager"); local flag_cat_skill_insurance_field = quest_manager_type_def:get_field("_FlagCatSkillInsurance"); local is_cat_skill_insurance_method = quest_manager_type_def:get_method("isCatSkillInsurance"); local system_array_type_def = sdk.find_type_definition("System.Array"); local get_length_method = system_array_type_def:get_method("get_Length"); local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)"); function this.update(player, player_data) local item_parameter = get_ref_item_parameter_method:call(singletons.player_manager); if item_parameter == nil then error_handler.report("dangos.update", "Failed to access Data: item_parameter"); return; end this.update_dango_adrenaline(); this.update_dango_bulker(player_data); this.update_dango_hunter(player_data); this.update_dango_insurance(); this.update_dango_insurance_defense_up(player_data); this.update_dango_flyer(player); this.update_super_recovery_dango(player); buffs.update_generic_buff(this.list, dangos_type_name, "dango_defender", this.get_dango_name, player_data, is_enable_kitchen_skill_048_reduce_method, nil, nil, nil, nil, true); buffs.update_generic_buff(this.list, dangos_type_name, "dango_booster", this.get_dango_name, nil, nil, player_data, kitchen_skill_027_timer_field); buffs.update_generic_buff(this.list, dangos_type_name, "dango_glutton", this.get_dango_name, nil, nil, player_data, kitchen_skill_045_timer_field); buffs.update_generic_buff(this.list, dangos_type_name, "dango_connector", this.get_dango_name, nil, nil, player_data, kitchen_skill_054_timer_field); end function this.update_dango_adrenaline() if not this.is_dango_adrenaline_active then this.list.dango_adrenaline = nil; return; end buffs.update_generic(this.list, dangos_type_name, "dango_adrenaline", this.get_dango_name); end function this.update_dango_bulker(player_data) local atk_up_buff_second = atk_up_buff_second_field:get_data(player_data); if atk_up_buff_second == nil then error_handler.report("consumables.update_dango_bulker", "Failed to access Data: atk_up_buff_second"); return; end if atk_up_buff_second ~= dango_bulker_attack_up then this.list.dango_bulker = nil; return; end buffs.update_generic_buff(this.list, dangos_type_name, "dango_bulker", this.get_dango_name, nil, nil, player_data, atk_up_buff_second_timer_field); end function this.update_dango_insurance() if singletons.player_manager == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: player_manager"); return; end if singletons.quest_manager == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: quest_manager"); return; end local player_skill_list_array = get_player_skill_method:call(singletons.player_manager); if player_skill_list_array == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: player_skill_list_array"); return; end local player_skill_list_array_length = get_length_method:call(player_skill_list_array); if player_skill_list_array_length == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: player_skill_array_list_length"); return; end local length = player_skill_list_array_length - 1; local has_insurance_skill = false; for player_id = 0, length do if players.list[player_id] == nil then goto continue; end local player_skill_list = get_value_method:call(player_skill_list_array, player_id); if player_skill_list_array_length == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: player_skill_list No. " .. tostring(player_id)); goto continue; end local kitchen_skill = has_kitchen_skill_method:call(player_skill_list, dango_ids.dango_insurance); if kitchen_skill == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: kitchen_skill No. " .. tostring(player_id)); goto continue; end if kitchen_skill then has_insurance_skill = true; break; end ::continue:: end local flag_cat_skill_insurance = flag_cat_skill_insurance_field:get_data(singletons.quest_manager); if flag_cat_skill_insurance == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: flag_cat_skill_insurance"); return; end local is_cat_skill_insurance = is_cat_skill_insurance_method:call(singletons.quest_manager, flag_cat_skill_insurance); if is_cat_skill_insurance == nil then error_handler.report("consumables.update_dango_insurance", "Failed to access Data: is_cat_skill_insurance"); return; end if not has_insurance_skill or is_cat_skill_insurance then this.list.dango_insurance = nil; return; end buffs.update_generic(this.list, dangos_type_name, "dango_insurance", this.get_dango_name, 1); end function this.update_dango_insurance_defense_up(player_data) local level = 3; local insurance_def_up_lv3 = kitchen_skill_insurance_def_up_lv3_field:get_data(player_data); if insurance_def_up_lv3 == nil then error_handler.report("dangos.update_dango_insurance_defense_up", "Failed to access Data: insurance_def_up_lv3"); return; end if not insurance_def_up_lv3 then local insurance_def_up_lv4 = kitchen_skill_insurance_def_up_lv4_field:get_data(player_data); if insurance_def_up_lv4 == nil then error_handler.report("dangos.update_dango_insurance_defense_up", "Failed to access Data: insurance_def_up_lv4"); return; end if not insurance_def_up_lv4 then this.list.dango_insurance_defense_up = nil; return; end level = 4; end buffs.update_generic(this.list, dangos_type_name, "dango_insurance_defense_up", this.get_dango_name, level); end function this.update_dango_flyer(player) local level = 4; local is_kitchen_skill_wire_stop_regene = get_is_kitchen_skill_wire_stop_regene_method:call(player); if is_kitchen_skill_wire_stop_regene == nil then error_handler.report("dangos.update_dango_flyer", "Failed to access Data: is_kitchen_skill_wire_stop_regene"); return; end if not is_kitchen_skill_wire_stop_regene then local is_kitchen_skill_wire_stop_heal_spd = get_is_kitchen_skill_wire_stop_heal_spd_method:call(player); if is_kitchen_skill_wire_stop_heal_spd == nil then error_handler.report("dangos.update_dango_flyer", "Failed to access Data: is_kitchen_skill_wire_stop_heal_spd"); return; end if not is_kitchen_skill_wire_stop_regene then this.list.dango_flyer = nil; return; end level = 3; end buffs.update_generic(this.list, dangos_type_name, "dango_flyer", this.get_dango_name, level); end function this.update_dango_hunter(player_data) local dango_hunter_buff = buffs.update_generic_buff(this.list, dangos_type_name, "dango_hunter", this.get_dango_name, nil, nil, player_data, kitchen_skill_051_atk_up_timer_field); if dango_hunter_buff then dango_hunter_buff.level = 4; end end function this.update_super_recovery_dango(player) local kitchen_skill_surume_regene_timer = get_kitchen_skill_surume_regene_timer_method:call(player); if kitchen_skill_surume_regene_timer == nil then error_handler.report("dangos.update_super_recovery_dango", "Failed to access Data: kitchen_skill_surume_regene_timer"); return; end if utils.number.is_equal(kitchen_skill_surume_regene_timer, 0) and utils.number.is_equal(previous_super_recovery_dango_timer, 0) then this.list.super_recovery_dango = nil; return; end previous_super_recovery_dango_timer = kitchen_skill_surume_regene_timer; buffs.update_generic(this.list, dangos_type_name, "super_recovery_dango", this.get_dango_name); end function this.get_dango_name(dango_key) if dango_ids[dango_key] == nil then local dango_name = language.current_language.dangos[dango_key]; if dango_name == nil then return dango_key; end return dango_name; end local dango_name = get_name_method:call(nil, dango_ids[dango_key]); if dango_name == nil then error_handler.report("dangos.get_dango_name", string.format("Failed to access Data: %s_name", dango_key)); return dango_key; end return dango_name; end function this.init_dependencies() buffs = require("MHR_Overlay.Buffs.buffs"); config = require("MHR_Overlay.Misc.config"); utils = require("MHR_Overlay.Misc.utils"); buff_UI_entity = require("MHR_Overlay.UI.UI_Entities.buff_UI_entity"); singletons = require("MHR_Overlay.Game_Handler.singletons"); players = require("MHR_Overlay.Damage_Meter.players"); language = require("MHR_Overlay.Misc.language"); error_handler = require("MHR_Overlay.Misc.error_handler"); end function this.init_module() end return this;