public static Task EnqueueActionPacket(ActionPacketQueueItem queueItem, QueuePriority priority) { lock ( _actionPacketQueueLock ) { _actionPacketQueue.Enqueue(queueItem, priority); return(queueItem.WaitHandle.ToTask()); } }
public static Task EnqueueDragDropGround(int serial, int amount, int x, int y, int z, QueuePriority priority = QueuePriority.Low, bool delaySend = true) { lock ( _actionPacketQueueLock ) { byte[] dragPacket = new DragItem(serial, amount).ToArray(); byte[] dropItem = new DropItem(serial, -1, x, y, z).ToArray(); ActionPacketQueueItem dragQueueItem = new ActionPacketQueueItem(dragPacket, dragPacket.Length, delaySend); _actionPacketQueue.Enqueue(dragQueueItem, priority); ActionPacketQueueItem dropQueueItem = new ActionPacketQueueItem(dropItem, dropItem.Length, delaySend); _actionPacketQueue.Enqueue(dropQueueItem, priority); return(new[] { dragQueueItem.WaitHandle, dropQueueItem.WaitHandle }.ToTask()); } }
public static Task EnqueueActionPackets(IEnumerable <BasePacket> packets, QueuePriority priority = QueuePriority.Low, bool delaySend = true) { lock ( _actionPacketQueueLock ) { List <EventWaitHandle> handles = new List <EventWaitHandle>(); foreach (BasePacket packet in packets) { byte[] data = packet.ToArray(); ActionPacketQueueItem queueItem = new ActionPacketQueueItem(data, data.Length, delaySend); handles.Add(queueItem.WaitHandle); _actionPacketQueue.Enqueue(queueItem, priority); } return(handles.ToTask()); } }
private static void ProcessActionPacketQueue(ActionPacketQueueItem queueItem) { // Lock here so wait don't set the WaitHandle before we've called ToTask(?) lock ( _actionPacketQueueLock ) { if (queueItem.DelaySend) { while (Engine.LastActionPacket + TimeSpan.FromMilliseconds(Options.CurrentOptions.ActionDelayMS) > DateTime.Now) { Thread.Sleep(1); } } byte[] data = queueItem.Packet; int length = queueItem.Length; Engine.LastActionPacket = DateTime.Now; Engine.SendPacketToServer(data, length); queueItem.WaitHandle.Set(); } }