mirror of
https://github.com/GreenComfyTea/MHR-Overlay.git
synced 2026-01-24 04:18:11 -08:00
Add Cart Count, fix Script Time;
This commit is contained in:
@@ -29,44 +29,15 @@ local get_condition_type3_method = enemy_calc_damage_info_type_def:get_method("g
|
||||
|
||||
local stock_mystery_core_break_damage_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase.stockMysteryCoreBreakDamage");
|
||||
|
||||
local quest_manager_type_def = sdk.find_type_definition("snow.QuestManager");
|
||||
|
||||
local types = {
|
||||
[0] = "PlayerWeapon",
|
||||
[1] = "BarrelBombLarge",
|
||||
[2] = "Makimushi",
|
||||
[3] = "Nitro",
|
||||
[4] = "OnibiMine",
|
||||
[5] = "BallistaHate",
|
||||
[6] = "CaptureSmokeBomb",
|
||||
[7] = "CaptureBullet",
|
||||
[8] = "BarrelBombSmall",
|
||||
[9] = "Kunai",
|
||||
[10] = "WaterBeetle",
|
||||
[11] = "DetonationGrenade",
|
||||
[12] = "Kabutowari",
|
||||
[13] = "FlashBoll", -- Flash Bomb
|
||||
[14] = "HmBallista",
|
||||
[15] = "HmCannon",
|
||||
[16] = "HmGatling",
|
||||
[17] = "HmTrap",
|
||||
[18] = "HmNpc",
|
||||
[19] = "HmFlameThrower",
|
||||
[20] = "HmDragnator",
|
||||
[21] = "Otomo",
|
||||
[22] = "OtAirouShell014",
|
||||
[23] = "OtAirouShell102",
|
||||
[24] = "Fg005",
|
||||
[25] = "EcBatExplode",
|
||||
[26] = "EcWallTrapBugExplode",
|
||||
[27] = "EcPiranha",
|
||||
[28] = "EcFlash",
|
||||
[29] = "EcSandWallShooter",
|
||||
[30] = "EcForestWallShooter",
|
||||
[31] = "EcSwampLeech",
|
||||
[32] = "EcPenetrateFish",
|
||||
[33] = "Max",
|
||||
[34] = "Invalid"
|
||||
}
|
||||
local not_host_cart_method = quest_manager_type_def:get_method("netRecvForfeit");
|
||||
local host_cart_method = quest_manager_type_def:get_method("netSendForfeit");
|
||||
local offline_cart_method = quest_manager_type_def:get_method("notifyDeath");
|
||||
|
||||
local packet_quest_forfeit_type_def = sdk.find_type_definition("snow.QuestManager.PacketQuestForfeit");
|
||||
local dead_player_id_field = packet_quest_forfeit_type_def:get_field("_DeadPlIndex");
|
||||
local is_from_host_field = packet_quest_forfeit_type_def:get_field("_IsFromQuestHostPacket");
|
||||
|
||||
function damage_hook.get_damage_source_type(damage_source_type_id, is_marionette_attack)
|
||||
if is_marionette_attack then
|
||||
@@ -213,8 +184,33 @@ function damage_hook.update_damage(enemy, enemy_calc_damage_info)
|
||||
player.update_damage(attacking_player, damage_source_type, is_large_monster, damage_object);
|
||||
end
|
||||
|
||||
function damage_hook.on_mystery_core_break(enemy)
|
||||
--function damage_hook.on_mystery_core_break(enemy)
|
||||
|
||||
--end
|
||||
|
||||
-- Coavins code
|
||||
function damage_hook.cart(type, args)
|
||||
if not quest_status.is_online then --We reach here with notifyDeath when player is offline
|
||||
player.myself.cart_count = player.myself.cart_count + 1;
|
||||
return;
|
||||
end
|
||||
|
||||
if player.myself.id == 0 then -- If player is host, netSendForfeit is always correct
|
||||
if type == "host" then
|
||||
local player_id = sdk.to_int64(args[3]);
|
||||
player.list[player_id].cart_count = player.list[player_id].cart_count + 1;
|
||||
end
|
||||
else
|
||||
if type == "not host" then
|
||||
local packet_quest_forfeit = sdk.to_managed_object(args[3]);
|
||||
local player_id = dead_player_id_field:get_data(packet_quest_forfeit);
|
||||
local is_from_host = is_from_host_field:get_data(packet_quest_forfeit)
|
||||
|
||||
if is_from_host then -- Data is sent twice, 1 from host and 1 from dead player. Check if from host to only add 1
|
||||
player.list[player_id].cart_count = player.list[player_id].cart_count + 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function damage_hook.init_module()
|
||||
@@ -230,11 +226,29 @@ function damage_hook.init_module()
|
||||
return retval;
|
||||
end);
|
||||
|
||||
sdk.hook(stock_mystery_core_break_damage_type_def, function(args)
|
||||
pcall(damage_hook.on_mystery_core_break, sdk.to_managed_object(args[2]));
|
||||
sdk.hook(not_host_cart_method, function(args)
|
||||
pcall(damage_hook.cart, "not host", args);
|
||||
end, function(retval)
|
||||
return retval;
|
||||
end);
|
||||
|
||||
sdk.hook(host_cart_method, function(args)
|
||||
pcall(damage_hook.cart, "host", args);
|
||||
end, function(retval)
|
||||
return retval;
|
||||
end);
|
||||
|
||||
sdk.hook(offline_cart_method, function(args)
|
||||
pcall(damage_hook.cart, "offline", args);
|
||||
end, function(retval)
|
||||
return retval;
|
||||
end);
|
||||
|
||||
--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)
|
||||
-- return retval;
|
||||
--end);
|
||||
end
|
||||
|
||||
return damage_hook;
|
||||
@@ -3,6 +3,7 @@ local singletons;
|
||||
local customization_menu;
|
||||
local player;
|
||||
local config;
|
||||
local small_monster;
|
||||
|
||||
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");
|
||||
@@ -12,9 +13,16 @@ time.total_elapsed_seconds = 0;
|
||||
time.elapsed_minutes = 0;
|
||||
time.elapsed_seconds = 0;
|
||||
|
||||
time.last_elapsed_seconds = 0;
|
||||
time.total_elapsed_script_seconds = 0;
|
||||
time.last_elapsed_script_seconds = 0;
|
||||
|
||||
function time.update_script_time()
|
||||
time.total_elapsed_script_seconds = os.clock();
|
||||
end
|
||||
|
||||
function time.tick()
|
||||
time.update_script_time();
|
||||
|
||||
if singletons.quest_manager == nil then
|
||||
return;
|
||||
end
|
||||
@@ -36,9 +44,10 @@ function time.tick()
|
||||
time.total_elapsed_seconds = quest_time_total_elapsed_seconds;
|
||||
time.elapsed_seconds = quest_time_total_elapsed_seconds - quest_time_elapsed_minutes * 60;
|
||||
|
||||
if time.total_elapsed_seconds - time.last_elapsed_seconds > 60 / config.current_config.global_settings.performance.updates_rate then
|
||||
time.last_elapsed_seconds = time.total_elapsed_seconds;
|
||||
if time.total_elapsed_script_seconds - time.last_elapsed_script_seconds > config.current_config.global_settings.performance.update_rate then
|
||||
time.last_elapsed_script_seconds = time.total_elapsed_script_seconds;
|
||||
time.update_players_dps();
|
||||
time.update_small_monsters();
|
||||
end
|
||||
end
|
||||
|
||||
@@ -48,20 +57,20 @@ function time.update_players_dps()
|
||||
local new_total_dps = 0;
|
||||
for _, _player in pairs(player.list) do
|
||||
if _player.join_time == -1 then
|
||||
_player.join_time = time.total_elapsed_seconds;
|
||||
_player.join_time = time.total_elapsed_script_seconds;
|
||||
end
|
||||
|
||||
if cached_config.dps_mode == "Quest Time" then
|
||||
if time.total_elapsed_seconds > 0 then
|
||||
_player.dps = _player.display.total_damage / time.total_elapsed_seconds;
|
||||
if time.total_elapsed_script_seconds > 0 then
|
||||
_player.dps = _player.display.total_damage / time.total_elapsed_script_seconds;
|
||||
end
|
||||
elseif cached_config.dps_mode == "Join Time" then
|
||||
if time.total_elapsed_seconds - _player.join_time > 0 then
|
||||
_player.dps = _player.display.total_damage / (time.total_elapsed_seconds - _player.join_time);
|
||||
if time.total_elapsed_script_seconds - _player.join_time > 0 then
|
||||
_player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.join_time);
|
||||
end
|
||||
elseif cached_config.dps_mode == "First Hit" then
|
||||
if time.total_elapsed_seconds - _player.first_hit_time > 0 then
|
||||
_player.dps = _player.display.total_damage / (time.total_elapsed_seconds - _player.first_hit_time);
|
||||
if time.total_elapsed_script_seconds - _player.first_hit_time > 0 then
|
||||
_player.dps = _player.display.total_damage / (time.total_elapsed_script_seconds - _player.first_hit_time);
|
||||
end
|
||||
else
|
||||
end
|
||||
@@ -72,12 +81,19 @@ function time.update_players_dps()
|
||||
player.total.dps = new_total_dps;
|
||||
end
|
||||
|
||||
function time.update_small_monsters()
|
||||
for enemy, monster in pairs(small_monster.list) do
|
||||
small_monster.update(enemy, monster);
|
||||
end
|
||||
end
|
||||
|
||||
function time.init_module()
|
||||
player = require("MHR_Overlay.Damage_Meter.player");
|
||||
singletons = require("MHR_Overlay.Game_Handler.singletons");
|
||||
customization_menu = require("MHR_Overlay.UI.customization_menu");
|
||||
time = require("MHR_Overlay.Game_Handler.time");
|
||||
config = require("MHR_Overlay.Misc.config");
|
||||
small_monster = require("MHR_Overlay.Monsters.small_monster");
|
||||
end
|
||||
|
||||
return time;
|
||||
@@ -3777,6 +3777,7 @@ function config.init()
|
||||
myself = {
|
||||
master_rank = true,
|
||||
hunter_rank = true,
|
||||
cart_count = false,
|
||||
word_player = false,
|
||||
player_id = false,
|
||||
player_name = true
|
||||
@@ -3785,6 +3786,7 @@ function config.init()
|
||||
others = {
|
||||
master_rank = true,
|
||||
hunter_rank = true,
|
||||
cart_count = false,
|
||||
word_player = false,
|
||||
player_id = false,
|
||||
player_name = true
|
||||
@@ -3840,6 +3842,26 @@ function config.init()
|
||||
}
|
||||
},
|
||||
|
||||
cart_count_label = {
|
||||
visibility = false,
|
||||
|
||||
text = "x%d",
|
||||
offset = {
|
||||
x = 315,
|
||||
y = 0
|
||||
},
|
||||
color = 0xFFCCF4E1,
|
||||
|
||||
shadow = {
|
||||
visibility = true,
|
||||
offset = {
|
||||
x = 1,
|
||||
y = 1
|
||||
},
|
||||
color = 0xFF000000
|
||||
}
|
||||
},
|
||||
|
||||
dps_label = {
|
||||
visibility = true,
|
||||
text = "%.1f",
|
||||
|
||||
@@ -378,7 +378,9 @@ language.default_language = {
|
||||
|
||||
player_name_size_limit = "Player Name Size Limit",
|
||||
|
||||
update_rate = "Update Rate"
|
||||
update_rate = "Update Rate",
|
||||
cart_count = "Cart Count",
|
||||
cart_count_label = "Cart Count Label",
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -337,7 +337,6 @@ function body_part.draw_static(monster, parts_position_on_screen, opacity_scale)
|
||||
and ((part.loss_health == part.loss_max_health and not part.is_severed) or part.loss_max_health < 0) then
|
||||
goto continue;
|
||||
end
|
||||
|
||||
if (not part.body_part_static_UI.flinch_visibility or part.max_health < 0)
|
||||
and (not part.body_part_static_UI.break_visibility or part.break_max_health < 0 or part.break_count >= part.break_max_count)
|
||||
and (not part.body_part_static_UI.loss_visibility or part.loss_max_health < 0 or part.is_severed) then
|
||||
@@ -348,6 +347,7 @@ function body_part.draw_static(monster, parts_position_on_screen, opacity_scale)
|
||||
goto continue;
|
||||
end
|
||||
|
||||
|
||||
table.insert(displayed_parts, part);
|
||||
::continue::
|
||||
end
|
||||
|
||||
@@ -895,7 +895,7 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale)
|
||||
else
|
||||
monster.health_static_UI.bar.colors = cached_config.health.bar.normal_colors;
|
||||
end
|
||||
|
||||
|
||||
drawing.draw_label(monster.static_name_label, position_on_screen, opacity_scale, monster_name_text);
|
||||
|
||||
local health_position_on_screen = {
|
||||
@@ -933,7 +933,7 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale)
|
||||
|
||||
stamina_UI_entity.draw(monster, monster.stamina_static_UI, stamina_position_on_screen, opacity_scale);
|
||||
rage_UI_entity.draw(monster, monster.rage_static_UI, rage_position_on_screen, opacity_scale);
|
||||
|
||||
|
||||
local last_part_position_on_screen = body_part.draw_static(monster, parts_position_on_screen, opacity_scale);
|
||||
|
||||
if cached_config.ailments.settings.offset_is_relative_to_parts then
|
||||
|
||||
@@ -89,7 +89,6 @@ function large_monster_UI.draw(dynamic_enabled, static_enabled, highlighted_enab
|
||||
if static_enabled then
|
||||
large_monster_UI.draw_static(displayed_monsters, highlighted_monster);
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function large_monster_UI.draw_dynamic(displayed_monsters, highlighted_monster)
|
||||
|
||||
@@ -5,7 +5,7 @@ local config;
|
||||
local player;
|
||||
local language;
|
||||
|
||||
function damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label, hunter_rank_label, value_label, percentage_label)
|
||||
function damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label, hunter_rank_label, value_label, percentage_label, cart_count_label)
|
||||
local entity = {};
|
||||
|
||||
local global_scale_modifier = config.current_config.global_settings.modifiers.global_scale_modifier;
|
||||
@@ -16,6 +16,7 @@ function damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label
|
||||
entity.player_name_label = table_helpers.deep_copy(player_name_label);
|
||||
entity.dps_label = table_helpers.deep_copy(dps_label);
|
||||
entity.hunter_rank_label = table_helpers.deep_copy(hunter_rank_label);
|
||||
entity.cart_count_label = table_helpers.deep_copy(cart_count_label);
|
||||
entity.value_label = table_helpers.deep_copy(value_label);
|
||||
entity.percentage_label = table_helpers.deep_copy(percentage_label);
|
||||
|
||||
@@ -40,6 +41,9 @@ function damage_UI_entity.new(bar, highlighted_bar, player_name_label, dps_label
|
||||
entity.hunter_rank_label.offset.x = entity.hunter_rank_label.offset.x * global_scale_modifier;
|
||||
entity.hunter_rank_label.offset.y = entity.hunter_rank_label.offset.y * global_scale_modifier;
|
||||
|
||||
entity.cart_count_label.offset.x = entity.cart_count_label.offset.x * global_scale_modifier;
|
||||
entity.cart_count_label.offset.y = entity.cart_count_label.offset.y * global_scale_modifier;
|
||||
|
||||
entity.value_label.offset.x = entity.value_label.offset.x * global_scale_modifier;
|
||||
entity.value_label.offset.y = entity.value_label.offset.y * global_scale_modifier;
|
||||
|
||||
@@ -67,6 +71,11 @@ function damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_d
|
||||
player_name_text = string.format("[%d] ", _player.hunter_rank);
|
||||
end
|
||||
|
||||
if player_include.cart_count then
|
||||
player_name_text = player_name_text .. string.format("x%d ", _player.cart_count);
|
||||
end
|
||||
|
||||
|
||||
if player_include.word_player then
|
||||
player_name_text = player_name_text .. language.current_language.UI.player .. " ";
|
||||
end
|
||||
@@ -125,12 +134,15 @@ function damage_UI_entity.draw(_player, position_on_screen, opacity_scale, top_d
|
||||
end
|
||||
end
|
||||
|
||||
player_name_text = drawing.limit_text_size(player_name_text, _player.damage_UI.player_name_size_limit);
|
||||
if _player.damage_UI.player_name_size_limit ~= 0 then
|
||||
player_name_text = drawing.limit_text_size(player_name_text, _player.damage_UI.player_name_size_limit);
|
||||
end
|
||||
|
||||
drawing.draw_label(_player.damage_UI.player_name_label, position_on_screen, opacity_scale, player_name_text);
|
||||
drawing.draw_label(_player.damage_UI.value_label, position_on_screen, opacity_scale, _player.display.total_damage);
|
||||
drawing.draw_label(_player.damage_UI.percentage_label, position_on_screen, opacity_scale, 100 * player_damage_percentage);
|
||||
drawing.draw_label(_player.damage_UI.dps_label, position_on_screen, opacity_scale, _player.dps);
|
||||
drawing.draw_label(_player.damage_UI.cart_count_label, position_on_screen, opacity_scale, _player.cart_count);
|
||||
end
|
||||
|
||||
function damage_UI_entity.init_module()
|
||||
|
||||
@@ -15249,6 +15249,12 @@ function customization_menu.draw()
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.player_name_label.include.myself.cart_count = imgui.checkbox(
|
||||
language.current_language.customization_menu.cart_count,
|
||||
config.current_config.damage_meter_UI.player_name_label.include.myself.cart_count);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.player_name_label.include.myself.word_player = imgui.checkbox(
|
||||
language.current_language.customization_menu.word_player,
|
||||
config.current_config.damage_meter_UI.player_name_label.include.myself.word_player);
|
||||
@@ -15283,6 +15289,12 @@ function customization_menu.draw()
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.player_name_label.include.others.cart_count = imgui.checkbox(
|
||||
language.current_language.customization_menu.cart_count,
|
||||
config.current_config.damage_meter_UI.player_name_label.include.others.cart_count);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.player_name_label.include.others.word_player = imgui.checkbox(
|
||||
language.current_language.customization_menu.word_player,
|
||||
config.current_config.damage_meter_UI.player_name_label.include.others.word_player);
|
||||
@@ -15478,6 +15490,77 @@ function customization_menu.draw()
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.cart_count_label) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.visibility = imgui.checkbox(language.current_language
|
||||
.customization_menu.visible,
|
||||
config.current_config.damage_meter_UI.cart_count_label.visibility);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.offset) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.offset.x = imgui.drag_float(language.current_language
|
||||
.customization_menu.x,
|
||||
config.current_config.damage_meter_UI.cart_count_label.offset.x, 0.1, -screen.width, screen.width, "%.1f");
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.offset.y = imgui.drag_float(language.current_language
|
||||
.customization_menu.y,
|
||||
config.current_config.damage_meter_UI.cart_count_label.offset.y, 0.1, -screen.height, screen.height, "%.1f");
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.color) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.color = imgui.color_picker_argb("",
|
||||
config.current_config.damage_meter_UI.cart_count_label.color, customization_menu.color_picker_flags);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.shadow) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.shadow.visibility = imgui.checkbox(language.current_language
|
||||
.customization_menu.visible,
|
||||
config.current_config.damage_meter_UI.cart_count_label.shadow.visibility);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.offset) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.shadow.offset.x = imgui.drag_float(language.current_language
|
||||
.customization_menu.x,
|
||||
config.current_config.damage_meter_UI.cart_count_label.shadow.offset.x, 0.1, -screen.width, screen.width, "%.1f");
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.shadow.offset.y = imgui.drag_float(language.current_language
|
||||
.customization_menu.y,
|
||||
config.current_config.damage_meter_UI.cart_count_label.shadow.offset.y, 0.1, -screen.height, screen.height,
|
||||
"%.1f");
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.color) then
|
||||
changed, config.current_config.damage_meter_UI.cart_count_label.shadow.color = imgui.color_picker_argb("",
|
||||
config.current_config.damage_meter_UI.cart_count_label.shadow.color, customization_menu.color_picker_flags);
|
||||
config_changed = config_changed or changed;
|
||||
damage_meter_UI_changed = damage_meter_UI_changed or changed;
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
imgui.tree_pop();
|
||||
end
|
||||
|
||||
if imgui.tree_node(language.current_language.customization_menu.dps_label) then
|
||||
changed, config.current_config.damage_meter_UI.dps_label.visibility = imgui.checkbox(language.current_language.customization_menu
|
||||
.visible,
|
||||
|
||||
Reference in New Issue
Block a user