Esempio n. 1
0
        public new void Update()
        {
            string filterName = ActorFilter.Text;

            ActorList.BeginUpdate();
            ActorList.DataSource = null;
            List <ActorMenuItem> menuItems = new List <ActorMenuItem>();

            if (Reader.CanGetActors())
            {
                ActorResult res = Reader.GetActors();
                foreach (ActorItem item in res.CurrentPCs.Values)
                {
                    if (!ExcludeActors.Contains(item.ID))
                    {
                        if (!string.IsNullOrEmpty(filterName))
                        {
                            if (!item.Name.ToLower().Contains(filterName.ToLower()))
                            {
                                continue;
                            }
                        }
                        menuItems.Add(new ActorMenuItem {
                            name = item.Name,
                            id   = (int)item.ID,
                        });
                    }
                }
            }
            ActorList.DataSource = menuItems;
            ActorList.EndUpdate();

            ActorList.Refresh();
        }
        private void SyncWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            SyncData data = (e.Result as SyncData);

            StringBuilder debugDump = new StringBuilder();

            if (Sharlayan.MemoryHandler.Instance.IsAttached)
            {
                if (Sharlayan.Reader.CanGetActors())
                {
                    ActorResult actors = Sharlayan.Reader.GetActors();
                    foreach (KeyValuePair <uint, long> kvp in data.idTimestamp)
                    {
                        if (actors.CurrentPCs.ContainsKey(kvp.Key))
                        {
                            ActorItem item = actors.CurrentPCs[kvp.Key];
                            debugDump.AppendLine(string.Format("{0} MS {1}", item.Name, kvp.Value));
                        }
                    }
                }
            }

            onMemoryCheck.Invoke(this, false);

            //MessageBox.Show(this.Parent, debugDump.ToString());
            Console.WriteLine(debugDump.ToString());
        }
Esempio n. 3
0
        static void Main(string[] args)
        {
            FFProcess       process  = new FFProcess(FFProcess.DX11_DEFAULT_NAME, true);
            DiscordPresence presence = new DiscordPresence(DISCORD_CLIENT_ID);

            bool shutdown = false;

            new Thread(x => {
                while (!shutdown)
                {
                    if (Console.ReadKey(true).Key == ConsoleKey.Escape)
                    {
                        shutdown = true;
                        Console.WriteLine("Stopping application...");
                    }
                }
            }).Start();

            Console.WriteLine("Press ESC to stop");
            do
            {
                while (Scanner.Instance.IsScanning)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("Scanning...");
                }
                CurrentPlayer currentPlayer = Reader.GetCurrentPlayer().CurrentPlayer;
                ActorItem     player        = null /*ActorItem.CurrentUser*/;
                if (player == null)
                {
                    ActorResult aResult = Reader.GetActors();
                    KeyValuePair <uint, ActorItem> playerKeyValue = aResult.CurrentPCs.ToList().Find(x => x.Value.Name == currentPlayer.Name);
                    ActorItem playerItem = playerKeyValue.Value;

                    player = playerItem;
                }

                if (player != null)
                {
                    presence.playerName = player.Name;
                    presence.lvl        = player.Level.ToString();
                    presence.job        = player.Job.ToString();

                    uint    mapID = player.MapTerritory;
                    MapItem zone  = ZoneLookup.GetZoneInfo(mapID);
                    presence.place = zone.Name.English;

                    presence.UpdatePresence();
                }
                Thread.Sleep(5000);
            } while (!shutdown);

            presence.Deinitialize();
        }
Esempio n. 4
0
 public void Update(Dictionary <uint, ActorItemBase> actors = null)
 {
     if (actors == null)
     {
         if (Reader.CanGetActors())
         {
             ActorResult res = Reader.GetActors();
             actors = res.CurrentPCs.ToDictionary(k => k.Key, k => k.Value as ActorItemBase);
         }
     }
 }
Esempio n. 5
0
 public List <ActorItem> GetActorItems(List <uint> keys)
 {
     if (Reader.CanGetActors())
     {
         ActorResult res = Reader.GetActors();
         if (res != null && res.CurrentPCs.Count > 0)
         {
             List <ActorItem> actors = res.CurrentPCs.Where(t => keys.Contains(t.Key)).Select(t => t.Value).ToList();
             return(actors);
         }
     }
     return(new List <ActorItem>());
 }
        private async Task<IActorResult> Handler(IMessage message)
        {
            var request = message.GetPayload<RequestWeatherHighlightsMessage>();
            var totalCount = request.Cities.Count();
            var response = new ActorResult(request
                                               .Cities
                                               .Select(city => Message.Create(new RequestCityWeatherMessage
                                                                              {
                                                                                  CityName = city,
                                                                                  TotalCityCount = totalCount
                                                                              })).ToArray());

            return response;
        }
Esempio n. 7
0
        private void ScanTimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (this._isScanning)
            {
                return;
            }

            // this._scanTimer.Interval = Settings.Default.ActorWorkerTiming;

            this._isScanning = true;

            ActorResult result = this._memoryHandler.Reader.GetActors();

            EventHost.Instance.RaiseNewMonsterActorItemsEvent(this._memoryHandler, result.CurrentMonsters);
            EventHost.Instance.RaiseNewNPCActorItemsEvent(this._memoryHandler, result.CurrentNPCs);
            EventHost.Instance.RaiseNewPCActorItemsEvent(this._memoryHandler, result.CurrentPCs);

            if (result.NewMonsters.Any())
            {
                EventHost.Instance.RaiseMonsterActorItemsAddedEvent(this._memoryHandler, result.NewMonsters);
            }

            if (result.NewNPCs.Any())
            {
                EventHost.Instance.RaiseNPCActorItemsAddedEvent(this._memoryHandler, result.NewNPCs);
            }

            if (result.NewPCs.Any())
            {
                EventHost.Instance.RaisePCActorItemsAddedEvent(this._memoryHandler, result.NewPCs);
            }

            if (result.RemovedMonsters.Any())
            {
                EventHost.Instance.RaiseMonsterActorItemsRemovedEvent(this._memoryHandler, result.RemovedMonsters);
            }

            if (result.RemovedNPCs.Any())
            {
                EventHost.Instance.RaiseNPCActorItemsRemovedEvent(this._memoryHandler, result.RemovedNPCs);
            }

            if (result.RemovedPCs.Any())
            {
                EventHost.Instance.RaisePCActorItemsRemovedEvent(this._memoryHandler, result.RemovedPCs);
            }

            this._isScanning = false;
        }
Esempio n. 8
0
        private void Reset()
        {
            hasScanned = false;
            isLoggedIn = false;

            logItems.Clear();
            completeLog.Clear();
            _previousArrayIndex = 0;
            _previousOffset     = 0;

            currentPlayer = new CurrentPlayerResult();
            party         = new PartyResult();
            actors        = new ActorResult();
            performance   = new PerformanceResult();
        }
        public void UpdateMemory()
        {
            if (Sharlayan.MemoryHandler.Instance.IsAttached)
            {
                if (Sharlayan.Reader.CanGetActors() && Sharlayan.Reader.CanGetPerformance())
                {
                    List <string> performerNames = GetPerformerNames();

                    int pid = -1;
                    PerformanceResult perfs = Sharlayan.Reader.GetPerformance();
                    ActorResult       ares  = Sharlayan.Reader.GetActors();
                    if (ares != null)
                    {
                        foreach (ActorItem actor in ares.CurrentPCs.Values.ToList())
                        {
                            if (performerNames.Contains(actor.Name))
                            {
                                uint perfId = actor.PerformanceID / 2;
                                if (perfId >= 0 && perfId < 99 && perfs.Performances.ContainsKey(perfId))
                                {
                                    PerformanceItem item = perfs.Performances[perfId];

                                    BmpLocalPerformer perf = this.FindPerformer(actor.Name);
                                    if (perf != null)
                                    {
                                        perf.PerformanceUp = item.IsReady();
                                        perf.performanceId = perfId;
                                        perf.actorId       = actor.ID;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Esempio n. 10
0
        public static async Task <ActorResult> GetActors()
        {
            var result = new ActorResult();

            if (!CanGetActors() || !MemoryHandler.Instance.IsAttached)
            {
                return(result);
            }

            try {
                IntPtr targetAddress = IntPtr.Zero;

                var endianSize = MemoryHandler.Instance.ProcessModel.IsWin64
                                     ? 8
                                     : 4;

                var    sourceSize          = MemoryHandler.Instance.Structures.ActorItem.SourceSize;
                var    limit               = MemoryHandler.Instance.Structures.ActorItem.EntityCount;
                byte[] characterAddressMap = MemoryHandler.Instance.GetByteArray(Scanner.Instance.Locations[Signatures.CharacterMapKey], endianSize * limit);
                Dictionary <IntPtr, IntPtr> uniqueAddresses = new Dictionary <IntPtr, IntPtr>();
                IntPtr firstAddress = IntPtr.Zero;

                DateTime now = DateTime.Now;

                TimeSpan staleActorRemovalTime = TimeSpan.FromSeconds(0.25);

                var firstTime = true;

                for (var i = 0; i < limit; i++)
                {
                    IntPtr characterAddress;

                    if (MemoryHandler.Instance.ProcessModel.IsWin64)
                    {
                        characterAddress = new IntPtr(BitConverter.TryToInt64(characterAddressMap, i * endianSize));
                    }
                    else
                    {
                        characterAddress = new IntPtr(BitConverter.TryToInt32(characterAddressMap, i * endianSize));
                    }

                    if (characterAddress == IntPtr.Zero)
                    {
                        continue;
                    }

                    if (firstTime)
                    {
                        firstAddress = characterAddress;
                        firstTime    = false;
                    }

                    uniqueAddresses[characterAddress] = characterAddress;
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in MonsterWorkerDelegate.ActorItems)
                {
                    result.RemovedMonsters.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in NPCWorkerDelegate.ActorItems)
                {
                    result.RemovedNPCs.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in PCWorkerDelegate.ActorItems)
                {
                    result.RemovedPCs.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                foreach (KeyValuePair <IntPtr, IntPtr> kvp in uniqueAddresses)
                {
                    try {
                        var    characterAddress = new IntPtr(kvp.Value.ToInt64());
                        byte[] source           = MemoryHandler.Instance.GetByteArray(characterAddress, sourceSize);

                        // var source = MemoryHandler.Instance.GetByteArray(characterAddress, 0x3F40);
                        var ID     = BitConverter.TryToUInt32(source, MemoryHandler.Instance.Structures.ActorItem.ID);
                        var NPCID2 = BitConverter.TryToUInt32(source, MemoryHandler.Instance.Structures.ActorItem.NPCID2);
                        var Type   = (Actor.Type)source[MemoryHandler.Instance.Structures.ActorItem.Type];

                        ActorItem existing = null;
                        var       newEntry = false;

                        switch (Type)
                        {
                        case Actor.Type.Monster:
                            if (result.RemovedMonsters.ContainsKey(ID))
                            {
                                result.RemovedMonsters.TryRemove(ID, out ActorItem removedMonster);
                                existing = MonsterWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        case Actor.Type.PC:
                            if (result.RemovedPCs.ContainsKey(ID))
                            {
                                result.RemovedPCs.TryRemove(ID, out ActorItem removedPC);
                                existing = PCWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        case Actor.Type.NPC:
                        case Actor.Type.Aetheryte:
                        case Actor.Type.EventObject:
                            if (result.RemovedNPCs.ContainsKey(NPCID2))
                            {
                                result.RemovedNPCs.TryRemove(NPCID2, out ActorItem removedNPC);
                                existing = NPCWorkerDelegate.GetActorItem(NPCID2);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        default:
                            if (result.RemovedNPCs.ContainsKey(ID))
                            {
                                result.RemovedNPCs.TryRemove(ID, out ActorItem removedNPC);
                                existing = NPCWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;
                        }

                        var isFirstEntry = kvp.Value.ToInt64() == firstAddress.ToInt64();

                        ActorItem entry = await ActorItemResolver.ResolveActorFromBytes(source, isFirstEntry, existing);

                        if (entry != null && entry.IsValid)
                        {
                            if (expiringActors.ContainsKey(ID))
                            {
                                expiringActors.Remove(ID);
                            }
                        }

                        if (entry.Type == Actor.Type.EventObject)
                        {
                            var(EventObjectTypeID, EventObjectType) = GetEventObjectType(targetAddress);
                            entry.EventObjectTypeID = EventObjectTypeID;
                            entry.EventObjectType   = EventObjectType;
                        }

                        EnsureMapAndZone(entry);

                        if (isFirstEntry)
                        {
                            if (targetAddress.ToInt64() > 0)
                            {
                                byte[] targetInfoSource = MemoryHandler.Instance.GetByteArray(targetAddress, 128);
                                entry.TargetID = (int)BitConverter.TryToUInt32(targetInfoSource, MemoryHandler.Instance.Structures.ActorItem.ID);
                            }
                        }

                        // it doesn't matter what this is set to; it won't be used in code below
                        ActorItem removed;

                        if (!entry.IsValid)
                        {
                            result.NewMonsters.TryRemove(entry.ID, out removed);
                            result.NewMonsters.TryRemove(entry.NPCID2, out removed);
                            result.NewNPCs.TryRemove(entry.ID, out removed);
                            result.NewNPCs.TryRemove(entry.NPCID2, out removed);
                            result.NewPCs.TryRemove(entry.ID, out removed);
                            result.NewPCs.TryRemove(entry.NPCID2, out removed);
                            continue;
                        }

                        if (existing != null)
                        {
                            continue;
                        }

                        if (newEntry)
                        {
                            switch (entry.Type)
                            {
                            case Actor.Type.Monster:
                                MonsterWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewMonsters.TryAdd(entry.ID, entry.Clone());
                                break;

                            case Actor.Type.PC:
                                PCWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewPCs.TryAdd(entry.ID, entry.Clone());
                                break;

                            case Actor.Type.Aetheryte:
                            case Actor.Type.EventObject:
                            case Actor.Type.NPC:
                                NPCWorkerDelegate.EnsureActorItem(entry.NPCID2, entry);
                                result.NewNPCs.TryAdd(entry.NPCID2, entry.Clone());
                                break;

                            default:
                                NPCWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewNPCs.TryAdd(entry.ID, entry.Clone());
                                break;
                            }
                        }
                    }
                    catch (Exception ex) {
                        MemoryHandler.Instance.RaiseException(Logger, ex, true);
                    }
                }

                try {
                    // add the "removed" actors to the expiring list
                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedMonsters)
                    {
                        if (!expiringActors.ContainsKey(kvp.Key))
                        {
                            expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }

                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedNPCs)
                    {
                        if (!expiringActors.ContainsKey(kvp.Key))
                        {
                            expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }

                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedPCs)
                    {
                        if (!expiringActors.ContainsKey(kvp.Key))
                        {
                            expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }


                    // check expiring list for stale actors
                    foreach (var kvp in expiringActors.ToList())
                    {
                        if (now > kvp.Value)
                        {
                            // Stale actor. Remove it.
                            MonsterWorkerDelegate.RemoveActorItem(kvp.Key);
                            NPCWorkerDelegate.RemoveActorItem(kvp.Key);
                            PCWorkerDelegate.RemoveActorItem(kvp.Key);

                            expiringActors.Remove(kvp.Key);
                        }
                        else
                        {
                            // Not stale enough yet. We're not actually removing it.
                            result.RemovedMonsters.TryRemove(kvp.Key, out ActorItem _);
                            result.RemovedNPCs.TryRemove(kvp.Key, out ActorItem _);
                            result.RemovedPCs.TryRemove(kvp.Key, out ActorItem _);
                        }
                    }
                }
                catch (Exception ex) {
                    MemoryHandler.Instance.RaiseException(Logger, ex, true);
                }

                MemoryHandler.Instance.ScanCount++;
            }
            catch (Exception ex) {
                MemoryHandler.Instance.RaiseException(Logger, ex, true);
            }

            return(result);
        }
Esempio n. 11
0
        /// <summary>
        /// </summary>
        /// <param name="sender"> </param>
        /// <param name="e"> </param>
        private void ScanTimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (this._isScanning)
            {
                return;
            }

            this._isScanning = true;

            double refresh = 100;

            if (double.TryParse(Settings.Default.ActorWorkerRefresh.ToString(CultureInfo.InvariantCulture), out refresh))
            {
                this._scanTimer.Interval = refresh;
            }

            Func <bool> scanner = delegate {
                ActorResult readResult = Reader.GetActors();

                if (!this.MonsterReferencesSet && readResult.CurrentMonsters.Any())
                {
                    this.MonsterReferencesSet = true;
                    AppContextHelper.Instance.RaiseMonsterItemsUpdated(readResult.CurrentMonsters);
                }

                if (!this.NPCReferencesSet && readResult.CurrentNPCs.Any())
                {
                    this.NPCReferencesSet = true;
                    AppContextHelper.Instance.RaiseNPCItemsUpdated(readResult.CurrentNPCs);
                }

                if (!this.PCReferencesSet && readResult.CurrentPCs.Any())
                {
                    this.PCReferencesSet = true;
                    AppContextHelper.Instance.RaisePCItemsUpdated(readResult.CurrentPCs);
                }

                if (this.MonsterReferencesSet && this.NPCReferencesSet && this.PCReferencesSet)
                {
                    this.ReferencesSet = true;
                }

                if (readResult.NewMonsters.Any())
                {
                    AppContextHelper.Instance.RaiseMonsterItemsAdded(readResult.NewMonsters);
                }

                if (readResult.NewNPCs.Any())
                {
                    AppContextHelper.Instance.RaiseNPCItemsAdded(readResult.NewNPCs);
                }

                if (readResult.NewPCs.Any())
                {
                    AppContextHelper.Instance.RaisePCItemsAdded(readResult.NewPCs);
                }

                if (readResult.RemovedMonsters.Any())
                {
                    AppContextHelper.Instance.RaiseMonsterItemsRemoved(readResult.RemovedMonsters);
                }

                if (readResult.RemovedNPCs.Any())
                {
                    AppContextHelper.Instance.RaiseNPCItemsRemoved(readResult.RemovedNPCs);
                }

                if (readResult.RemovedPCs.Any())
                {
                    AppContextHelper.Instance.RaisePCItemsRemoved(readResult.RemovedPCs);
                }

                this._isScanning = false;
                return(true);
            };

            scanner.BeginInvoke(delegate { }, scanner);
        }
Esempio n. 12
0
        public bool Refresh()
        {
            if (ffxivProcess != null)
            {
                ffxivProcess.Refresh();
                if (ffxivProcess.HasExited)
                {
                    OnProcessLost?.Invoke(this, EventArgs.Empty);
                    ffxivProcess = null;
                    hasLost      = true;
                    Reset();

                    Console.WriteLine("Exited game");
                }
                if (IsScanning() && !hasScanned)
                {
                    Console.WriteLine("Scanning...");
                    while (IsScanning())
                    {
                        Thread.Sleep(100);
                    }
                    Console.WriteLine("Finished scanning");
                    OnProcessReady?.Invoke(this, ffxivProcess);
                    hasScanned = true;
                }
            }
            if ((ffxivProcess == null) && hasLost)
            {
                OnProcessSeek?.Invoke(this, EventArgs.Empty);
                hasLost = false;
                return(false);
            }


            if (Reader.CanGetCharacterId())
            {
                string id = Reader.GetCharacterId();
                if (!string.IsNullOrEmpty(id))
                {
                    if (string.IsNullOrEmpty(CharacterID) ||
                        (!string.IsNullOrEmpty(CharacterID) && !CharacterID.Equals(id)))
                    {
                        CharacterID = id;
                    }
                }
            }
            if (Reader.CanGetPlayerInfo())
            {
                CurrentPlayerResult res = Reader.GetCurrentPlayer();
                if (res.CurrentPlayer.Job != currentPlayer.CurrentPlayer.Job)
                {
                    if (currentPlayer.CurrentPlayer.Job == Sharlayan.Core.Enums.Actor.Job.Unknown)
                    {
                        // Logged in
                        OnCurrentPlayerLogin?.Invoke(this, res);
                        isLoggedIn = true;
                    }
                    else if (res.CurrentPlayer.Job == Sharlayan.Core.Enums.Actor.Job.Unknown)
                    {
                        // Logged out
                        OnCurrentPlayerLogout?.Invoke(this, currentPlayer);
                        isLoggedIn = false;
                        Reset();
                    }
                    else
                    {
                        OnCurrentPlayerJobChange?.Invoke(this, currentPlayer);
                    }
                }
                currentPlayer = res;
            }
            if (!isLoggedIn)
            {
                return(false);
            }
            if (Reader.CanGetPartyMembers())
            {
                PartyResult party2 = Reader.GetPartyMembers();
                if (party2.NewPartyMembers.Count > 0 ||
                    party2.RemovedPartyMembers.Count > 0)
                {
                    // Something changed
                    party = party2;
                    OnPartyChanged?.Invoke(this, party2);
                }
                int pcount  = party.PartyMembers.Count;
                int pcount2 = party2.PartyMembers.Count;
                if (!(party is PartyResult) || (party is PartyResult && (pcount != pcount2)))
                {
                    party = party2;
                    OnPartyChanged?.Invoke(this, party2);
                }
            }
            if (Reader.CanGetPerformance())
            {
                List <uint>       changedIds = new List <uint>();
                PerformanceResult perf       = Reader.GetPerformance();
                if (!perf.Performances.IsEmpty && !performance.Performances.IsEmpty)
                {
                    foreach (KeyValuePair <uint, PerformanceItem> pp in perf.Performances)
                    {
                        if (pp.Value.Status != performance.Performances[pp.Key].Status)
                        {
                            changedIds.Add(pp.Key);
                        }
                    }
                }

                if (changedIds.Count > 0)
                {
                    List <uint> actorIds = new List <uint>();
                    if (Reader.CanGetActors())
                    {
                        foreach (ActorItem actor in Reader.GetActors().CurrentPCs.Values)
                        {
                            if (changedIds.Contains(actor.PerformanceID / 2))
                            {
                                actorIds.Add(actor.ID);
                            }
                        }
                    }
                    if (actorIds.Count > 0)
                    {
                        OnPerformanceChanged?.Invoke(this, actorIds);
                    }
                }

                //Update
                performance = perf;

                bool r = perf.Performances[0].IsReady();
                if (r != performanceReady)
                {
                    performanceReady = r;
                    OnPerformanceReadyChanged?.Invoke(this, performanceReady);
                }
            }

            logItems.Clear();
            if (Reader.CanGetChatLog())
            {
                ChatLogResult readResult = Reader.GetChatLog(_previousArrayIndex, _previousOffset);
                _previousArrayIndex = readResult.PreviousArrayIndex;
                _previousOffset     = readResult.PreviousOffset;
                foreach (ChatLogItem item in readResult.ChatLogItems)
                {
                    logItems.Push(item);
                    completeLog.Add(item);
                    OnChatReceived?.Invoke(this, item);
                }
            }
            if (Reader.CanGetActors())
            {
                int jobsum0 = 0;
                if (actors != null)
                {
                    jobsum0 = actors.CurrentPCs.Sum(e => (int)e.Value.Job);
                }

                ActorResult actorRes = Reader.GetActors();
                if (actors != null)
                {
                    if (actorRes.CurrentPCs.Count != actors.CurrentPCs.Count)
                    {
                        actors = actorRes;
                        OnPcChanged?.Invoke(this, actorRes.CurrentPCs.ToDictionary(k => k.Key, k => k.Value as ActorItemBase));
                    }
                    int jobsum1 = actorRes.CurrentPCs.Sum(e => (int)e.Value.Job);

                    if (jobsum0 != jobsum1)
                    {
                        actors = actorRes;
                        OnPcChanged?.Invoke(this, actorRes.CurrentPCs.ToDictionary(k => k.Key, k => k.Value as ActorItemBase));
                    }
                }
                else
                {
                    actors = actorRes;
                    OnPcChanged?.Invoke(this, actorRes.CurrentPCs.ToDictionary(k => k.Key, k => k.Value as ActorItemBase));
                }
            }
            return(true);
        }
Esempio n. 13
0
        public ActorResult GetActors()
        {
            ActorResult result = new ActorResult();

            if (!this.CanGetActors() || !this._memoryHandler.IsAttached)
            {
                return(result);
            }

            IntPtr targetAddress = IntPtr.Zero;

            int limit      = this._memoryHandler.Structures.ActorItem.EntityCount;
            int sourceSize = this._memoryHandler.Structures.ActorItem.SourceSize;

            byte[] characterAddressMap = this._memoryHandler.BufferPool.Rent(8 * limit);
            byte[] sourceMap           = this._memoryHandler.BufferPool.Rent(sourceSize);
            byte[] targetInfoMap       = this._memoryHandler.BufferPool.Rent(128);

            try {
                this._memoryHandler.GetByteArray(this._memoryHandler.Scanner.Locations[Signatures.CHARMAP_KEY], characterAddressMap);

                IntPtr firstAddress = IntPtr.Zero;

                DateTime now = DateTime.Now;

                TimeSpan staleActorRemovalTime = TimeSpan.FromSeconds(0.25);

                bool firstTime = true;

                for (int i = 0; i < limit; i++)
                {
                    IntPtr characterAddress = new IntPtr(SharlayanBitConverter.TryToInt64(characterAddressMap, i * 8));

                    if (characterAddress == IntPtr.Zero)
                    {
                        continue;
                    }

                    if (firstTime)
                    {
                        firstAddress = characterAddress;
                        firstTime    = false;
                    }

                    this._uniqueCharacterAddresses[characterAddress] = characterAddress;
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in this._monsterWorkerDelegate.ActorItems)
                {
                    result.RemovedMonsters.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in this._npcWorkerDelegate.ActorItems)
                {
                    result.RemovedNPCs.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                foreach (KeyValuePair <uint, ActorItem> kvp in this._pcWorkerDelegate.ActorItems)
                {
                    result.RemovedPCs.TryAdd(kvp.Key, kvp.Value.Clone());
                }

                (uint mapID, uint mapIndex, uint mapTerritory) = this.GetMapInfo();

                foreach (KeyValuePair <IntPtr, IntPtr> kvp in this._uniqueCharacterAddresses)
                {
                    try {
                        IntPtr characterAddress = new IntPtr(kvp.Value.ToInt64());
                        this._memoryHandler.GetByteArray(characterAddress, sourceMap);

                        uint       ID     = SharlayanBitConverter.TryToUInt32(sourceMap, this._memoryHandler.Structures.ActorItem.ID);
                        uint       NPCID2 = SharlayanBitConverter.TryToUInt32(sourceMap, this._memoryHandler.Structures.ActorItem.NPCID2);
                        Actor.Type Type   = (Actor.Type)sourceMap[this._memoryHandler.Structures.ActorItem.Type];

                        ActorItem existing = null;
                        bool      newEntry = false;

                        switch (Type)
                        {
                        case Actor.Type.Monster:
                            if (result.RemovedMonsters.ContainsKey(ID))
                            {
                                result.RemovedMonsters.TryRemove(ID, out ActorItem removedMonster);
                                existing = this._monsterWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        case Actor.Type.PC:
                            if (result.RemovedPCs.ContainsKey(ID))
                            {
                                result.RemovedPCs.TryRemove(ID, out ActorItem removedPC);
                                existing = this._pcWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        case Actor.Type.NPC:
                        case Actor.Type.Aetheryte:
                        case Actor.Type.EventObject:
                            if (result.RemovedNPCs.ContainsKey(NPCID2))
                            {
                                result.RemovedNPCs.TryRemove(NPCID2, out ActorItem removedNPC);
                                existing = this._npcWorkerDelegate.GetActorItem(NPCID2);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;

                        default:
                            if (result.RemovedNPCs.ContainsKey(ID))
                            {
                                result.RemovedNPCs.TryRemove(ID, out ActorItem removedNPC);
                                existing = this._npcWorkerDelegate.GetActorItem(ID);
                            }
                            else
                            {
                                newEntry = true;
                            }

                            break;
                        }

                        bool isFirstEntry = kvp.Value.ToInt64() == firstAddress.ToInt64();

                        ActorItem entry = this._actorItemResolver.ResolveActorFromBytes(sourceMap, isFirstEntry, existing);

                        if (entry != null && entry.IsValid)
                        {
                            if (this._expiringActors.ContainsKey(ID))
                            {
                                this._expiringActors.TryRemove(ID, out DateTime removedDateTime);
                            }
                        }

                        if (entry.Type == Actor.Type.EventObject)
                        {
                            (ushort EventObjectTypeID, Actor.EventObjectType EventObjectType) = this.GetEventObjectType(targetAddress);
                            entry.EventObjectTypeID = EventObjectTypeID;
                            entry.EventObjectType   = EventObjectType;
                        }

                        entry.MapID        = mapID;
                        entry.MapIndex     = mapIndex;
                        entry.MapTerritory = mapTerritory;

                        if (isFirstEntry)
                        {
                            if (targetAddress.ToInt64() > 0)
                            {
                                this._memoryHandler.GetByteArray(targetAddress, targetInfoMap);
                                entry.TargetID = (int)SharlayanBitConverter.TryToUInt32(targetInfoMap, this._memoryHandler.Structures.ActorItem.ID);
                            }
                        }

                        if (!entry.IsValid)
                        {
                            result.NewMonsters.TryRemove(entry.ID, out ActorItem _);
                            result.NewMonsters.TryRemove(entry.NPCID2, out ActorItem _);
                            result.NewNPCs.TryRemove(entry.ID, out ActorItem _);
                            result.NewNPCs.TryRemove(entry.NPCID2, out ActorItem _);
                            result.NewPCs.TryRemove(entry.ID, out ActorItem _);
                            result.NewPCs.TryRemove(entry.NPCID2, out ActorItem _);
                            continue;
                        }

                        if (existing != null)
                        {
                            continue;
                        }

                        if (newEntry)
                        {
                            switch (entry.Type)
                            {
                            case Actor.Type.Monster:
                                this._monsterWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewMonsters.TryAdd(entry.ID, entry.Clone());
                                break;

                            case Actor.Type.PC:
                                this._pcWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewPCs.TryAdd(entry.ID, entry.Clone());
                                break;

                            case Actor.Type.Aetheryte:
                            case Actor.Type.EventObject:
                            case Actor.Type.NPC:
                                this._npcWorkerDelegate.EnsureActorItem(entry.NPCID2, entry);
                                result.NewNPCs.TryAdd(entry.NPCID2, entry.Clone());
                                break;

                            default:
                                this._npcWorkerDelegate.EnsureActorItem(entry.ID, entry);
                                result.NewNPCs.TryAdd(entry.ID, entry.Clone());
                                break;
                            }
                        }
                    }
                    catch (Exception ex) {
                        this._memoryHandler.RaiseException(Logger, ex);
                    }
                }

                try {
                    // add the "removed" actors to the expiring list
                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedMonsters)
                    {
                        if (!this._expiringActors.ContainsKey(kvp.Key))
                        {
                            this._expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }

                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedNPCs)
                    {
                        if (!this._expiringActors.ContainsKey(kvp.Key))
                        {
                            this._expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }

                    foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedPCs)
                    {
                        if (!this._expiringActors.ContainsKey(kvp.Key))
                        {
                            this._expiringActors[kvp.Key] = now + staleActorRemovalTime;
                        }
                    }

                    // check expiring list for stale actors
                    foreach (KeyValuePair <uint, DateTime> kvp in this._expiringActors)
                    {
                        if (now > kvp.Value)
                        {
                            // Stale actor. Remove it.
                            this._monsterWorkerDelegate.RemoveActorItem(kvp.Key);
                            this._npcWorkerDelegate.RemoveActorItem(kvp.Key);
                            this._pcWorkerDelegate.RemoveActorItem(kvp.Key);

                            this._expiringActors.TryRemove(kvp.Key, out DateTime removedDateTime);
                        }
                        else
                        {
                            // Not stale enough yet. We're not actually removing it.
                            result.RemovedMonsters.TryRemove(kvp.Key, out ActorItem _);
                            result.RemovedNPCs.TryRemove(kvp.Key, out ActorItem _);
                            result.RemovedPCs.TryRemove(kvp.Key, out ActorItem _);
                        }
                    }
                }
                catch (Exception ex) {
                    this._memoryHandler.RaiseException(Logger, ex);
                }

                this._memoryHandler.ScanCount++;
            }
            catch (Exception ex) {
                this._memoryHandler.RaiseException(Logger, ex);
            }
            finally {
                this._memoryHandler.BufferPool.Return(characterAddressMap);
                this._memoryHandler.BufferPool.Return(sourceMap);
                this._memoryHandler.BufferPool.Return(targetInfoMap);
            }

            result.CurrentMonsters = this._monsterWorkerDelegate.ActorItems;
            result.CurrentNPCs     = this._npcWorkerDelegate.ActorItems;
            result.CurrentPCs      = this._pcWorkerDelegate.ActorItems;

            this._uniqueCharacterAddresses.Clear();

            return(result);
        }
Esempio n. 14
0
        /// <summary>
        /// Get all npcs around the player in memory
        /// </summary>
        /// <returns></returns>
        public static List <ActorItem> GetNpcsAroundPlayer()
        {
            ActorResult readResult = Reader.GetActors();

            return(readResult.CurrentNPCs.Select(e => e.Value).ToList());
        }
Esempio n. 15
0
        // Start memory poll sync

        private void SyncWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker        worker             = (sender as BackgroundWorker);
            List <uint>             actorIds           = (e.Argument as List <uint>);
            SyncData                data               = new SyncData();
            Dictionary <uint, uint> performanceToActor = new Dictionary <uint, uint>();

            if (Sharlayan.MemoryHandler.Instance.IsAttached)
            {
                if (Sharlayan.Reader.CanGetPartyMembers() && Sharlayan.Reader.CanGetActors())
                {
                    ActorResult actors = Sharlayan.Reader.GetActors();
                    foreach (ActorItem actor in actors.CurrentPCs.Values.ToList())
                    {
                        if (actorIds.Contains(actor.ID))
                        {
                            performanceToActor[actor.PerformanceID / 2] = actor.ID;
                        }
                    }
                }
            }

            if (e.Cancel)
            {
                return;
            }

            PerformanceResult performanceCache = null;
            List <uint>       perfKeys         = performanceToActor.Keys.ToList();

            Stopwatch msCounter = Stopwatch.StartNew();
            DateTime  now       = DateTime.Now;

            while (!worker.CancellationPending)
            {
                if (e.Cancel)
                {
                    return;
                }
                if (Sharlayan.MemoryHandler.Instance.IsAttached)
                {
                    if (Sharlayan.Reader.CanGetPerformance())
                    {
                        performanceCache = Sharlayan.Reader.GetPerformance();

                        foreach (uint pid in perfKeys)
                        {
                            if (performanceToActor.ContainsKey(pid))
                            {
                                // Check it
                                if (performanceCache.Performances[pid].Animation > 0)
                                {
                                    uint aid = performanceToActor[pid];
                                    //data.idTimestamp[aid] = msCounter.ElapsedMilliseconds;
                                    data.idTimestamp[aid] = (long)((DateTime.Now - now).TotalMilliseconds);
                                    performanceToActor.Remove(pid);
                                }
                            }
                        }
                        if (perfKeys.Count != performanceToActor.Keys.Count)
                        {
                            perfKeys = performanceToActor.Keys.ToList();
                        }
                        if (performanceToActor.Keys.Count == 0)
                        {
                            break;
                        }
                    }
                }
            }

            e.Result = data;
        }