mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-15 08:21:28 +00:00
Clear stale pending expedition lockouts
Delete pending lockouts of members on expedition creation Delete pending lockouts when all members removed from expedition This fixes an edge case where members could incorrectly be assigned pending lockouts that were never cleared from the database (from a server crash or other situation) after entering another dz.
This commit is contained in:
parent
6165550133
commit
17be2bf2f7
@ -427,7 +427,7 @@ void DynamicZone::RemoveAllCharacters(bool enable_removal_timers)
|
||||
database.RemoveClientsFromInstance(GetInstanceID());
|
||||
}
|
||||
|
||||
void DynamicZone::SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t> character_ids)
|
||||
void DynamicZone::SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t>& character_ids)
|
||||
{
|
||||
std::string insert_values;
|
||||
for (const auto& character_id : character_ids)
|
||||
|
||||
@ -75,7 +75,7 @@ public:
|
||||
|
||||
uint32_t CreateInstance();
|
||||
void AddCharacter(uint32_t character_id);
|
||||
void SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t> character_ids);
|
||||
void SaveInstanceMembersToDatabase(const std::unordered_set<uint32_t>& character_ids);
|
||||
|
||||
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
|
||||
uint16_t GetInstanceID() const { return static_cast<uint16_t>(m_instance_id); };
|
||||
|
||||
@ -310,7 +310,9 @@ void Expedition::SaveMembers(ExpeditionRequest& request)
|
||||
{
|
||||
m_member_id_history.emplace(member.char_id);
|
||||
}
|
||||
|
||||
ExpeditionDatabase::InsertMembers(m_id, m_members);
|
||||
ExpeditionDatabase::DeleteAllMembersPendingLockouts(m_members);
|
||||
m_dynamiczone.SaveInstanceMembersToDatabase(m_member_id_history); // all are current members here
|
||||
}
|
||||
|
||||
@ -504,10 +506,13 @@ void Expedition::RemoveAllMembers(bool enable_removal_timers)
|
||||
{
|
||||
m_dynamiczone.RemoveAllCharacters(enable_removal_timers);
|
||||
|
||||
ExpeditionDatabase::DeleteAllMembersPendingLockouts(m_members);
|
||||
ExpeditionDatabase::UpdateAllMembersRemoved(m_id);
|
||||
|
||||
SendUpdatesToZoneMembers(true);
|
||||
SendWorldExpeditionUpdate(ServerOP_ExpeditionMembersRemoved);
|
||||
|
||||
m_members.clear();
|
||||
}
|
||||
|
||||
bool Expedition::RemoveMember(const std::string& remove_char_name)
|
||||
@ -1626,6 +1631,7 @@ void Expedition::HandleWorldMessage(ServerPacket* pack)
|
||||
if (expedition)
|
||||
{
|
||||
expedition->SendUpdatesToZoneMembers(true);
|
||||
expedition->m_members.clear();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@ -379,6 +379,29 @@ void ExpeditionDatabase::DeletePendingLockouts(uint32_t character_id)
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
|
||||
void ExpeditionDatabase::DeleteAllMembersPendingLockouts(const std::vector<ExpeditionMember>& members)
|
||||
{
|
||||
LogExpeditionsDetail("Deleting pending lockouts for [{}] characters", members.size());
|
||||
|
||||
std::string query_character_ids;
|
||||
for (const auto& member : members)
|
||||
{
|
||||
fmt::format_to(std::back_inserter(query_character_ids), "{},", member.char_id);
|
||||
}
|
||||
|
||||
if (!query_character_ids.empty())
|
||||
{
|
||||
query_character_ids.pop_back(); // trailing comma
|
||||
|
||||
auto query = fmt::format(SQL(
|
||||
DELETE FROM expedition_character_lockouts
|
||||
WHERE character_id IN ({}) AND is_pending = TRUE;
|
||||
), query_character_ids);
|
||||
|
||||
database.QueryDatabase(query);
|
||||
}
|
||||
}
|
||||
|
||||
void ExpeditionDatabase::DeleteLockout(uint32_t expedition_id, const std::string& event_name)
|
||||
{
|
||||
LogExpeditionsDetail("Deleting expedition [{}] lockout event [{}]", expedition_id, event_name);
|
||||
|
||||
@ -55,6 +55,7 @@ namespace ExpeditionDatabase
|
||||
const std::vector<ExpeditionMember>& members, const std::string& expedition_name, const std::string& event_name);
|
||||
void AssignPendingLockouts(uint32_t character_id, const std::string& expedition_name);
|
||||
void DeletePendingLockouts(uint32_t character_id);
|
||||
void DeleteAllMembersPendingLockouts(const std::vector<ExpeditionMember>& members);
|
||||
uint32_t GetExpeditionIDFromCharacterID(uint32_t character_id);
|
||||
uint32_t GetExpeditionIDFromInstanceID(uint32_t instance_id);
|
||||
ExpeditionMember GetExpeditionLeader(uint32_t expedition_id);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user