Rename IpcCallerMare, implement checking for Lightless/Snowcloak.
- Do not sync with pairs handled by Lightless/Snowcloak. - Easy to add extra clients into this list.
This commit is contained in:
@@ -12,21 +12,21 @@ public class VisibilityService : DisposableMediatorSubscriberBase
|
||||
{
|
||||
NotVisible,
|
||||
Visible,
|
||||
MareHandled
|
||||
OtherSyncHandled
|
||||
};
|
||||
|
||||
private readonly DalamudUtilService _dalamudUtil;
|
||||
private readonly ConcurrentDictionary<string, TrackedPlayerStatus> _trackedPlayerVisibility = new(StringComparer.Ordinal);
|
||||
private readonly List<string> _makeVisibleNextFrame = new();
|
||||
private readonly IpcCallerMare _mare;
|
||||
private readonly HashSet<nint> cachedMareAddresses = new();
|
||||
private readonly IpcCallerOtherSync _otherSync;
|
||||
private readonly HashSet<nint> cachedOtherSyncAddresses = new();
|
||||
private uint _cachedAddressSum = 0;
|
||||
private uint _cachedAddressSumDebounce = 1;
|
||||
|
||||
public VisibilityService(ILogger<VisibilityService> logger, MareMediator mediator, IpcCallerMare mare, DalamudUtilService dalamudUtil)
|
||||
public VisibilityService(ILogger<VisibilityService> logger, MareMediator mediator, IpcCallerOtherSync otherSync, DalamudUtilService dalamudUtil)
|
||||
: base(logger, mediator)
|
||||
{
|
||||
_mare = mare;
|
||||
_otherSync = otherSync;
|
||||
_dalamudUtil = dalamudUtil;
|
||||
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => FrameworkUpdate());
|
||||
}
|
||||
@@ -44,19 +44,19 @@ public class VisibilityService : DisposableMediatorSubscriberBase
|
||||
|
||||
private void FrameworkUpdate()
|
||||
{
|
||||
var mareHandledAddresses = _mare.GetHandledGameAddresses();
|
||||
var otherSyncHandledAddresses = _otherSync.GetHandledGameAddresses();
|
||||
uint addressSum = 0;
|
||||
|
||||
foreach (var addr in mareHandledAddresses)
|
||||
foreach (var addr in otherSyncHandledAddresses)
|
||||
addressSum ^= (uint)addr.GetHashCode();
|
||||
|
||||
if (addressSum != _cachedAddressSum)
|
||||
{
|
||||
if (addressSum == _cachedAddressSumDebounce)
|
||||
{
|
||||
cachedMareAddresses.Clear();
|
||||
foreach (var addr in mareHandledAddresses)
|
||||
cachedMareAddresses.Add(addr);
|
||||
cachedOtherSyncAddresses.Clear();
|
||||
foreach (var addr in otherSyncHandledAddresses)
|
||||
cachedOtherSyncAddresses.Add(addr);
|
||||
_cachedAddressSum = addressSum;
|
||||
}
|
||||
else
|
||||
@@ -69,11 +69,11 @@ public class VisibilityService : DisposableMediatorSubscriberBase
|
||||
{
|
||||
string ident = player.Key;
|
||||
var findResult = _dalamudUtil.FindPlayerByNameHash(ident);
|
||||
var isMareHandled = cachedMareAddresses.Contains(findResult.Address);
|
||||
var isVisible = findResult.ObjectId != 0 && !isMareHandled;
|
||||
var isOtherSyncHandled = cachedOtherSyncAddresses.Contains(findResult.Address);
|
||||
var isVisible = findResult.ObjectId != 0 && !isOtherSyncHandled;
|
||||
|
||||
if (player.Value == TrackedPlayerStatus.MareHandled && !isMareHandled)
|
||||
_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.NotVisible, comparisonValue: TrackedPlayerStatus.MareHandled);
|
||||
if (player.Value == TrackedPlayerStatus.OtherSyncHandled && !isOtherSyncHandled)
|
||||
_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.NotVisible, comparisonValue: TrackedPlayerStatus.OtherSyncHandled);
|
||||
|
||||
if (player.Value == TrackedPlayerStatus.NotVisible && isVisible)
|
||||
{
|
||||
@@ -85,17 +85,17 @@ public class VisibilityService : DisposableMediatorSubscriberBase
|
||||
else
|
||||
_makeVisibleNextFrame.Add(ident);
|
||||
}
|
||||
else if (player.Value == TrackedPlayerStatus.NotVisible && isMareHandled)
|
||||
else if (player.Value == TrackedPlayerStatus.NotVisible && isOtherSyncHandled)
|
||||
{
|
||||
// Send a technically redundant visibility update with the added intent of triggering PairHandler to undo the application by name
|
||||
if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.MareHandled, comparisonValue: TrackedPlayerStatus.NotVisible))
|
||||
if (_trackedPlayerVisibility.TryUpdate(ident, newValue: TrackedPlayerStatus.OtherSyncHandled, comparisonValue: TrackedPlayerStatus.NotVisible))
|
||||
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: false, Invalidate: true));
|
||||
}
|
||||
else if (player.Value == TrackedPlayerStatus.Visible && !isVisible)
|
||||
{
|
||||
var newTrackedStatus = isMareHandled ? TrackedPlayerStatus.MareHandled : TrackedPlayerStatus.NotVisible;
|
||||
var newTrackedStatus = isOtherSyncHandled ? TrackedPlayerStatus.OtherSyncHandled : TrackedPlayerStatus.NotVisible;
|
||||
if (_trackedPlayerVisibility.TryUpdate(ident, newValue: newTrackedStatus, comparisonValue: TrackedPlayerStatus.Visible))
|
||||
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: false, Invalidate: isMareHandled));
|
||||
Mediator.Publish<PlayerVisibilityMessage>(new(ident, IsVisible: false, Invalidate: isOtherSyncHandled));
|
||||
}
|
||||
|
||||
if (!isVisible)
|
||||
|
||||
Reference in New Issue
Block a user