use of org.lanternpowered.server.inventory.AbstractSlot in project LanternServer by LanternPowered.
the class VanillaContainerInteractionBehavior method handlePick.
@Override
public void handlePick(ClientContainer clientContainer, @Nullable ClientSlot clientSlot) {
final LanternPlayer player = clientContainer.getPlayer();
if (player != this.container.getPlayerInventory().getCarrier().orElse(null) || !(clientSlot instanceof ClientSlot.Slot)) {
return;
}
final PlayerInventoryContainer inventoryContainer = player.getInventoryContainer();
final ClientSlot hotbarClientSlot = inventoryContainer.getClientContainer().getSelectedHotbarSlot();
if (!(hotbarClientSlot instanceof ClientSlot.Slot)) {
return;
}
final LanternHotbarInventory hotbar = player.getInventory().getHotbar();
final AbstractSlot slot = ((ClientSlot.Slot) clientSlot).getSlot();
// The slot we will swap items with
AbstractSlot hotbarSlot = hotbar.getSelectedSlot();
if (hotbarSlot.peek().isPresent()) {
final Optional<AbstractSlot> optSlot = Streams.stream(hotbar.<AbstractSlot>slots()).filter(slot1 -> !slot1.peek().isPresent()).findFirst();
if (optSlot.isPresent()) {
hotbarSlot = optSlot.get();
}
}
final ItemStack slotItem = slot.peek().orElse(null);
final ItemStack hotbarItem = hotbarSlot.peek().orElse(null);
hotbarSlot.set(slotItem);
hotbar.setSelectedSlotIndex(hotbar.getSlotIndex(hotbarSlot));
slot.set(hotbarItem);
}
use of org.lanternpowered.server.inventory.AbstractSlot in project LanternServer by LanternPowered.
the class UserStore method serializePlayerInventory.
private static List<DataView> serializePlayerInventory(AbstractUserInventory<?> inventory) {
final List<DataView> itemViews = new ArrayList<>();
final LanternMainPlayerInventory mainInventory = inventory.getMain();
final LanternPlayerEquipmentInventory equipmentInventory = inventory.getEquipment();
final AbstractSlot offHandSlot = inventory.getOffhand();
Iterable<Slot> slots = mainInventory.slots();
for (Slot slot : slots) {
serializeSlot(mainInventory, slot, 0, ItemStackStore.INSTANCE, itemViews);
}
slots = equipmentInventory.slots();
for (Slot slot : slots) {
serializeSlot(equipmentInventory, slot, 100, ItemStackStore.INSTANCE, itemViews);
}
serializeSlot(150, offHandSlot, ItemStackStore.INSTANCE, itemViews);
return itemViews;
}
use of org.lanternpowered.server.inventory.AbstractSlot in project LanternServer by LanternPowered.
the class UserStore method deserializePlayerInventory.
private static void deserializePlayerInventory(AbstractUserInventory<?> inventory, List<DataView> itemViews) {
final LanternMainPlayerInventory mainInventory = inventory.getMain();
final LanternPlayerEquipmentInventory equipmentInventory = inventory.getEquipment();
final AbstractSlot offHandSlot = inventory.getOffhand();
for (DataView itemView : itemViews) {
final int slot = itemView.getByte(SLOT).get() & 0xff;
final LanternItemStack itemStack = ItemStackStore.INSTANCE.deserialize(itemView);
if (slot >= 0 && slot < mainInventory.capacity()) {
mainInventory.set(new SlotIndex(slot), itemStack);
} else if (slot >= 100 && slot - 100 < equipmentInventory.capacity()) {
equipmentInventory.set(new SlotIndex(slot - 100), itemStack);
} else if (slot == 150) {
offHandSlot.set(itemStack);
}
}
}
use of org.lanternpowered.server.inventory.AbstractSlot in project LanternServer by LanternPowered.
the class HandlerPlayInSignBook method handle.
@Override
public void handle(NetworkContext context, MessagePlayInSignBook message) {
final LanternPlayer player = context.getSession().getPlayer();
final AbstractSlot slot = player.getInventory().getHotbar().getSelectedSlot();
ItemStack itemStack = slot.peek().orElse(null);
if (itemStack != null && itemStack.getType() == ItemTypes.WRITABLE_BOOK) {
final ItemStack itemStack1 = new LanternItemStack(ItemTypes.WRITTEN_BOOK);
itemStack.getValues().forEach(itemStack1::offer);
itemStack1.offer(Keys.BOOK_PAGES, message.getPages().stream().map(Text::of).collect(Collectors.toList()));
itemStack1.offer(Keys.BOOK_AUTHOR, Text.of(message.getAuthor()));
itemStack1.offer(Keys.DISPLAY_NAME, Text.of(message.getTitle()));
slot.set(itemStack1);
}
}
use of org.lanternpowered.server.inventory.AbstractSlot in project LanternServer by LanternPowered.
the class HandlerPlayInSwapHandItems method handle.
@Override
public void handle(NetworkContext context, MessagePlayInSwapHandItems message) {
final LanternPlayer player = context.getSession().getPlayer();
final LanternPlayerInventory inventory = player.getInventory();
final AbstractSlot hotbarSlot = inventory.getHotbar().getSelectedSlot();
final AbstractSlot offHandSlot = inventory.getOffhand();
final ItemStackSnapshot hotbarItem = hotbarSlot.peek().map(ItemStack::createSnapshot).orElse(ItemStackSnapshot.NONE);
final ItemStackSnapshot offHandItem = offHandSlot.peek().map(ItemStack::createSnapshot).orElse(ItemStackSnapshot.NONE);
final List<SlotTransaction> transactions = new ArrayList<>();
transactions.add(new SlotTransaction(hotbarSlot, hotbarItem, offHandItem));
transactions.add(new SlotTransaction(offHandSlot, offHandItem, hotbarItem));
try (CauseStack.Frame frame = CauseStack.current().pushCauseFrame()) {
frame.addContext(EventContextKeys.PLAYER, player);
frame.pushCause(player);
final ChangeInventoryEvent.SwapHand event = SpongeEventFactory.createChangeInventoryEventSwapHand(frame.getCurrentCause(), inventory, transactions);
Sponge.getEventManager().post(event);
if (!event.isCancelled()) {
transactions.stream().filter(Transaction::isValid).forEach(transaction -> transaction.getSlot().set(transaction.getFinal().createStack()));
final PlayerInventoryContainer inventoryContainer = context.getSession().getPlayer().getInventoryContainer();
inventoryContainer.getClientContainer().queueSilentSlotChange(hotbarSlot);
}
}
}
Aggregations