public static Task <bool> EnqueueAction <T>(T arguments, Func <T, bool> action, QueuePriority priority = QueuePriority.Low,
                                                    bool delaySend = true, CancellationToken cancellationToken = default)
        {
            lock ( _actionPacketQueueLock )
            {
                ActionQueueItem actionQueueItem =
                    new ActionQueueItem(e => !cancellationToken.IsCancellationRequested && action((T)e))
                {
                    DelaySend = delaySend, Token = cancellationToken, Arguments = arguments
                };

                _actionPacketQueue.Enqueue(actionQueueItem, priority);

                return(actionQueueItem.WaitHandle.ToTask(() => actionQueueItem.Result));
            }
        }
Beispiel #2
0
        public static Task EnqueueDragDrop(int serial, int amount, int containerSerial,
                                           QueuePriority priority = QueuePriority.Low, bool checkRange = false, bool checkExisting = false, bool delaySend = true, int x = -1,
                                           int y = -1)
        {
            lock ( _actionPacketQueueLock )
            {
                if (checkExisting && _actionPacketQueue.Contains(e => e is ActionQueueItem aqi && aqi.Serial == serial))
                {
                    return(Task.CompletedTask);
                }

                ActionQueueItem actionQueueItem = new ActionQueueItem(check =>
                {
                    if (check)
                    {
                        Item item = Engine.Items.GetItem(serial);

                        if (item == null || item.Distance >= DRAG_DROP_DISTANCE)
                        {
                            if (!MacroManager.QuietMode)
                            {
                                Commands.SystemMessage(Strings.Item_out_of_range___);
                            }

                            return(false);
                        }
                    }

                    Engine.SendPacketToServer(new DragItem(serial, amount));
                    Thread.Sleep(50);
                    Engine.SendPacketToServer(new DropItem(serial, containerSerial, x, y, 0));

                    return(true);
                })
                {
                    CheckRange = checkRange, DelaySend = delaySend, Serial = serial
                };

                _actionPacketQueue.Enqueue(actionQueueItem, priority);

                return(actionQueueItem.WaitHandle.ToTask());
            }
        }