From ba608509a7e39af547f97f278c691bd045cbf24c Mon Sep 17 00:00:00 2001 From: JJ Date: Sat, 13 Jan 2024 19:00:52 -0500 Subject: [PATCH 1/2] [Merchants] Change database structure for merchant slots The `slot` field should be unsigned int. The temp slot is currently limited to 127. The client will limit the visible slots. --- common/database/database_update_manifest.cpp | 23 +++++++++ .../base/base_merchantlist_repository.h | 50 +++++++++---------- .../base/base_merchantlist_temp_repository.h | 21 ++++---- 3 files changed, 58 insertions(+), 36 deletions(-) diff --git a/common/database/database_update_manifest.cpp b/common/database/database_update_manifest.cpp index 7cecf30245..1c4cb47563 100644 --- a/common/database/database_update_manifest.cpp +++ b/common/database/database_update_manifest.cpp @@ -5198,6 +5198,29 @@ ADD COLUMN `idle_when_empty` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `min_l ADD COLUMN `seconds_before_idle` int(11) UNSIGNED NOT NULL DEFAULT 60 AFTER `idle_when_empty`; )", .content_schema_update = true + }, + ManifestEntry{ + .version = 9253, + .description = "2024_01_13_merchantlist_slot.sql", + .check = "SHOW COLUMNS FROM `merchantlist` LIKE 'slot'", + .condition = "missing", + .match = "unsigned", + .sql = R"( +ALTER TABLE `merchantlist` + MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0 +)", + .content_schema_update = true + }, + ManifestEntry{ + .version = 9254, + .description = "2024_01_13_merchantlist_temp_slot.sql", + .check = "SHOW COLUMNS FROM `merchantlist_temp` LIKE 'slot'", + .condition = "contains", + .match = "tinyint", + .sql = R"( +ALTER TABLE `merchantlist_temp` + MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0 +)" } // -- template; copy/paste this when you need to create a new entry // ManifestEntry{ diff --git a/common/repositories/base/base_merchantlist_repository.h b/common/repositories/base/base_merchantlist_repository.h index d341d7f35d..9468127b71 100644 --- a/common/repositories/base/base_merchantlist_repository.h +++ b/common/repositories/base/base_merchantlist_repository.h @@ -20,7 +20,7 @@ class BaseMerchantlistRepository { public: struct Merchantlist { int32_t merchantid; - int32_t slot; + uint32_t slot; int32_t item; int16_t faction_required; uint8_t level_required; @@ -179,21 +179,21 @@ class BaseMerchantlistRepository { if (results.RowCount() == 1) { Merchantlist e{}; - e.merchantid = static_cast(atoi(row[0])); - e.slot = static_cast(atoi(row[1])); - e.item = static_cast(atoi(row[2])); - e.faction_required = static_cast(atoi(row[3])); + e.merchantid = row[0] ? static_cast(atoi(row[0])) : 0; + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.item = row[2] ? static_cast(atoi(row[2])) : 0; + e.faction_required = row[3] ? static_cast(atoi(row[3])) : -100; e.level_required = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.min_status = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 0; e.max_status = row[6] ? static_cast(strtoul(row[6], nullptr, 10)) : 255; e.alt_currency_cost = row[7] ? static_cast(strtoul(row[7], nullptr, 10)) : 0; - e.classes_required = static_cast(atoi(row[8])); - e.probability = static_cast(atoi(row[9])); + e.classes_required = row[8] ? static_cast(atoi(row[8])) : 65535; + e.probability = row[9] ? static_cast(atoi(row[9])) : 100; e.bucket_name = row[10] ? row[10] : ""; e.bucket_value = row[11] ? row[11] : ""; e.bucket_comparison = row[12] ? static_cast(strtoul(row[12], nullptr, 10)) : 0; - e.min_expansion = static_cast(atoi(row[13])); - e.max_expansion = static_cast(atoi(row[14])); + e.min_expansion = row[13] ? static_cast(atoi(row[13])) : -1; + e.max_expansion = row[14] ? static_cast(atoi(row[14])) : -1; e.content_flags = row[15] ? row[15] : ""; e.content_flags_disabled = row[16] ? row[16] : ""; @@ -363,21 +363,21 @@ class BaseMerchantlistRepository { for (auto row = results.begin(); row != results.end(); ++row) { Merchantlist e{}; - e.merchantid = static_cast(atoi(row[0])); - e.slot = static_cast(atoi(row[1])); - e.item = static_cast(atoi(row[2])); - e.faction_required = static_cast(atoi(row[3])); + e.merchantid = row[0] ? static_cast(atoi(row[0])) : 0; + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.item = row[2] ? static_cast(atoi(row[2])) : 0; + e.faction_required = row[3] ? static_cast(atoi(row[3])) : -100; e.level_required = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.min_status = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 0; e.max_status = row[6] ? static_cast(strtoul(row[6], nullptr, 10)) : 255; e.alt_currency_cost = row[7] ? static_cast(strtoul(row[7], nullptr, 10)) : 0; - e.classes_required = static_cast(atoi(row[8])); - e.probability = static_cast(atoi(row[9])); + e.classes_required = row[8] ? static_cast(atoi(row[8])) : 65535; + e.probability = row[9] ? static_cast(atoi(row[9])) : 100; e.bucket_name = row[10] ? row[10] : ""; e.bucket_value = row[11] ? row[11] : ""; e.bucket_comparison = row[12] ? static_cast(strtoul(row[12], nullptr, 10)) : 0; - e.min_expansion = static_cast(atoi(row[13])); - e.max_expansion = static_cast(atoi(row[14])); + e.min_expansion = row[13] ? static_cast(atoi(row[13])) : -1; + e.max_expansion = row[14] ? static_cast(atoi(row[14])) : -1; e.content_flags = row[15] ? row[15] : ""; e.content_flags_disabled = row[16] ? row[16] : ""; @@ -404,21 +404,21 @@ class BaseMerchantlistRepository { for (auto row = results.begin(); row != results.end(); ++row) { Merchantlist e{}; - e.merchantid = static_cast(atoi(row[0])); - e.slot = static_cast(atoi(row[1])); - e.item = static_cast(atoi(row[2])); - e.faction_required = static_cast(atoi(row[3])); + e.merchantid = row[0] ? static_cast(atoi(row[0])) : 0; + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.item = row[2] ? static_cast(atoi(row[2])) : 0; + e.faction_required = row[3] ? static_cast(atoi(row[3])) : -100; e.level_required = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.min_status = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 0; e.max_status = row[6] ? static_cast(strtoul(row[6], nullptr, 10)) : 255; e.alt_currency_cost = row[7] ? static_cast(strtoul(row[7], nullptr, 10)) : 0; - e.classes_required = static_cast(atoi(row[8])); - e.probability = static_cast(atoi(row[9])); + e.classes_required = row[8] ? static_cast(atoi(row[8])) : 65535; + e.probability = row[9] ? static_cast(atoi(row[9])) : 100; e.bucket_name = row[10] ? row[10] : ""; e.bucket_value = row[11] ? row[11] : ""; e.bucket_comparison = row[12] ? static_cast(strtoul(row[12], nullptr, 10)) : 0; - e.min_expansion = static_cast(atoi(row[13])); - e.max_expansion = static_cast(atoi(row[14])); + e.min_expansion = row[13] ? static_cast(atoi(row[13])) : -1; + e.max_expansion = row[14] ? static_cast(atoi(row[14])) : -1; e.content_flags = row[15] ? row[15] : ""; e.content_flags_disabled = row[16] ? row[16] : ""; diff --git a/common/repositories/base/base_merchantlist_temp_repository.h b/common/repositories/base/base_merchantlist_temp_repository.h index 4d94d8f46d..35f1bc2157 100644 --- a/common/repositories/base/base_merchantlist_temp_repository.h +++ b/common/repositories/base/base_merchantlist_temp_repository.h @@ -16,12 +16,11 @@ #include "../../strings.h" #include - class BaseMerchantlistTempRepository { public: struct MerchantlistTemp { uint32_t npcid; - uint8_t slot; + uint32_t slot; int32_t zone_id; int32_t instance_id; uint32_t itemid; @@ -137,9 +136,9 @@ class BaseMerchantlistTempRepository { MerchantlistTemp e{}; e.npcid = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; - e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; - e.zone_id = static_cast(atoi(row[2])); - e.instance_id = static_cast(atoi(row[3])); + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.zone_id = row[2] ? static_cast(atoi(row[2])) : 0; + e.instance_id = row[3] ? static_cast(atoi(row[3])) : 0; e.itemid = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.charges = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 1; @@ -277,9 +276,9 @@ class BaseMerchantlistTempRepository { MerchantlistTemp e{}; e.npcid = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; - e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; - e.zone_id = static_cast(atoi(row[2])); - e.instance_id = static_cast(atoi(row[3])); + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.zone_id = row[2] ? static_cast(atoi(row[2])) : 0; + e.instance_id = row[3] ? static_cast(atoi(row[3])) : 0; e.itemid = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.charges = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 1; @@ -307,9 +306,9 @@ class BaseMerchantlistTempRepository { MerchantlistTemp e{}; e.npcid = row[0] ? static_cast(strtoul(row[0], nullptr, 10)) : 0; - e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; - e.zone_id = static_cast(atoi(row[2])); - e.instance_id = static_cast(atoi(row[3])); + e.slot = row[1] ? static_cast(strtoul(row[1], nullptr, 10)) : 0; + e.zone_id = row[2] ? static_cast(atoi(row[2])) : 0; + e.instance_id = row[3] ? static_cast(atoi(row[3])) : 0; e.itemid = row[4] ? static_cast(strtoul(row[4], nullptr, 10)) : 0; e.charges = row[5] ? static_cast(strtoul(row[5], nullptr, 10)) : 1; From c527d46f4b8a9b9eca2cf999b54b748c887e1ecb Mon Sep 17 00:00:00 2001 From: JJ <3617814+joligario@users.noreply.github.com> Date: Sat, 13 Jan 2024 20:22:43 -0500 Subject: [PATCH 2/2] Update version.h --- common/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/version.h b/common/version.h index ec94158b96..82978a54e5 100644 --- a/common/version.h +++ b/common/version.h @@ -42,7 +42,7 @@ * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt */ -#define CURRENT_BINARY_DATABASE_VERSION 9252 +#define CURRENT_BINARY_DATABASE_VERSION 9254 #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9041