// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ // ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ // Magicbane Emulator Project © 2013 - 2022 // www.magicbane.com package engine.net; import engine.objects.ProducedItem; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Delayed; import java.util.concurrent.TimeUnit; import static engine.net.MessageDispatcher.itemPoolSize; /** * Data class holds a message and a distribution list */ public class ItemQueue implements Delayed { private static final ConcurrentLinkedQueue itemPool = new ConcurrentLinkedQueue<>(); public ProducedItem item; public long delayTime; public ItemQueue(ProducedItem item, long delayTime) { this.item = item; this.delayTime = System.currentTimeMillis() + delayTime; } public static ItemQueue borrow(ProducedItem item, long delayTime) { ItemQueue itemQueue; itemQueue = itemPool.poll(); if (itemQueue == null) { itemQueue = new ItemQueue(item, delayTime); } else { itemQueue.item = item; itemQueue.delayTime = System.currentTimeMillis() + delayTime; itemPoolSize.decrement(); } return itemQueue; } public void reset() { this.item = null; this.delayTime = 0; } public void release() { this.reset(); itemPool.add(this); itemPoolSize.increment(); } @Override public int compareTo(Delayed another) { ItemQueue anotherTask = (ItemQueue) another; if (this.delayTime < anotherTask.delayTime) { return -1; } if (this.delayTime > anotherTask.delayTime) { return 1; } return 0; } @Override public long getDelay(TimeUnit unit) { long difference = delayTime - System.currentTimeMillis(); return unit.convert(difference, TimeUnit.MILLISECONDS); } }