use of org.spongepowered.common.bridge.world.inventory.container.TrackedContainerBridge in project SpongeCommon by SpongePowered.
the class ContainerBasedTransaction method generateEvent.
@Override
public Optional<ClickContainerEvent> generateEvent(final PhaseContext<@NonNull ?> context, @Nullable final GameTransaction<@NonNull ?> parent, final ImmutableList<GameTransaction<ClickContainerEvent>> gameTransactions, final Cause currentCause) {
final ImmutableList<ContainerBasedTransaction> containerBasedTransactions = gameTransactions.stream().filter(tx -> tx instanceof ContainerBasedTransaction).map(tx -> (ContainerBasedTransaction) tx).filter(tx -> !tx.used).collect(ImmutableList.toImmutableList());
if (containerBasedTransactions.stream().map(c -> c.isContainerEventAllowed(context)).filter(b -> !b).findAny().orElse(false)) {
SpongeCommon.logger().warn("No event will be fired for existing ContainerBasedTransactions: {}", containerBasedTransactions.size());
return Optional.empty();
}
if (!((TrackedContainerBridge) this.menu).bridge$capturePossible()) {
// if (ContainerBasedTransaction.containersFailedCapture.add(this.menu.getClass())) {
// SpongeCommon.logger()
// .warn("Changes in modded Container were not captured. Inventory events will not fire for this. Container: " + this.menu.getClass());
// }
}
final List<Entity> entities = containerBasedTransactions.stream().map(ContainerBasedTransaction::getEntitiesSpawned).flatMap(List::stream).collect(Collectors.toList());
final List<SlotTransaction> slotTransactions = containerBasedTransactions.stream().map(ContainerBasedTransaction::getSlotTransactions).flatMap(List::stream).collect(Collectors.toList());
if (this.craftingInventory != null) {
// Event with Preview transaction on crafting inventory?
Slot slot = this.craftingInventory.result();
@Nullable final SlotTransaction preview = this.findPreviewTransaction(this.craftingInventory.result(), slotTransactions);
final ItemStackSnapshot previewItem = ItemStackUtil.snapshotOf(this.craftingInventory.peek());
if (preview != null) {
slot = preview.slot();
// Check if preview transaction is correct
if (!preview.defaultReplacement().equals(previewItem)) {
slotTransactions.remove(preview);
slotTransactions.add(new SlotTransaction(slot, preview.original(), previewItem));
}
} else if (!previewItem.isEmpty()) {
slotTransactions.add(new SlotTransaction(slot, previewItem, previewItem));
}
}
for (final ContainerBasedTransaction transaction : containerBasedTransactions) {
transaction.used = true;
}
final Optional<ClickContainerEvent> event = containerBasedTransactions.stream().map(t -> t.createInventoryEvent(slotTransactions, entities, context, currentCause)).filter(Optional::isPresent).map(Optional::get).findFirst();
if (!event.isPresent() && !slotTransactions.isEmpty()) {
SpongeCommon.logger().warn("Logged slot transactions without event! {} {}", gameTransactions.size(), this.menu.getClass().getName(), new Exception(""));
for (final SlotTransaction slotTransaction : slotTransactions) {
SpongeCommon.logger().warn(slotTransaction);
}
}
return event;
}
Aggregations