Make spawn2 enabled/disabled instance aware

This commit is contained in:
Akkadius
2023-10-29 22:19:09 -05:00
parent d8ac387569
commit 06461944df
6 changed files with 41 additions and 24 deletions
@@ -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`)
@@ -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<int32_t>(atoi(row[1]));
e.disabled = static_cast<int16_t>(atoi(row[2]));
e.id = strtoll(row[0], nullptr, 10);
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.disabled = static_cast<int16_t>(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<int32_t>(atoi(row[1]));
e.disabled = static_cast<int16_t>(atoi(row[2]));
e.id = strtoll(row[0], nullptr, 10);
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.disabled = static_cast<int16_t>(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<int32_t>(atoi(row[1]));
e.disabled = static_cast<int16_t>(atoi(row[2]));
e.id = strtoll(row[0], nullptr, 10);
e.spawn2_id = static_cast<int32_t>(atoi(row[1]));
e.instance_id = static_cast<int32_t>(atoi(row[2]));
e.disabled = static_cast<int16_t>(atoi(row[3]));
all_entries.push_back(e);
}
+2 -2
View File
@@ -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;
+4 -3
View File
@@ -486,12 +486,13 @@ bool ZoneDatabase::PopulateZoneSpawnList(uint32 zoneid, LinkedList<Spawn2*> &spa
}
std::vector<Spawn2DisabledRepository::Spawn2Disabled> 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()
)
);
}
+10 -5
View File
@@ -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);
}
+1 -1
View File
@@ -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);