Core/Housing: stage 26 add initiative persistence handlers
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
|
||||
*/
|
||||
|
||||
#include "HousingInitiativeSession.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "HousingDefines.h"
|
||||
#include "HousingMgr.h"
|
||||
#include "HousingPackets.h"
|
||||
#include "Log.h"
|
||||
#include "Player.h"
|
||||
#include "WorldSession.h"
|
||||
|
||||
namespace Housing
|
||||
{
|
||||
namespace
|
||||
{
|
||||
bool LoadOwnedNeighborhood(WorldSession* session, ObjectGuid const& neighborhoodGuid, HouseState& house)
|
||||
{
|
||||
house = {};
|
||||
if (!session || !IsNeighborhoodGuid(neighborhoodGuid))
|
||||
return false;
|
||||
|
||||
Player* player = session->GetPlayer();
|
||||
if (!player)
|
||||
return false;
|
||||
|
||||
if (sHousingMgr.LoadOwnedHouse(player, ObjectGuid::Empty, house) != Result::Success)
|
||||
return false;
|
||||
|
||||
return house.NeighborhoodGuid == neighborhoodGuid;
|
||||
}
|
||||
|
||||
void EnsureInitiativePersistence(HouseState const& house)
|
||||
{
|
||||
CharacterDatabase.PExecute(
|
||||
"INSERT INTO housing_neighborhood_initiative "
|
||||
"(NeighborhoodGuid, InitiativeID, State, Progress, RewardTier, StartedAt, EndsAt) "
|
||||
"VALUES ('{}', 0, 0, 0, 0, NULL, NULL) "
|
||||
"ON DUPLICATE KEY UPDATE NeighborhoodGuid = VALUES(NeighborhoodGuid)",
|
||||
house.NeighborhoodGuid.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
void HandleInitiativeServiceStatus(WorldSession* session,
|
||||
WorldPackets::Housing::NeighborhoodInitiativeServiceStatusCheck& /*packet*/)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::InitiativeServiceStatus response;
|
||||
response.Available = true;
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
|
||||
void HandleInitiativeActivityLog(WorldSession* session,
|
||||
WorldPackets::Housing::GetInitiativeActivityLogRequest& packet)
|
||||
{
|
||||
if (!session)
|
||||
return;
|
||||
|
||||
WorldPackets::Housing::GetInitiativeActivityLogResult response;
|
||||
response.NeighborhoodGUID = packet.NeighborhoodGUID;
|
||||
response.EntryCount = 0;
|
||||
|
||||
HouseState house;
|
||||
if (!LoadOwnedNeighborhood(session, packet.NeighborhoodGUID, house))
|
||||
{
|
||||
session->SendPacket(response.Write());
|
||||
return;
|
||||
}
|
||||
|
||||
EnsureInitiativePersistence(house);
|
||||
|
||||
QueryResult persistedEntries = CharacterDatabase.PQuery(
|
||||
"SELECT COUNT(*) FROM housing_initiative_activity_log "
|
||||
"WHERE NeighborhoodGuid = '{}'",
|
||||
packet.NeighborhoodGUID.ToString());
|
||||
uint64 const persistedEntryCount = persistedEntries ? persistedEntries->Fetch()[0].GetUInt64() : 0;
|
||||
if (persistedEntryCount != 0)
|
||||
{
|
||||
// The non-empty build 69587 activity-log record layout is not yet verified.
|
||||
// Keep persisted progress server-side instead of advertising a count whose
|
||||
// corresponding records cannot be serialized safely to the retail client.
|
||||
TC_LOG_DEBUG("housing", "Neighborhood {} has {} persisted Initiative log entries; wire publication is deferred",
|
||||
packet.NeighborhoodGUID.ToString(), persistedEntryCount);
|
||||
}
|
||||
|
||||
session->SendPacket(response.Write());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user