Implemented Ailment Buildup UI per player.

This commit is contained in:
GreenComfyTea
2022-06-04 18:58:23 +03:00
parent b461f63a4a
commit 984b463aaf
15 changed files with 4322 additions and 49 deletions

View File

@@ -0,0 +1,529 @@
local ailment_buildup = {};
local player;
local language;
local config;
local ailments;
local ailment_buildup_UI_entity;
local time;
local small_monster;
local large_monster;
local table_helpers;
local drawing;
function ailment_buildup.draw_dynamic(monster, ailment_buildups_position_on_screen, opacity_scale)
if not config.current_config.large_monster_UI.dynamic.ailment_buildups.enabled then
return;
end
for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then
if not config.current_config.large_monster_UI.dynamic.ailment_buildups.filter.stun then
goto continue;
end
elseif id == ailments.poison_id then
if not config.current_config.large_monster_UI.dynamic.ailment_buildups.filter.poison then
goto continue;
end
elseif id == ailments.blast_id then
if not config.current_config.large_monster_UI.dynamic.ailment_buildups.filter.blast then
goto continue;
end
else
goto continue;
end
if config.current_config.large_monster_UI.dynamic.ailment_buildups.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.dynamic.ailment_buildups.settings.time_limit then
goto continue;
end
local total_buildup = 0;
local top_buildup = 0;
local displayed_players = {};
for player_id, player_buildup in pairs(ailment.buildup) do
total_buildup = total_buildup + player_buildup;
if player_buildup > top_buildup then
top_buildup = player_buildup;
end
table.insert(displayed_players,
{
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player_id],
["id"] = player_id
}
);
end
if total_buildup == 0 then
goto continue;
end
if config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.type == "Normal" then
if config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.id < right.id;
end);
else
table.sort(displayed_players, function(left, right)
return left.id > right.id;
end);
end
elseif config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.type == "Buildup" then
if config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup < right.buildup;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup > right.buildup;
end);
end
elseif config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.type == "Buildup Percentage" then
if config.current_config.large_monster_UI.dynamic.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup_share < right.buildup_share;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup_share > right.buildup_share;
end);
end
end
local ailment_name = "";
if config.current_config.large_monster_UI.dynamic.ailment_buildups.ailment_name_label.include.ailment_name then
ailment_name = ailment.name .. " ";
end
if config.current_config.large_monster_UI.dynamic.ailment_buildups.ailment_name_label.include.activation_count and ailment.activate_count ~= 0 then
ailment_name = ailment_name .. "x" .. tostring(ailment.activate_count);
end
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_dynamic_UI.ailment_name_label, ailment_buildups_position_on_screen, opacity_scale, ailment_name);
local last_j = 0;
for j, _player in ipairs(displayed_players) do
local ailment_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.dynamic.ailment_buildups.players_spacing.x * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.dynamic.ailment_buildups.players_spacing.y * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier;
};
ailment_buildup_UI_entity.draw_dynamic(_player, monster.ailments[ailments.stun_id].ailment_buildup_dynamic_UI, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
last_j = j;
end
local total_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.dynamic.ailment_buildups.players_spacing.x * last_j * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.dynamic.ailment_buildups.players_spacing.y * last_j * config.current_config.global_settings.modifiers.global_scale_modifier;
};
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_dynamic_UI.total_buildup_label, total_buildup_position_on_screen, opacity_scale, language.current_language.UI.total_buildup);
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_dynamic_UI.total_buildup_value_label, total_buildup_position_on_screen, opacity_scale, total_buildup);
ailment_buildups_position_on_screen = {
x = total_buildup_position_on_screen.x + config.current_config.large_monster_UI.dynamic.ailment_buildups.ailments_spacing.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = total_buildup_position_on_screen.y + 17 + config.current_config.large_monster_UI.dynamic.ailment_buildups.ailments_spacing.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
::continue::
end
end
function ailment_buildup.draw_static(monster, ailment_buildups_position_on_screen, opacity_scale)
if not config.current_config.large_monster_UI.static.ailment_buildups.enabled then
return;
end
for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then
if not config.current_config.large_monster_UI.static.ailment_buildups.filter.stun then
goto continue;
end
elseif id == ailments.poison_id then
if not config.current_config.large_monster_UI.static.ailment_buildups.filter.poison then
goto continue;
end
elseif id == ailments.blast_id then
if not config.current_config.large_monster_UI.static.ailment_buildups.filter.blast then
goto continue;
end
else
goto continue;
end
if config.current_config.large_monster_UI.static.ailment_buildups.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.static.ailment_buildups.settings.time_limit then
goto continue;
end
local total_buildup = 0;
local top_buildup = 0;
local displayed_players = {};
for player_id, player_buildup in pairs(ailment.buildup) do
total_buildup = total_buildup + player_buildup;
if player_buildup > top_buildup then
top_buildup = player_buildup;
end
table.insert(displayed_players,
{
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player_id],
["id"] = player_id
}
);
end
if total_buildup == 0 then
goto continue;
end
if config.current_config.large_monster_UI.static.ailment_buildups.sorting.type == "Normal" then
if config.current_config.large_monster_UI.static.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.id < right.id;
end);
else
table.sort(displayed_players, function(left, right)
return left.id > right.id;
end);
end
elseif config.current_config.large_monster_UI.static.ailment_buildups.sorting.type == "Buildup" then
if config.current_config.large_monster_UI.static.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup < right.buildup;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup > right.buildup;
end);
end
elseif config.current_config.large_monster_UI.static.ailment_buildups.sorting.type == "Buildup Percentage" then
if config.current_config.large_monster_UI.static.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup_share < right.buildup_share;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup_share > right.buildup_share;
end);
end
end
local ailment_name = "";
if config.current_config.large_monster_UI.static.ailment_buildups.ailment_name_label.include.ailment_name then
ailment_name = ailment.name .. " ";
end
if config.current_config.large_monster_UI.static.ailment_buildups.ailment_name_label.include.activation_count and ailment.activate_count ~= 0 then
ailment_name = ailment_name .. "x" .. tostring(ailment.activate_count);
end
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_static_UI.ailment_name_label, ailment_buildups_position_on_screen, opacity_scale, ailment_name);
local last_j = 0;
for j, _player in ipairs(displayed_players) do
local ailment_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.static.ailment_buildups.players_spacing.x * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.static.ailment_buildups.players_spacing.y * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier;
};
ailment_buildup_UI_entity.draw_static(_player, monster.ailments[ailments.stun_id].ailment_buildup_static_UI, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
last_j = j;
end
local total_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.static.ailment_buildups.players_spacing.x * last_j * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.static.ailment_buildups.players_spacing.y * last_j * config.current_config.global_settings.modifiers.global_scale_modifier;
};
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_static_UI.total_buildup_label, total_buildup_position_on_screen, opacity_scale, language.current_language.UI.total_buildup);
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_static_UI.total_buildup_value_label, total_buildup_position_on_screen, opacity_scale, total_buildup);
ailment_buildups_position_on_screen = {
x = total_buildup_position_on_screen.x + config.current_config.large_monster_UI.static.ailment_buildups.ailments_spacing.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = total_buildup_position_on_screen.y + 17 + config.current_config.large_monster_UI.static.ailment_buildups.ailments_spacing.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
::continue::
end
end
function ailment_buildup.draw_highlighted(monster, ailment_buildups_position_on_screen, opacity_scale)
if not config.current_config.large_monster_UI.highlighted.ailment_buildups.enabled then
return;
end
for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then
if not config.current_config.large_monster_UI.highlighted.ailment_buildups.filter.stun then
goto continue;
end
elseif id == ailments.poison_id then
if not config.current_config.large_monster_UI.highlighted.ailment_buildups.filter.poison then
goto continue;
end
elseif id == ailments.blast_id then
if not config.current_config.large_monster_UI.highlighted.ailment_buildups.filter.blast then
goto continue;
end
else
goto continue;
end
if config.current_config.large_monster_UI.highlighted.ailment_buildups.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.large_monster_UI.highlighted.ailment_buildups.settings.time_limit then
goto continue;
end
local total_buildup = 0;
local top_buildup = 0;
local displayed_players = {};
for player_id, player_buildup in pairs(ailment.buildup) do
total_buildup = total_buildup + player_buildup;
if player_buildup > top_buildup then
top_buildup = player_buildup;
end
table.insert(displayed_players,
{
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player_id],
["id"] = player_id
}
);
end
if total_buildup == 0 then
goto continue;
end
if config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.type == "Normal" then
if config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.id < right.id;
end);
else
table.sort(displayed_players, function(left, right)
return left.id > right.id;
end);
end
elseif config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.type == "Buildup" then
if config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup < right.buildup;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup > right.buildup;
end);
end
elseif config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.type == "Buildup Percentage" then
if config.current_config.large_monster_UI.highlighted.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup_share < right.buildup_share;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup_share > right.buildup_share;
end);
end
end
local ailment_name = "";
if config.current_config.large_monster_UI.highlighted.ailment_buildups.ailment_name_label.include.ailment_name then
ailment_name = ailment.name .. " ";
end
if config.current_config.large_monster_UI.highlighted.ailment_buildups.ailment_name_label.include.activation_count and ailment.activate_count ~= 0 then
ailment_name = ailment_name .. "x" .. tostring(ailment.activate_count);
end
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_highlighted_UI.ailment_name_label, ailment_buildups_position_on_screen, opacity_scale, ailment_name);
local last_j = 0;
for j, _player in ipairs(displayed_players) do
local ailment_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailment_buildups.players_spacing.x * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailment_buildups.players_spacing.y * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier;
};
ailment_buildup_UI_entity.draw_highlighted(_player, monster.ailments[ailments.stun_id].ailment_buildup_highlighted_UI, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
last_j = j;
end
local total_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailment_buildups.players_spacing.x * last_j * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailment_buildups.players_spacing.y * last_j * config.current_config.global_settings.modifiers.global_scale_modifier;
};
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_highlighted_UI.total_buildup_label, total_buildup_position_on_screen, opacity_scale, language.current_language.UI.total_buildup);
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_highlighted_UI.total_buildup_value_label, total_buildup_position_on_screen, opacity_scale, total_buildup);
ailment_buildups_position_on_screen = {
x = total_buildup_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailment_buildups.ailments_spacing.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = total_buildup_position_on_screen.y + 17 + config.current_config.large_monster_UI.highlighted.ailment_buildups.ailments_spacing.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
::continue::
end
end
function ailment_buildup.draw_small(monster, ailment_buildups_position_on_screen, opacity_scale)
if not config.current_config.small_monster_UI.ailment_buildups.enabled then
return;
end
for id, ailment in pairs(monster.ailments) do
if id == ailments.stun_id then
if not config.current_config.small_monster_UI.ailment_buildups.filter.stun then
goto continue;
end
elseif id == ailments.poison_id then
if not config.current_config.small_monster_UI.ailment_buildups.filter.poison then
goto continue;
end
elseif id == ailments.blast_id then
if not config.current_config.small_monster_UI.ailment_buildups.filter.blast then
goto continue;
end
else
goto continue;
end
if config.current_config.small_monster_UI.ailment_buildups.settings.time_limit ~= 0 and time.total_elapsed_seconds - ailment.last_change_time > config.current_config.small_monster_UI.ailment_buildups.settings.time_limit then
goto continue;
end
local total_buildup = 0;
local top_buildup = 0;
local displayed_players = {};
for player_id, player_buildup in pairs(ailment.buildup) do
total_buildup = total_buildup + player_buildup;
if player_buildup > top_buildup then
top_buildup = player_buildup;
end
table.insert(displayed_players,
{
["buildup"] = player_buildup,
["buildup_share"] = ailment.buildup_share[player_id],
["id"] = player_id
}
);
end
if total_buildup == 0 then
goto continue;
end
if config.current_config.small_monster_UI.ailment_buildups.sorting.type == "Normal" then
if config.current_config.small_monster_UI.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.id < right.id;
end);
else
table.sort(displayed_players, function(left, right)
return left.id > right.id;
end);
end
elseif config.current_config.small_monster_UI.ailment_buildups.sorting.type == "Buildup" then
if config.current_config.small_monster_UI.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup < right.buildup;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup > right.buildup;
end);
end
elseif config.current_config.small_monster_UI.ailment_buildups.sorting.type == "Buildup Percentage" then
if config.current_config.small_monster_UI.ailment_buildups.sorting.reversed_order then
table.sort(displayed_players, function(left, right)
return left.buildup_share < right.buildup_share;
end);
else
table.sort(displayed_players, function(left, right)
return left.buildup_share > right.buildup_share;
end);
end
end
local ailment_name = "";
if config.current_config.small_monster_UI.ailment_buildups.ailment_name_label.include.ailment_name then
ailment_name = ailment.name .. " ";
end
if config.current_config.small_monster_UI.ailment_buildups.ailment_name_label.include.activation_count and ailment.activate_count ~= 0 then
ailment_name = ailment_name .. "x" .. tostring(ailment.activate_count);
end
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_small_UI.ailment_name_label, ailment_buildups_position_on_screen, opacity_scale, ailment_name);
local last_j = 0;
for j, _player in ipairs(displayed_players) do
local ailment_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.small_monster_UI.ailment_buildups.players_spacing.x * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.small_monster_UI.ailment_buildups.players_spacing.y * (j - 1) * config.current_config.global_settings.modifiers.global_scale_modifier;
};
ailment_buildup_UI_entity.draw_small(_player, monster.ailments[ailments.stun_id].ailment_buildup_small_UI, ailment_buildup_position_on_screen, opacity_scale, top_buildup);
last_j = j;
end
local total_buildup_position_on_screen = {
x = ailment_buildups_position_on_screen.x + config.current_config.small_monster_UI.ailment_buildups.players_spacing.x * last_j * config.current_config.global_settings.modifiers.global_scale_modifier,
y = ailment_buildups_position_on_screen.y + config.current_config.small_monster_UI.ailment_buildups.players_spacing.y * last_j * config.current_config.global_settings.modifiers.global_scale_modifier;
};
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_small_UI.total_buildup_label, total_buildup_position_on_screen, opacity_scale, language.current_language.UI.total_buildup);
drawing.draw_label(monster.ailments[ailments.stun_id].ailment_buildup_small_UI.total_buildup_value_label, total_buildup_position_on_screen, opacity_scale, total_buildup);
ailment_buildups_position_on_screen = {
x = total_buildup_position_on_screen.x + config.current_config.small_monster_UI.ailment_buildups.ailments_spacing.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = total_buildup_position_on_screen.y + 17 + config.current_config.small_monster_UI.ailment_buildups.ailments_spacing.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
::continue::
end
end
function ailment_buildup.init_module()
player = require("MHR_Overlay.Damage_Meter.player");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
ailments = require("MHR_Overlay.Monsters.ailments");
ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
time = require("MHR_Overlay.Game_Handler.time");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");
table_helpers = require("MHR_Overlay.Misc.table_helpers");
drawing = require("MHR_Overlay.UI.drawing");
end
return ailment_buildup;

View File

@@ -54,7 +54,8 @@ function ailment_hook.poison_proc(poison_param)
monster = small_monster.get_monster(enemy);
end
ailments.calculate_ailment_contribution(monster, ailments.poison_id);
monster.ailments[ailments.poison_id].cashed_buildup_share = monster.ailments[ailments.poison_id].buildup_share;
ailments.clear_ailment_contribution(monster, ailments.poison_id);
end
function ailment_hook.stock_damage()

View File

@@ -3,6 +3,7 @@ local player;
local language;
local config;
local ailment_UI_entity;
local ailment_buildup_UI_entity;
local time;
local small_monster;
local large_monster;
@@ -139,13 +140,65 @@ function ailments.init_ailments()
_ailments[ailments.poison_id].buildup = {};
_ailments[ailments.poison_id].buildup_share = {};
_ailments[ailments.poison_id].cashed_buildup_share = {};
_ailments[ailments.blast_id].buildup = {};
_ailments[ailments.blast_id].buildup_share = {};
_ailments[ailments.stun_id].buildup = {};
_ailments[ailments.stun_id].buildup_share = {};
ailments.init_ailment_buildup_UI(_ailments);
return _ailments;
end
function ailments.init_ailment_buildup_UI(_ailments)
_ailments[ailments.stun_id].ailment_buildup_dynamic_UI = ailment_buildup_UI_entity.new(
config.current_config.large_monster_UI.dynamic.ailment_buildups.buildup_bar,
config.current_config.large_monster_UI.dynamic.ailment_buildups.highlighted_buildup_bar,
config.current_config.large_monster_UI.dynamic.ailment_buildups.ailment_name_label,
config.current_config.large_monster_UI.dynamic.ailment_buildups.player_name_label,
config.current_config.large_monster_UI.dynamic.ailment_buildups.buildup_value_label,
config.current_config.large_monster_UI.dynamic.ailment_buildups.buildup_percentage_label,
config.current_config.large_monster_UI.dynamic.ailment_buildups.total_buildup_label,
config.current_config.large_monster_UI.dynamic.ailment_buildups.total_buildup_value_label
);
_ailments[ailments.stun_id].ailment_buildup_static_UI = ailment_buildup_UI_entity.new(
config.current_config.large_monster_UI.static.ailment_buildups.buildup_bar,
config.current_config.large_monster_UI.static.ailment_buildups.highlighted_buildup_bar,
config.current_config.large_monster_UI.static.ailment_buildups.ailment_name_label,
config.current_config.large_monster_UI.static.ailment_buildups.player_name_label,
config.current_config.large_monster_UI.static.ailment_buildups.buildup_value_label,
config.current_config.large_monster_UI.static.ailment_buildups.buildup_percentage_label,
config.current_config.large_monster_UI.static.ailment_buildups.total_buildup_label,
config.current_config.large_monster_UI.static.ailment_buildups.total_buildup_value_label
);
_ailments[ailments.stun_id].ailment_buildup_highlighted_UI = ailment_buildup_UI_entity.new(
config.current_config.large_monster_UI.highlighted.ailment_buildups.buildup_bar,
config.current_config.large_monster_UI.highlighted.ailment_buildups.highlighted_buildup_bar,
config.current_config.large_monster_UI.highlighted.ailment_buildups.ailment_name_label,
config.current_config.large_monster_UI.highlighted.ailment_buildups.player_name_label,
config.current_config.large_monster_UI.highlighted.ailment_buildups.buildup_value_label,
config.current_config.large_monster_UI.highlighted.ailment_buildups.buildup_percentage_label,
config.current_config.large_monster_UI.highlighted.ailment_buildups.total_buildup_label,
config.current_config.large_monster_UI.highlighted.ailment_buildups.total_buildup_value_label
);
_ailments[ailments.stun_id].ailment_buildup_small_UI = ailment_buildup_UI_entity.new(
config.current_config.small_monster_UI.ailment_buildups.buildup_bar,
config.current_config.small_monster_UI.ailment_buildups.highlighted_buildup_bar,
config.current_config.small_monster_UI.ailment_buildups.ailment_name_label,
config.current_config.small_monster_UI.ailment_buildups.player_name_label,
config.current_config.small_monster_UI.ailment_buildups.buildup_value_label,
config.current_config.small_monster_UI.ailment_buildups.buildup_percentage_label,
config.current_config.small_monster_UI.ailment_buildups.total_buildup_label,
config.current_config.small_monster_UI.ailment_buildups.total_buildup_value_label
);
end
local enemy_character_base_type_def = sdk.find_type_definition("snow.enemy.EnemyCharacterBase");
local enemy_condition_damage_param_base_type_def = sdk.find_type_definition("snow.enemy.EnemyConditionDamageParamBase");
@@ -218,6 +271,10 @@ function ailments.update_ailments(enemy, monster)
if activate_count ~= nil then
if activate_count ~= monster.ailments[id].activate_count then
ailments.update_last_change_time(monster, id);
if id == ailments.stun_id then
ailments.clear_ailment_contribution(monster, ailments.stun_id);
end
end
monster.ailments[id].activate_count = activate_count;
@@ -267,7 +324,7 @@ function ailments.update_ailments(enemy, monster)
monster.ailments[id].duration = duration;
end
if duration ~= 0 then
if duration ~= 0 and duration ~= nil then
monster.ailments[id].timer_percentage = timer / monster.ailments[id].duration;
end
@@ -286,14 +343,6 @@ function ailments.update_ailments(enemy, monster)
monster.ailments[id].minutes_left = minutes_left;
monster.ailments[id].seconds_left = seconds_left;
end
if is_active ~= nil then
if is_active ~= monster.ailments[id].is_active then
ailments.update_last_change_time(monster, id);
end
monster.ailments[id].is_active = is_active;
end
end
end
@@ -323,12 +372,11 @@ function ailments.update_poison_blast(monster, poison_param, blast_param)
if activate_count > monster.ailments[ailments.blast_id].activate_count then
monster.ailments[ailments.blast_id].activate_count = activate_count;
ailments.calculate_ailment_contribution(monster, ailments.blast_id);
local blast_damage = blast_damage_method:call(blast_param);
local blast_adjust_rate = blast_adjust_rate_method:call(blast_param);
ailments.apply_ailment_damage(monster, ailments.blast_id, blast_damage * blast_adjust_rate);
ailments.clear_ailment_contribution(monster, ailments.blast_id);
end
end
end
@@ -643,7 +691,8 @@ function ailments.draw_small(monster, ailments_position_on_screen, opacity_scale
end
function ailments.apply_ailment_buildup(monster, attacker_id, ailment_type, ailment_buildup)
if monster == nil or player == nil or (ailment_type ~= ailments.poison_id and ailment_type ~= ailments.blast_id) then
if monster == nil or player == nil or (ailment_type ~= ailments.poison_id and ailment_type ~= ailments.blast_id and ailment_type ~= ailments.stun_id) then
return;
end
@@ -654,6 +703,8 @@ function ailments.apply_ailment_buildup(monster, attacker_id, ailment_type, ailm
-- accumulate this buildup for this attacker
monster.ailments[ailment_type].buildup[attacker_id] = (monster.ailments[ailment_type].buildup[attacker_id] or 0) + ailment_buildup;
ailments.calculate_ailment_contribution(monster, ailment_type);
end
-- Code by coavins
@@ -667,8 +718,12 @@ function ailments.calculate_ailment_contribution(monster, ailment_type)
for attacker_id, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
-- update ratio for this attacker
monster.ailments[ailment_type].buildup_share[attacker_id] = player_buildup / total;
-- clear accumulated buildup for this attacker
-- they have to start over to earn a share of next ailment trigger
end
end
function ailments.clear_ailment_contribution(monster, ailment_type)
for attacker_id, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
monster.ailments[ailment_type].buildup_share[attacker_id] = 0;
monster.ailments[ailment_type].buildup[attacker_id] = 0;
end
end
@@ -681,8 +736,10 @@ function ailments.apply_ailment_damage(monster, ailment_type, ailment_damage)
end
local damage_source_type = "";
local buildup_share = monster.ailments[ailment_type].buildup_share;
if ailment_type == ailments.poison_id then
damage_source_type = "poison";
buildup_share = monster.ailments[ailment_type]._cached_buildup_share;
elseif ailment_type == ailments.blast_id then
damage_source_type = "blast";
else
@@ -693,7 +750,7 @@ function ailments.apply_ailment_damage(monster, ailment_type, ailment_damage)
-- split up damage according to ratio of buildup on boss for this type
for attacker_id, percentage in pairs(monster.ailments[ailment_type].buildup_share) do
for attacker_id, percentage in pairs(buildup_share) do
local damage_portion = damage * percentage;
local damage_object = {};
@@ -719,6 +776,7 @@ function ailments.init_module()
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
ailment_buildup_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_buildup_UI_entity");
time = require("MHR_Overlay.Game_Handler.time");
small_monster = require("MHR_Overlay.Monsters.small_monster");
large_monster = require("MHR_Overlay.Monsters.large_monster");

View File

@@ -8,6 +8,7 @@ local health_UI_entity;
local stamina_UI_entity;
local rage_UI_entity;
local ailment_UI_entity;
local ailment_buildup;
local screen;
local drawing;
local ailments;
@@ -688,6 +689,11 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale)
x = position_on_screen.x + config.current_config.large_monster_UI.dynamic.ailments.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.large_monster_UI.dynamic.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
local ailment_buildups_position_on_screen = {
x = position_on_screen.x + config.current_config.large_monster_UI.dynamic.ailment_buildups.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.large_monster_UI.dynamic.ailment_buildups.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
health_UI_entity.draw(monster, monster.health_dynamic_UI, health_position_on_screen, opacity_scale);
drawing.draw_capture_line(monster.health_dynamic_UI.bar, health_position_on_screen, opacity_scale, monster.capture_percentage);
@@ -707,6 +713,7 @@ function large_monster.draw_dynamic(monster, position_on_screen, opacity_scale)
end
ailments.draw_dynamic(monster, ailments_position_on_screen, opacity_scale);
ailment_buildup.draw_dynamic(monster, ailment_buildups_position_on_screen, opacity_scale);
end
function large_monster.draw_static(monster, position_on_screen, opacity_scale)
@@ -762,6 +769,11 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale)
y = position_on_screen.y + config.current_config.large_monster_UI.static.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
local ailment_buildups_position_on_screen = {
x = position_on_screen.x + config.current_config.large_monster_UI.static.ailment_buildups.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.large_monster_UI.static.ailment_buildups.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
health_UI_entity.draw(monster, monster.health_static_UI, health_position_on_screen, opacity_scale);
drawing.draw_capture_line(monster.health_static_UI.bar, health_position_on_screen, opacity_scale, monster.capture_percentage);
@@ -773,13 +785,14 @@ function large_monster.draw_static(monster, position_on_screen, opacity_scale)
if config.current_config.large_monster_UI.static.ailments.settings.offset_is_relative_to_parts then
if last_part_position_on_screen ~= nil then
ailments_position_on_screen = {
x = last_part_position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = last_part_position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.relative_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
x = last_part_position_on_screen.x + config.current_config.large_monster_UI.static.ailments.relative_offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = last_part_position_on_screen.y + config.current_config.large_monster_UI.static.ailments.relative_offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
end
end
ailments.draw_static(monster, ailments_position_on_screen, opacity_scale);
ailment_buildup.draw_static(monster, ailment_buildups_position_on_screen, opacity_scale);
end
function large_monster.draw_highlighted(monster, position_on_screen, opacity_scale)
@@ -834,6 +847,11 @@ function large_monster.draw_highlighted(monster, position_on_screen, opacity_sca
y = position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
local ailment_buildups_position_on_screen = {
x = position_on_screen.x + config.current_config.large_monster_UI.highlighted.ailment_buildups.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.large_monster_UI.highlighted.ailment_buildups.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
health_UI_entity.draw(monster, monster.health_highlighted_UI, health_position_on_screen, opacity_scale);
drawing.draw_capture_line(monster.health_highlighted_UI.bar, health_position_on_screen, opacity_scale, monster.capture_percentage);
@@ -842,8 +860,6 @@ function large_monster.draw_highlighted(monster, position_on_screen, opacity_sca
local last_part_position_on_screen = body_part.draw_highlighted(monster, parts_position_on_screen, opacity_scale);
if config.current_config.large_monster_UI.highlighted.ailments.settings.offset_is_relative_to_parts then
if last_part_position_on_screen ~= nil then
ailments_position_on_screen = {
@@ -854,6 +870,7 @@ function large_monster.draw_highlighted(monster, position_on_screen, opacity_sca
end
ailments.draw_highlighted(monster, ailments_position_on_screen, opacity_scale);
ailment_buildup.draw_highlighted(monster, ailment_buildups_position_on_screen, opacity_scale);
end
function large_monster.init_list()
@@ -877,6 +894,7 @@ function large_monster.init_module()
ailments = require("MHR_Overlay.Monsters.ailments");
player = require("MHR_Overlay.Damage_Meter.player");
time = require("MHR_Overlay.Game_Handler.time");
ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup");
end
return large_monster;

View File

@@ -9,6 +9,7 @@ local screen;
local drawing;
local ailments;
local ailment_UI_entity;
local ailment_buildup;
small_monster.list = {};
@@ -282,11 +283,18 @@ function small_monster.draw(monster, position_on_screen, opacity_scale)
x = position_on_screen.x + config.current_config.small_monster_UI.ailments.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.small_monster_UI.ailments.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
local ailment_buildups_position_on_screen = {
x = position_on_screen.x + config.current_config.small_monster_UI.ailment_buildups.offset.x * config.current_config.global_settings.modifiers.global_scale_modifier,
y = position_on_screen.y + config.current_config.small_monster_UI.ailment_buildups.offset.y * config.current_config.global_settings.modifiers.global_scale_modifier
};
health_UI_entity.draw(monster, monster.health_UI, health_position_on_screen, opacity_scale);
stamina_UI_entity.draw(monster, monster.stamina_UI, stamina_position_on_screen, opacity_scale);
ailments.draw_small(monster, ailments_position_on_screen, opacity_scale);
ailment_buildup.draw_small(monster, ailment_buildups_position_on_screen, opacity_scale);
end
function small_monster.init_list()
@@ -304,6 +312,7 @@ function small_monster.init_module()
drawing = require("MHR_Overlay.UI.drawing");
ailments = require("MHR_Overlay.Monsters.ailments");
ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
ailment_buildup = require("MHR_Overlay.Monsters.ailment_buildup");
end
return small_monster;