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); } }
public void Update(Engine engine) { try { if (!IsLocalActorValid(engine)) { return; } if (!IsObjectManagerOnNewFrame(engine)) { return; } var itemsToAdd = new List <IMapMarker>(); var acds = ActorCommonData.Container; if (acds == null) { Trace.TraceError("ACDs == null"); } else { var bufferSizePreDump = _acdsBuffer.Length; acds.TakeSnapshot(); var dump = acds.GetBufferDump(ref _acdsBuffer); var bufferSizePostDump = _acdsBuffer.Length; if (bufferSizePostDump < bufferSizePreDump) { _minimapItems.Clear(); _minimapItemsDic.Clear(); _playerAcd = null; return; } // Must have a local ACD to base coords on. if (_playerAcd == null) { var playerAcdId = ActorCommonDataHelper.GetLocalAcd().x000_Id; foreach (var item in dump) { var acdId = BitConverter.ToInt32(_acdsBuffer, item.BufferOffset + 0x00); if (acdId == playerAcdId) { _playerAcd = item.Create(); } } if (_playerAcd == null) { return; } } var firstFreeAcd = acds.x114_Free; if (firstFreeAcd != _firstFreeAcd) { foreach (var item in dump) { if (_minimapItemsDic.ContainsKey(item.Address)) { continue; } var acd = item.Create(); int acdId = acd.x000_Id; if (acdId == -1) { continue; } var actorSnoId = acd.x090_ActorSnoId; 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); } } } } _firstFreeAcd = firstFreeAcd; acds.FreeSnapshot(); } UpdateUI(itemsToAdd); } catch (Exception exception) { OnUpdateException(exception); } }