From 06461944dfaae5027f5ec52ddc453d5bcf06184e Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 29 Oct 2023 22:19:09 -0500 Subject: [PATCH] Make spawn2 enabled/disabled instance aware --- common/database/database_update_manifest.cpp | 1 + .../base/base_spawn2_disabled_repository.h | 36 ++++++++++++------- zone/questmgr.cpp | 4 +-- zone/spawn2.cpp | 7 ++-- zone/zonedb.cpp | 15 +++++--- zone/zonedb.h | 2 +- 6 files changed, 41 insertions(+), 24 deletions(-) diff --git a/common/database/database_update_manifest.cpp b/common/database/database_update_manifest.cpp index f56d39856..4c742c23f 100644 --- a/common/database/database_update_manifest.cpp +++ b/common/database/database_update_manifest.cpp @@ -5008,6 +5008,7 @@ CREATE TABLE `spawn2_backup_2023_10_29` LIKE `spawn2`; CREATE TABLE `spawn2_disabled` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `spawn2_id` int(11) DEFAULT NULL, + `instance_id` int(11) DEFAULT 0, `disabled` smallint(11) DEFAULT 0, PRIMARY KEY (`id`), UNIQUE KEY `spawn2_id` (`spawn2_id`) diff --git a/common/repositories/base/base_spawn2_disabled_repository.h b/common/repositories/base/base_spawn2_disabled_repository.h index ce00b5384..f23573a19 100644 --- a/common/repositories/base/base_spawn2_disabled_repository.h +++ b/common/repositories/base/base_spawn2_disabled_repository.h @@ -22,6 +22,7 @@ public: struct Spawn2Disabled { int64_t id; int32_t spawn2_id; + int32_t instance_id; int16_t disabled; }; @@ -35,6 +36,7 @@ public: return { "id", "spawn2_id", + "instance_id", "disabled", }; } @@ -44,6 +46,7 @@ public: return { "id", "spawn2_id", + "instance_id", "disabled", }; } @@ -85,9 +88,10 @@ public: { Spawn2Disabled e{}; - e.id = 0; - e.spawn2_id = 0; - e.disabled = 0; + e.id = 0; + e.spawn2_id = 0; + e.instance_id = 0; + e.disabled = 0; return e; } @@ -124,9 +128,10 @@ public: if (results.RowCount() == 1) { Spawn2Disabled e{}; - e.id = strtoll(row[0], nullptr, 10); - e.spawn2_id = static_cast(atoi(row[1])); - e.disabled = static_cast(atoi(row[2])); + e.id = strtoll(row[0], nullptr, 10); + e.spawn2_id = static_cast(atoi(row[1])); + e.instance_id = static_cast(atoi(row[2])); + e.disabled = static_cast(atoi(row[3])); return e; } @@ -161,7 +166,8 @@ public: auto columns = Columns(); v.push_back(columns[1] + " = " + std::to_string(e.spawn2_id)); - v.push_back(columns[2] + " = " + std::to_string(e.disabled)); + v.push_back(columns[2] + " = " + std::to_string(e.instance_id)); + v.push_back(columns[3] + " = " + std::to_string(e.disabled)); auto results = db.QueryDatabase( fmt::format( @@ -185,6 +191,7 @@ public: v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.spawn2_id)); + v.push_back(std::to_string(e.instance_id)); v.push_back(std::to_string(e.disabled)); auto results = db.QueryDatabase( @@ -217,6 +224,7 @@ public: v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.spawn2_id)); + v.push_back(std::to_string(e.instance_id)); v.push_back(std::to_string(e.disabled)); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); @@ -251,9 +259,10 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { Spawn2Disabled e{}; - e.id = strtoll(row[0], nullptr, 10); - e.spawn2_id = static_cast(atoi(row[1])); - e.disabled = static_cast(atoi(row[2])); + e.id = strtoll(row[0], nullptr, 10); + e.spawn2_id = static_cast(atoi(row[1])); + e.instance_id = static_cast(atoi(row[2])); + e.disabled = static_cast(atoi(row[3])); all_entries.push_back(e); } @@ -278,9 +287,10 @@ public: for (auto row = results.begin(); row != results.end(); ++row) { Spawn2Disabled e{}; - e.id = strtoll(row[0], nullptr, 10); - e.spawn2_id = static_cast(atoi(row[1])); - e.disabled = static_cast(atoi(row[2])); + e.id = strtoll(row[0], nullptr, 10); + e.spawn2_id = static_cast(atoi(row[1])); + e.instance_id = static_cast(atoi(row[2])); + e.disabled = static_cast(atoi(row[3])); all_entries.push_back(e); } diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 8e1bc724b..f1eb93733 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -359,7 +359,7 @@ Mob *QuestManager::spawn_from_spawn2(uint32 spawn2_id) void QuestManager::enable_spawn2(uint32 spawn2_id) { - database.UpdateSpawn2Status(spawn2_id, 1); + database.UpdateSpawn2Status(spawn2_id, 1, zone->GetInstanceID()); auto pack = new ServerPacket(ServerOP_SpawnStatusChange, sizeof(ServerSpawnStatusChange_Struct)); ServerSpawnStatusChange_Struct* ssc = (ServerSpawnStatusChange_Struct*) pack->pBuffer; ssc->id = spawn2_id; @@ -370,7 +370,7 @@ void QuestManager::enable_spawn2(uint32 spawn2_id) void QuestManager::disable_spawn2(uint32 spawn2_id) { - database.UpdateSpawn2Status(spawn2_id, 0); + database.UpdateSpawn2Status(spawn2_id, 0, zone->GetInstanceID()); auto pack = new ServerPacket(ServerOP_SpawnStatusChange, sizeof(ServerSpawnStatusChange_Struct)); ServerSpawnStatusChange_Struct* ssc = (ServerSpawnStatusChange_Struct*) pack->pBuffer; ssc->id = spawn2_id; diff --git a/zone/spawn2.cpp b/zone/spawn2.cpp index 9401ad24a..27307c464 100644 --- a/zone/spawn2.cpp +++ b/zone/spawn2.cpp @@ -486,12 +486,13 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList &spa } std::vector disabled_spawns = {}; - if (spawn2_ids.size() > 0) { + if (!spawn2_ids.empty()) { disabled_spawns = Spawn2DisabledRepository::GetWhere( database, fmt::format( - "spawn2_id IN ({})", - Strings::Join(spawn2_ids, ",") + "spawn2_id IN ({}) and instance_id = {}", + Strings::Join(spawn2_ids, ","), + zone->GetInstanceID() ) ); } diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index a135ea688..711238106 100755 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -172,20 +172,25 @@ uint32 ZoneDatabase::GetSpawnTimeLeft(uint32 id, uint16 instance_id) } -void ZoneDatabase::UpdateSpawn2Status(uint32 id, uint8 new_status) +void ZoneDatabase::UpdateSpawn2Status(uint32 id, uint8 new_status, uint32 instance_id) { - auto spawns = Spawn2DisabledRepository::GetWhere(*this, fmt::format("spawn2_id = {}", id)); + auto spawns = Spawn2DisabledRepository::GetWhere( + *this, + fmt::format("spawn2_id = {} and instance_id = {}", id, instance_id) + ); if (!spawns.empty()) { auto spawn = spawns[0]; // 1 = enabled 0 = disabled - spawn.disabled = new_status ? 0 : 1; + spawn.disabled = new_status ? 0 : 1; + spawn.instance_id = instance_id; Spawn2DisabledRepository::UpdateOne(*this, spawn); return; } auto spawn = Spawn2DisabledRepository::NewEntity(); - spawn.spawn2_id = id; - spawn.disabled = new_status ? 0 : 1; + spawn.spawn2_id = id; + spawn.instance_id = instance_id; + spawn.disabled = new_status ? 0 : 1; Spawn2DisabledRepository::InsertOne(*this, spawn); } diff --git a/zone/zonedb.h b/zone/zonedb.h index cb21db7ea..e922aa01c 100644 --- a/zone/zonedb.h +++ b/zone/zonedb.h @@ -529,7 +529,7 @@ public: bool CreateSpawn2(Client *c, uint32 spawngroup, const char* zone, const glm::vec4& position, uint32 respawn, uint32 variance, uint16 condition, int16 cond_value); void UpdateRespawnTime(uint32 id, uint16 instance_id,uint32 timeleft); uint32 GetSpawnTimeLeft(uint32 id, uint16 instance_id); - void UpdateSpawn2Status(uint32 id, uint8 new_status); + void UpdateSpawn2Status(uint32 id, uint8 new_status, uint32 instance_id); /* Grids/Paths */ uint32 GetFreeGrid(uint16 zoneid);