Added Support for multiple configs

1) Implemented ailment damage for buddies;
2) Bugfixes;
This commit is contained in:
GreenComfyTea
2023-01-14 13:30:09 +02:00
parent 9a3cb399e2
commit 3513d77714
12 changed files with 1431 additions and 1109 deletions

View File

@@ -8,6 +8,7 @@ local time;
local small_monster;
local large_monster;
local table_helpers;
local non_players;
--0 Paralyze
--1 Sleep
@@ -50,68 +51,71 @@ ailments.fall_otomo_trap_id = 18;
ailments.shock_otomo_trap_id = 19;
function ailments.new(_ailments, ailment_id)
_ailments[ailment_id] = {};
local new_ailment = {}
new_ailment = {};
_ailments[ailment_id].is_enable = true;
_ailments[ailment_id].id = ailment_id;
new_ailment.is_enable = true;
new_ailment.id = ailment_id;
_ailments[ailment_id].total_buildup = 0;
_ailments[ailment_id].buildup_limit = 0;
_ailments[ailment_id].buildup_percentage = 0;
new_ailment.total_buildup = 0;
new_ailment.buildup_limit = 0;
new_ailment.buildup_percentage = 0;
_ailments[ailment_id].timer = 0;
_ailments[ailment_id].duration = 100000;
_ailments[ailment_id].timer_percentage = 0;
new_ailment.timer = 0;
new_ailment.duration = 100000;
new_ailment.timer_percentage = 0;
_ailments[ailment_id].minutes_left = 0;
_ailments[ailment_id].seconds_left = 0;
new_ailment.minutes_left = 0;
new_ailment.seconds_left = 0;
_ailments[ailment_id].is_active = false;
_ailments[ailment_id].activate_count = 0;
new_ailment.is_active = false;
new_ailment.activate_count = 0;
_ailments[ailment_id].last_change_time = time.total_elapsed_script_seconds;
new_ailment.last_change_time = time.total_elapsed_script_seconds;
if ailment_id == ailments.paralyze_id then
_ailments[ailment_id].name = language.current_language.ailments.paralysis;
new_ailment.name = language.current_language.ailments.paralysis;
elseif ailment_id == ailments.sleep_id then
_ailments[ailment_id].name = language.current_language.ailments.sleep;
new_ailment.name = language.current_language.ailments.sleep;
elseif ailment_id == ailments.stun_id then
_ailments[ailment_id].name = language.current_language.ailments.stun;
new_ailment.name = language.current_language.ailments.stun;
elseif ailment_id == ailments.flash_id then
_ailments[ailment_id].name = language.current_language.ailments.flash;
new_ailment.name = language.current_language.ailments.flash;
elseif ailment_id == ailments.poison_id then
_ailments[ailment_id].name = language.current_language.ailments.poison;
new_ailment.name = language.current_language.ailments.poison;
elseif ailment_id == ailments.blast_id then
_ailments[ailment_id].name = language.current_language.ailments.blast;
new_ailment.name = language.current_language.ailments.blast;
elseif ailment_id == ailments.exhaust_id then
_ailments[ailment_id].name = language.current_language.ailments.exhaust;
new_ailment.name = language.current_language.ailments.exhaust;
elseif ailment_id == ailments.ride_id then
_ailments[ailment_id].name = language.current_language.ailments.ride;
new_ailment.name = language.current_language.ailments.ride;
elseif ailment_id == ailments.water_id then
_ailments[ailment_id].name = language.current_language.ailments.waterblight;
new_ailment.name = language.current_language.ailments.waterblight;
elseif ailment_id == ailments.fire_id then
_ailments[ailment_id].name = language.current_language.ailments.fireblight;
new_ailment.name = language.current_language.ailments.fireblight;
elseif ailment_id == ailments.ice_id then
_ailments[ailment_id].name = language.current_language.ailments.iceblight;
new_ailment.name = language.current_language.ailments.iceblight;
elseif ailment_id == ailments.thunder_id then
_ailments[ailment_id].name = language.current_language.ailments.thunderblight;
new_ailment.name = language.current_language.ailments.thunderblight;
elseif ailment_id == ailments.fall_trap_id then
_ailments[ailment_id].name = language.current_language.ailments.fall_trap;
new_ailment.name = language.current_language.ailments.fall_trap;
elseif ailment_id == ailments.shock_trap_id then
_ailments[ailment_id].name = language.current_language.ailments.shock_trap;
new_ailment.name = language.current_language.ailments.shock_trap;
elseif ailment_id == ailments.capture_id then
_ailments[ailment_id].name = language.current_language.ailments.tranq_bomb;
new_ailment.name = language.current_language.ailments.tranq_bomb;
elseif ailment_id == ailments.koyashi_id then
_ailments[ailment_id].name = language.current_language.ailments.dung_bomb;
new_ailment.name = language.current_language.ailments.dung_bomb;
elseif ailment_id == ailments.steel_fang_id then
_ailments[ailment_id].name = language.current_language.ailments.steel_fang;
new_ailment.name = language.current_language.ailments.steel_fang;
elseif ailment_id == ailments.fall_quick_sand_id then
_ailments[ailment_id].name = language.current_language.ailments.quick_sand;
new_ailment.name = language.current_language.ailments.quick_sand;
elseif ailment_id == ailments.fall_otomo_trap_id then
_ailments[ailment_id].name = language.current_language.ailments.fall_otomo_trap;
new_ailment.name = language.current_language.ailments.fall_otomo_trap;
elseif ailment_id == ailments.shock_otomo_trap_id then
_ailments[ailment_id].name = language.current_language.ailments.shock_otomo_trap;
new_ailment.name = language.current_language.ailments.shock_otomo_trap;
end
_ailments[ailment_id] = new_ailment;
end
function ailments.init_ailments()
@@ -149,9 +153,65 @@ function ailments.init_ailments()
_ailments[ailments.stun_id].buildup = {};
_ailments[ailments.stun_id].buildup_share = {};
_ailments[ailments.poison_id].otomo_buildup = {};
_ailments[ailments.poison_id].otomo_buildup_share = {};
_ailments[ailments.poison_id].cached_otomo_buildup_share = {};
_ailments[ailments.blast_id].otomo_buildup = {};
_ailments[ailments.blast_id].otomo_buildup_share = {};
_ailments[ailments.stun_id].otomo_buildup = {};
_ailments[ailments.stun_id].otomo_buildup_share = {};
return _ailments;
end
function ailments.init_ailment_names(_ailments)
for ailment_id, ailment in pairs(_ailments) do
if ailment_id == ailments.paralyze_id then
ailment.name = language.current_language.ailments.paralysis;
elseif ailment_id == ailments.sleep_id then
ailment.name = language.current_language.ailments.sleep;
elseif ailment_id == ailments.stun_id then
ailment.name = language.current_language.ailments.stun;
elseif ailment_id == ailments.flash_id then
ailment.name = language.current_language.ailments.flash;
elseif ailment_id == ailments.poison_id then
ailment.name = language.current_language.ailments.poison;
elseif ailment_id == ailments.blast_id then
ailment.name = language.current_language.ailments.blast;
elseif ailment_id == ailments.exhaust_id then
ailment.name = language.current_language.ailments.exhaust;
elseif ailment_id == ailments.ride_id then
ailment.name = language.current_language.ailments.ride;
elseif ailment_id == ailments.water_id then
ailment.name = language.current_language.ailments.waterblight;
elseif ailment_id == ailments.fire_id then
ailment.name = language.current_language.ailments.fireblight;
elseif ailment_id == ailments.ice_id then
ailment.name = language.current_language.ailments.iceblight;
elseif ailment_id == ailments.thunder_id then
ailment.name = language.current_language.ailments.thunderblight;
elseif ailment_id == ailments.fall_trap_id then
ailment.name = language.current_language.ailments.fall_trap;
elseif ailment_id == ailments.shock_trap_id then
ailment.name = language.current_language.ailments.shock_trap;
elseif ailment_id == ailments.capture_id then
ailment.name = language.current_language.ailments.tranq_bomb;
elseif ailment_id == ailments.koyashi_id then
ailment.name = language.current_language.ailments.dung_bomb;
elseif ailment_id == ailments.steel_fang_id then
ailment.name = language.current_language.ailments.steel_fang;
elseif ailment_id == ailments.fall_quick_sand_id then
ailment.name = language.current_language.ailments.quick_sand;
elseif ailment_id == ailments.fall_otomo_trap_id then
ailment.name = language.current_language.ailments.fall_otomo_trap;
elseif ailment_id == ailments.shock_otomo_trap_id then
ailment.name = language.current_language.ailments.shock_otomo_trap;
end
end
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");
@@ -593,14 +653,11 @@ function ailments.draw(monster, ailment_UI, cached_config, ailments_position_on_
end
function ailments.apply_ailment_buildup(monster, attacker_id, ailment_type, ailment_buildup)
function ailments.apply_ailment_buildup(monster, player, otomo, ailment_type, ailment_buildup)
if monster == nil or
(ailment_type ~= ailments.poison_id and ailment_type ~= ailments.blast_id and ailment_type ~= ailments.stun_id) then
return;
end
if ailment_buildup == 0 or ailment_buildup == nil then
(ailment_type ~= ailments.poison_id and ailment_type ~= ailments.blast_id and ailment_type ~= ailments.stun_id)
or (ailment_buildup == 0 or ailment_buildup == nil) then
return;
end
@@ -609,8 +666,17 @@ function ailments.apply_ailment_buildup(monster, attacker_id, ailment_type, ailm
monster.ailments[ailment_type].buildup = {};
end
-- accumulate this buildup for this attacker
monster.ailments[ailment_type].buildup[attacker_id] = (monster.ailments[ailment_type].buildup[attacker_id] or 0) + ailment_buildup;
-- get the otomo buildup accumulator for this type
if monster.ailments[ailment_type].otomo_buildup == nil then
monster.ailments[ailment_type].otomo_buildup = {};
end
if otomo == nil then
monster.ailments[ailment_type].buildup[player] = (monster.ailments[ailment_type].buildup[player] or 0) + ailment_buildup;
else
monster.ailments[ailment_type].otomo_buildup[otomo] = (monster.ailments[ailment_type].otomo_buildup[otomo] or 0) + ailment_buildup;
end
ailments.calculate_ailment_contribution(monster, ailment_type);
end
@@ -619,20 +685,34 @@ end
function ailments.calculate_ailment_contribution(monster, ailment_type)
-- get total
local total = 0;
for attacker_id, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
for player, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
total = total + player_buildup;
end
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;
for otomo, otomo_buildup in pairs(monster.ailments[ailment_type].otomo_buildup) do
total = total + otomo_buildup;
end
for player, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
-- update ratio for this player
monster.ailments[ailment_type].buildup_share[player] = player_buildup / total;
end
for otomo, otomo_buildup in pairs(monster.ailments[ailment_type].otomo_buildup) do
-- update ratio for this otomo
monster.ailments[ailment_type].otomo_buildup_share[otomo] = otomo_buildup / total;
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;
for player, player_buildup in pairs(monster.ailments[ailment_type].buildup) do
monster.ailments[ailment_type].buildup_share[player] = 0;
monster.ailments[ailment_type].buildup[player] = 0;
end
for aotomo, otomo_buildup in pairs(monster.ailments[ailment_type].otomo_buildup) do
monster.ailments[ailment_type].otomo_buildup_share[aotomo] = 0;
monster.ailments[ailment_type].otomo_buildup[aotomo] = 0;
end
end
@@ -644,18 +724,25 @@ function ailments.apply_ailment_damage(monster, ailment_type, ailment_damage)
end
local damage_source_type = "";
local otomo_damage_source_type = "";
local buildup_share = monster.ailments[ailment_type].buildup_share;
local otomo_buildup_share = monster.ailments[ailment_type].otomo_buildup_share;
if ailment_type == ailments.poison_id then
damage_source_type = "poison";
otomo_damage_source_type = "otomo poison";
buildup_share = monster.ailments[ailment_type].cached_buildup_share;
otomo_buildup_share = monster.ailments[ailment_type].cached_otomo_buildup_share;
elseif ailment_type == ailments.blast_id then
damage_source_type = "blast";
otomo_damage_source_type = "otomo blast";
else
return;
end
-- split up damage according to ratio of buildup on boss for this type
for attacker_id, percentage in pairs(buildup_share) do
for player, percentage in pairs(buildup_share) do
local damage_portion = ailment_damage * percentage;
local damage_object = {};
@@ -664,11 +751,26 @@ function ailments.apply_ailment_damage(monster, ailment_type, ailment_damage)
damage_object.elemental_damage = 0;
damage_object.ailment_damage = damage_portion;
local attacking_player = players.get_player(attacker_id);
players.update_damage(player, damage_source_type, true, damage_object);
end
if attacking_player ~= nil then
players.update_damage(attacking_player, damage_source_type, true, damage_object);
-- split up damage according to ratio of buildup on boss for this type
for otomo, percentage in pairs(otomo_buildup_share) do
local damage_portion = ailment_damage * percentage;
local damage_object = {};
damage_object.total_damage = damage_portion;
damage_object.physical_damage = 0;
damage_object.elemental_damage = 0;
damage_object.ailment_damage = damage_portion;
local player = players.get_player(otomo.id);
if player ~= nil then
players.update_damage(player, otomo_damage_source_type, true, damage_object);
end
players.update_damage(otomo, otomo_damage_source_type, true, damage_object);
end
local damage_object = {};
@@ -682,6 +784,7 @@ end
function ailments.init_module()
players = require("MHR_Overlay.Damage_Meter.players");
non_players = require("MHR_Overlay.Damage_Meter.non_players");
language = require("MHR_Overlay.Misc.language");
config = require("MHR_Overlay.Misc.config");
ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");