eqemu-server/common/repositories/zone_state_spawns_repository.h
Chris Miles 8d1a9efac9
[Zone] Zone State Improvements Part 3 (#4773)
* [Zone State] Additional improvements

* Return early

* Update zone_save_state.cpp

* Push

* Push

* Update zone.cpp

* Update zone_save_state.cpp

* Equip items that were dynamically added on restore

* IsZoneStateValid helper

* ZoneStateSpawnsRepository::PurgeInvalidZoneStates

* Add Zone:StateSaveClearDays and PurgeOldZoneStates

* spawn2 / unique_spawn block when restored from zone state

* One time purge

* Update zone_state_spawns_repository.h

* Update npc.cpp

* Update npc.cpp

* test

* ORDER BY spawn2_id

* Stuff

* Restored corpses shouldn't trigger events

* Fix weird edge case
2025-03-13 17:00:30 -05:00

83 lines
1.9 KiB
C++

#ifndef EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H
#define EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H
#include "../database.h"
#include "../strings.h"
#include "base/base_zone_state_spawns_repository.h"
class ZoneStateSpawnsRepository : public BaseZoneStateSpawnsRepository {
public:
static void PurgeInvalidZoneStates(Database &database)
{
std::string query = R"(
SELECT zone_id, instance_id
FROM zone_state_spawns
GROUP BY zone_id, instance_id
HAVING COUNT(*) = SUM(
CASE
WHEN hp = 0
AND mana = 0
AND endurance = 0
AND (loot_data IS NULL OR loot_data = '')
AND (entity_variables IS NULL OR entity_variables = '')
AND (buffs IS NULL OR buffs = '')
THEN 1 ELSE 0
END
);
)";
auto results = database.QueryDatabase(query);
if (!results.Success()) {
return;
}
for (auto row: results) {
uint32 zone_id = std::stoul(row[0]);
uint32 instance_id = std::stoul(row[1]);
int rows = ZoneStateSpawnsRepository::DeleteWhere(
database,
fmt::format(
"`zone_id` = {} AND `instance_id` = {}",
zone_id,
instance_id
)
);
LogInfo(
"Purged invalid zone state data for zone [{}] instance [{}] rows [{}]",
zone_id,
instance_id,
Strings::Commify(rows)
);
}
}
static void PurgeOldZoneStates(Database &database)
{
int days = RuleI(Zone, StateSaveClearDays);
std::string query = fmt::format(
"DELETE FROM zone_state_spawns WHERE created_at < NOW() - INTERVAL {} DAY",
days
);
auto results = database.QueryDatabase(query);
if (!results.Success()) {
LogError("Failed to purge old zone state data older than {} days.", days);
return;
}
if (results.RowsAffected() > 0) {
LogInfo(
"Purged old zone state data older than days [{}] rows [{}]",
days,
Strings::Commify(results.RowsAffected())
);
}
}
};
#endif //EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H