diff --git a/src/js/game/buildings/painter.js b/src/js/game/buildings/painter.js index 6e941403..dd042948 100644 --- a/src/js/game/buildings/painter.js +++ b/src/js/game/buildings/painter.js @@ -182,7 +182,7 @@ export class MetaPainterBuilding extends MetaBuilding { ]); entity.components.ItemEjector.setSlots([ - { pos: new Vector(1, 0), direction: enumDirection.right }, + { pos: new Vector(1, 0), direction: enumDirection.right, buffered: true }, ]); entity.components.ItemProcessor.type = enumItemProcessorTypes.painterDouble; diff --git a/src/js/game/components/item_ejector.js b/src/js/game/components/item_ejector.js index 47253b4b..b62a44ab 100644 --- a/src/js/game/components/item_ejector.js +++ b/src/js/game/components/item_ejector.js @@ -12,6 +12,7 @@ import { typeItemSingleton } from "../item_resolver"; * direction: enumDirection, * item: BaseItem, * progress: number?, + * nextItem?: BaseItem, * cachedDestSlot?: import("./item_acceptor").ItemAcceptorLocatedSlot, * cachedBeltPath?: BeltPath, * cachedTargetEntity?: Entity @@ -38,7 +39,7 @@ export class ItemEjectorComponent extends Component { /** * * @param {object} param0 - * @param {Array<{pos: Vector, direction: enumDirection }>=} param0.slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, buffered?: boolean }>=} param0.slots The slots to eject on * @param {boolean=} param0.renderFloatingItems Whether to render items even if they are not connected */ constructor({ slots = [], renderFloatingItems = true }) { @@ -49,7 +50,7 @@ export class ItemEjectorComponent extends Component { } /** - * @param {Array<{pos: Vector, direction: enumDirection }>} slots The slots to eject on + * @param {Array<{pos: Vector, direction: enumDirection, buffered?: boolean }>} slots The slots to eject on */ setSlots(slots) { /** @type {Array} */ @@ -61,6 +62,7 @@ export class ItemEjectorComponent extends Component { direction: slot.direction, item: null, progress: 0, + nextItem: slot.buffered ? null : undefined, cachedDestSlot: null, cachedTargetEntity: null, }); @@ -97,7 +99,7 @@ export class ItemEjectorComponent extends Component { */ canEjectOnSlot(slotIndex) { assert(slotIndex >= 0 && slotIndex < this.slots.length, "Invalid ejector slot: " + slotIndex); - return !this.slots[slotIndex].item; + return !this.slots[slotIndex].item || this.slots[slotIndex].nextItem === null; } /** @@ -123,6 +125,10 @@ export class ItemEjectorComponent extends Component { if (!this.canEjectOnSlot(slotIndex)) { return false; } + if (this.slots[slotIndex].item) { + this.slots[slotIndex].nextItem = item; + return true; + } this.slots[slotIndex].item = item; this.slots[slotIndex].progress = 0; return true; @@ -136,7 +142,12 @@ export class ItemEjectorComponent extends Component { takeSlotItem(slotIndex) { const slot = this.slots[slotIndex]; const item = slot.item; - slot.item = null; + if (slot.nextItem === undefined) { + slot.item = null; + } else { + slot.item = slot.nextItem; + slot.nextItem = null; + } slot.progress = 0.0; return item; } diff --git a/src/js/game/systems/item_ejector.js b/src/js/game/systems/item_ejector.js index 56535111..8139a033 100644 --- a/src/js/game/systems/item_ejector.js +++ b/src/js/game/systems/item_ejector.js @@ -182,7 +182,7 @@ export class ItemEjectorSystem extends GameSystemWithFilter { if (destPath) { // Try passing the item over if (destPath.tryAcceptItem(item)) { - sourceSlot.item = null; + sourceEjectorComp.takeSlotItem(j); } // Always stop here, since there can *either* be a belt path *or* @@ -209,7 +209,7 @@ export class ItemEjectorSystem extends GameSystemWithFilter { item ); } - sourceSlot.item = null; + sourceEjectorComp.takeSlotItem(j); continue; } }