Core/Housing: stage 31 reject expired active Initiative selection

This commit is contained in:
Gexo91
2026-09-12 17:42:03 +03:00
parent 7737573e0c
commit 007105d896
@@ -122,15 +122,17 @@ namespace Housing
} }
if (snapshot.InitiativeId != 0 || snapshot.State != 0 || snapshot.Progress != 0 || if (snapshot.InitiativeId != 0 || snapshot.State != 0 || snapshot.Progress != 0 ||
snapshot.RewardTier != 0 || !snapshot.Activities.empty() || !snapshot.PlayerActivities.empty()) snapshot.RewardTier != 0 || snapshot.StartedAt != 0 || snapshot.EndsAt != 0 || snapshot.Expired ||
!snapshot.Activities.empty() || !snapshot.PlayerActivities.empty())
{ {
// The empty player-info form is verified and terminates after the flag byte. // The empty player-info form is verified and terminates after the flag byte.
// Keep richer persisted Initiative state server-side until the current-client // Keep richer persisted Initiative state server-side until the current-client
// trailing data block has been capture-verified. // trailing data block has been capture-verified.
TC_LOG_DEBUG("housing", TC_LOG_DEBUG("housing",
"Neighborhood {} has Initiative {} state {} progress {} reward tier {} with {} activities and {} player contributions; detailed wire publication is deferred", "Neighborhood {} has Initiative {} state {} progress {} reward tier {} start {} end {} expired {} with {} activities and {} player contributions; detailed wire publication is deferred",
packet.NeighborhoodGUID.ToString(), snapshot.InitiativeId, uint32(snapshot.State), snapshot.Progress, packet.NeighborhoodGUID.ToString(), snapshot.InitiativeId, uint32(snapshot.State), snapshot.Progress,
uint32(snapshot.RewardTier), snapshot.Activities.size(), snapshot.PlayerActivities.size()); uint32(snapshot.RewardTier), snapshot.StartedAt, snapshot.EndsAt, snapshot.Expired,
snapshot.Activities.size(), snapshot.PlayerActivities.size());
} }
session->SendPacket(response.Write()); session->SendPacket(response.Write());
@@ -155,6 +157,15 @@ namespace Housing
EnsureInitiativePersistence(house); EnsureInitiativePersistence(house);
InitiativeProgressSnapshot snapshot;
InitiativeProgressResult const loadResult = LoadInitiativeProgress(
session->GetPlayer(), packet.NeighborhoodGUID, snapshot);
if (loadResult != InitiativeProgressResult::Success)
{
session->SendPacket(response.Write());
return;
}
QueryResult persistedEntries = CharacterDatabase.PQuery( QueryResult persistedEntries = CharacterDatabase.PQuery(
"SELECT COUNT(*) FROM housing_initiative_activity_log " "SELECT COUNT(*) FROM housing_initiative_activity_log "
"WHERE NeighborhoodGuid = '{}'", "WHERE NeighborhoodGuid = '{}'",
@@ -195,6 +206,26 @@ namespace Housing
} }
EnsureInitiativePersistence(house); EnsureInitiativePersistence(house);
InitiativeProgressSnapshot snapshot;
InitiativeProgressResult const loadResult = LoadInitiativeProgress(
session->GetPlayer(), packet.NeighborhoodGUID, snapshot);
if (loadResult != InitiativeProgressResult::Success)
{
TC_LOG_WARN("housing", "Failed to validate Initiative neighborhood {} before activation for player {}",
packet.NeighborhoodGUID.ToString(),
session->GetPlayer() ? session->GetPlayer()->GetGUID().ToString() : "<none>");
return;
}
if (snapshot.Expired)
{
TC_LOG_DEBUG("housing", "Rejected expired Initiative {} neighborhood {} for player {}",
snapshot.InitiativeId, packet.NeighborhoodGUID.ToString(),
session->GetPlayer() ? session->GetPlayer()->GetGUID().ToString() : "<none>");
return;
}
if (!PersistActiveNeighborhood(session, packet.NeighborhoodGUID)) if (!PersistActiveNeighborhood(session, packet.NeighborhoodGUID))
TC_LOG_WARN("housing", "Failed to persist active Initiative neighborhood {} for player {}", TC_LOG_WARN("housing", "Failed to persist active Initiative neighborhood {} for player {}",
packet.NeighborhoodGUID.ToString(), packet.NeighborhoodGUID.ToString(),