mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-14 19:51:29 +00:00
[Scaling] Add support for pipe-separated zone IDs and versions (#3015)
* [Scaling] Add support for pipe-separated zone IDs and versions # Notes - Allows `|` separated zone IDs and instance versions within the scaling data. - Loads scaling data on zone bootup as well, without needing to repop for it to initialize. * Cleanup
This commit is contained in:
parent
83ea9816b8
commit
c21d47f450
@ -22,8 +22,8 @@ public:
|
||||
struct NpcScaleGlobalBase {
|
||||
int32_t type;
|
||||
int32_t level;
|
||||
uint32_t zone_id;
|
||||
int32_t instance_version;
|
||||
std::string zone_id_list;
|
||||
std::string instance_version_list;
|
||||
int32_t ac;
|
||||
int32_t hp;
|
||||
int32_t accuracy;
|
||||
@ -62,8 +62,8 @@ public:
|
||||
return {
|
||||
"type",
|
||||
"level",
|
||||
"zone_id",
|
||||
"instance_version",
|
||||
"zone_id_list",
|
||||
"instance_version_list",
|
||||
"ac",
|
||||
"hp",
|
||||
"accuracy",
|
||||
@ -98,8 +98,8 @@ public:
|
||||
return {
|
||||
"type",
|
||||
"level",
|
||||
"zone_id",
|
||||
"instance_version",
|
||||
"zone_id_list",
|
||||
"instance_version_list",
|
||||
"ac",
|
||||
"hp",
|
||||
"accuracy",
|
||||
@ -168,8 +168,8 @@ public:
|
||||
|
||||
e.type = 0;
|
||||
e.level = 0;
|
||||
e.zone_id = 0;
|
||||
e.instance_version = -1;
|
||||
e.zone_id_list = "";
|
||||
e.instance_version_list = "";
|
||||
e.ac = 0;
|
||||
e.hp = 0;
|
||||
e.accuracy = 0;
|
||||
@ -234,8 +234,8 @@ public:
|
||||
|
||||
e.type = static_cast<int32_t>(atoi(row[0]));
|
||||
e.level = static_cast<int32_t>(atoi(row[1]));
|
||||
e.zone_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.instance_version = static_cast<int32_t>(atoi(row[3]));
|
||||
e.zone_id_list = row[2] ? row[2] : "";
|
||||
e.instance_version_list = row[3] ? row[3] : "";
|
||||
e.ac = static_cast<int32_t>(atoi(row[4]));
|
||||
e.hp = static_cast<int32_t>(atoi(row[5]));
|
||||
e.accuracy = static_cast<int32_t>(atoi(row[6]));
|
||||
@ -297,8 +297,8 @@ public:
|
||||
|
||||
v.push_back(columns[0] + " = " + std::to_string(e.type));
|
||||
v.push_back(columns[1] + " = " + std::to_string(e.level));
|
||||
v.push_back(columns[2] + " = " + std::to_string(e.zone_id));
|
||||
v.push_back(columns[3] + " = " + std::to_string(e.instance_version));
|
||||
v.push_back(columns[2] + " = '" + Strings::Escape(e.zone_id_list) + "'");
|
||||
v.push_back(columns[3] + " = '" + Strings::Escape(e.instance_version_list) + "'");
|
||||
v.push_back(columns[4] + " = " + std::to_string(e.ac));
|
||||
v.push_back(columns[5] + " = " + std::to_string(e.hp));
|
||||
v.push_back(columns[6] + " = " + std::to_string(e.accuracy));
|
||||
@ -348,8 +348,8 @@ public:
|
||||
|
||||
v.push_back(std::to_string(e.type));
|
||||
v.push_back(std::to_string(e.level));
|
||||
v.push_back(std::to_string(e.zone_id));
|
||||
v.push_back(std::to_string(e.instance_version));
|
||||
v.push_back("'" + Strings::Escape(e.zone_id_list) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.instance_version_list) + "'");
|
||||
v.push_back(std::to_string(e.ac));
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.accuracy));
|
||||
@ -407,8 +407,8 @@ public:
|
||||
|
||||
v.push_back(std::to_string(e.type));
|
||||
v.push_back(std::to_string(e.level));
|
||||
v.push_back(std::to_string(e.zone_id));
|
||||
v.push_back(std::to_string(e.instance_version));
|
||||
v.push_back("'" + Strings::Escape(e.zone_id_list) + "'");
|
||||
v.push_back("'" + Strings::Escape(e.instance_version_list) + "'");
|
||||
v.push_back(std::to_string(e.ac));
|
||||
v.push_back(std::to_string(e.hp));
|
||||
v.push_back(std::to_string(e.accuracy));
|
||||
@ -470,8 +470,8 @@ public:
|
||||
|
||||
e.type = static_cast<int32_t>(atoi(row[0]));
|
||||
e.level = static_cast<int32_t>(atoi(row[1]));
|
||||
e.zone_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.instance_version = static_cast<int32_t>(atoi(row[3]));
|
||||
e.zone_id_list = row[2] ? row[2] : "";
|
||||
e.instance_version_list = row[3] ? row[3] : "";
|
||||
e.ac = static_cast<int32_t>(atoi(row[4]));
|
||||
e.hp = static_cast<int32_t>(atoi(row[5]));
|
||||
e.accuracy = static_cast<int32_t>(atoi(row[6]));
|
||||
@ -524,8 +524,8 @@ public:
|
||||
|
||||
e.type = static_cast<int32_t>(atoi(row[0]));
|
||||
e.level = static_cast<int32_t>(atoi(row[1]));
|
||||
e.zone_id = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
||||
e.instance_version = static_cast<int32_t>(atoi(row[3]));
|
||||
e.zone_id_list = row[2] ? row[2] : "";
|
||||
e.instance_version_list = row[3] ? row[3] : "";
|
||||
e.ac = static_cast<int32_t>(atoi(row[4]));
|
||||
e.hp = static_cast<int32_t>(atoi(row[5]));
|
||||
e.accuracy = static_cast<int32_t>(atoi(row[6]));
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
|
||||
*/
|
||||
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9221
|
||||
#define CURRENT_BINARY_DATABASE_VERSION 9222
|
||||
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9038
|
||||
|
||||
#endif
|
||||
|
||||
@ -475,6 +475,7 @@
|
||||
9219|2023_01_29_merchant_status_requirements.sql|SHOW COLUMNS FROM merchantlist LIKE 'min_status'|empty|
|
||||
9220|2022_12_19_player_events_tables.sql|SHOW TABLES LIKE 'player_event_logs'|empty|
|
||||
9221|2023_02_24_npc_scaling_zone_id_instance_version.sql|SHOW COLUMNS FROM `npc_scale_global_base` LIKE 'zone_id'|empty|
|
||||
9222|2023_02_28_npc_scaling_zone_list_version_list.sql|SHOW COLUMNS FROM `npc_scale_global_base` LIKE 'zone_id_list'|empty|
|
||||
|
||||
# Upgrade conditions:
|
||||
# This won't be needed after this system is implemented, but it is used database that are not
|
||||
|
||||
@ -0,0 +1,5 @@
|
||||
ALTER TABLE `npc_scale_global_base`
|
||||
CHANGE COLUMN `zone_id` `zone_id_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 0 AFTER `level`,
|
||||
CHANGE COLUMN `instance_version` `instance_version_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 0 AFTER `zone_id_list`,
|
||||
DROP PRIMARY KEY,
|
||||
ADD PRIMARY KEY (`type`, `level`, `zone_id_list`(255), `instance_version_list`(255)) USING BTREE;
|
||||
@ -216,12 +216,17 @@ bool NpcScaleManager::LoadScaleData()
|
||||
{
|
||||
auto rows = NpcScaleGlobalBaseRepository::All(content_db);
|
||||
for (const auto &s : rows) {
|
||||
if (
|
||||
s.zone_id_list.empty() ||
|
||||
s.instance_version_list.empty()
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
global_npc_scale scale_data;
|
||||
|
||||
scale_data.type = s.type;
|
||||
scale_data.level = s.level;
|
||||
scale_data.zone_id = s.zone_id;
|
||||
scale_data.instance_version = s.instance_version;
|
||||
scale_data.ac = s.ac;
|
||||
scale_data.hp = s.hp;
|
||||
scale_data.accuracy = s.accuracy;
|
||||
@ -252,6 +257,13 @@ bool NpcScaleManager::LoadScaleData()
|
||||
scale_data.special_abilities = s.special_abilities;
|
||||
}
|
||||
|
||||
const auto has_multiple_zones = Strings::Contains(s.zone_id_list, "|");
|
||||
const auto has_multiple_versions = Strings::Contains(s.instance_version_list, "|");
|
||||
|
||||
if (!has_multiple_zones && !has_multiple_versions) {
|
||||
scale_data.zone_id = std::stoul(s.zone_id_list);
|
||||
scale_data.instance_version = static_cast<uint16>(std::stoul(s.instance_version_list));
|
||||
|
||||
npc_global_base_scaling_data.insert(
|
||||
std::make_pair(
|
||||
std::make_tuple(
|
||||
@ -263,6 +275,70 @@ bool NpcScaleManager::LoadScaleData()
|
||||
scale_data
|
||||
)
|
||||
);
|
||||
} else if (has_multiple_zones && !has_multiple_versions) {
|
||||
scale_data.instance_version = static_cast<uint16>(std::stoul(s.instance_version_list));
|
||||
|
||||
const auto zones = Strings::Split(s.zone_id_list, "|");
|
||||
|
||||
for (const auto &z : zones) {
|
||||
scale_data.zone_id = std::stoul(z);
|
||||
|
||||
npc_global_base_scaling_data.insert(
|
||||
std::make_pair(
|
||||
std::make_tuple(
|
||||
scale_data.type,
|
||||
scale_data.level,
|
||||
scale_data.zone_id,
|
||||
scale_data.instance_version
|
||||
),
|
||||
scale_data
|
||||
)
|
||||
);
|
||||
}
|
||||
} else if (!has_multiple_zones && has_multiple_versions) {
|
||||
scale_data.zone_id = std::stoul(s.zone_id_list);
|
||||
|
||||
const auto versions = Strings::Split(s.instance_version_list, "|");
|
||||
|
||||
for (const auto &v : versions) {
|
||||
scale_data.instance_version = static_cast<uint16>(std::stoul(v));
|
||||
|
||||
npc_global_base_scaling_data.insert(
|
||||
std::make_pair(
|
||||
std::make_tuple(
|
||||
scale_data.type,
|
||||
scale_data.level,
|
||||
scale_data.zone_id,
|
||||
scale_data.instance_version
|
||||
),
|
||||
scale_data
|
||||
)
|
||||
);
|
||||
}
|
||||
} else if (has_multiple_zones && has_multiple_versions) {
|
||||
const auto zones = Strings::Split(s.zone_id_list, "|");
|
||||
const auto versions = Strings::Split(s.instance_version_list, "|");
|
||||
|
||||
for (const auto &z : zones) {
|
||||
scale_data.zone_id = std::stoul(z);
|
||||
|
||||
for (const auto &v : versions) {
|
||||
scale_data.instance_version = static_cast<uint16>(std::stoul(v));
|
||||
|
||||
npc_global_base_scaling_data.insert(
|
||||
std::make_pair(
|
||||
std::make_tuple(
|
||||
scale_data.type,
|
||||
scale_data.level,
|
||||
scale_data.zone_id,
|
||||
scale_data.instance_version
|
||||
),
|
||||
scale_data
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogInfo("Loaded [{}] global scaling data entries", Strings::Commify(rows.size()));
|
||||
|
||||
@ -1218,6 +1218,8 @@ bool Zone::Init(bool is_static) {
|
||||
LoadGrids();
|
||||
LoadTickItems();
|
||||
|
||||
npc_scale_manager->LoadScaleData();
|
||||
|
||||
// logging origination information
|
||||
LogSys.origination_info.zone_short_name = zone->short_name;
|
||||
LogSys.origination_info.zone_long_name = zone->long_name;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user