コード例 #1
0
        public static bool WaitForProperties(object obj, int timeout)
        {
            int serial = AliasCommands.ResolveSerial(obj);

            if (serial == 0)
            {
                UOC.SystemMessage(Strings.Invalid_or_unknown_object_id);
                return(false);
            }

            PacketFilterInfo pfi = new PacketFilterInfo(0xD6,
                                                        new[] { PacketFilterConditions.IntAtPositionCondition(serial, 5) });

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            Engine.SendPacketToServer(new BatchQueryProperties(serial));

            try
            {
                bool result = we.Lock.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(we);
            }
        }
コード例 #2
0
        public static long Ping()
        {
            Random random = new Random();

            byte value = (byte)random.Next(1, byte.MaxValue);

            Stopwatch sw = new Stopwatch();

            sw.Start();

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(
                new PacketFilterInfo(0x73, new[] { new PacketFilterCondition(1, new[] { value }, 1) }),
                PacketDirection.Incoming, true);

            Engine.SendPacketToServer(new Ping(value));

            bool result = we.Lock.WaitOne(5000);

            sw.Stop();

            if (result)
            {
                return(sw.ElapsedMilliseconds);
            }

            return(-1);
        }
コード例 #3
0
ファイル: Commands.cs プロジェクト: NaphalAXT/ClassicAssist
        public static bool WaitForTarget(int timeout)
        {
            PacketFilterInfo pfi = new PacketFilterInfo(0x6C);

            Engine.WaitingForTarget = true;

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming);

            try
            {
                do
                {
                    bool result = we.Lock.WaitOne(timeout);

                    if (!result)
                    {
                        return(false);
                    }

                    if (we.Packet[6] == 0x03)
                    {
                        continue;
                    }

                    return(true);
                }while (true);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(we);

                Engine.WaitingForTarget = false;
            }
        }
コード例 #4
0
        public static bool WaitForContainerContentsUse(int serial, int timeout)
        {
            int pos = 19;

            if (Engine.ClientVersion < new Version(6, 0, 1, 7))
            {
                pos = 18;
            }

            PacketFilterInfo pfi = new PacketFilterInfo(0x3C,
                                                        new[] { PacketFilterConditions.IntAtPositionCondition(serial, pos) });

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            Engine.SendPacketToServer(new UseObject(serial));

            try
            {
                bool result = we.Lock.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(we);
            }
        }
コード例 #5
0
        public static bool WaitForTargetOrFizzle(int timeout)
        {
            PacketFilterInfo targetPfi = new PacketFilterInfo(0x6C);
            PacketFilterInfo fizzPfi   = new PacketFilterInfo(0xC0,
                                                              new[]
            {
                PacketFilterConditions.IntAtPositionCondition(Engine.Player.Serial, 2),
                PacketFilterConditions.ShortAtPositionCondition(0x3735, 10)
            });

            Engine.WaitingForTarget = true;

            PacketWaitEntry targetWe = Engine.PacketWaitEntries.Add(targetPfi, PacketDirection.Incoming);
            PacketWaitEntry fizzWe   = Engine.PacketWaitEntries.Add(fizzPfi, PacketDirection.Incoming);

            try
            {
                Task <bool> targetTask = Task.Run(() =>
                {
                    do
                    {
                        bool result = targetWe.Lock.WaitOne(timeout);

                        if (!result)
                        {
                            return(false);
                        }

                        if (targetWe.Packet[6] == 0x03)
                        {
                            continue;
                        }

                        return(true);
                    }while (true);
                });

                Task fizzTask = Task.Run(() => fizzWe.Lock.WaitOne(timeout));

                int index = Task.WaitAny(targetTask, fizzTask);

                return(index == 0 && targetTask.Result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(targetWe);
                Engine.PacketWaitEntries.Remove(fizzWe);

                Engine.WaitingForTarget = false;
            }
        }
コード例 #6
0
        public static bool WaitForPrompt(int timeout)
        {
            PacketFilterInfo pfi = new PacketFilterInfo(0xC2);

            PacketWaitEntry packetWaitEntry = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            try
            {
                bool result = packetWaitEntry.Lock.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(packetWaitEntry);
            }
        }
コード例 #7
0
        public static bool BandageSelf()
        {
            PlayerMobile player = Engine.Player;

            if (player == null)
            {
                SystemMessage(Strings.Error__No_Player);
                return(false);
            }

            Item backpack = player.Backpack;

            if (backpack == null)
            {
                SystemMessage(Strings.Error__Cannot_find_player_backpack);
                return(false);
            }

            Item bandage = backpack.Container?.SelectEntity(i => _bandageTypes.Contains(i.ID));

            if (bandage == null)
            {
                SystemMessage(Strings.Error__Cannot_find_type);
                return(false);
            }

            ObjectCommands.UseObject(bandage.Serial);

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(new PacketFilterInfo(0x6C), PacketDirection.Incoming);

            bool result = we.Lock.WaitOne(TIMEOUT);

            if (!result)
            {
                SystemMessage(Strings.Target_timeout___);
                return(false);
            }

            byte[] packet = we.Packet;

            int senderSerial = (packet[2] << 24) | (packet[3] << 16) | (packet[4] << 8) | packet[5];

            Engine.SendPacketToServer(new Target(senderSerial, player, true));

            return(true);
        }
コード例 #8
0
ファイル: Commands.cs プロジェクト: wverri/ClassicAssist
        public static bool WaitForContainerContents(int serial, int timeout)
        {
            PacketFilterInfo pfi = new PacketFilterInfo(0x3C,
                                                        new[] { PacketFilterConditions.IntAtPositionCondition(serial, 19) });

            PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            try
            {
                bool result = we.Lock.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(we);
            }
        }
コード例 #9
0
ファイル: Commands.cs プロジェクト: NaphalAXT/ClassicAssist
        public static bool WaitForIncomingPacket(PacketFilterInfo pfi, int timeout, Action beforeWait = null)
        {
            PacketWaitEntry we = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            bool result;

            beforeWait?.Invoke();

            try
            {
                result = we.Lock.WaitOne(timeout);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(we);
            }

            return(result);
        }
コード例 #10
0
ファイル: Commands.cs プロジェクト: NaphalAXT/ClassicAssist
        public static bool WaitForGump(uint gumpId, int timeout = 30000)
        {
            PacketFilterInfo pfi = new PacketFilterInfo(0xDD);

            if (gumpId != 0)
            {
                pfi = new PacketFilterInfo(0xDD,
                                           new[] { PacketFilterConditions.UIntAtPositionCondition(gumpId, 7) });
            }

            PacketWaitEntry packetWaitEntry = Engine.PacketWaitEntries.Add(pfi, PacketDirection.Incoming, true);

            try
            {
                bool result = packetWaitEntry.Lock.WaitOne(timeout);

                return(result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(packetWaitEntry);
            }
        }
コード例 #11
0
        public static (int, bool) WaitForTargetOrFizzle(int timeout)
        {
            PacketWaitEntry targetWe = CreateWaitEntry(new PacketFilterInfo(0x6C));

            PacketWaitEntry fizzWe = CreateWaitEntry(new PacketFilterInfo(0xC0,
                                                                          new[]
            {
                PacketFilterConditions.IntAtPositionCondition(Engine.Player.Serial, 2),
                PacketFilterConditions.ShortAtPositionCondition(0x3735, 10)
            }));

            PacketWaitEntry fizzMessageWe = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                                 new[] { PacketFilterConditions.IntAtPositionCondition(502632, 14) /* The spell fizzles. */ }));

            PacketWaitEntry recoveredMessageWe = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                                      new[]
            {
                PacketFilterConditions.IntAtPositionCondition(502644,
                                                              14) /* You have not yet recovered from casting a spell. */
            }));

            PacketWaitEntry alreadyCastingWe = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                                    new[]
            {
                PacketFilterConditions.IntAtPositionCondition(502642,
                                                              14) /* You are already casting a spell. */
            }));

            PacketWaitEntry alreadyCasting2We = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                                     new[]
            {
                PacketFilterConditions.IntAtPositionCondition(502645,
                                                              14) /* You are already casting a spell. */
            }));

            PacketWaitEntry concentrationWe = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                                   new[]
            {
                PacketFilterConditions.IntAtPositionCondition(500641,
                                                              14) /* Your concentration is disturbed, thus ruining thy spell. */
            }));

            PacketWaitEntry noManaWe = CreateWaitEntry(new PacketFilterInfo(0xC1,
                                                                            new[]
            {
                PacketFilterConditions.IntAtPositionCondition(502625, 14)       /* Insufficient mana etc... */
            }));

            PacketWaitEntry fizzChivWe = CreateWaitEntry(new PacketFilterInfo(0x54,
                                                                              new[]
            {
                PacketFilterConditions.ShortAtPositionCondition(0x1D6, 2),
                PacketFilterConditions.ShortAtPositionCondition(Engine.Player.X, 6),
                PacketFilterConditions.ShortAtPositionCondition(Engine.Player.Y, 8),
                PacketFilterConditions.ShortAtPositionCondition(Engine.Player.Z, 10)
            }));

            Engine.WaitingForTarget = true;

            List <Task> tasks = new List <Task>();

            try
            {
                Task <bool> targetTask = Task.Run(() =>
                {
                    do
                    {
                        bool result = targetWe.Lock.WaitOne(timeout);

                        if (!result)
                        {
                            return(false);
                        }

                        if (targetWe.Packet[6] == 0x03)
                        {
                            continue;
                        }

                        return(true);
                    }while (true);
                });

                Task fizzTask = Task.Factory.StartNew(() => fizzWe.Lock.WaitOne(timeout),
                                                      TaskCreationOptions.LongRunning);

                Task fizzMessageTask = Task.Factory.StartNew(() => fizzMessageWe.Lock.WaitOne(timeout + 100),
                                                             TaskCreationOptions.LongRunning);

                Task recoveredMessageTask =
                    Task.Factory.StartNew(() => recoveredMessageWe.Lock.WaitOne(timeout + 100),
                                          TaskCreationOptions.LongRunning);

                Task alreadyCastingTask = Task.Factory.StartNew(() => alreadyCastingWe.Lock.WaitOne(timeout + 100),
                                                                TaskCreationOptions.LongRunning);

                Task alreadyCasting2Task = Task.Factory.StartNew(() => alreadyCasting2We.Lock.WaitOne(timeout + 100),
                                                                 TaskCreationOptions.LongRunning);

                Task concentrationTask = Task.Factory.StartNew(() => concentrationWe.Lock.WaitOne(timeout + 100),
                                                               TaskCreationOptions.LongRunning);

                Task noManaTask = Task.Factory.StartNew(() => noManaWe.Lock.WaitOne(timeout + 100),
                                                        TaskCreationOptions.LongRunning);

                Task fizzChivTask = Task.Factory.StartNew(() => fizzChivWe.Lock.WaitOne(timeout + 100),
                                                          TaskCreationOptions.LongRunning);

                int index;

                tasks.AddRange(new[]
                {
                    targetTask, fizzTask, fizzMessageTask, recoveredMessageTask, alreadyCastingTask,
                    alreadyCasting2Task, concentrationTask, noManaTask, fizzChivTask
                });

                try
                {
                    index = Task.WaitAny(tasks.ToArray());
                }
                catch (OperationCanceledException)
                {
                    return(-1, false);
                }
                catch (ThreadInterruptedException)
                {
                    return(-1, false);
                }

                return(index, index == 0 && targetTask.Result);
            }
            finally
            {
                Engine.PacketWaitEntries.Remove(targetWe);
                Engine.PacketWaitEntries.Remove(fizzWe);
                Engine.PacketWaitEntries.Remove(fizzMessageWe);
                Engine.PacketWaitEntries.Remove(recoveredMessageWe);
                Engine.PacketWaitEntries.Remove(alreadyCastingWe);
                Engine.PacketWaitEntries.Remove(alreadyCasting2We);
                Engine.PacketWaitEntries.Remove(concentrationWe);
                Engine.PacketWaitEntries.Remove(noManaWe);
                Engine.PacketWaitEntries.Remove(fizzChivWe);

                Engine.WaitingForTarget = false;
            }
        }