Add Cart Count, fix Script Time;

This commit is contained in:
GreenComfyTea
2022-07-11 11:55:31 +03:00
parent 2d84b4bb65
commit 8da36a275c
14 changed files with 225 additions and 57 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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