Core/Instances: Save instance entrance based on completed encounters
Port From (https://github.com/TrinityCore/TrinityCore/commit/4cbaaa343543e0fde5d90b87f762804997f1dbac)
This commit is contained in:
@@ -267,6 +267,9 @@ namespace Game.Maps
|
|||||||
if (!entries.MapDifficulty.IsUsingEncounterLocks())
|
if (!entries.MapDifficulty.IsUsingEncounterLocks())
|
||||||
instanceLock.GetData().CompletedEncountersMask |= updateEvent.InstanceCompletedEncountersMask;
|
instanceLock.GetData().CompletedEncountersMask |= updateEvent.InstanceCompletedEncountersMask;
|
||||||
|
|
||||||
|
if (updateEvent.EntranceWorldSafeLocId.HasValue)
|
||||||
|
instanceLock.GetData().EntranceWorldSafeLocId = updateEvent.EntranceWorldSafeLocId.Value;
|
||||||
|
|
||||||
if (instanceLock.IsExpired())
|
if (instanceLock.IsExpired())
|
||||||
{
|
{
|
||||||
Cypher.Assert(instanceLock.IsExtended(), "Instance lock must have been extended to create instance map from it");
|
Cypher.Assert(instanceLock.IsExtended(), "Instance lock must have been extended to create instance map from it");
|
||||||
@@ -299,6 +302,9 @@ namespace Game.Maps
|
|||||||
Log.outDebug(LogFilter.Instance, $"Instance {updateEvent.InstanceId} gains completed encounter [{updateEvent.CompletedEncounter.Id}-{updateEvent.CompletedEncounter.Name[Global.WorldMgr.GetDefaultDbcLocale()]}]");
|
Log.outDebug(LogFilter.Instance, $"Instance {updateEvent.InstanceId} gains completed encounter [{updateEvent.CompletedEncounter.Id}-{updateEvent.CompletedEncounter.Name[Global.WorldMgr.GetDefaultDbcLocale()]}]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (updateEvent.EntranceWorldSafeLocId.HasValue)
|
||||||
|
sharedData.EntranceWorldSafeLocId = updateEvent.EntranceWorldSafeLocId.Value;
|
||||||
|
|
||||||
trans.Append($"DELETE FROM instance2 WHERE instanceId={sharedData.InstanceId}");
|
trans.Append($"DELETE FROM instance2 WHERE instanceId={sharedData.InstanceId}");
|
||||||
string escapedData = sharedData.Data;
|
string escapedData = sharedData.Data;
|
||||||
CharacterDatabase.EscapeString(ref escapedData);
|
CharacterDatabase.EscapeString(ref escapedData);
|
||||||
@@ -505,13 +511,15 @@ namespace Game.Maps
|
|||||||
public string NewData;
|
public string NewData;
|
||||||
public uint InstanceCompletedEncountersMask;
|
public uint InstanceCompletedEncountersMask;
|
||||||
public DungeonEncounterRecord CompletedEncounter;
|
public DungeonEncounterRecord CompletedEncounter;
|
||||||
|
public uint? EntranceWorldSafeLocId;
|
||||||
|
|
||||||
public InstanceLockUpdateEvent(uint instanceId, string newData, uint instanceCompletedEncountersMask, DungeonEncounterRecord completedEncounter)
|
public InstanceLockUpdateEvent(uint instanceId, string newData, uint instanceCompletedEncountersMask, DungeonEncounterRecord completedEncounter, uint? entranceWorldSafeLocId)
|
||||||
{
|
{
|
||||||
InstanceId = instanceId;
|
InstanceId = instanceId;
|
||||||
NewData = newData;
|
NewData = newData;
|
||||||
InstanceCompletedEncountersMask = instanceCompletedEncountersMask;
|
InstanceCompletedEncountersMask = instanceCompletedEncountersMask;
|
||||||
CompletedEncounter = completedEncounter;
|
CompletedEncounter = completedEncounter;
|
||||||
|
EntranceWorldSafeLocId = entranceWorldSafeLocId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -506,6 +506,19 @@ namespace Game.Maps
|
|||||||
return writer.GetString();
|
return writer.GetString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public uint? GetEntranceLocationForCompletedEncounters(uint completedEncountersMask)
|
||||||
|
{
|
||||||
|
if (!instance.GetMapDifficulty().IsUsingEncounterLocks())
|
||||||
|
return _entranceId;
|
||||||
|
|
||||||
|
return ComputeEntranceLocationForCompletedEncounters(completedEncountersMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual uint? ComputeEntranceLocationForCompletedEncounters(uint completedEncountersMask)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void HandleGameObject(ObjectGuid guid, bool open, GameObject go = null)
|
public void HandleGameObject(ObjectGuid guid, bool open, GameObject go = null)
|
||||||
{
|
{
|
||||||
if (!go)
|
if (!go)
|
||||||
|
|||||||
+12
-5
@@ -4992,7 +4992,8 @@ namespace Game.Maps
|
|||||||
SQLTransaction trans = new();
|
SQLTransaction trans = new();
|
||||||
|
|
||||||
if (entries.IsInstanceIdBound())
|
if (entries.IsInstanceIdBound())
|
||||||
Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter));
|
Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(),
|
||||||
|
instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data.GetEntranceLocationForCompletedEncounters(instanceCompletedEncounters)));
|
||||||
|
|
||||||
foreach (var player in GetPlayers())
|
foreach (var player in GetPlayers())
|
||||||
{
|
{
|
||||||
@@ -5002,12 +5003,17 @@ namespace Game.Maps
|
|||||||
|
|
||||||
InstanceLock playerLock = Global.InstanceLockMgr.FindActiveInstanceLock(player.GetGUID(), entries);
|
InstanceLock playerLock = Global.InstanceLockMgr.FindActiveInstanceLock(player.GetGUID(), entries);
|
||||||
string oldData = "";
|
string oldData = "";
|
||||||
|
uint playerCompletedEncounters = 0;
|
||||||
if (playerLock != null)
|
if (playerLock != null)
|
||||||
|
{
|
||||||
oldData = playerLock.GetData().Data;
|
oldData = playerLock.GetData().Data;
|
||||||
|
playerCompletedEncounters = playerLock.GetData().CompletedEncountersMask | (1u << updateSaveDataEvent.DungeonEncounter.Bit);
|
||||||
|
}
|
||||||
|
|
||||||
bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired();
|
bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired();
|
||||||
|
|
||||||
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateBossStateSaveData(oldData, updateSaveDataEvent), instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter));
|
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateBossStateSaveData(oldData, updateSaveDataEvent),
|
||||||
|
instanceCompletedEncounters, updateSaveDataEvent.DungeonEncounter, i_data.GetEntranceLocationForCompletedEncounters(playerCompletedEncounters)));
|
||||||
|
|
||||||
if (isNewLock)
|
if (isNewLock)
|
||||||
{
|
{
|
||||||
@@ -5034,7 +5040,7 @@ namespace Game.Maps
|
|||||||
SQLTransaction trans = new();
|
SQLTransaction trans = new();
|
||||||
|
|
||||||
if (entries.IsInstanceIdBound())
|
if (entries.IsInstanceIdBound())
|
||||||
Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, null));
|
Global.InstanceLockMgr.UpdateSharedInstanceLock(trans, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), instanceCompletedEncounters, null, null));
|
||||||
|
|
||||||
foreach (var player in GetPlayers())
|
foreach (var player in GetPlayers())
|
||||||
{
|
{
|
||||||
@@ -5049,7 +5055,8 @@ namespace Game.Maps
|
|||||||
|
|
||||||
bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired();
|
bool isNewLock = playerLock == null || playerLock.GetData().CompletedEncountersMask == 0 || playerLock.IsExpired();
|
||||||
|
|
||||||
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateAdditionalSaveData(oldData, updateSaveDataEvent), instanceCompletedEncounters, null));
|
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.UpdateAdditionalSaveData(oldData, updateSaveDataEvent),
|
||||||
|
instanceCompletedEncounters, null, null));
|
||||||
|
|
||||||
if (isNewLock)
|
if (isNewLock)
|
||||||
{
|
{
|
||||||
@@ -5074,7 +5081,7 @@ namespace Game.Maps
|
|||||||
|
|
||||||
SQLTransaction trans = new();
|
SQLTransaction trans = new();
|
||||||
|
|
||||||
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), i_instanceLock.GetData().CompletedEncountersMask, null));
|
InstanceLock newLock = Global.InstanceLockMgr.UpdateInstanceLockForPlayer(trans, player.GetGUID(), entries, new InstanceLockUpdateEvent(GetInstanceId(), i_data.GetSaveData(), i_instanceLock.GetData().CompletedEncountersMask, null, null));
|
||||||
|
|
||||||
DB.Characters.CommitTransaction(trans);
|
DB.Characters.CommitTransaction(trans);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user