use of org.spongepowered.api.event.item.inventory.container.ClickContainerEvent in project SpongeCommon by SpongePowered.
the class ClickMenuTransaction method createInventoryEvent.
@Override
Optional<ClickContainerEvent> createInventoryEvent(final List<SlotTransaction> slotTransactions, final List<Entity> entities, final PhaseContext<@NonNull ?> context, final Cause cause) {
final ItemStackSnapshot resultingCursor = ItemStackUtil.snapshotOf(this.player.inventory.getCarried());
final Transaction<ItemStackSnapshot> cursorTransaction = new Transaction<>(this.cursor, resultingCursor);
@Nullable final ClickContainerEvent event = context.createContainerEvent(cause, this.player, (Container) this.menu, cursorTransaction, slotTransactions, entities, this.buttonNum, this.slot);
return Optional.ofNullable(event);
}
use of org.spongepowered.api.event.item.inventory.container.ClickContainerEvent 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;
}
use of org.spongepowered.api.event.item.inventory.container.ClickContainerEvent in project SpongeCommon by SpongePowered.
the class PlaceRecipeTransaction method createInventoryEvent.
@Override
Optional<ClickContainerEvent> createInventoryEvent(final List<SlotTransaction> slotTransactions, final List<Entity> entities, final PhaseContext<@NonNull ?> context, final Cause cause) {
final SlotTransaction preview = this.getPreviewTransaction(this.craftingInventory.result(), slotTransactions);
final Transaction<ItemStackSnapshot> cursorTransaction = new Transaction<>(this.originalCursor, ItemStackUtil.snapshotOf(this.player.inventory.getCarried()));
ClickContainerEvent.Recipe event;
if (this.shift) {
event = SpongeEventFactory.createClickContainerEventRecipeAll(cause, (Container) this.menu, this.craftingInventory, cursorTransaction, preview, Optional.of((CraftingRecipe) this.recipe), Optional.empty(), slotTransactions);
} else {
event = SpongeEventFactory.createClickContainerEventRecipeSingle(cause, (Container) this.menu, this.craftingInventory, cursorTransaction, preview, Optional.of((CraftingRecipe) this.recipe), Optional.empty(), slotTransactions);
}
return Optional.of(event);
}
use of org.spongepowered.api.event.item.inventory.container.ClickContainerEvent in project SpongeCommon by SpongePowered.
the class SelectTradeTransaction method createInventoryEvent.
@Override
Optional<ClickContainerEvent> createInventoryEvent(final List<SlotTransaction> slotTransactions, final List<Entity> entities, final PhaseContext<@NonNull ?> context, final Cause cause) {
final ItemStackSnapshot cursorItem = ItemStackUtil.snapshotOf(this.player.inventory.getCarried());
final Transaction<ItemStackSnapshot> cursorTransaction = new Transaction<>(cursorItem, cursorItem);
if (this.menu instanceof MerchantMenu) {
final MerchantOffer offer = ((MerchantMenu) this.menu).getOffers().get(this.tradeItem);
final ClickContainerEvent.SelectTrade event = SpongeEventFactory.createClickContainerEventSelectTrade(cause, (Container) this.menu, cursorTransaction, Optional.empty(), (TradeOffer) offer, slotTransactions, this.tradeItem);
return Optional.of(event);
}
SpongeCommon.logger().warn("SelectTradeTransaction without MerchantMenu");
return Optional.empty();
}
use of org.spongepowered.api.event.item.inventory.container.ClickContainerEvent in project SpongeCommon by SpongePowered.
the class ContainerBasedTransaction method markCancelledTransactions.
@Override
public boolean markCancelledTransactions(final ClickContainerEvent event, final ImmutableList<? extends GameTransaction<ClickContainerEvent>> gameTransactions) {
if (event.isCancelled()) {
event.transactions().forEach(SlotTransaction::invalidate);
event.cursorTransaction().invalidate();
if (event instanceof CraftItemEvent.Preview) {
((CraftItemEvent.Preview) event).preview().invalidate();
}
return true;
}
boolean cancelledAny = false;
for (final SlotTransaction transaction : event.transactions()) {
if (!transaction.isValid()) {
cancelledAny = true;
for (final GameTransaction<ClickContainerEvent> gameTransaction : gameTransactions) {
((ContainerBasedTransaction) gameTransaction).getSlotTransactions().forEach(tx -> {
if (tx == transaction) {
gameTransaction.markCancelled();
}
});
}
}
}
return cancelledAny;
}
Aggregations