use of org.lanternpowered.server.inventory.AbstractInventorySlot in project LanternServer by LanternPowered.
the class ClientContainer method bind.
/**
* Binds this {@link ClientContainer} to the
* given {@link LanternPlayer}.
*
* @param player The player
*/
public void bind(Player player) {
checkNotNull(player, "player");
checkState(this.player == null, "There is already a player bound");
populate();
this.player = (LanternPlayer) player;
// Add the tracker to each slot
for (AbstractInventorySlot slot : this.slotMap.keySet()) {
slot.addTracker(this);
}
}
use of org.lanternpowered.server.inventory.AbstractInventorySlot in project LanternServer by LanternPowered.
the class VanillaContainerInteractionBehavior method handleShiftClick.
@Override
public void handleShiftClick(ClientContainer clientContainer, ClientSlot clientSlot, MouseButton mouseButton) {
final LanternPlayer player = clientContainer.getPlayer();
if (player != this.container.getPlayerInventory().getCarrier().orElse(null) || !(clientSlot instanceof ClientSlot.Slot) || mouseButton == MouseButton.MIDDLE) {
return;
}
final AbstractInventorySlot slot = ((ClientSlot.Slot) clientSlot).getSlot();
final ItemStack itemStack = slot.peek().orElse(null);
final Transaction<ItemStackSnapshot> cursorTransaction;
final List<SlotTransaction> transactions = new ArrayList<>();
if (slot instanceof CraftingOutput) {
final ItemStackSnapshot cursorItem = LanternItemStack.toSnapshot(getCursorItem());
cursorTransaction = new Transaction<>(cursorItem, cursorItem);
final AbstractInventory parent = slot.parent();
if (parent instanceof CraftingInventory) {
final CraftingInventory inventory = (CraftingInventory) parent;
final Optional<ExtendedCraftingResult> optResult = Lantern.getRegistry().getCraftingRecipeRegistry().getExtendedResult(inventory.getCraftingGrid(), player.getWorld());
if (optResult.isPresent()) {
final ExtendedCraftingResult result = optResult.get();
final ItemStackSnapshot resultItem = result.getResult().getResult();
int times = result.getMaxTimes();
final ItemStack itemStack1 = resultItem.createStack();
itemStack1.setQuantity(times * itemStack1.getQuantity());
final AbstractInventory targetInventory = this.container.getPlayerInventory().getView(LanternPlayerInventory.View.REVERSE_MAIN_AND_HOTBAR);
PeekedOfferTransactionResult peekResult = targetInventory.peekOffer(itemStack1);
if (peekResult.isSuccess()) {
transactions.add(new SlotTransaction(slot, resultItem, ItemStackSnapshot.NONE));
final ItemStack rejectedItem = peekResult.getRejectedItem().orElse(null);
if (rejectedItem != null) {
final int added = itemStack1.getQuantity() - rejectedItem.getQuantity();
times = added / resultItem.getQuantity();
final int diff = added % resultItem.getQuantity();
if (diff != 0) {
itemStack1.setQuantity(resultItem.getQuantity() * times);
peekResult = targetInventory.peekOffer(itemStack1);
checkState(peekResult.isSuccess());
}
}
transactions.addAll(peekResult.getTransactions());
updateCraftingGrid(player, inventory, result.getMatrixResult(times), transactions);
}
} else {
// No actual transaction, there shouldn't have been a item in the crafting result slot
transactions.add(new SlotTransaction(slot, ItemStackSnapshot.NONE, ItemStackSnapshot.NONE));
}
} else {
Lantern.getLogger().warn("Found a CraftingOutput slot without a CraftingInventory as parent.");
return;
}
} else {
final ItemStackSnapshot cursorItem = LanternItemStack.toSnapshot(getCursorItem());
cursorTransaction = new Transaction<>(cursorItem, cursorItem);
if (itemStack != null) {
final IInventory target = this.container.getOpenInventory().getShiftClickBehavior().getTarget(this.container, slot);
final PeekedOfferTransactionResult result = target.peekOffer(itemStack.copy());
if (result.isSuccess()) {
transactions.addAll(result.getTransactions());
final ItemStack rejectedItem = result.getRejectedItem().orElse(null);
if (rejectedItem != null) {
slot.peekPoll(itemStack.getQuantity() - rejectedItem.getQuantity(), stack -> true).ifPresent(peekResult -> transactions.addAll(peekResult.getTransactions()));
} else {
slot.peekPoll(stack -> true).ifPresent(peekResult -> transactions.addAll(peekResult.getTransactions()));
}
}
}
}
final List<SlotTransaction> transactions1 = this.container.transformSlots(transactions);
final CauseStack causeStack = CauseStack.current();
final ClickInventoryEvent.Shift event;
if (mouseButton == MouseButton.LEFT) {
event = SpongeEventFactory.createClickInventoryEventShiftPrimary(causeStack.getCurrentCause(), cursorTransaction, this.container, transactions1);
} else {
event = SpongeEventFactory.createClickInventoryEventShiftSecondary(causeStack.getCurrentCause(), cursorTransaction, this.container, transactions1);
}
finishInventoryEvent(event);
}
use of org.lanternpowered.server.inventory.AbstractInventorySlot in project LanternServer by LanternPowered.
the class ClientContainer method bindBottom.
public BottomContainerPart bindBottom(BottomContainerPart bottomContainerPart) {
populate();
if (this.bottomContainerPart == null) {
this.bottomContainerPart = new BottomContainerPartImpl();
}
final ClientContainer clientContainer = bottomContainerPart.getRoot();
final int s1 = getTopSlotsCount();
final int s2 = clientContainer.getTopSlotsCount();
for (int i = 0; i < MAIN_INVENTORY_FLAGS.length; i++) {
final int index = s1 + i;
removeSlot(index);
BaseClientSlot clientSlot = clientContainer.slots[s2 + i];
if (clientSlot instanceof SlotClientSlot) {
final AbstractInventorySlot slot = ((SlotClientSlot) clientSlot).slot;
clientSlot = new SlotClientSlot(index, slot);
this.slotMap.put(slot, (SlotClientSlot) clientSlot);
if (this.player != null) {
slot.addTracker(this);
}
} else if (clientSlot instanceof IconClientSlot) {
final ItemStack itemStack = clientSlot.getItem();
clientSlot = new IconClientSlot(index);
((IconClientSlot) clientSlot).setItem(itemStack);
} else {
clientSlot = new EmptyClientSlot(index);
}
this.slots[index] = clientSlot;
}
return this.bottomContainerPart;
}
use of org.lanternpowered.server.inventory.AbstractInventorySlot in project LanternServer by LanternPowered.
the class ClientContainer method release.
/**
* Releases all the {@link AbstractInventorySlot} and
* removes the {@link LanternPlayer}.
*/
public void release() {
populate();
if (this.player == null) {
return;
}
this.player = null;
// Remove the tracker from each slot
for (AbstractInventorySlot slot : this.slotMap.keySet()) {
slot.removeTracker(this);
}
}
Aggregations