keep backpack content by tags in compound

This commit is contained in:
2020-08-20 22:18:26 +02:00
parent e0511d8971
commit 2a6e71b914
4 changed files with 67 additions and 70 deletions

View File

@ -1,5 +1,8 @@
package de.jottyfan.minecraft.quickiefabric.container;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.Inventories;
@ -9,16 +12,23 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Hand;
import net.minecraft.util.collection.DefaultedList;
/**
*
* @author jotty
*
*/
public class BackpackInventory implements Inventory {
public static final int SECTION_SIZE = 9;
private final static Logger LOGGER = LogManager.getLogger(BackpackInventory.class);
private final DefaultedList<ItemStack> stacks;
private final BackpackScreenHandler handler;
private Hand hand;
private BackpackInventory(CompoundTag tag, BackpackScreenHandler handler) {
this.handler = handler;
this.stacks = DefaultedList.ofSize(SECTION_SIZE * ItemBackpack.SLOTSIZE, ItemStack.EMPTY);
this.stacks = DefaultedList.ofSize(ItemBackpack.SLOTSIZE, ItemStack.EMPTY);
readItemsFromTag(this.stacks, tag);
}
@ -35,35 +45,6 @@ public class BackpackInventory implements Inventory {
return new BackpackInventory(stack.getTag().getCompound("backpack"), handler);
}
private void readItemsFromTag(DefaultedList<ItemStack> inventory, CompoundTag tag) {
ListTag listTag = tag.getList("items", 10);
for (int i = 0; i < listTag.size(); ++i) {
CompoundTag compoundTag = listTag.getCompound(i);
int j = compoundTag.getInt("slot");
if (j >= 0 && j < inventory.size()) {
inventory.set(j, ItemStack.fromTag(compoundTag));
}
}
}
private CompoundTag writeItemsToTag() {
DefaultedList<ItemStack> inventory = stacks;
ListTag listTag = new ListTag();
for (int i = 0; i < inventory.size(); ++i) {
ItemStack itemStack = (ItemStack) inventory.get(i);
if (!itemStack.isEmpty()) {
CompoundTag compoundTag = new CompoundTag();
compoundTag.putInt("slot", i);
itemStack.toTag(compoundTag);
listTag.add(compoundTag);
}
}
CompoundTag tag = new CompoundTag();
tag.put("items", listTag);
return tag;
}
public DefaultedList<ItemStack> getList() {
return stacks;
}
@ -110,6 +91,7 @@ public class BackpackInventory implements Inventory {
@Override
public void setStack(int slot, ItemStack stack) {
// LOGGER.info("set slot {} item stack {}x {}", slot, stack.getCount(), stack.getItem().getName());
this.stacks.set(slot, stack);
markDirty();
}
@ -121,7 +103,8 @@ public class BackpackInventory implements Inventory {
@Override
public void markDirty() {
handler.onContentChanged(this);
// LOGGER.info("dirty marked");
// handler.onContentChanged(this);
}
@Override
@ -133,13 +116,47 @@ public class BackpackInventory implements Inventory {
@Override
public void onClose(PlayerEntity player) {
Inventory.super.onClose(player);
ItemStack stack = handler.getStack();
ItemStack stack = player.getStackInHand(hand);
if (stack != null) {
if (!stack.hasTag()) {
stack.setTag(new CompoundTag());
}
stack.getTag().put("backpack", writeItemsToTag());
}
player.getStackInHand(hand).setTag(stack.getTag());
player.playSound(SoundEvents.BLOCK_WOOL_PLACE, SoundCategory.PLAYERS, 1f, 1f);
}
private void readItemsFromTag(DefaultedList<ItemStack> inventory, CompoundTag tag) {
ListTag listTag = tag.getList("items", 10);
for (int i = 0; i < listTag.size(); ++i) {
CompoundTag compoundTag = listTag.getCompound(i);
int j = compoundTag.getInt("slot");
if (j >= 0 && j < inventory.size()) {
inventory.set(j, ItemStack.fromTag(compoundTag));
}
}
}
private CompoundTag writeItemsToTag() {
DefaultedList<ItemStack> inventory = stacks;
ListTag listTag = new ListTag();
for (int i = 0; i < inventory.size(); ++i) {
ItemStack itemStack = (ItemStack) inventory.get(i);
if (!itemStack.isEmpty()) {
CompoundTag compoundTag = new CompoundTag();
compoundTag.putInt("slot", i);
compoundTag = itemStack.toTag(compoundTag);
listTag.add(compoundTag);
}
}
CompoundTag tag = new CompoundTag();
tag.put("items", listTag);
return tag;
}
public void setHand(Hand hand) {
this.hand = hand;
}
}

View File

@ -15,9 +15,12 @@ import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
@Environment(EnvType.CLIENT)
public class BackpackScreen extends HandledScreen<BackpackScreenHandler> implements ScreenHandlerProvider<BackpackScreenHandler> {
private final static Identifier TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC, "textures/gui/backpack.png");
private final static Identifier SLOT_TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC, "textures/gui/slot.png");
public class BackpackScreen extends HandledScreen<BackpackScreenHandler>
implements ScreenHandlerProvider<BackpackScreenHandler> {
private final static Identifier TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC,
"textures/gui/backpack.png");
private final static Identifier SLOT_TEXTURE = new Identifier(RegistryManager.QUICKIEFABRIC,
"textures/gui/slot.png");
private int slots;
private final Integer containerHeight = 222;
private final Integer containerWidth = 176;
@ -65,9 +68,8 @@ public class BackpackScreen extends HandledScreen<BackpackScreenHandler> impleme
}
@Override
protected void drawForeground(MatrixStack matrixStack, int i, int j)
{
this.textRenderer.draw(matrixStack, this.title, 8.0F, -20.0F, 4210752);
this.textRenderer.draw(matrixStack, this.playerInventory.getDisplayName(), 8.0F, 101f, 4210752);
}
protected void drawForeground(MatrixStack matrixStack, int i, int j) {
this.textRenderer.draw(matrixStack, this.title, 8.0F, -20.0F, 4210752);
this.textRenderer.draw(matrixStack, this.playerInventory.getDisplayName(), 8.0F, 101f, 4210752);
}
}

View File

@ -4,17 +4,17 @@ import de.jottyfan.minecraft.quickiefabric.init.RegistryManager;
import de.jottyfan.minecraft.quickiefabric.items.ItemBackpack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.Hand;
public class BackpackScreenHandler extends ScreenHandler {
private final BackpackInventory backpackInventory;
private final PlayerEntity player;
private final Hand hand;
private final ItemStack stack; // the stack of the backpack item
private int backpackSlotSize;
@ -22,6 +22,7 @@ public class BackpackScreenHandler extends ScreenHandler {
super(RegistryManager.BACKPACK_SCREEN_HANDLER, syncId);
this.player = playerInventory.player;
this.stack = buf.readItemStack();
this.hand = buf.readByte() > 0 ? Hand.MAIN_HAND : Hand.OFF_HAND;
this.backpackInventory = BackpackInventory.getInventory(this, player, stack);
backpackSlotSize = ItemBackpack.SLOTSIZE;
@ -41,20 +42,6 @@ public class BackpackScreenHandler extends ScreenHandler {
for (int x = 0; x < 9; ++x) {
this.addSlot(new Slot(playerInventory, x, 8 + x * 18, 58 + spacing));
}
playerInventory.onOpen(player);
DefaultedList<ItemStack> backpackSlots = backpackInventory.getList();
if (backpackSlots.size() == 0) {
return;
}
for (int x = 0; x < 9; x++) {
for (int y = 0; y < backpackSlotSize / 9; y++) {
this.getSlot(x + y * 9).setStack(backpackSlots.get(x + y * 9));
}
}
for (int x = 0; x < (backpackSlotSize % 9); x++) {
this.getSlot(x + (backpackSlotSize / 9) * 9).setStack(backpackSlots.get(x + (backpackSlotSize / 9) * 9));
}
}
public PlayerEntity getPlayer() {
@ -66,24 +53,13 @@ public class BackpackScreenHandler extends ScreenHandler {
return true;
}
@Override
public void onContentChanged(Inventory inv) {
super.onContentChanged(inv);
if (inv == this.backpackInventory) {
this.updateInv();
}
}
@Override
public void close(PlayerEntity player) {
super.close(player);
this.backpackInventory.setHand(hand);
this.backpackInventory.onClose(player);
}
public void updateInv() {
this.sendContentUpdates();
}
@Override
public ItemStack transferSlot(PlayerEntity player, int slotNum) {
ItemStack copy = ItemStack.EMPTY;

View File

@ -30,7 +30,7 @@ public class ItemBackpack extends Item implements DyeableItem {
public ItemBackpack() {
super(new Item.Settings().group(RegistryManager.QUICKIEFABRIC_GROUP).maxCount(1));
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
ItemStack itemStack = player.getStackInHand(hand);
@ -39,6 +39,7 @@ public class ItemBackpack extends Item implements DyeableItem {
@Override
public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) {
packetByteBuf.writeItemStack(itemStack);
packetByteBuf.writeByte(hand == Hand.MAIN_HAND ? 1 : 0);
}
@Override
@ -50,6 +51,7 @@ public class ItemBackpack extends Item implements DyeableItem {
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) {
PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
buf.writeItemStack(itemStack);
buf.writeByte(hand == Hand.MAIN_HAND ? 1 : 0);
return new BackpackScreenHandler(syncId, inv, buf);
}
});