mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 06:21:28 +00:00
* [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
83 lines
1.9 KiB
C++
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
|