aboutsummaryrefslogtreecommitdiff
path: root/GuiTest/src/main/java/io
diff options
context:
space:
mode:
Diffstat (limited to 'GuiTest/src/main/java/io')
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java38
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java26
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java213
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java25
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/TestContainer.java30
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java8
-rw-r--r--GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java19
7 files changed, 346 insertions, 13 deletions
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java
new file mode 100644
index 0000000..ec37c55
--- /dev/null
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java
@@ -0,0 +1,38 @@
+package io.github.cottonmc.test;
+
+import net.fabricmc.fabric.api.block.FabricBlockSettings;
+import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockEntityProvider;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.util.Hand;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.hit.BlockHitResult;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.BlockView;
+import net.minecraft.world.World;
+
+public class GuiBlock extends Block implements BlockEntityProvider {
+
+ public GuiBlock() {
+ super(FabricBlockSettings.copy(Blocks.IRON_BLOCK).build());
+ }
+
+
+ @Override
+ public boolean activate(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hitResult) {
+ if (!world.isClient) {
+ ContainerProviderRegistry.INSTANCE.openContainer(new Identifier(LibGuiTest.MODID, "gui"), player, (buf)->buf.writeBlockPos(pos));
+ }
+ return true;
+ }
+
+
+ @Override
+ public BlockEntity createBlockEntity(BlockView var1) {
+ return new GuiBlockEntity();
+ }
+}
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java
new file mode 100644
index 0000000..f07ccb7
--- /dev/null
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java
@@ -0,0 +1,26 @@
+package io.github.cottonmc.test;
+
+import net.minecraft.block.entity.BlockEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.DefaultedList;
+
+public class GuiBlockEntity extends BlockEntity implements ImplementedInventory {
+
+ DefaultedList<ItemStack> items = DefaultedList.ofSize(8, ItemStack.EMPTY);
+
+ public GuiBlockEntity() {
+ super(LibGuiTest.GUI_BLOCKENTITY_TYPE);
+ }
+
+ @Override
+ public DefaultedList<ItemStack> getItems() {
+ return items;
+ }
+
+ @Override
+ public boolean canPlayerUseInv(PlayerEntity player) {
+ return pos.isWithinDistance(player.getBlockPos(), 4.5);
+ }
+
+}
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java b/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java
new file mode 100644
index 0000000..177affd
--- /dev/null
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java
@@ -0,0 +1,213 @@
+package io.github.cottonmc.test;
+
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventories;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.inventory.SidedInventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.CompoundTag;
+import net.minecraft.util.DefaultedList;
+import net.minecraft.util.math.Direction;
+
+import java.util.List;
+
+/**
+ * A simple {@code SidedInventory} implementation with only default methods + an item list getter.
+ *
+ * <h2>Reading and writing to tags</h2>
+ * Use {@link Inventories#fromTag(CompoundTag, DefaultedList)} and {@link Inventories#toTag(CompoundTag, DefaultedList)}
+ * on {@linkplain #getItems() the item list}.
+ *
+ * License: <a href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a>
+ * @author Juuz
+ */
+@FunctionalInterface
+public interface ImplementedInventory extends SidedInventory {
+ /**
+ * Gets the item list of this inventory.
+ * Must return the same instance every time it's called.
+ *
+ * @return the item list
+ */
+ DefaultedList<ItemStack> getItems();
+
+ // Creation
+
+ /**
+ * Creates an inventory from the item list.
+ *
+ * @param items the item list
+ * @return a new inventory
+ */
+ static ImplementedInventory of(DefaultedList<ItemStack> items) {
+ return () -> items;
+ }
+
+ /**
+ * Creates a new inventory with the size.
+ *
+ * @param size the inventory size
+ * @return a new inventory
+ */
+ static ImplementedInventory ofSize(int size) {
+ return of(DefaultedList.ofSize(size, ItemStack.EMPTY));
+ }
+
+ // SidedInventory
+
+ /**
+ * Gets the available slots to automation on the side.
+ *
+ * <p>The default implementation returns an array of all slots.
+ *
+ * @param side the side
+ * @return the available slots
+ */
+ @Override
+ default int[] getInvAvailableSlots(Direction side) {
+ int[] result = new int[getItems().size()];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = i;
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns true if the stack can be inserted in the slot at the side.
+ *
+ * <p>The default implementation returns true.
+ *
+ * @param slot the slot
+ * @param stack the stack
+ * @param side the side
+ * @return true if the stack can be inserted
+ */
+ @Override
+ default boolean canInsertInvStack(int slot, ItemStack stack, Direction side) {
+ return true;
+ }
+
+ /**
+ * Returns true if the stack can be extracted from the slot at the side.
+ *
+ * <p>The default implementation returns true.
+ *
+ * @param slot the slot
+ * @param stack the stack
+ * @param side the side
+ * @return true if the stack can be extracted
+ */
+ @Override
+ default boolean canExtractInvStack(int slot, ItemStack stack, Direction side) {
+ return true;
+ }
+
+ // Inventory
+
+ /**
+ * Returns the inventory size.
+ *
+ * <p>The default implementation returns the size of {@link #getItems()}.
+ *
+ * @return the inventory size
+ */
+ @Override
+ default int getInvSize() {
+ return getItems().size();
+ }
+
+ /**
+ * @return true if this inventory has only empty stacks, false otherwise
+ */
+ @Override
+ default boolean isInvEmpty() {
+ for (int i = 0; i < getInvSize(); i++) {
+ ItemStack stack = getInvStack(i);
+ if (!stack.isEmpty()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Gets the item in the slot.
+ *
+ * @param slot the slot
+ * @return the item in the slot
+ */
+ @Override
+ default ItemStack getInvStack(int slot) {
+ return getItems().get(slot);
+ }
+
+ /**
+ * Takes a stack of the size from the slot.
+ *
+ * <p>(default implementation) If there are less items in the slot than what are requested,
+ * takes all items in that slot.
+ *
+ * @param slot the slot
+ * @param count the item count
+ * @return a stack
+ */
+ @Override
+ default ItemStack takeInvStack(int slot, int count) {
+ ItemStack result = Inventories.splitStack(getItems(), slot, count);
+ if (!result.isEmpty()) {
+ markDirty();
+ }
+
+ return result;
+ }
+
+ /**
+ * Removes the current stack in the {@code slot} and returns it.
+ *
+ * <p>The default implementation uses {@link Inventories#removeStack(List, int)}
+ *
+ * @param slot the slot
+ * @return the removed stack
+ */
+ @Override
+ default ItemStack removeInvStack(int slot) {
+ return Inventories.removeStack(getItems(), slot);
+ }
+
+ /**
+ * Replaces the current stack in the {@code slot} with the provided stack.
+ *
+ * <p>If the stack is too big for this inventory ({@link Inventory#getInvMaxStackAmount()}),
+ * it gets resized to this inventory's maximum amount.
+ *
+ * @param slot the slot
+ * @param stack the stack
+ */
+ @Override
+ default void setInvStack(int slot, ItemStack stack) {
+ getItems().set(slot, stack);
+ if (stack.getCount() > getInvMaxStackAmount()) {
+ stack.setCount(getInvMaxStackAmount());
+ }
+ }
+
+ /**
+ * Clears {@linkplain #getItems() the item list}}.
+ */
+ @Override
+ default void clear() {
+ getItems().clear();
+ }
+
+ @Override
+ default void markDirty() {
+ // Override if you want behavior.
+ }
+
+ @Override
+ default boolean canPlayerUseInv(PlayerEntity player) {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java b/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java
index e2431c8..2e35a55 100644
--- a/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java
@@ -1,17 +1,38 @@
package io.github.cottonmc.test;
import net.fabricmc.api.ModInitializer;
+import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
+import net.minecraft.block.entity.BlockEntityType;
+import net.minecraft.container.BlockContext;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.item.BlockItem;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemGroup;
import net.minecraft.util.Identifier;
+import net.minecraft.util.PacketByteBuf;
import net.minecraft.util.registry.Registry;
public class LibGuiTest implements ModInitializer {
public static final String MODID = "libgui-test";
+ public static GuiBlock GUI_BLOCK;
+ public static BlockItem GUI_BLOCK_ITEM;
+ public static BlockEntityType<GuiBlockEntity> GUI_BLOCKENTITY_TYPE;
@Override
public void onInitialize() {
- //TODO: Register an item that spawns a clientside gui, and a block that spawns a serverside one
-
Registry.register(Registry.ITEM, new Identifier(MODID, "client_gui"), new GuiItem());
+
+ GUI_BLOCK = new GuiBlock();
+ Registry.register(Registry.BLOCK, new Identifier(MODID, "gui"), GUI_BLOCK);
+ GUI_BLOCK_ITEM = new BlockItem(GUI_BLOCK, new Item.Settings().group(ItemGroup.MISC));
+ Registry.register(Registry.ITEM, new Identifier(MODID, "gui"), GUI_BLOCK_ITEM);
+ GUI_BLOCKENTITY_TYPE = BlockEntityType.Builder.create(GuiBlockEntity::new, GUI_BLOCK).build(null);
+ Registry.register(Registry.BLOCK_ENTITY, new Identifier(MODID, "gui"), GUI_BLOCKENTITY_TYPE);
+
+
+ ContainerProviderRegistry.INSTANCE.registerFactory(new Identifier(MODID, "gui"), (int syncId, Identifier identifier, PlayerEntity player, PacketByteBuf buf)->{
+ return new TestContainer(syncId, player.inventory, BlockContext.create(player.getEntityWorld(), buf.readBlockPos()));
+ });
}
}
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/TestContainer.java b/GuiTest/src/main/java/io/github/cottonmc/test/TestContainer.java
new file mode 100644
index 0000000..975cd6f
--- /dev/null
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/TestContainer.java
@@ -0,0 +1,30 @@
+package io.github.cottonmc.test;
+
+import io.github.cottonmc.cotton.gui.CottonScreenController;
+import io.github.cottonmc.cotton.gui.widget.WButton;
+import io.github.cottonmc.cotton.gui.widget.WGridPanel;
+import io.github.cottonmc.cotton.gui.widget.WItemSlot;
+import io.github.cottonmc.cotton.gui.widget.WPlayerInvPanel;
+import net.minecraft.container.BlockContext;
+import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.text.LiteralText;
+
+public class TestContainer extends CottonScreenController {
+
+ public TestContainer(int syncId, PlayerInventory playerInventory, BlockContext context) {
+ super(null, syncId, playerInventory, getBlockInventory(context), null);
+
+ WGridPanel root = (WGridPanel)this.getRootPanel();
+
+ root.add(WItemSlot.of(blockInventory, 0, 4, 1), 0, 1);
+
+ WButton button = new WButton(new LiteralText("Test Button"));
+ root.add(button, 0, 3, 5, 1);
+
+
+ root.add(new WPlayerInvPanel(playerInventory), 0, 5);
+
+
+ this.getRootPanel().validate(this);
+ }
+}
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java
index 42b4b42..360fd73 100644
--- a/GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java
@@ -1,12 +1,18 @@
package io.github.cottonmc.test.client;
+import io.github.cottonmc.cotton.gui.client.CottonScreen;
+import io.github.cottonmc.test.LibGuiTest;
+import io.github.cottonmc.test.TestContainer;
import net.fabricmc.api.ClientModInitializer;
+import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry;
+import net.minecraft.container.BlockContext;
+import net.minecraft.util.Identifier;
public class LibGuiTestClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
-
+ ScreenProviderRegistry.INSTANCE.registerFactory(new Identifier(LibGuiTest.MODID, "gui"), (syncId, identifier, player, buf)->new CottonScreen<TestContainer>(new TestContainer(syncId, player.inventory, BlockContext.create(player.getEntityWorld(), buf.readBlockPos())), player));
}
}
diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java
index 73f23b4..4b914f8 100644
--- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java
+++ b/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java
@@ -13,23 +13,22 @@ import net.minecraft.text.LiteralText;
public class TestClientGui extends LightweightGuiDescription {
public TestClientGui() {
- WGridPanel root = new WGridPanel();
+ WGridPanel root = new WGridPanel(24);
this.setRootPanel(root);
+ WLabel title = new WLabel(new LiteralText("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR);
+ root.add(title, 0, 0);
+
WTextField text = new WTextField();
text.setSuggestion("Test Suggestion");
root.add(text, 0, 1, 8, 1);
+ text.setSize(8*18, 20);
ArrayList<String> data = new ArrayList<>();
- data.add("This");
- data.add("is");
- data.add("a");
- data.add("test");
- data.add("of the");
- data.add("new");
- data.add("recycler-style");
- data.add("list");
- data.add("widget");
+ for(int i=0; i<100; i++) {
+ data.add(""+i);
+ }
+
BiConsumer<String, WLabel> configurator = (String s, WLabel label) -> {
label.setText(new LiteralText(s));
};