some steps forward in menu container server client stuff

This commit is contained in:
Jörg Henke 2020-08-18 17:15:51 +02:00
parent 988a867099
commit 1303489a90
5 changed files with 70 additions and 65 deletions

View File

@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
loader_version=0.8.8+build.202 loader_version=0.8.8+build.202
# Mod Properties # Mod Properties
mod_version = 1.16.1.7 mod_version = 1.16.1.8
maven_group = de.jottyfan.minecraft maven_group = de.jottyfan.minecraft
archives_base_name = quickiefabric archives_base_name = quickiefabric

View File

@ -9,6 +9,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents; import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Hand;
import net.minecraft.util.collection.DefaultedList; import net.minecraft.util.collection.DefaultedList;
public class BackpackInventory implements Inventory { public class BackpackInventory implements Inventory {
@ -22,6 +23,19 @@ public class BackpackInventory implements Inventory {
readItemsFromTag(this.stacks, tag); readItemsFromTag(this.stacks, tag);
} }
public static BackpackInventory getInventory(BackpackScreenHandler handler, PlayerEntity player) {
ItemStack stack = player.getMainHandStack();
if (stack != null) {
if (!stack.hasTag()) {
stack.setTag(new CompoundTag());
}
if (!stack.getTag().contains("backpack")) {
stack.getTag().put("backpack", new CompoundTag());
}
}
return new BackpackInventory(stack.getTag().getCompound("backpack"), handler);
}
private void readItemsFromTag(DefaultedList<ItemStack> inventory, CompoundTag tag) { private void readItemsFromTag(DefaultedList<ItemStack> inventory, CompoundTag tag) {
ListTag listTag = tag.getList("items", 10); ListTag listTag = tag.getList("items", 10);
for (int i = 0; i < listTag.size(); ++i) { for (int i = 0; i < listTag.size(); ++i) {

View File

@ -6,6 +6,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot; import net.minecraft.screen.slot.Slot;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -18,14 +19,17 @@ public class BackpackScreenHandler extends ScreenHandler {
private int backpackSlots; private int backpackSlots;
private Hand hand; private Hand hand;
public BackpackScreenHandler(int syncId, PlayerInventory playerInventory) { public BackpackScreenHandler(int syncId, PlayerInventory playerInventory, PacketByteBuf buf) {
super(RegistryManager.BACKPACK_SCREEN_HANDLER, syncId); super(RegistryManager.BACKPACK_SCREEN_HANDLER, syncId);
this.player = playerInventory.player; this.player = playerInventory.player;
this.backpackInventory = ItemBackpack.getInventory(this, hand, player); ItemStack stack = buf.readItemStack();
this.hand = buf.readInt() == 0 ? Hand.MAIN_HAND : Hand.OFF_HAND;
this.backpackInventory = BackpackInventory.getInventory(this, player);
backpackSlots = ItemBackpack.SLOTSIZE; backpackSlots = ItemBackpack.SLOTSIZE;
int spacing = 112; int spacing = 112;
backpackInventory.onOpen(player);
for (int y = 0; y < 6; y++) { for (int y = 0; y < 6; y++) {
for (int x = 0; x < 9; ++x) { for (int x = 0; x < 9; ++x) {
this.addSlot(new Slot(backpackInventory, x + y * 9, 8 + x * 18, -10 + y * 18)); this.addSlot(new Slot(backpackInventory, x + y * 9, 8 + x * 18, -10 + y * 18));
@ -39,6 +43,20 @@ public class BackpackScreenHandler extends ScreenHandler {
for (int x = 0; x < 9; ++x) { for (int x = 0; x < 9; ++x) {
this.addSlot(new Slot(playerInventory, x, 8 + x * 18, 58 + spacing)); this.addSlot(new Slot(playerInventory, x, 8 + x * 18, 58 + spacing));
} }
playerInventory.onOpen(player);
DefaultedList<ItemStack> ad = DefaultedList.ofSize(backpackSlots, ItemStack.EMPTY);
if (ad.size() == 0) {
return;
}
for (int x = 0; x < 9; x++) {
for (int y = 0; y < backpackSlots / 9; y++) {
this.getSlot(x + y * 9).setStack(ad.get(x + y * 9));
}
}
for (int x = 0; x < (backpackSlots % 9); x++) {
this.getSlot(x + (backpackSlots / 9) * 9).setStack(ad.get(x + (backpackSlots / 9) * 9));
}
} }
public PlayerEntity getPlayer() { public PlayerEntity getPlayer() {
@ -91,24 +109,6 @@ public class BackpackScreenHandler extends ScreenHandler {
return copy; return copy;
} }
public BackpackScreenHandler withHand(Hand hand) {
this.hand = hand;
DefaultedList<ItemStack> ad = DefaultedList.ofSize(backpackSlots, ItemStack.EMPTY);
// ItemBackpack.getInventory(player.getStackInHand(this.hand), ad);
if (ad.size() == 0) {
return this;
}
for (int x = 0; x < 9; x++) {
for (int y = 0; y < backpackSlots / 9; y++) {
this.getSlot(x + y * 9).setStack(ad.get(x + y * 9));
}
}
for (int x = 0; x < (backpackSlots % 9); x++) {
this.getSlot(x + (backpackSlots / 9) * 9).setStack(ad.get(x + (backpackSlots / 9) * 9));
}
return this;
}
public Hand getHand() { public Hand getHand() {
return hand; return hand;
} }

View File

@ -49,7 +49,7 @@ public class RegistryManager {
public static final String QUICKIEFABRIC = "quickiefabric"; public static final String QUICKIEFABRIC = "quickiefabric";
public static final Identifier BACKPACK_IDENTIFIER = new Identifier(QUICKIEFABRIC, "backpack"); public static final Identifier BACKPACK_IDENTIFIER = new Identifier(QUICKIEFABRIC, "backpack");
public static final ScreenHandlerType<BackpackScreenHandler> BACKPACK_SCREEN_HANDLER = ScreenHandlerRegistry.registerSimple(RegistryManager.BACKPACK_IDENTIFIER, BackpackScreenHandler::new); public static final ScreenHandlerType<BackpackScreenHandler> BACKPACK_SCREEN_HANDLER = ScreenHandlerRegistry.registerExtended(RegistryManager.BACKPACK_IDENTIFIER, BackpackScreenHandler::new);
public static final ItemGroup QUICKIEFABRIC_GROUP = FabricItemGroupBuilder.create(new Identifier(QUICKIEFABRIC, "all")).icon(() -> new ItemStack(QuickieItems.SPEEDPOWDER)) public static final ItemGroup QUICKIEFABRIC_GROUP = FabricItemGroupBuilder.create(new Identifier(QUICKIEFABRIC, "all")).icon(() -> new ItemStack(QuickieItems.SPEEDPOWDER))
.appendItems(stacks -> { .appendItems(stacks -> {

View File

@ -1,17 +1,18 @@
package de.jottyfan.minecraft.quickiefabric.items; package de.jottyfan.minecraft.quickiefabric.items;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import de.jottyfan.minecraft.quickiefabric.container.BackpackInventory;
import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler; import de.jottyfan.minecraft.quickiefabric.container.BackpackScreenHandler;
import de.jottyfan.minecraft.quickiefabric.init.RegistryManager; import de.jottyfan.minecraft.quickiefabric.init.RegistryManager;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.DyeableItem; import net.minecraft.item.DyeableItem;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag; import net.minecraft.item.ItemUsageContext;
import net.minecraft.screen.SimpleNamedScreenHandlerFactory; import net.minecraft.network.PacketByteBuf;
import net.minecraft.screen.ScreenHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
@ -24,7 +25,6 @@ import net.minecraft.world.World;
* *
*/ */
public class ItemBackpack extends Item implements DyeableItem { public class ItemBackpack extends Item implements DyeableItem {
private final static Logger LOGGER = LogManager.getLogger(ItemBackpack.class);
public final static Integer SLOTSIZE = 54; public final static Integer SLOTSIZE = 54;
public ItemBackpack() { public ItemBackpack() {
@ -34,43 +34,34 @@ public class ItemBackpack extends Item implements DyeableItem {
@Override @Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) { public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (!world.isClient) { if (!world.isClient) {
SimpleNamedScreenHandlerFactory factory = new SimpleNamedScreenHandlerFactory( ItemStack itemStack = player.getActiveItem();
(id, inventory, buf) -> new BackpackScreenHandler(id, player.inventory).withHand(hand), player.openHandledScreen(new ExtendedScreenHandlerFactory() {
Text.method_30163(RegistryManager.BACKPACK_IDENTIFIER.toString())); @Override
player.openHandledScreen(factory); public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) {
packetByteBuf.writeItemStack(itemStack);
packetByteBuf.writeInt(hand.equals(Hand.MAIN_HAND) ? 0 : 1);
}
@Override
public Text getDisplayName() {
return Text.method_30163(RegistryManager.BACKPACK_IDENTIFIER.toString());
}
@Override
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) {
PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer());
buf.writeItemStack(itemStack);
buf.writeInt(hand.equals(Hand.MAIN_HAND) ? 0 : 1);
return new BackpackScreenHandler(syncId, inv, buf);
}
});
} }
return new TypedActionResult<ItemStack>(ActionResult.PASS, player.getStackInHand(hand)); return new TypedActionResult<ItemStack>(ActionResult.PASS, player.getStackInHand(hand));
} }
public static BackpackInventory getInventory(BackpackScreenHandler handler, Hand hand, PlayerEntity player) { @Override
ItemStack stack = player.getMainHandStack(); public ActionResult useOnBlock(ItemUsageContext context) {
if (stack != null) { // TODO implement unloading by right clicking on a chest; if left click, load as much as possible
if (!stack.hasTag()) { return super.useOnBlock(context);
stack.setTag(new CompoundTag());
} }
if (!stack.getTag().contains("backpack")) {
stack.getTag().put("backpack", new CompoundTag());
}
} else {
LOGGER.warn("player.getMainHandStack() is null");
}
return new BackpackInventory(stack.getTag().getCompound("backpack"), handler);
}
// public static void setInventory(ItemStack backpack, DefaultedList<ItemStack> list) {
// CompoundTag nbt = backpack.getOrCreateTag();
// Inventories.toTag(nbt, list);
// backpack.setTag(nbt);
// }
//
// public static void getInventory(ItemStack backpack, DefaultedList<ItemStack> defaultedList) {
// CompoundTag nbt;
// if (backpack.hasTag()) {
// nbt = backpack.getTag();
// } else {
// nbt = new CompoundTag();
// }
// Inventories.fromTag(nbt, defaultedList);
// backpack.setTag(nbt);
// }
} }