use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.
the class CustomContainer method quickMoveStack.
@Override
public ItemStack quickMoveStack(final Player playerIn, final int index) {
// Almost 1:1 copy of ChestContainer#transferStackInSlot
ItemStack itemstack = ItemStack.EMPTY;
final Slot slot = this.slots.get(index);
if (slot != null && slot.hasItem()) {
final ItemStack itemstack1 = slot.getItem();
itemstack = itemstack1.copy();
if (index < this.inv.getContainerSize()) {
if (!this.moveItemStackTo(itemstack1, this.inv.getContainerSize(), this.slots.size(), true)) {
return ItemStack.EMPTY;
}
} else if (!this.moveItemStackTo(itemstack1, 0, this.inv.getContainerSize(), false)) {
return ItemStack.EMPTY;
}
if (itemstack1.isEmpty()) {
slot.set(ItemStack.EMPTY);
} else {
slot.setChanged();
}
}
return itemstack;
}
use of net.minecraft.world.inventory.Slot in project SpongeCommon by SpongePowered.
the class AbstractContainerMenuMixin_Inventory method bridge$detectAndSendChanges.
@Override
public void bridge$detectAndSendChanges(final boolean captureOnly) {
// Code-Flow changed from vanilla completely!
final SpongeInventoryMenu menu = ((MenuBridge) this).bridge$getMenu();
// We first collect all differences and check if cancelled for readonly menu changes
final List<Integer> changes = new ArrayList<>();
for (int i = 0; i < this.slots.size(); ++i) {
final Slot slot = this.slots.get(i);
final ItemStack newStack = slot.getItem();
final ItemStack oldStack = this.lastSlots.get(i);
if (!ItemStack.matches(oldStack, newStack)) {
changes.add(i);
}
}
// For each change
for (final Integer i : changes) {
final Slot slot = this.slots.get(i);
final ItemStack newStack = slot.getItem();
ItemStack oldStack = this.lastSlots.get(i);
// Only call Menu Callbacks when clicking
if (this.impl$isClicking && menu != null && !menu.onChange(newStack, oldStack, (org.spongepowered.api.item.inventory.Container) this, i, slot)) {
// revert changes
this.lastSlots.set(i, oldStack.copy());
// Send reverted slots to clients
this.impl$sendSlotContents(i, oldStack);
} else {
// Capture changes for inventory events
this.impl$capture(i, newStack, oldStack);
if (captureOnly) {
continue;
}
// Perform vanilla logic - updating inventory stack - notify listeners
oldStack = newStack.isEmpty() ? ItemStack.EMPTY : newStack.copy();
this.lastSlots.set(i, oldStack);
// TODO forge checks !itemstack1.equals(itemstack, true) before doing this
for (final ContainerListener listener : this.containerListeners) {
listener.slotChanged(((AbstractContainerMenu) (Object) this), i, oldStack);
}
}
}
// like vanilla send property changes
this.impl$detectAndSendPropertyChanges();
if (this instanceof InventoryMenuBridge) {
((InventoryMenuBridge) this).bridge$markClean();
}
}
Aggregations