Add Stats UI

This commit is contained in:
GreenComfyTea
2023-08-15 16:02:01 +03:00
parent 9d16048c8d
commit 758a02bce8
13 changed files with 1272 additions and 14 deletions

View File

@@ -84,13 +84,18 @@ function this.init_default()
},
module_visibility = {
in_lobby = {
stats_UI = true
},
in_training_area = {
large_monster_dynamic_UI = true,
large_monster_static_UI = true,
large_monster_highlighted_UI = true,
damage_meter_UI = true,
endemic_life_UI = true,
buff_UI = true
buff_UI = true,
stats_UI = true
},
cutscene = {
@@ -101,7 +106,8 @@ function this.init_default()
time_UI = false,
damage_meter_UI = false,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
loading_quest = {
@@ -112,7 +118,8 @@ function this.init_default()
time_UI = false,
damage_meter_UI = false,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
quest_start_animation = {
@@ -123,7 +130,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = true,
buff_UI = true
buff_UI = true,
stats_UI = true
},
playing_quest = {
@@ -134,7 +142,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = true,
buff_UI = true
buff_UI = true,
stats_UI = true
},
killcam = {
@@ -145,7 +154,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = true,
buff_UI = true
buff_UI = true,
stats_UI = true
},
quest_end_timer = {
@@ -156,7 +166,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = true,
buff_UI = true
buff_UI = true,
stats_UI = true
},
quest_end_animation = {
@@ -167,7 +178,8 @@ function this.init_default()
time_UI = false,
damage_meter_UI = false,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
quest_end_screen = {
@@ -178,7 +190,9 @@ function this.init_default()
time_UI = false,
damage_meter_UI = false,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
reward_screen = {
@@ -189,7 +203,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
summary_screen = {
@@ -200,7 +215,8 @@ function this.init_default()
time_UI = true,
damage_meter_UI = true,
endemic_life_UI = false,
buff_UI = false
buff_UI = false,
stats_UI = false
},
},
@@ -6124,6 +6140,7 @@ function this.init_default()
x = 205,
y = 0
},
color = 0xFFF59FC4,
shadow = {
@@ -7576,6 +7593,381 @@ function this.init_default()
}
},
stats_UI = {
enabled = false,
position = {
x = 0,
y = 0,
-- Possible values: "Top-Left", "Top-Right", "Bottom-Left", "Bottom-Right"
anchor = "Bottom-Right"
},
attack_label = {
visibility = true,
settings = {
right_alignment_shift = 11
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -353,
y = -17
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
affinity_label = {
visibility = true,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -242,
y = -17
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
defense_label = {
visibility = true,
settings = {
right_alignment_shift = 13
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -103,
y = -17
},
color = 0xFFBFF7FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
fire_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 13
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -625,
y = -53
},
color = 0xFFF27979,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
water_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -507,
y = -53
},
color = 0xFF7AB8F8,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
thunder_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 16
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -382,
y = -53
},
color = 0xFFFEFF88,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
ice_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 12
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -228,
y = -53
},
color = 0xFFBFF7FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
dragon_resistance_label = {
visibility = false,
settings = {
right_alignment_shift = 15
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -117,
y = -53
},
color = 0xFFB999FF,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
stamina_label = {
visibility = false,
settings = {
right_alignment_shift = 16
},
text_formatting = "%s",
include = {
name = true,
value = true,
max_value = true
},
offset = {
x = -382,
y = -35
},
color = 0xFFFEFF88,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
element_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -110,
y = -35
},
color = 0xFFF59FC4,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
element_2_label = {
visibility = false,
settings = {
right_alignment_shift = 14
},
text_formatting = "%s",
include = {
name = true,
value = true
},
offset = {
x = -242,
y = -35
},
color = 0xFFF59FC4,
shadow = {
visibility = true,
offset = {
x = 1,
y = 1
},
color = 0xFF000000
}
},
},
debug = {
history_size = 64
},

View File

@@ -665,7 +665,42 @@ this.default_language = {
current_time = "Current Time",
everything_seems_to_be_ok = "Everything seems to be OK!",
history = "History",
history_size = "History Size"
history_size = "History Size",
value = "Value",
stats_UI = "Stats UI",
attack_label = "Attack Label",
defense_label = "Defense Label",
affinity_label = "Affinity Label",
fire_resistance_label = "Fire Resistance Label",
water_resistance_label = "Water Resistance Label",
thunder_resistance_label = "Thunder Resistance Label",
ice_resistance_label = "Ice Resistance Label",
dragon_resistance_label = "Dragon Resistance Label",
stamina_label = "Stamina Label",
element_label = "Element Label",
element_2_label = "Element 2 Label"
},
stats = {
attack = "Attack",
defense = "Defense",
affinity = "Affinity",
fire_resistance = "Fire Res";
water_resistance = "Water Res";
thunder_resistance = "Thunder Res";
ice_resistance = "Ice Res";
dragon_resistance = "Dragon Res";
stamina = "Stamina",
fire = "Fire",
water = "Water",
thunder = "Thunder",
ice = "Ice",
dragon = "Dragon",
}
};

View File

@@ -0,0 +1,251 @@
local this = {};
local drawing;
local customization_menu;
local singletons;
local config;
local utils;
local error_handler;
local quest_status;
local time;
local sdk = sdk;
local tostring = tostring;
local pairs = pairs;
local ipairs = ipairs;
local tonumber = tonumber;
local require = require;
local pcall = pcall;
local table = table;
local string = string;
local Vector3f = Vector3f;
local d2d = d2d;
local math = math;
local json = json;
local log = log;
local fs = fs;
local next = next;
local type = type;
local setmetatable = setmetatable;
local getmetatable = getmetatable;
local assert = assert;
local select = select;
local coroutine = coroutine;
local utf8 = utf8;
local re = re;
local imgui = imgui;
local draw = draw;
local Vector2f = Vector2f;
local reframework = reframework;
local os = os;
local ValueType = ValueType;
local package = package;
this.list = {
attack = 0;
defense = 0;
affinity = 0;
stamina = 0;
max_stamina = 0;
element_type = 0;
element_attack = 0;
element_type_2 = 0;
element_attack_2 = 0;
fire_resistance = 0;
water_resistance = 0;
thunder_resistance = 0;
ice_resistance = 0;
dragon_resistance = 0;
};
local player_manager_type_def = sdk.find_type_definition("snow.player.PlayerManager");
local get_player_method = player_manager_type_def:get_method("getPlayer");
local find_master_player_method = player_manager_type_def:get_method("findMasterPlayer");
local player_base_type_def = find_master_player_method:get_return_type();
local get_player_data_method = player_base_type_def:get_method("get_PlayerData");
local player_data_type_def = get_player_data_method:get_return_type();
local attack_field = player_data_type_def:get_field("_Attack");
local defence_field = player_data_type_def:get_field("_Defence");
local critical_rate_field = player_data_type_def:get_field("_CriticalRate");
local stamina_field = player_data_type_def:get_field("_stamina");
local stamina_max_field = player_data_type_def:get_field("_staminaMax");
local element_type_field = player_data_type_def:get_field("_ElementType");
local element_attack_field = player_data_type_def:get_field("_ElementAttack");
local element_type_2nd_field = player_data_type_def:get_field("_ElementType2nd");
local element_attack_2nd_field = player_data_type_def:get_field("_ElementAttack2nd");
local resistance_element_field = player_data_type_def:get_field("_ResistanceElement");
local system_array_type_def = sdk.find_type_definition("System.Array");
local length_method = system_array_type_def:get_method("get_Length");
local get_value_method = system_array_type_def:get_method("GetValue(System.Int32)");
function this.update()
if not config.current_config.stats_UI.enabled then
return;
end
if quest_status.flow_state == quest_status.flow_states.NONE then
return;
end
if singletons.player_manager == nil then
error_handler.report("player_info.update", "Failed to access Data: player_manager");
return;
end
local master_player = find_master_player_method:call(singletons.player_manager);
if master_player == nil then
error_handler.report("player_info.update", "Failed to access Data: master_player");
return;
end
local master_player_data = get_player_data_method:call(master_player);
if master_player_data == nil then
error_handler.report("player_info.update", "Failed to access Data: master_player_data");
end
this.update_generic("attack", master_player_data, attack_field);
this.update_generic("affinity", master_player_data, critical_rate_field);
this.update_generic("defense", master_player_data, defence_field);
this.update_generic("stamina", master_player_data, stamina_field);
this.list.stamina = math.floor(this.list.stamina / 30);
this.update_generic("max_stamina", master_player_data, stamina_max_field);
this.list.max_stamina = math.floor(this.list.max_stamina / 30);
this.update_generic("element_type", master_player_data, element_type_field);
this.update_generic("element_attack", master_player_data, element_attack_field);
this.update_generic("element_type_2", master_player_data, element_type_2nd_field);
this.update_generic("element_attack_2", master_player_data, element_attack_2nd_field);
this.update_resistances(master_player_data);
end
function this.update_generic(key, player_data, field)
local value = field:get_data(player_data);
if value == nil then
error_handler.report("player_info.update_generic", string.format("Failed to access Data: %s_value", key));
return;
end
this.list[key] = math.floor(value);
end
function this.update_resistances(player_data)
local resistance_element_array = resistance_element_field:get_data(player_data);
if resistance_element_array == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: resistance_element_array");
return;
end
-- Fire Resistance
local fire_resistance_valtype = get_value_method:call(resistance_element_array, 0);
if fire_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: fire_resistance_valtype");
return;
end
local fire_resistance = fire_resistance_valtype:get_field("mValue");
if fire_resistance ~= nil then
this.list.fire_resistance = math.floor(fire_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: fire_resistance");
return;
end
-- Water Resistance
local water_resistance_valtype = get_value_method:call(resistance_element_array, 1);
if water_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: water_resistance_valtype");
return;
end
local water_resistance = water_resistance_valtype:get_field("mValue");
if water_resistance ~= nil then
this.list.water_resistance = math.floor(water_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: water_resistance");
return;
end
-- Thunder Resistance
local thunder_resistance_valtype = get_value_method:call(resistance_element_array, 2);
if thunder_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: thunder_resistance_valtype");
return;
end
local thunder_resistance = thunder_resistance_valtype:get_field("mValue");
if thunder_resistance ~= nil then
this.list.thunder_resistance = math.floor(thunder_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: thunder_resistance");
return;
end
-- Ice Resistance
local ice_resistance_valtype = get_value_method:call(resistance_element_array, 3);
if ice_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: ice_resistance_valtype");
return;
end
local ice_resistance = ice_resistance_valtype:get_field("mValue");
if ice_resistance ~= nil then
this.list.ice_resistance = math.floor(ice_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: ice_resistance");
return;
end
-- Dragon Resistance
local dragon_resistance_valtype = get_value_method:call(resistance_element_array, 4);
if dragon_resistance_valtype == nil then
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance_valtype");
return;
end
local dragon_resistance = dragon_resistance_valtype:get_field("mValue");
if dragon_resistance ~= nil then
this.list.dragon_resistance = math.floor(dragon_resistance);
else
error_handler.report("player_info.update_resistances", "Failed to access Data: dragon_resistance");
return;
end
end
function this.init_dependencies()
singletons = require("MHR_Overlay.Game_Handler.singletons");
customization_menu = require("MHR_Overlay.UI.customization_menu");
config = require("MHR_Overlay.Misc.config");
utils = require("MHR_Overlay.Misc.utils");
--health_UI_entity = require("MHR_Overlay.UI.UI_Entities.health_UI_entity");
--stamina_UI_entity = require("MHR_Overlay.UI.UI_Entities.stamina_UI_entity");
--screen = require("MHR_Overlay.Game_Handler.screen");
drawing = require("MHR_Overlay.UI.drawing");
--ailments = require("MHR_Overlay.Monsters.ailments");
--ailment_UI_entity = require("MHR_Overlay.UI.UI_Entities.ailment_UI_entity");
error_handler = require("MHR_Overlay.Misc.error_handler");
quest_status = require("MHR_Overlay.Game_Handler.quest_status");
time = require("MHR_Overlay.Game_Handler.time");
end
function this.init_module()
time.new_timer(this.update, 0.5);
end
return this;