[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:
Alex King 2023-03-04 18:24:16 -05:00 committed by GitHub
parent 83ea9816b8
commit c21d47f450
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 230 additions and 146 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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