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)); } }
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()); } }