aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/Map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r--src/server/game/Maps/Map.cpp53
1 files changed, 48 insertions, 5 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 5d2a530b9d7..c8540ac80e7 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3014,13 +3014,56 @@ std::string const& InstanceMap::GetScriptName() const
return sObjectMgr->GetScriptName(i_script_id);
}
-void InstanceMap::UpdateInstanceLock(DungeonEncounterEntry const* dungeonEncounter, UpdateSaveDataEvent const& updateSaveDataEvent)
+void InstanceMap::UpdateInstanceLock(UpdateBossStateSaveDataEvent const& updateSaveDataEvent)
+{
+ if (i_instanceLock)
+ {
+ uint32 instanceCompletedEncounters = i_instanceLock->GetData()->CompletedEncountersMask | (1u << updateSaveDataEvent.DungeonEncounter->Bit);
+
+ MapDb2Entries entries{ GetEntry(), GetMapDifficulty() };
+
+ CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
+
+ if (entries.IsInstanceIdBound())
+ sInstanceLockMgr.UpdateSharedInstanceLock(trans,
+ { GetInstanceId(), i_data->GetSaveData(), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter });
+
+ for (MapReference& mapReference : m_mapRefManager)
+ {
+ Player* player = mapReference.GetSource();
+ // never instance bind GMs with GM mode enabled
+ if (player->IsGameMaster())
+ continue;
+
+ InstanceLock const* playerLock = sInstanceLockMgr.FindActiveInstanceLock(player->GetGUID(), entries);
+ std::string const* oldData = nullptr;
+ if (playerLock)
+ oldData = &playerLock->GetData()->Data;
+
+ bool isNewLock = !playerLock || !playerLock->GetData()->CompletedEncountersMask || playerLock->IsExpired();
+
+ InstanceLock const* newLock = sInstanceLockMgr.UpdateInstanceLockForPlayer(trans, player->GetGUID(), entries,
+ { GetInstanceId(), i_data->UpdateBossStateSaveData(oldData ? *oldData : "", updateSaveDataEvent), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter });
+
+ if (isNewLock)
+ {
+ WorldPackets::Instance::InstanceSaveCreated data;
+ data.Gm = player->IsGameMaster();
+ player->SendDirectMessage(data.Write());
+
+ player->GetSession()->SendCalendarRaidLockoutAdded(newLock);
+ }
+ }
+
+ CharacterDatabase.CommitTransaction(trans);
+ }
+}
+
+void InstanceMap::UpdateInstanceLock(UpdateAdditionalSaveDataEvent const& updateSaveDataEvent)
{
if (i_instanceLock)
{
uint32 instanceCompletedEncounters = i_instanceLock->GetData()->CompletedEncountersMask;
- if (dungeonEncounter)
- instanceCompletedEncounters |= 1u << dungeonEncounter->Bit;
MapDb2Entries entries{ GetEntry(), GetMapDifficulty() };
@@ -3028,7 +3071,7 @@ void InstanceMap::UpdateInstanceLock(DungeonEncounterEntry const* dungeonEncount
if (entries.IsInstanceIdBound())
sInstanceLockMgr.UpdateSharedInstanceLock(trans,
- { GetInstanceId(), i_data->GetSaveData(), instanceCompletedEncounters, dungeonEncounter });
+ { GetInstanceId(), i_data->GetSaveData(), instanceCompletedEncounters, nullptr });
for (MapReference& mapReference : m_mapRefManager)
{
@@ -3045,7 +3088,7 @@ void InstanceMap::UpdateInstanceLock(DungeonEncounterEntry const* dungeonEncount
bool isNewLock = !playerLock || !playerLock->GetData()->CompletedEncountersMask || playerLock->IsExpired();
InstanceLock const* newLock = sInstanceLockMgr.UpdateInstanceLockForPlayer(trans, player->GetGUID(), entries,
- { GetInstanceId(), i_data->UpdateSaveData(oldData ? *oldData : "", updateSaveDataEvent), instanceCompletedEncounters, dungeonEncounter });
+ { GetInstanceId(), i_data->UpdateAdditionalSaveData(oldData ? *oldData : "", updateSaveDataEvent), instanceCompletedEncounters, nullptr });
if (isNewLock)
{