Functions and fields are cached, part names added, part name language support added.

This commit is contained in:
GreenComfyTea
2022-02-09 20:08:34 +02:00
parent 54c55155e8
commit 1c9174ca38
17 changed files with 974 additions and 261 deletions

View File

@@ -5,7 +5,9 @@ local screen = require("MHR_Overlay.Game_Handler.screen");
local singletons = require("MHR_Overlay.Game_Handler.singletons");
local config = require("MHR_Overlay.Misc.config");
local language = require("MHR_Overlay.Misc.language");
local table_helpers = require("MHR_Overlay.Misc.table_helpers");
local part_names = require("MHR_Overlay.Misc.part_names");
local player = require("MHR_Overlay.Damage_Meter.player");
local damage_hook = require("MHR_Overlay.Damage_Meter.damage_hook");
@@ -35,8 +37,10 @@ screen.init_module();
singletons.init_module();
table_helpers.init_module();
language.init_module();
config.init_module();
quest_status.init_module();
part_names.init_module();
damage_UI_entity.init_module();
health_UI_entity.init_module();
@@ -85,7 +89,7 @@ re.on_frame(function()
end);
re.on_frame(function()
draw.text("x: " .. tostring(x), 450, 50, 0xFFFFFFFF);
--draw.text("x: " .. tostring(x), 450, 50, 0xFFFFFFFF);
end);
-- #endregion
--------------------------RE_IMGUI---------------------------

View File

@@ -2,11 +2,21 @@ local damage_hook = {};
local quest_status;
local player;
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local enemy_character_base_after_calc_damage_damage_side = enemy_character_base_type_def:get_method("afterCalcDamage_DamageSide");
local is_boss_enemy_method = enemy_character_base_type_def:get_method("get_isBossEnemy");
local check_die_method = enemy_character_base_type_def:get_method("checkDie");
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");
local get_damage_attacker_type_method = enemy_calc_damage_info_type_def:get_method("get_DamageAttackerType");
local get_total_damage_method = enemy_calc_damage_info_type_def:get_method("get_TotalDamage");
local get_physical_damage_method = enemy_calc_damage_info_type_def:get_method("get_PhysicalDamage");
local get_elemental_damage_method = enemy_calc_damage_info_type_def:get_method("get_ElementDamage");
local get_condition_damage_method = enemy_calc_damage_info_type_def:get_method("get_ConditionDamage");
sdk.hook(enemy_character_base_after_calc_damage_damage_side, function(args)
damage_hook.update_damage(args);
end, function(retval)
@@ -19,12 +29,13 @@ function damage_hook.update_damage(args)
return;
end
local is_large_monster = enemy:call("get_isBossEnemy");
local is_large_monster = is_boss_enemy_method:call(enemy);
if is_large_monster == nil then
return;
end
local dead_or_captured = enemy:call("checkDie");
local dead_or_captured = check_die_method:call(enemy);
if dead_or_captured == nil then
return;
end
@@ -34,8 +45,8 @@ function damage_hook.update_damage(args)
end
local enemy_calc_damage_info = sdk.to_managed_object(args[3]); -- snow.hit.EnemyCalcDamageInfo.AfterCalcInfo_DamageSide
local attacker_id = enemy_calc_damage_info:call("get_AttackerID");
local attacker_type = enemy_calc_damage_info:call("get_DamageAttackerType");
local attacker_id = get_attacker_id_method:call(enemy_calc_damage_info);
local attacker_type = get_damage_attacker_type_method:call(enemy_calc_damage_info);
if attacker_id >= 100 then
return;
@@ -47,10 +58,10 @@ function damage_hook.update_damage(args)
end
local damage_object = {}
damage_object.total_damage = enemy_calc_damage_info:call("get_TotalDamage");
damage_object.physical_damage = enemy_calc_damage_info:call("get_PhysicalDamage");
damage_object.elemental_damage = enemy_calc_damage_info:call("get_ElementDamage");
damage_object.ailment_damage = enemy_calc_damage_info:call("get_ConditionDamage");
damage_object.total_damage = get_total_damage_method:call(enemy_calc_damage_info);
damage_object.physical_damage = get_physical_damage_method:call(enemy_calc_damage_info);
damage_object.elemental_damage = get_elemental_damage_method:call(enemy_calc_damage_info);
damage_object.ailment_damage = get_condition_damage_method:call(enemy_calc_damage_info);
-- -1 - bombs
-- 0 - player

View File

@@ -177,8 +177,6 @@ function player.update_display(_player)
end
end
if config.current_config.damage_meter_UI.tracked_monster_types.large_monsters then
if config.current_config.damage_meter_UI.tracked_damage_types.player_damage then
player.merge_damage(_player.display, _player.large_monsters);
@@ -215,31 +213,38 @@ function player.merge_damage(first, second)
return first;
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");
local get_game_object_method = sdk.find_type_definition("via.Component"):get_method("get_GameObject")
local get_transform_method = sdk.find_type_definition("via.GameObject"):get_method("get_Transform")
local get_position_method = sdk.find_type_definition("via.Transform"):get_method("get_Position")
function player.update_myself_position()
if singletons.player_manager == nil then
customization_menu.status = "No player manager";
return;
end
local master_player = singletons.player_manager:call("findMasterPlayer")
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
customization_menu.status = "No master player";
return;
end
local master_player_game_object = master_player:call("get_GameObject")
local master_player_game_object = get_game_object_method:call(master_player);
if master_player_game_object == nil then
customization_menu.status = "No master player game object";
return;
end
local master_player_transform = master_player_game_object:call("get_Transform")
local master_player_transform = get_transform_method:call(master_player_game_object);
if not master_player_transform then
customization_menu.status = "No master player transform";
return;
end
local master_player_position = master_player_transform:call("get_Position")
local master_player_position = get_position_method:call(master_player_transform);
if master_player_position == nil then
customization_menu.status = "No masterplayer position";
return;

View File

@@ -12,6 +12,9 @@ quest_status.is_training_area = false;
local quest_manager_type_definition = sdk.find_type_definition("snow.QuestManager");
local on_changed_game_status = quest_manager_type_definition:get_method("onChangedGameStatus");
local village_area_manager_type_def = sdk.find_type_definition("snow.VillageAreaManager");
local check_current_area_training_area_method = village_area_manager_type_def:get_method("checkCurrentArea_TrainingArea");
sdk.hook(on_changed_game_status, function(args)
local new_quest_status = sdk.to_int64(args[3]);
if new_quest_status ~= nil then
@@ -66,7 +69,7 @@ function quest_status.update_is_training_area()
return;
end
local _is_training_area = singletons.village_area_manager:call("checkCurrentArea_TrainingArea");
local _is_training_area = check_current_area_training_area_method:call(singletons.village_area_manager);
if _is_training_area == nil then
return;
end

View File

@@ -1,11 +1,14 @@
local config = {};
local table_helpers;
local language;
config.current_config = nil;
config.config_file_name = "MHR Overlay/config.json";
config.default_config = {
global_settings = {
language = "en-us",
module_visibility = {
during_quest = {
small_monster_UI = true,
@@ -29,7 +32,7 @@ config.default_config = {
damage_meter_UI = true
}
},
font = {
family = "Consolas",
size = 13,
@@ -552,7 +555,7 @@ config.default_config = {
},
parts = {
visibility = false,
visibility = true,
offset = {
x = 0,
@@ -565,7 +568,7 @@ config.default_config = {
},
settings = {
hide_undamaged_parts = true,
hide_undamaged_parts = false,
},
sorting = {
@@ -578,7 +581,7 @@ config.default_config = {
text = "%s",
include = {
part_name = false,
part_name = true,
break_count = true
},
@@ -586,7 +589,7 @@ config.default_config = {
x = 15,
y = 61
},
color = 0xF1F4A3CC,
color = 0xFFf9d9ff,
shadow = {
visibility = true,
@@ -603,7 +606,7 @@ config.default_config = {
text = "HP:",
offset = {
x = -15,
y = 71
y = 69
},
color = 0xF1F4A3CC,
@@ -622,7 +625,7 @@ config.default_config = {
text = "%.0f/%.0f", -- current_health/max_health
offset = {
x = 55,
y = 78
y = 74
},
color = 0xFFFFFFFF,
@@ -637,12 +640,12 @@ config.default_config = {
},
percentage_label = {
visibility = false,
visibility = true,
text = "%5.1f%%",
offset = {
x = 145,
y = 78
y = 74
},
color = 0xFFFFFFFF,
@@ -660,7 +663,7 @@ config.default_config = {
visibility = true,
offset = {
x = 10,
y = 78
y = 75
},
size = {
@@ -669,7 +672,7 @@ config.default_config = {
},
colors = {
foreground = 0xF4D0A3CC,
foreground = 0xB9ca85cc,
background = 0x88000000
}
}
@@ -971,9 +974,7 @@ config.default_config = {
},
parts = {
visibility = true,
visibility = false,
offset = {
x = 0,
@@ -999,7 +1000,7 @@ config.default_config = {
text = "%s",
include = {
part_name = false,
part_name = true,
break_count = true
},
@@ -1007,7 +1008,7 @@ config.default_config = {
x = 15,
y = 61
},
color = 0xF1F4A3CC,
color = 0xFFf9d9ff,
shadow = {
visibility = true,
@@ -1024,7 +1025,7 @@ config.default_config = {
text = "HP:",
offset = {
x = -15,
y = 71
y = 69
},
color = 0xF1F4A3CC,
@@ -1043,7 +1044,7 @@ config.default_config = {
text = "%.0f/%.0f", -- current_health/max_health
offset = {
x = 55,
y = 78
y = 74
},
color = 0xFFFFFFFF,
@@ -1063,7 +1064,7 @@ config.default_config = {
offset = {
x = 145,
y = 78
y = 74
},
color = 0xFFFFFFFF,
@@ -1081,7 +1082,7 @@ config.default_config = {
visibility = true,
offset = {
x = 10,
y = 78
y = 75
},
size = {
@@ -1090,7 +1091,7 @@ config.default_config = {
},
colors = {
foreground = 0xF4D0A3CC,
foreground = 0xB9ca85cc,
background = 0x88000000
}
}
@@ -1347,7 +1348,10 @@ end
function config.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
language = require("MHR_Overlay.Misc.language");
config.load();
language.update(table_helpers.find_index(language.language_names, config.current_config.global_settings.language, false));
config.current_config.version = "v1.7";
end

View File

@@ -0,0 +1,110 @@
local language = {};
local table_helpers;
language.current_language = {};
language.language_names = {};
language.languages = {};
language.language_folder = "MHR Overlay\\languages\\";
language.default_language = {
parts = {
head = "Head",
neck = "Neck",
body = "Body",
torso = "Torso",
abdomen = "Abdomen",
back = "Back",
tail = "Tail",
upper_body = "Upper Body",
lower_body = "Lower Body",
upper_back = "Upper Back",
lower_back = "Lower Back",
left_wing = "Wing L",
right_wing = "Wing R",
wings = "Wings",
left_leg = "Leg L",
right_leg = "Leg R",
legs = "Legs",
left_legs = "Legs L",
right_legs = "Legs R",
left_arm = "Arm L",
right_arm = "Arm R",
arms = "Arms",
left_arm_ice = "Arm L (Ice)",
right_arm_ice = "Arm R (Ice)",
left_cutwing = "Cutwing L",
right_cutwing = "Cutwing R",
head_mud = "Head (Mud)",
tail_mud = "Tail (Mud)",
tail_windsac = "Tail (Windsac)",
chest_windsac = "Chest (Windsac)",
back_windsac = "Back (Windsac)",
large_mudbulb = "Large Mudbulb",
mane = "Mane",
rear = "Rear",
claw = "Claw",
dorsal_fin = "Dorsal Fin",
carapace = "Carapace",
spinning = "Spinning",
rock = "Rock"
}
};
function language.load()
local language_files = fs.glob([[MHR Overlay\\languages\\.*json]]);
if language_files == nil then
return;
end
for i, language_file in ipairs(language_files) do
local language_name = language_file:gsub(language.language_folder, ""):gsub(".json", "");
-- v will be something like `my-cool-mod\config-file-1.json`;
local loaded_language = json.load_file(language.language_folder .. "en-us.json");
if loaded_language ~= nil then
log.info("[MHR Overlay] " .. language_name .. ".json loaded successfully");
table.insert(language.language_names, language_name);
table.insert(language.languages, loaded_language);
else
log.error("[MHR Overlay] Failed to load " .. language_name .. ".json");
end
end
end
function language.save_default()
-- save current config to disk, replacing any existing file
local success = json.dump_file(language.language_folder .. "en-us.json", language.default_language);
if success then
log.info('[MHR Overlay] en-us.json saved successfully');
else
log.error('[MHR Overlay] Failed to save en-us.json');
end
end
function language.update(index)
language.current_language = table_helpers.deep_copy(language.languages[index]);
end
function language.init_module()
table_helpers = require("MHR_Overlay.Misc.table_helpers");
language.save_default();
language.load();
end
return language;

View File

@@ -0,0 +1,476 @@
local part_names = {};
local language;
local table_helpers;
part_names.list = {};
function part_names.init()
part_names.list = {
[98] = -- Great Izuchi+ 98
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.arms,
language.current_language.parts.tail,
},
[54] = -- Great Baggi+ 54
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.tail
},
[107] = -- Kulu-Ya-Ku+ 107 boulders are cut out
{
language.current_language.parts.head,
language.current_language.parts.arms,
language.current_language.parts.body,
language.current_language.parts.tail,
language.current_language.parts.rock,
language.current_language.parts.rock
},
[59] = -- Great Wroggi+ 59
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.tail
},
[60] = -- Arzuros+ 60 Unknown parts
{
language.current_language.parts.head,
language.current_language.parts.upper_body,
language.current_language.parts.arms,
language.current_language.parts.rear,
language.current_language.parts.lower_body
},
[61] = -- Lagombi+ 61
{
language.current_language.parts.head,
language.current_language.parts.upper_body,
language.current_language.parts.arms,
language.current_language.parts.rear,
language.current_language.parts.lower_body
},
[62] = -- Volvidon+ 62
{
language.current_language.parts.upper_back,
language.current_language.parts.upper_body,
language.current_language.parts.arms,
language.current_language.parts.lower_back,
language.current_language.parts.lower_body,
language.current_language.parts.spinning
},
[91] = -- Aknosom+ 91
{
language.current_language.parts.head,
language.current_language.parts.neck,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.body,
language.current_language.parts.tail,
language.current_language.parts.legs
},
[47] = -- Royal Ludroth+ 47
{
language.current_language.parts.head,
language.current_language.parts.mane,
language.current_language.parts.torso,
language.current_language.parts.left_legs,
language.current_language.parts.right_legs,
language.current_language.parts.tail
},
[44] = -- Barroth+ 44
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.arms,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[3] = -- Khezu+ 3
{
language.current_language.parts.head,
language.current_language.parts.neck,
language.current_language.parts.torso,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.tail
},
[92] = -- Tetranadon+ 92
{
language.current_language.parts.head,
language.current_language.parts.right_arm,
language.current_language.parts.left_arm,
language.current_language.parts.right_leg,
language.current_language.parts.left_leg,
language.current_language.parts.carapace,
language.current_language.parts.torso,
language.current_language.parts.tail
},
[90] = -- Bishaten+ 90
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.right_arm,
language.current_language.parts.left_arm,
language.current_language.parts.right_leg,
language.current_language.parts.left_leg,
language.current_language.parts.tail
},
[102] = -- Pukei-Pukei+ 102
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[108] = -- Jyuratodus+ 108 missing mud parts
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail,
language.current_language.parts.head_mud,
language.current_language.parts.tail_mud
},
[4] = -- Basarios+ 4
{
language.current_language.parts.torso,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.head,
language.current_language.parts.abdomen,
language.current_language.parts.tail
},
[93] = -- Somnacanth+ 93
{
language.current_language.parts.body,
language.current_language.parts.head,
language.current_language.parts.neck,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[1] = -- Rathian+ 1
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[42] = -- Barioth+ 42
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[109] = -- Tobi-Kadachi+ 109
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.back,
language.current_language.parts.arms,
language.current_language.parts.legs,
language.current_language.parts.tail
},
[89] = -- Magnamalo+ 89
{
language.current_language.parts.head,
language.current_language.parts.torso,
language.current_language.parts.right_arm,
language.current_language.parts.left_arm,
language.current_language.parts.back,
language.current_language.parts.tail,
language.current_language.parts.legs
},
[100] = -- Anjanath+ 100 (missing parts)
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing
},
[37] = -- Nargacuga+ 37
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_cutwing,
language.current_language.parts.tail,
language.current_language.parts.arms,
language.current_language.parts.left_leg,
language.current_language.parts.right_cutwing,
language.current_language.parts.right_leg
},
[82] = -- Mizutsune+ 82
{
language.current_language.parts.head,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.body,
language.current_language.parts.tail,
language.current_language.parts.dorsal_fin
},
[97] = -- Goss Harag+ 97
{
language.current_language.parts.head,
language.current_language.parts.back,
language.current_language.parts.left_arm,
language.current_language.parts.left_arm_ice,
language.current_language.parts.right_arm,
language.current_language.parts.right_arm_ice,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.body
},
[2] = -- Rathalos+ 2
{
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.neck,
language.current_language.parts.head,
language.current_language.parts.tail
},
[95] = -- Almudron+ 95
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail,
language.current_language.parts.large_mudbulb,
language.current_language.parts.large_mudbulb,
},
[57] = -- Zinogre+ 57
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.back,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[32] = -- Tigrex+ 32
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[7] = -- Diablos+ 7
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[94] = -- Rakna-Kadaki+ 94 (?)
{
language.current_language.parts.head,
language.current_language.parts.claw,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.abdomen,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm -- mb abdomen_cocooned)
},
[24] = -- Kushala Daora+ 24
{
language.current_language.parts.head,
language.current_language.parts.back,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.wings,
language.current_language.parts.tail
},
[25] = -- Chameleos+ 25
{
language.current_language.parts.head,
language.current_language.parts.abdomen,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail,
language.current_language.parts.wings
},
[27] = -- Teostra+ 27
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.arms,
language.current_language.parts.legs,
language.current_language.parts.wings,
language.current_language.parts.tail
},
[23] = -- Rajang+ 23
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[118] = -- Bazelgeuse+ 118
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.legs,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.tail
},
[96] = -- Wind Serpent Ibushi+ 96 (missing parts)
{
language.current_language.parts.head,
language.current_language.parts.right_arm,
language.current_language.parts.left_arm,
language.current_language.parts.torso,
language.current_language.parts.back,
language.current_language.parts.tail,
language.current_language.parts.tail_windsac,
language.current_language.parts.chest_windsac,
language.current_language.parts.back_windsac
},
[99] = -- Thunder Serpent Narwa+ 99 (no parts?)
{},
[1379] = -- Narwa the Allmother+ 1379 (no parts?)
{},
[1366] = -- Crimson Glow Valstrax+ 1366
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.tail,
language.current_language.parts.legs,
language.current_language.parts.chest_windsac
},
[1852] = -- Apex Arzuros+ 1852
{
language.current_language.parts.head,
language.current_language.parts.upper_body,
language.current_language.parts.arms,
language.current_language.parts.rear,
language.current_language.parts.lower_body
},
[1793] = -- Apex Rathian+ 1793
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[1874] = -- Apex Mizutsune+ 1874
{
language.current_language.parts.head,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.body,
language.current_language.parts.tail,
language.current_language.parts.dorsal_fin
},
[1794] = -- Apex Rathalos+ 1794
{
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.neck,
language.current_language.parts.head,
language.current_language.parts.tail
},
[1799] = -- Apex Diablos+ 1799
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.left_wing,
language.current_language.parts.right_wing,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
},
[1849] = -- Apex Zinogre+ 1849
{
language.current_language.parts.head,
language.current_language.parts.body,
language.current_language.parts.back,
language.current_language.parts.left_arm,
language.current_language.parts.right_arm,
language.current_language.parts.left_leg,
language.current_language.parts.right_leg,
language.current_language.parts.tail
}
};
end
function part_names.get_part_name(monster_id, part_id)
local monster_parts = part_names.list[monster_id];
if monster_parts == nil then
return "";
end
local part_name = monster_parts[part_id];
if part_name == nil then
return "";
end
return part_name;
end
function part_names.init_module()
language = require("MHR_Overlay.Misc.language");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
part_names.init();
end
return part_names;

View File

@@ -62,82 +62,18 @@ function table_helpers.merge(...)
end
function table_helpers.tostring(table)
local cache, stack, output = {}, {}, {};
local depth = 1;
local output_string = "{\n";
while true do
local size = 0;
for key, value in pairs(table) do
size = size + 1;
end
local current_index = 1;
for key, value in pairs(table) do
if (cache[table] == nil) or (current_index >= cache[table]) then
if (string.find(output_string, "}", output_string:len())) then
output_string = output_string .. ",\n";
elseif not (string.find(output_string, "\n",output_string:len())) then
output_string = output_string .. "\n";
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output, output_string);
output_string = "";
local key;
if (type(key) == "number" or type(key) == "boolean") then
key = "[" .. tostring(key) .. "]";
else
key = "['" .. tostring(key) .. "']";
end
if (type(value) == "number" or type(value) == "boolean") then
output_string = output_string .. string.rep('\t', depth) .. key .. " = " .. tostring(value);
elseif (type(value) == "table") then
output_string = output_string .. string.rep('\t', depth) .. key .. " = {\n";
table.insert(stack, table);
table.insert(stack, value);
cache[table] = current_index + 1;
break
else
output_string = output_string .. string.rep('\t', depth) .. key .. " = '" .. tostring(value) .. "'";
end
if (current_index == size) then
output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}";
else
output_string = output_string .. ",";
end
else
-- close the table
if (current_index == size) then
output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}";
end
if type(table) == 'table' then
local s = '{ \n';
for k,v in pairs(table) do
if type(k) ~= 'number' then
k = '"' .. k .. '"';
end
current_index = current_index + 1;
end
if (size == 0) then
output_string = output_string .. "\n" .. string.rep('\t', depth - 1) .. "}";
end
if (#stack > 0) then
table = stack[#stack];
stack[#stack] = nil;
depth = cache[table] == nil and depth + 1 or depth - 1;
else
break;
s = s .. '\t['..k..'] = ' .. table_helpers.tostring(v) .. ',\n';
end
return s .. '} \n';
else
return tostring(table);
end
-- This is necessary for working with HUGE tables otherwise we run out of memory using concat on huge strings
table.insert(output, output_string);
output_string = table.concat(output);
return output_string;
end
function table_helpers.init_module()

View File

@@ -9,10 +9,11 @@ local rage_UI_entity;
local body_part_UI_entity;
local screen;
local drawing;
local part_names;
body_part.list = {};
function body_part.new(REpart, id)
function body_part.new(REpart, name, id)
local part = {};
part.REpart = REpart;
@@ -22,7 +23,7 @@ function body_part.new(REpart, id)
part.max_health = 99999;
part.health_percentage = 0;
part.name = "??";
part.name = name;
part.break_count = 0;
body_part.init_dynamic_UI(part);
@@ -90,6 +91,7 @@ function body_part.init_module()
body_part_UI_entity = require("MHR_Overlay.UI.UI_Entities.body_part_UI_entity");
screen = require("MHR_Overlay.Game_Handler.screen");
drawing = require("MHR_Overlay.UI.drawing");
part_names = require("MHR_Overlay.Misc.part_names");
end
return body_part;

View File

@@ -9,6 +9,7 @@ local rage_UI_entity;
local screen;
local drawing;
local body_part;
local part_names;
large_monster.list = {};
@@ -213,7 +214,7 @@ local anger_param_get_timer_method = anger_param_type:get_method("get_Timer")
local get_timer_anger_method = anger_param_type:get_method("get_TimerAnger")
local get_count_anger_method = anger_param_type:get_method("get_CountAnger")
local get_gameobject_method = sdk.find_type_definition("via.Component"):get_method("get_GameObject")
local get_game_object_method = sdk.find_type_definition("via.Component"):get_method("get_GameObject")
local get_transform_method = sdk.find_type_definition("via.GameObject"):get_method("get_Transform")
local get_position_method = sdk.find_type_definition("via.Transform"):get_method("get_Position")
@@ -230,7 +231,7 @@ function large_monster.update_position(enemy)
-- as these are pretty much guaranteed to stay constant
-- as long as the enemy is alive
if monster.game_object == nil then
monster.game_object = get_gameobject_method:call(enemy)
monster.game_object = get_game_object_method:call(enemy)
if monster.game_object == nil then
customization_menu.status = "No enemy game object";
return;
@@ -354,10 +355,6 @@ function large_monster.update(enemy)
goto continue;
end
if part_health == last_REpart_health then
break;
end
local part_max_health = REpart:call("get_Max");
if part_max_health == nil or part_max_health <= 0 then
goto continue;
@@ -365,8 +362,12 @@ function large_monster.update(enemy)
local part = monster.parts[REpart];
if part == nil then
part = body_part.new(REpart, part_id);
monster.parts[REpart] = part;
local part_name = part_names.get_part_name(monster.id, part_id);
if part_name ~= "" then
part = body_part.new(REpart, part_name, part_id);
monster.parts[REpart] = part;
end
end
body_part.update(part, part_health, part_max_health);
@@ -473,7 +474,7 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale)
100 * monster.big_border, 100 * monster.king_border);
end
drawing.draw_label(monster.dynamic_name_label, position_on_screen, opacity_scale, monster_name_text .. " " .. tostring(monster.id));
drawing.draw_label(monster.dynamic_name_label, position_on_screen, opacity_scale, monster_name_text);
health_UI_entity.draw(monster, monster.health_dynamic_UI, position_on_screen, opacity_scale);
stamina_UI_entity.draw(monster, monster.stamina_dynamic_UI, position_on_screen, opacity_scale);
@@ -550,7 +551,7 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale)
100 * monster.big_border, 100 * monster.king_border);
end
drawing.draw_label(monster.static_name_label, position_on_screen, opacity_scale, monster_name_text .. " " .. tostring(monster.id));
drawing.draw_label(monster.static_name_label, position_on_screen, opacity_scale, monster_name_text);
health_UI_entity.draw(monster, monster.health_static_UI, position_on_screen, opacity_scale);
stamina_UI_entity.draw(monster, monster.stamina_static_UI, position_on_screen, opacity_scale);
@@ -624,6 +625,7 @@ function large_monster.init_module()
rage_UI_entity = require("MHR_Overlay.UI.UI_Entities.rage_UI_entity");
screen = require("MHR_Overlay.Game_Handler.screen");
drawing = require("MHR_Overlay.UI.drawing");
part_names = require("MHR_Overlay.Misc.part_names");
end
return large_monster;

View File

@@ -5,13 +5,14 @@ local large_monster;
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local enemy_character_base_type_def_update_method = enemy_character_base_type_def:get_method("update");
local is_boss_enemy_method = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"):get_method("get_isBossEnemy");
sdk.hook(enemy_character_base_type_def_update_method, function(args)
monster.update_monster(sdk.to_managed_object(args[2]));
end, function(retval)
return retval;
end);
local is_boss_enemy_method = sdk.find_type_definition("snow.enemy.EnemyCharacterBase"):get_method("get_isBossEnemy");
local tick_count = 0
local last_update_tick = 0
local recorded_monsters = {}
@@ -30,21 +31,18 @@ local MAX_UPDATES_PER_TICK = 2
-- the reason for this is that the hooks on all the monsters' update functions
-- causes a HUGE performance hit (adds ~3+ ms to UpdateBehavior and frame time)
re.on_pre_application_entry("UpdateBehavior", function()
tick_count = tick_count + 1
updates_this_tick = 0
tick_count = tick_count + 1;
updates_this_tick = 0;
if num_known_monsters ~= 0 and
num_updated_monsters >= num_known_monsters or
tick_count >= num_known_monsters * 2
then
recorded_monsters = {}
updated_monsters = {}
known_big_monsters = {}
last_update_tick = 0
tick_count = 0
num_known_monsters = 0
num_updated_monsters = 0
updates_this_tick = 0
if num_known_monsters ~= 0 and num_updated_monsters >= num_known_monsters or tick_count >= num_known_monsters * 2 then
recorded_monsters = {};
updated_monsters = {};
known_big_monsters = {};
last_update_tick = 0;
tick_count = 0;
num_known_monsters = 0;
num_updated_monsters = 0;
updates_this_tick = 0;
end
end)

View File

@@ -9,6 +9,28 @@ local drawing;
damage_meter_UI.last_displayed_players = {};
local lobby_manager_type_def = sdk.find_type_definition("snow.LobbyManager");
local my_hunter_info_field = lobby_manager_type_def:get_field("_myHunterInfo");
local myself_index_field = lobby_manager_type_def:get_field("_myselfIndex");
local myself_quest_index_field = lobby_manager_type_def:get_field("_myselfQuestIndex");
local quest_hunter_info_field = lobby_manager_type_def:get_field("_questHunterInfo");
local my_hunter_info_type_def = my_hunter_info_field:get_type();
local name_field = my_hunter_info_type_def:get_field("_name");
local quest_hunter_info_type_def = quest_hunter_info_field:get_type();
local get_count_method = quest_hunter_info_type_def:get_method("get_Count");
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");
local hunter_rank_field = hunter_info_type_def:get_field("_hunterRank");
--local name_field = hunter_info_type_def:get_field("_name");
local progress_manager_type_def = sdk.find_type_definition("snow.progress.ProgressManager");
local get_hunter_rank_method = progress_manager_type_def:get_method("get_HunterRank");
function damage_meter_UI.draw()
if player.total.display.total_damage == 0 and config.current_config.damage_meter_UI.settings.hide_module_if_total_damage_is_zero then
@@ -24,40 +46,38 @@ function damage_meter_UI.draw()
end
-- myself player
local myself_player_info = singletons.lobby_manager:get_field("_myHunterInfo");
local myself_player_info = my_hunter_info_field:get_data(singletons.lobby_manager);
if myself_player_info == nil then
customization_menu.status = "No myself player info list";
return;
end
local myself_player_name = myself_player_info:get_field("_name");
local myself_player_name = name_field:get_data(myself_player_info);
if myself_player_name == nil then
customization_menu.status = "No myself player name";
return;
end
if quest_status.is_online then
player.myself_id = singletons.lobby_manager:get_field("_myselfQuestIndex");
player.myself_id = myself_quest_index_field:get_data(singletons.lobby_manager);
if player.myself_id == nil then
customization_menu.status = "No myself player id";
return;
end
else
player.myself_id = singletons.lobby_manager:get_field("_myselfIndex");
player.myself_id = myself_index_field:get_data(singletons.lobby_manager);
if player.myself_id == nil then
customization_menu.status = "No myself player id";
return;
end
end
local myself_hunter_rank = singletons.progress_manager:call("get_HunterRank");
local myself_hunter_rank = get_hunter_rank_method:call(singletons.progress_manager);
if myself_hunter_rank == nil then
customization_menu.status = "No myself hunter rank";
myself_hunter_rank = 0;
end
x = singletons.lobby_manager:get_field("_myselfIndex");
if player.list[player.myself_id] == nil then
player.list[player.myself_id] = player.new(player.myself_id, myself_player_name, myself_hunter_rank);
player.myself = player.list[player.myself_id];
@@ -71,12 +91,12 @@ function damage_meter_UI.draw()
quest_players = damage_meter_UI.last_displayed_players;
else
-- other players
local player_info_list = singletons.lobby_manager:get_field("_questHunterInfo");
local player_info_list = quest_hunter_info_field:get_data(singletons.lobby_manager);
if player_info_list == nil then
customization_menu.status = "No player info list";
end
local count = player_info_list:call("get_Count");
local count = get_count_method:call(player_info_list);
if count == nil then
customization_menu.status = "No player info list count";
return;
@@ -84,17 +104,17 @@ function damage_meter_UI.draw()
for i = 0, count - 1 do
local player_info = player_info_list:call("get_Item", i);
local player_info = get_item_method:call(player_info_list, i);
if player_info == nil then
goto continue
end
local player_id = player_info:get_field("_memberIndex");
local player_id = member_index_field:get_data(player_info)
if player_id == nil then
goto continue
end
local player_hunter_rank = player_info:get_field("_hunterRank");
local player_hunter_rank = hunter_rank_field:get_data(player_info);
if player_hunter_rank == nil then
goto continue
end
@@ -104,7 +124,7 @@ function damage_meter_UI.draw()
goto continue
end
local player_name = player_info:get_field("_name");
local player_name = name_field:get_data(player_info);
if player_name == nil then
goto continue
end

View File

@@ -11,6 +11,10 @@ local health_UI_entity;
local stamina_UI_entity;
local rage_UI_entity;
local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager");
local get_boss_enemy_count_method = enemy_manager_type_def:get_method("getBossEnemyCount");
local get_boss_enemy_method = enemy_manager_type_def:get_method("getBossEnemy");
function large_monster_UI.draw(dynamic_enabled, static_enabled)
if singletons.enemy_manager == nil then
return;
@@ -18,13 +22,13 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled)
local displayed_monsters = {};
local enemy_count = singletons.enemy_manager:call("getBossEnemyCount");
local enemy_count = get_boss_enemy_count_method:call(singletons.enemy_manager);
if enemy_count == nil then
return;
end
for i = 0, enemy_count - 1 do
local enemy = singletons.enemy_manager:call("getBossEnemy", i);
local enemy = get_boss_enemy_method:call(singletons.enemy_manager, i);
if enemy == nil then
customization_menu.status = "No enemy";
break

View File

@@ -10,6 +10,10 @@ local table_helpers;
local health_UI_entity;
local stamina_UI_entity;
local enemy_manager_type_def = sdk.find_type_definition("snow.enemy.EnemyManager");
local get_zako_enemy_count_method = enemy_manager_type_def:get_method("getZakoEnemyCount");
local get_zako_enemy_method = enemy_manager_type_def:get_method("getZakoEnemy");
function small_monster_UI.draw()
if singletons.enemy_manager == nil then
return;
@@ -17,14 +21,14 @@ function small_monster_UI.draw()
local displayed_monsters = {};
local enemy_count = singletons.enemy_manager:call("getZakoEnemyCount");
local enemy_count = get_zako_enemy_count_method:call(singletons.enemy_manager);
if enemy_count == nil then
customization_menu.status = "No enemy count";
return;
end
for i = 0, enemy_count - 1 do
local enemy = singletons.enemy_manager:call("getZakoEnemy", i);
local enemy = get_zako_enemy_method:call(singletons.enemy_manager, i);
if enemy == nil then
customization_menu.status = "No enemy";
break

View File

@@ -5,20 +5,22 @@ local screen;
local config;
local drawing;
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
local get_quest_elapsed_time_min_method = quest_manager_type_def:get_method("getQuestElapsedTimeMin");
local get_quest_elapseD_time_sec_method = quest_manager_type_def:get_method("getQuestElapsedTimeSec");
function time_UI.draw()
if singletons.quest_manager == nil then
return;
end
local quest_time_elapsed_minutes = singletons.quest_manager:call("getQuestElapsedTimeMin");
local quest_time_elapsed_minutes = get_quest_elapsed_time_min_method:call( singletons.quest_manager);
if quest_time_elapsed_minutes == nil then
customization_menu.status = "No quest time elapsed minutes";
return;
end
local quest_time_total_elapsed_seconds = singletons.quest_manager:call("getQuestElapsedTimeSec");
local quest_time_total_elapsed_seconds = get_quest_elapseD_time_sec_method:call(singletons.quest_manager);
if quest_time_total_elapsed_seconds == nil then
customization_menu.status = "No quest time total elapsed seconds";
return;

View File

@@ -16,7 +16,6 @@ end
function health_UI_entity.draw(monster, health_UI, position_on_screen, opacity_scale)
if not health_UI.visibility then
x = health_UI.visibility
return;
end

File diff suppressed because it is too large Load Diff