Core/Instances: Instance lock rewrite (WIP)

Port From (https://github.com/TrinityCore/TrinityCore/commit/17665c929c3a9fb7fe75dd680648129bc1c1f874)
This commit is contained in:
hondacrx
2022-10-04 10:00:07 -04:00
parent d21624fd87
commit d3dde761a2
27 changed files with 907 additions and 431 deletions
+34 -49
View File
@@ -72,27 +72,16 @@ namespace Game
packet.Events.Add(eventInfo);
}
foreach (var difficulty in CliDB.DifficultyStorage.Values)
foreach (InstanceLock instanceLock in Global.InstanceLockMgr.GetInstanceLocksForPlayer(_player.GetGUID()))
{
var boundInstances = _player.GetBoundInstances((Difficulty)difficulty.Id);
if (boundInstances != null)
{
foreach (var boundInstance in boundInstances.Values)
{
if (boundInstance.perm)
{
CalendarSendCalendarRaidLockoutInfo lockoutInfo;
CalendarSendCalendarRaidLockoutInfo lockoutInfo = new();
InstanceSave save = boundInstance.save;
lockoutInfo.MapID = (int)save.GetMapId();
lockoutInfo.DifficultyID = (uint)save.GetDifficultyID();
lockoutInfo.ExpireTime = save.GetResetTime() - currTime;
lockoutInfo.InstanceID = save.GetInstanceId(); // instance save id as unique instance copy id
lockoutInfo.MapID = (int)instanceLock.GetMapId();
lockoutInfo.DifficultyID = (uint)instanceLock.GetDifficultyId();
lockoutInfo.ExpireTime = (int)(instanceLock.GetEffectiveExpiryTime() - GameTime.GetSystemTime()).TotalSeconds;
lockoutInfo.InstanceID = instanceLock.GetInstanceId();
packet.RaidLockouts.Add(lockoutInfo);
}
}
}
packet.RaidLockouts.Add(lockoutInfo);
}
SendPacket(packet);
@@ -253,7 +242,7 @@ namespace Game
Global.CalendarMgr.SendCalendarCommandResult(guid, CalendarError.EventPassed);
return;
}
CalendarEvent oldEvent = Global.CalendarMgr.GetEvent(calendarCopyEvent.EventID);
if (oldEvent != null)
{
@@ -564,39 +553,17 @@ namespace Game
player.BindToInstance(instanceBind.save, true, newState, false);
}
/*
InstancePlayerBind* instanceBind = GetPlayer().GetBoundInstance(setSavedInstanceExtend.MapID, Difficulty(setSavedInstanceExtend.DifficultyID);
if (!instanceBind || !instanceBind.save)
return;
InstanceSave* save = instanceBind.save;
// http://www.wowwiki.com/Instance_Lock_Extension
// SendCalendarRaidLockoutUpdated(save);
*/
}
public void SendCalendarRaidLockout(InstanceSave save, bool add)
public void SendCalendarRaidLockoutAdded(InstanceLock instanceLock)
{
long currTime = GameTime.GetGameTime();
if (add)
{
CalendarRaidLockoutAdded calendarRaidLockoutAdded = new();
calendarRaidLockoutAdded.InstanceID = save.GetInstanceId();
calendarRaidLockoutAdded.ServerTime = (uint)currTime;
calendarRaidLockoutAdded.MapID = (int)save.GetMapId();
calendarRaidLockoutAdded.DifficultyID = save.GetDifficultyID();
calendarRaidLockoutAdded.TimeRemaining = (int)(save.GetResetTime() - currTime);
SendPacket(calendarRaidLockoutAdded);
}
else
{
CalendarRaidLockoutRemoved calendarRaidLockoutRemoved = new();
calendarRaidLockoutRemoved.InstanceID = save.GetInstanceId();
calendarRaidLockoutRemoved.MapID = (int)save.GetMapId();
calendarRaidLockoutRemoved.DifficultyID = save.GetDifficultyID();
SendPacket(calendarRaidLockoutRemoved);
}
CalendarRaidLockoutAdded calendarRaidLockoutAdded = new();
calendarRaidLockoutAdded.InstanceID = instanceLock.GetInstanceId();
calendarRaidLockoutAdded.ServerTime = (uint)GameTime.GetGameTime();
calendarRaidLockoutAdded.MapID = (int)instanceLock.GetMapId();
calendarRaidLockoutAdded.DifficultyID = instanceLock.GetDifficultyId();
calendarRaidLockoutAdded.TimeRemaining = (int)(instanceLock.GetExpiryTime() - GameTime.GetSystemTime()).TotalSeconds;
SendPacket(calendarRaidLockoutAdded);
}
public void SendCalendarRaidLockoutUpdated(InstanceSave save)
@@ -614,5 +581,23 @@ namespace Game
SendPacket(packet);
}
public void SendCalendarRaidLockoutRemoved(InstanceSave save)
{
CalendarRaidLockoutRemoved calendarRaidLockoutRemoved = new();
calendarRaidLockoutRemoved.InstanceID = save.GetInstanceId();
calendarRaidLockoutRemoved.MapID = (int)save.GetMapId();
calendarRaidLockoutRemoved.DifficultyID = save.GetDifficultyID();
SendPacket(calendarRaidLockoutRemoved);
}
void SendCalendarRaidLockoutRemoved(InstanceLock instanceLock)
{
CalendarRaidLockoutRemoved calendarRaidLockoutRemoved = new();
calendarRaidLockoutRemoved.InstanceID = instanceLock.GetInstanceId();
calendarRaidLockoutRemoved.MapID = (int)instanceLock.GetMapId();
calendarRaidLockoutRemoved.DifficultyID = instanceLock.GetDifficultyId();
SendPacket(calendarRaidLockoutRemoved);
}
}
}
+1 -1
View File
@@ -1312,7 +1312,7 @@ namespace Game
for (int i = 0; i < SharedConst.MaxDeclinedNameCases; ++i)
{
string declinedName = packet.DeclinedNames.name[i];
DB.Characters.EscapeString(ref declinedName);
CharacterDatabase.EscapeString(ref declinedName);
packet.DeclinedNames.name[i] = declinedName;
}
+9 -13
View File
@@ -304,18 +304,14 @@ namespace Game
Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' does not have a corpse in instance map {1} and cannot enter", player.GetName(), at.target_mapId);
break;
case EnterState.CannotEnterInstanceBindMismatch:
{
MapRecord entry = CliDB.MapStorage.LookupByKey(at.target_mapId);
if (entry != null)
{
string mapName = entry.MapName[player.GetSession().GetSessionDbcLocale()];
Log.outDebug(LogFilter.Maps, "MAP: Player '{0}' cannot enter instance map '{1}' because their permanent bind is incompatible with their group's", player.GetName(), mapName);
// is there a special opcode for this?
// @todo figure out how to get player localized difficulty string (e.g. "10 player", "Heroic" etc)
player.SendSysMessage(CypherStrings.InstanceBindMismatch, mapName);
}
reviveAtTrigger = true;
}
player.SendTransferAborted(at.target_mapId, TransferAbortReason.LockedToDifferentInstance);
Log.outDebug(LogFilter.Maps, $"MAP: Player '{player.GetName()}' cannot enter instance map {at.target_mapId} because their permanent bind is incompatible with their group's");
reviveAtTrigger = true;
break;
case EnterState.CannotEnterAlreadyCompletedEncounter:
player.SendTransferAborted(at.target_mapId, TransferAbortReason.AlreadyCompletedEncounter);
Log.outDebug(LogFilter.Maps, $"MAP: Player '{player.GetName()}' cannot enter instance map {at.target_mapId} because their permanent bind is incompatible with their group's");
reviveAtTrigger = true;
break;
case EnterState.CannotEnterTooManyInstances:
player.SendTransferAborted(at.target_mapId, TransferAbortReason.TooManyInstances);
@@ -783,7 +779,7 @@ namespace Game
}
if (packet.AcceptLock)
GetPlayer().BindToInstance();
GetPlayer().ConfirmPendingBind();
else
GetPlayer().RepopAtGraveyard();