private void Reset() { _minimapItemsDic.Clear(); if (_minimapItems.Count > 0) { Execute.OnUIThread(() => _minimapItems.Clear()); } _acdsObserver = null; _playerAcd = null; _ignoredSnoIds.Clear(); _localData = null; _objectManager = null; _isLocalActorReady = false; _previousFrame = 0; }
public void Update(MemoryContext ctx) { if (ctx == null) { throw new ArgumentNullException(nameof(ctx)); } try { if (!IsLocalActorValid(ctx)) { return; } if (!IsObjectManagerOnNewFrame(ctx)) { return; } var itemsToAdd = new List <IMapMarker>(); var itemsToRemove = new List <IMapMarker>(); _acdsObserver = _acdsObserver ?? new ContainerObserver <ACD>(ctx.DataSegment.ObjectManager.ACDManager.ActorCommonData); _acdsObserver.Update(); // Must have a local ACD to base coords on. if (_playerAcd == null) { var playerAcdId = ctx.DataSegment.ObjectManager.PlayerDataManager[ ctx.DataSegment.ObjectManager.Player.LocalPlayerIndex].ACDID; var index = Array.IndexOf(_acdsObserver.CurrentMapping, playerAcdId); if (index != -1) { _playerAcd = MemoryObjectFactory.UnsafeCreate <ACD>(new BufferMemoryReader(_acdsObserver.CurrentData), index * _acdsObserver.Container.ItemSize); } } foreach (var acd in _acdsObserver.OldItems) { var marker = default(IMapMarker); if (_minimapItemsDic.TryGetValue(acd.Address, out marker)) { Trace.WriteLine("Removing " + acd.Name); itemsToRemove.Add(marker); _minimapItemsDic.Remove(acd.Address); } } foreach (var acd in _acdsObserver.NewItems) { var actorSnoId = acd.ActorSNO; if (_ignoredSnoIds.Contains(actorSnoId)) { continue; } if (!_minimapItemsDic.ContainsKey(acd.Address)) { bool ignore; var minimapItem = MapMarkerFactory.Create(acd, out ignore); if (ignore) { _ignoredSnoIds.Add(actorSnoId); } else if (minimapItem != null) { _minimapItemsDic.Add(acd.Address, minimapItem); itemsToAdd.Add(minimapItem); } } } UpdateUI(itemsToAdd, itemsToRemove); } catch (Exception exception) { OnUpdateException(exception); } }