From 089f424d264839664d5d2e89a71e2ae9e8a46250 Mon Sep 17 00:00:00 2001 From: Juuz <6596629+Juuxel@users.noreply.github.com> Date: Sun, 14 May 2023 16:46:47 +0300 Subject: Move test mod to root project --- GuiTest/build.gradle | 67 ------- .../java/io/github/cottonmc/test/GuiBlock.java | 37 ---- .../io/github/cottonmc/test/GuiBlockEntity.java | 46 ----- .../main/java/io/github/cottonmc/test/GuiItem.java | 55 ------ .../github/cottonmc/test/ImplementedInventory.java | 213 --------------------- .../java/io/github/cottonmc/test/LibGuiTest.java | 91 --------- .../cottonmc/test/NoBlockInventoryBlock.java | 39 ---- .../cottonmc/test/ReallySimpleDescription.java | 16 -- .../io/github/cottonmc/test/TestDescription.java | 80 -------- .../github/cottonmc/test/TestItemDescription.java | 156 --------------- .../github/cottonmc/test/client/InsetsTestGui.java | 20 -- .../cottonmc/test/client/Issue182TestGui.java | 18 -- .../cottonmc/test/client/Issue196TestGui.java | 16 -- .../cottonmc/test/client/LibGuiTestClient.java | 77 -------- .../cottonmc/test/client/PaddingTestGui.java | 35 ---- .../cottonmc/test/client/ScrollingTestGui.java | 32 ---- .../io/github/cottonmc/test/client/TabTestGui.java | 26 --- .../github/cottonmc/test/client/TestClientGui.java | 156 --------------- .../cottonmc/test/client/TextFieldTestGui.java | 20 -- .../io/github/cottonmc/test/client/WHudTest.java | 25 --- .../src/main/resources/assets/libgui-test/icon.png | Bin 5016 -> 0 bytes .../main/resources/assets/libgui-test/portal.png | Bin 399 -> 0 bytes .../main/resources/assets/libgui-test/portal2.png | Bin 441 -> 0 bytes .../main/resources/assets/libgui-test/saddle.png | Bin 179 -> 0 bytes GuiTest/src/main/resources/fabric.mod.json | 29 --- build.gradle | 42 +++- gradle.properties | 1 - settings.gradle | 2 - .../java/io/github/cottonmc/test/GuiBlock.java | 37 ++++ .../io/github/cottonmc/test/GuiBlockEntity.java | 43 +++++ .../java/io/github/cottonmc/test/GuiItem.java | 55 ++++++ .../github/cottonmc/test/ImplementedInventory.java | 213 +++++++++++++++++++++ .../java/io/github/cottonmc/test/LibGuiTest.java | 91 +++++++++ .../cottonmc/test/NoBlockInventoryBlock.java | 39 ++++ .../cottonmc/test/ReallySimpleDescription.java | 16 ++ .../io/github/cottonmc/test/TestDescription.java | 80 ++++++++ .../github/cottonmc/test/TestItemDescription.java | 156 +++++++++++++++ .../github/cottonmc/test/client/InsetsTestGui.java | 20 ++ .../cottonmc/test/client/Issue182TestGui.java | 18 ++ .../cottonmc/test/client/Issue196TestGui.java | 16 ++ .../cottonmc/test/client/LibGuiTestClient.java | 77 ++++++++ .../cottonmc/test/client/PaddingTestGui.java | 35 ++++ .../cottonmc/test/client/ScrollingTestGui.java | 32 ++++ .../io/github/cottonmc/test/client/TabTestGui.java | 26 +++ .../github/cottonmc/test/client/TestClientGui.java | 156 +++++++++++++++ .../cottonmc/test/client/TextFieldTestGui.java | 20 ++ .../io/github/cottonmc/test/client/WHudTest.java | 25 +++ src/testMod/resources/assets/libgui-test/icon.png | Bin 0 -> 5016 bytes .../resources/assets/libgui-test/portal.png | Bin 0 -> 399 bytes .../resources/assets/libgui-test/portal2.png | Bin 0 -> 441 bytes .../resources/assets/libgui-test/saddle.png | Bin 0 -> 179 bytes src/testMod/resources/fabric.mod.json | 30 +++ 52 files changed, 1219 insertions(+), 1265 deletions(-) delete mode 100644 GuiTest/build.gradle delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/GuiItem.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/NoBlockInventoryBlock.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/ReallySimpleDescription.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/TestDescription.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/TestItemDescription.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/InsetsTestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/Issue182TestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/Issue196TestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/PaddingTestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/ScrollingTestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/TabTestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/TextFieldTestGui.java delete mode 100644 GuiTest/src/main/java/io/github/cottonmc/test/client/WHudTest.java delete mode 100644 GuiTest/src/main/resources/assets/libgui-test/icon.png delete mode 100644 GuiTest/src/main/resources/assets/libgui-test/portal.png delete mode 100644 GuiTest/src/main/resources/assets/libgui-test/portal2.png delete mode 100644 GuiTest/src/main/resources/assets/libgui-test/saddle.png delete mode 100644 GuiTest/src/main/resources/fabric.mod.json create mode 100644 src/testMod/java/io/github/cottonmc/test/GuiBlock.java create mode 100644 src/testMod/java/io/github/cottonmc/test/GuiBlockEntity.java create mode 100644 src/testMod/java/io/github/cottonmc/test/GuiItem.java create mode 100644 src/testMod/java/io/github/cottonmc/test/ImplementedInventory.java create mode 100644 src/testMod/java/io/github/cottonmc/test/LibGuiTest.java create mode 100644 src/testMod/java/io/github/cottonmc/test/NoBlockInventoryBlock.java create mode 100644 src/testMod/java/io/github/cottonmc/test/ReallySimpleDescription.java create mode 100644 src/testMod/java/io/github/cottonmc/test/TestDescription.java create mode 100644 src/testMod/java/io/github/cottonmc/test/TestItemDescription.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/InsetsTestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/Issue182TestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/Issue196TestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/PaddingTestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/ScrollingTestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/TabTestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/TestClientGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/TextFieldTestGui.java create mode 100644 src/testMod/java/io/github/cottonmc/test/client/WHudTest.java create mode 100644 src/testMod/resources/assets/libgui-test/icon.png create mode 100644 src/testMod/resources/assets/libgui-test/portal.png create mode 100644 src/testMod/resources/assets/libgui-test/portal2.png create mode 100644 src/testMod/resources/assets/libgui-test/saddle.png create mode 100644 src/testMod/resources/fabric.mod.json diff --git a/GuiTest/build.gradle b/GuiTest/build.gradle deleted file mode 100644 index 48a5d57..0000000 --- a/GuiTest/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id 'fabric-loom' -} - -if(rootProject.file('private.gradle').exists()) { //Publishing details - apply from: rootProject.file('private.gradle') -} - -archivesBaseName = "LibGuiTest" -version = rootProject.version -group = rootProject.group - -loom { - runConfigs.configureEach { - ideConfigGenerated = true - } -} - -repositories { - maven { url "https://server.bbkr.space/artifactory/libs-release" } - maven { - url = "https://maven.terraformersmc.com/releases" - content { - includeGroup "com.terraformersmc" - } - } -} - -dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" - modApi "net.fabricmc:fabric-loader:${rootProject.loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_version}" - - compileOnly ("com.google.code.findbugs:jsr305:3.0.2") { transitive = false } - - implementation project(path: ':', configuration: 'namedElements') - // TODO: Fix this in Loom (namedElements should expose remapped mod* dependencies) - modImplementation "io.github.cottonmc:Jankson-Fabric:${rootProject.jankson_version}" - modLocalRuntime("com.terraformersmc:modmenu:$rootProject.modmenu_version") { - exclude group: 'net.fabricmc.fabric-api' - } -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} - -tasks.withType(JavaCompile) { - // ensure that the encoding is set to UTF-8, no matter what the system default is - // this fixes some edge cases with special characters not displaying correctly - // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html - options.encoding = "UTF-8" - options.release.set 16 -} - -java { - withSourcesJar() -} - -jar { - from "LICENSE" -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java deleted file mode 100644 index 1b1666f..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlock.java +++ /dev/null @@ -1,37 +0,0 @@ -package io.github.cottonmc.test; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.block.BlockWithEntity; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class GuiBlock extends BlockWithEntity { - - public GuiBlock() { - super(FabricBlockSettings.copy(Blocks.IRON_BLOCK)); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hitResult) { - player.openHandledScreen(state.createScreenHandlerFactory(world, pos)); - return ActionResult.SUCCESS; - } - - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return new GuiBlockEntity(pos, state); - } - - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java b/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java deleted file mode 100644 index 2739d51..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/GuiBlockEntity.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.github.cottonmc.test; - -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.text.Text; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.BlockPos; - -import javax.annotation.Nullable; - -public class GuiBlockEntity extends BlockEntity implements ImplementedInventory, NamedScreenHandlerFactory { - static final int INVENTORY_SIZE = 8; - - DefaultedList items = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); - - public GuiBlockEntity(BlockPos pos, BlockState state) { - super(LibGuiTest.GUI_BLOCKENTITY_TYPE, pos, state); - } - - @Override - public DefaultedList getItems() { - return items; - } - - @Override - public boolean canPlayerUse(PlayerEntity player) { - return pos.isWithinDistance(player.getBlockPos(), 4.5); - } - - @Override - public Text getDisplayName() { - return Text.literal("test title"); - } - - @Nullable - @Override - public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { - return new TestDescription(LibGuiTest.GUI_SCREEN_HANDLER_TYPE, syncId, inv, ScreenHandlerContext.create(world, pos)); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/GuiItem.java b/GuiTest/src/main/java/io/github/cottonmc/test/GuiItem.java deleted file mode 100644 index 27c8d5f..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/GuiItem.java +++ /dev/null @@ -1,55 +0,0 @@ -package io.github.cottonmc.test; - -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.StackReference; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Rarity; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; - -public class GuiItem extends Item { - public GuiItem() { - super(new Item.Settings().rarity(Rarity.EPIC)); - } - - @Override - public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - player.openHandledScreen(createScreenHandlerFactory(player, hand)); - return new TypedActionResult<>(ActionResult.SUCCESS, player.getStackInHand(hand)); - } - - private NamedScreenHandlerFactory createScreenHandlerFactory(PlayerEntity player, Hand hand) { - EquipmentSlot slot = switch (hand) { - case MAIN_HAND -> EquipmentSlot.MAINHAND; - case OFF_HAND -> EquipmentSlot.OFFHAND; - }; - ItemStack stack = player.getStackInHand(hand); - return new ExtendedScreenHandlerFactory() { - @Override - public Text getDisplayName() { - return stack.getName(); - } - - @Override - public ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) { - return new TestItemDescription(syncId, playerInventory, StackReference.of(player, slot)); - } - - @Override - public void writeScreenOpeningData(ServerPlayerEntity player, PacketByteBuf buf) { - buf.writeEnumConstant(slot); - } - }; - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java b/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java deleted file mode 100644 index a1d3911..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/ImplementedInventory.java +++ /dev/null @@ -1,213 +0,0 @@ -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.util.collection.DefaultedList; -import net.minecraft.util.math.Direction; - -import java.util.List; - -/** - * A simple {@code SidedInventory} implementation with only default methods + an item list getter. - * - *

Reading and writing to tags

- * Use {@link Inventories#readNbt(net.minecraft.nbt.NbtCompound, DefaultedList)} and {@link Inventories#writeNbt(net.minecraft.nbt.NbtCompound, DefaultedList)} - * on {@linkplain #getItems() the item list}. - * - *

License: CC0 - * - * @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 getItems(); - - // Creation - - /** - * Creates an inventory from the item list. - * - * @param items the item list - * @return a new inventory - */ - static ImplementedInventory of(DefaultedList 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. - * - *

The default implementation returns an array of all slots. - * - * @param side the side - * @return the available slots - */ - @Override - default int[] getAvailableSlots(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. - * - *

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 canInsert(int slot, ItemStack stack, Direction side) { - return true; - } - - /** - * Returns true if the stack can be extracted from the slot at the side. - * - *

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 canExtract(int slot, ItemStack stack, Direction side) { - return true; - } - - // Inventory - - /** - * Returns the inventory size. - * - *

The default implementation returns the size of {@link #getItems()}. - * - * @return the inventory size - */ - @Override - default int size() { - return getItems().size(); - } - - /** - * @return true if this inventory has only empty stacks, false otherwise - */ - @Override - default boolean isEmpty() { - for (int i = 0; i < size(); i++) { - ItemStack stack = getStack(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 getStack(int slot) { - return getItems().get(slot); - } - - /** - * Takes a stack of the size from the slot. - * - *

(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 removeStack(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. - * - *

The default implementation uses {@link Inventories#removeStack(List, int)} - * - * @param slot the slot - * @return the removed stack - */ - @Override - default ItemStack removeStack(int slot) { - return Inventories.removeStack(getItems(), slot); - } - - /** - * Replaces the current stack in the {@code slot} with the provided stack. - * - *

If the stack is too big for this inventory ({@link Inventory#getMaxCountPerStack()} ()}), - * it gets resized to this inventory's maximum amount. - * - * @param slot the slot - * @param stack the stack - */ - @Override - default void setStack(int slot, ItemStack stack) { - getItems().set(slot, stack); - if (stack.getCount() > getMaxCountPerStack()) { - stack.setCount(getMaxCountPerStack()); - } - } - - /** - * Clears {@linkplain #getItems() the item list}}. - */ - @Override - default void clear() { - getItems().clear(); - } - - @Override - default void markDirty() { - // Override if you want behavior. - } - - @Override - default boolean canPlayerUse(PlayerEntity player) { - return true; - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java b/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java deleted file mode 100644 index 1d48daa..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/LibGuiTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package io.github.cottonmc.test; - -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; -import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.ModContainer; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.StackReference; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.resource.featuretoggle.FeatureFlags; -import net.minecraft.resource.featuretoggle.FeatureSet; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.util.Identifier; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Optional; - -public class LibGuiTest implements ModInitializer { - public static final String MODID = "libgui-test"; - - public static GuiBlock GUI_BLOCK; - public static Block NO_BLOCK_INVENTORY_BLOCK; - public static BlockItem GUI_BLOCK_ITEM; - public static BlockEntityType GUI_BLOCKENTITY_TYPE; - public static ScreenHandlerType GUI_SCREEN_HANDLER_TYPE; - public static ScreenHandlerType ITEM_SCREEN_HANDLER_TYPE; - public static ScreenHandlerType REALLY_SIMPLE_SCREEN_HANDLER_TYPE; - - @Override - public void onInitialize() { - Registry.register(Registries.ITEM, new Identifier(MODID, "client_gui"), new GuiItem()); - - GUI_BLOCK = new GuiBlock(); - Registry.register(Registries.BLOCK, new Identifier(MODID, "gui"), GUI_BLOCK); - GUI_BLOCK_ITEM = new BlockItem(GUI_BLOCK, new Item.Settings()); - Registry.register(Registries.ITEM, new Identifier(MODID, "gui"), GUI_BLOCK_ITEM); - NO_BLOCK_INVENTORY_BLOCK = new NoBlockInventoryBlock(AbstractBlock.Settings.copy(Blocks.STONE)); - Registry.register(Registries.BLOCK, new Identifier(MODID, "no_block_inventory"), NO_BLOCK_INVENTORY_BLOCK); - Registry.register(Registries.ITEM, new Identifier(MODID, "no_block_inventory"), new BlockItem(NO_BLOCK_INVENTORY_BLOCK, new Item.Settings())); - GUI_BLOCKENTITY_TYPE = FabricBlockEntityTypeBuilder.create(GuiBlockEntity::new, GUI_BLOCK).build(null); - Registry.register(Registries.BLOCK_ENTITY_TYPE, new Identifier(MODID, "gui"), GUI_BLOCKENTITY_TYPE); - - GUI_SCREEN_HANDLER_TYPE = new ScreenHandlerType<>((int syncId, PlayerInventory inventory) -> { - return new TestDescription(GUI_SCREEN_HANDLER_TYPE, syncId, inventory, ScreenHandlerContext.EMPTY); - }, FeatureSet.of(FeatureFlags.VANILLA)); - Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "gui"), GUI_SCREEN_HANDLER_TYPE); - ITEM_SCREEN_HANDLER_TYPE = new ExtendedScreenHandlerType<>((syncId, inventory, buf) -> { - var equipmentSlot = buf.readEnumConstant(EquipmentSlot.class); - StackReference handStack = StackReference.of(inventory.player, equipmentSlot); - return new TestItemDescription(syncId, inventory, handStack); - }); - Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "item_gui"), ITEM_SCREEN_HANDLER_TYPE); - - REALLY_SIMPLE_SCREEN_HANDLER_TYPE = new ScreenHandlerType<>(ReallySimpleDescription::new, FeatureSet.of(FeatureFlags.VANILLA)); - Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "really_simple"), REALLY_SIMPLE_SCREEN_HANDLER_TYPE); - - Optional containerOpt = FabricLoader.getInstance().getModContainer("jankson"); - if (containerOpt.isPresent()) { - ModContainer jankson = containerOpt.get(); - System.out.println("Jankson root path: "+jankson.getRootPath()); - try { - Files.list(jankson.getRootPath()).forEach((path)->{ - path.getFileSystem().getFileStores().forEach((store)->{ - System.out.println(" Filestore: "+store.name()); - }); - System.out.println(" "+path.toAbsolutePath()); - }); - } catch (IOException e) { - e.printStackTrace(); - } - Path modJson = jankson.getPath("/fabric.mod.json"); - System.out.println("Jankson fabric.mod.json path: "+modJson); - System.out.println(Files.exists(modJson) ? "Exists" : "Does Not Exist"); - } else { - System.out.println("Container isn't present!"); - } - } - -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/NoBlockInventoryBlock.java b/GuiTest/src/main/java/io/github/cottonmc/test/NoBlockInventoryBlock.java deleted file mode 100644 index 2b784a6..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/NoBlockInventoryBlock.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.github.cottonmc.test; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.NamedScreenHandlerFactory; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import org.jetbrains.annotations.Nullable; - -public class NoBlockInventoryBlock extends Block implements NamedScreenHandlerFactory { - public NoBlockInventoryBlock(Settings settings) { - super(settings); - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - player.openHandledScreen(this); - return world.isClient ? ActionResult.SUCCESS : ActionResult.CONSUME; - } - - @Override - public Text getDisplayName() { - return getName(); - } - - @Nullable - @Override - public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { - return new ReallySimpleDescription(syncId, inv); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/ReallySimpleDescription.java b/GuiTest/src/main/java/io/github/cottonmc/test/ReallySimpleDescription.java deleted file mode 100644 index bcb9213..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/ReallySimpleDescription.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.cottonmc.test; - -import net.minecraft.entity.player.PlayerInventory; - -import io.github.cottonmc.cotton.gui.SyncedGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; - -// A really simple GUI description that only contains a player inventory panel. -public class ReallySimpleDescription extends SyncedGuiDescription { - public ReallySimpleDescription(int syncId, PlayerInventory playerInventory) { - super(LibGuiTest.REALLY_SIMPLE_SCREEN_HANDLER_TYPE, syncId, playerInventory); - setTitleVisible(false); - ((WGridPanel) getRootPanel()).add(createPlayerInventoryPanel(), 0, 0); - getRootPanel().validate(this); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/TestDescription.java b/GuiTest/src/main/java/io/github/cottonmc/test/TestDescription.java deleted file mode 100644 index 39b09d6..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/TestDescription.java +++ /dev/null @@ -1,80 +0,0 @@ -package io.github.cottonmc.test; - -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.Items; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import io.github.cottonmc.cotton.gui.SyncedGuiDescription; -import io.github.cottonmc.cotton.gui.networking.NetworkSide; -import io.github.cottonmc.cotton.gui.networking.ScreenNetworking; -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.WLabel; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.data.Texture; -import io.github.cottonmc.cotton.gui.widget.icon.TextureIcon; - -public class TestDescription extends SyncedGuiDescription { - private static final Identifier TEST_MESSAGE = new Identifier("libgui", "test"); - private static final Identifier UNREGISTERED_ON_SERVER = new Identifier("libgui", "unregistered_on_server"); - - public TestDescription(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { - super(type, syncId, playerInventory, getBlockInventory(context, GuiBlockEntity.INVENTORY_SIZE), null); - - WGridPanel root = (WGridPanel)this.getRootPanel(); - - WItemSlot slot = WItemSlot.of(blockInventory, 0, 4, 1); - root.add(slot, 0, 1); - - WButton buttonA = new WButton(Text.literal("Send Message")); - - buttonA.setOnClick(() -> { - ScreenNetworking.of(this, NetworkSide.CLIENT).send(TEST_MESSAGE, buf -> {}); - ScreenNetworking.of(this, NetworkSide.CLIENT).send(UNREGISTERED_ON_SERVER, buf -> {}); - }); - - root.add(buttonA, 0, 3, 4, 1); - - WButton buttonB = new WButton(Text.literal("Show Warnings")); - buttonB.setOnClick(() -> slot.setIcon(new TextureIcon(new Identifier("libgui-test", "saddle.png")))); - - root.add(buttonB, 5, 3, 4, 1); - TextureIcon testIcon = new TextureIcon(new Texture(new Identifier("libgui-test", "icon.png"))); - root.add(new WButton(testIcon, Text.literal("Button C")), 0, 5, 4, 1); - root.add(new WButton(Text.literal("Button D")), 5, 5, 4, 1); - root.add(new WTextField(Text.literal("Type something...")).setMaxLength(64), 0, 7, 5, 1); - - root.add(new WLabel(Text.literal("Large slot:")), 0, 9); - root.add(WItemSlot.outputOf(blockInventory, 0), 4, 9); - - root.add(WItemSlot.of(blockInventory, 7).setIcon(new TextureIcon(new Identifier("libgui-test", "saddle.png"))), 7, 9); - - root.add(createPlayerInventoryPanel(), 0, 11); - System.out.println(root.toString()); - - this.getRootPanel().validate(this); - - getRootPanel().streamChildren() - .forEach(child -> { - if (child instanceof WItemSlot wis) { - // Prevent apples from entering the item slots - wis.setFilter(stack -> !stack.isOf(Items.APPLE)); - } - }); - - ScreenNetworking.of(this, NetworkSide.SERVER).receive(TEST_MESSAGE, buf -> { - System.out.println("Received on the server!"); - }); - - try { - slot.onHidden(); - slot.onShown(); - } catch (Throwable t) { - throw new AssertionError("ValidatedSlot.setVisible crashed", t); - } - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/TestItemDescription.java b/GuiTest/src/main/java/io/github/cottonmc/test/TestItemDescription.java deleted file mode 100644 index 4c9c1f0..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/TestItemDescription.java +++ /dev/null @@ -1,156 +0,0 @@ -package io.github.cottonmc.test; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.StackReference; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import io.github.cottonmc.cotton.gui.ItemSyncedGuiDescription; -import io.github.cottonmc.cotton.gui.client.ScreenDrawing; -import io.github.cottonmc.cotton.gui.widget.TooltipBuilder; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.WSlider; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.WTiledSprite; -import io.github.cottonmc.cotton.gui.widget.WWidget; -import io.github.cottonmc.cotton.gui.widget.data.Axis; -import io.github.cottonmc.cotton.gui.widget.data.Color; -import io.github.cottonmc.cotton.gui.widget.data.Insets; - -public class TestItemDescription extends ItemSyncedGuiDescription { - private int r = 0; - private int g = 0; - private int b = 0; - - public TestItemDescription(int syncId, PlayerInventory playerInventory, StackReference owner) { - super(LibGuiTest.ITEM_SCREEN_HANDLER_TYPE, syncId, playerInventory, owner); - WGridPanel root = new WGridPanel(22); - root.setInsets(Insets.ROOT_PANEL); - this.setRootPanel(root); - WLabel title = new WLabel(Text.literal("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR) { - @Environment(EnvType.CLIENT) - @Override - public void addTooltip(TooltipBuilder tooltip) { - tooltip.add(Text.literal("Radical!")); - } - }; - WTiledSprite wood = new WTiledSprite( - 8, 8, // tile width and height - 500, // animation speed - new Identifier("minecraft:textures/block/birch_planks.png"), - new Identifier("minecraft:textures/block/dark_oak_planks.png"), - new Identifier("minecraft:textures/block/jungle_planks.png") - ); - root.add(wood, 3, 3, 2, 2); - root.add(title, 0, 0); - - WTextField text = new WTextField(); - text.setSuggestion(Text.literal("Search")); - root.add(text, 0, 1, 8, 1); - text.setSize(7*18, 20); - /* - ArrayList data = new ArrayList<>(); - data.add("Wolfram Alpha"); - data.add("Strange Home"); - data.add("Nether Base"); - data.add("Death"); - data.add("Cake"); - data.add("Mushroom Island"); - data.add("A List Item"); - data.add("Notes"); - data.add("Slime Island"); - - BiConsumer configurator = (String s, PortalDestination destination) -> { - destination.label.setText(new LiteralText(s)); - - int hash = s.hashCode(); - Identifier sprite = ((hash & 0x01) == 0) ? PORTAL1 : PORTAL2; - destination.sprite.setImage(sprite); - - int cost = (hash >> 1) & 0x2FF; - destination.cost.setText(new LiteralText(""+cost+" XP")); - }; - WListPanel list = new WListPanel(data, PortalDestination.class, PortalDestination::new, configurator); - list.setListItemHeight(2*18); - list.setBackgroundPainter(PANEL); - root.add(list, 0, 2, 7, 6); - - root.add(new WButton(new LiteralText("Teleport")), 3,8,4,1);*/ - WColorBox col = new WColorBox(); - root.add(col, 3,2,1,3); - - WSlider r = new WSlider(0, 100, Axis.VERTICAL); - root.add(r, 0, 2, 1, 3); - r.setValueChangeListener((i)->{ - this.r = i; - updateCol(col); - System.out.println("h: "+this.r+" s: "+this.g+ " l: "+this.b); - System.out.println("col is now "+Integer.toHexString(col.color)); - }); - WSlider g = new WSlider(0, 100, Axis.VERTICAL); - root.add(g, 1, 2, 1, 3); - g.setValueChangeListener((i)->{ - this.g = i; - updateCol(col); - }); - WSlider b = new WSlider(0, 100, Axis.VERTICAL); - root.add(b, 2, 2, 1, 3); - b.setValueChangeListener((i)->{ - this.b = i; - updateCol(col); - }); - - root.validate(this); - } - /* - public static class PortalDestination extends WPlainPanel { - WSprite sprite; - WLabel label; - WLabel cost; - - public PortalDestination() { - sprite = new WSprite(new Identifier("libgui-test:portal")); - this.add(sprite, 2, 2, 18, 18); - label = new WLabel("Foo"); - this.add(label, 18+ 4, 2, 5*18, 18); - cost = new WLabel("1000 Xp"); - this.add(cost, 2, 20, 6*18, 18); - - this.setSize(7*18, 2*18); - - this.setBackgroundPainter(PANEL); //Would fail on a serverside gui - } - }*/ - - private void updateCol(WColorBox col) { - Color.HSL hsl = new Color.HSL(r/100f, g/100f, b/100f); - col.setColor(hsl.toRgb()); - } - - public static class WColorBox extends WWidget { - protected int color = 0xFF_FFFFFF; - public WColorBox() {} - - public WColorBox(int col) { - this.color = col; - } - - @Override - public boolean canResize() { - return true; - } - - public void setColor(int col) { - this.color = col; - } - - @Override - public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { - ScreenDrawing.coloredRect(matrices, x, y, this.getWidth(), this.getHeight(), color); - } - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/InsetsTestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/InsetsTestGui.java deleted file mode 100644 index f89de7a..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/InsetsTestGui.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WButton; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.data.Insets; - -public class InsetsTestGui extends LightweightGuiDescription { - public InsetsTestGui() { - WGridPanel root = (WGridPanel) rootPanel; - - root.add(new WLabel(Text.literal("Insets demo")), 0, 0); - root.add(new WButton(Text.literal("Default")).setOnClick(() -> root.setInsets(Insets.ROOT_PANEL)), 0, 1, 2, 1); - root.add(new WButton(Text.literal("None")).setOnClick(() -> root.setInsets(Insets.NONE)), 2, 1, 2, 1); - root.add(new WButton(Text.literal("Large")).setOnClick(() -> root.setInsets(new Insets(16))), 4, 1, 2, 1); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue182TestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue182TestGui.java deleted file mode 100644 index 5d4a739..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue182TestGui.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.github.cottonmc.test.client; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WBox; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.data.Axis; - -// Used for testing issue #182 (https://github.com/CottonMC/LibGui/issues/182): -// Highlighting/selecting text in the top field makes the bottom one blue. -public final class Issue182TestGui extends LightweightGuiDescription { - public Issue182TestGui() { - WBox root = new WBox(Axis.VERTICAL); - root.add(new WTextField(), 100, 20); - root.add(new WTextField(), 100, 20); - setRootPanel(root); - root.validate(this); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue196TestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue196TestGui.java deleted file mode 100644 index 6de8181..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/Issue196TestGui.java +++ /dev/null @@ -1,16 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WTextField; - -public final class Issue196TestGui extends LightweightGuiDescription { - public Issue196TestGui() { - WTextField textField = new WTextField(Text.literal("Select with tab and type text")); - textField.setText(""); - ((WGridPanel) rootPanel).add(textField, 0, 0, 4, 1); - rootPanel.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 deleted file mode 100644 index 635040f..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/LibGuiTestClient.java +++ /dev/null @@ -1,77 +0,0 @@ -package io.github.cottonmc.test.client; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.arguments.IntegerArgumentType; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.HandledScreens; -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.CottonClientScreen; -import io.github.cottonmc.cotton.gui.client.CottonHud; -import io.github.cottonmc.cotton.gui.client.CottonInventoryScreen; -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.impl.modmenu.ConfigGui; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.test.LibGuiTest; -import io.github.cottonmc.test.ReallySimpleDescription; -import io.github.cottonmc.test.TestDescription; -import io.github.cottonmc.test.TestItemDescription; - -import java.util.function.Function; - -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; -import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; - -public class LibGuiTestClient implements ClientModInitializer { - - @Override - public void onInitializeClient() { - HandledScreens.>register( - LibGuiTest.GUI_SCREEN_HANDLER_TYPE, - CottonInventoryScreen::new - ); - - HandledScreens.>register( - LibGuiTest.REALLY_SIMPLE_SCREEN_HANDLER_TYPE, - CottonInventoryScreen::new - ); - - HandledScreens.>register( - LibGuiTest.ITEM_SCREEN_HANDLER_TYPE, - CottonInventoryScreen::new - ); - - CottonHud.add(new WHudTest(), 10, -20, 10, 10); - CottonHud.add(new WLabel(Text.literal("Test label")), 10, -30, 10, 10); - - ClientCommandRegistrationCallback.EVENT.register((dispatcher, commandRegistryAccess) -> dispatcher.register( - literal("libgui") - .then(literal("config").executes(openScreen(client -> new ConfigGui(client.currentScreen)))) - .then(literal("tab").executes(openScreen(client -> new TabTestGui()))) - .then(literal("scrolling").executes(openScreen(client -> new ScrollingTestGui()))) - .then(literal("insets").executes(openScreen(client -> new InsetsTestGui()))) - .then(literal("textfield").executes(openScreen(client -> new TextFieldTestGui()))) - .then(literal("paddings") - .then(argument("horizontal", IntegerArgumentType.integer(0)) - .then(argument("vertical", IntegerArgumentType.integer(0)) - .executes(context -> { - var hori = IntegerArgumentType.getInteger(context, "horizontal"); - var vert = IntegerArgumentType.getInteger(context, "vertical"); - return openScreen(client -> new PaddingTestGui(hori, vert)).run(context); - })))) - .then(literal("#182").executes(openScreen(client -> new Issue182TestGui()))) - .then(literal("#196").executes(openScreen(client -> new Issue196TestGui()))) - )); - } - - private static Command openScreen(Function screenFactory) { - return context -> { - var client = context.getSource().getClient(); - client.send(() -> client.setScreen(new CottonClientScreen(screenFactory.apply(client)))); - return Command.SINGLE_SUCCESS; - }; - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/PaddingTestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/PaddingTestGui.java deleted file mode 100644 index 9f5d790..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/PaddingTestGui.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment; -import io.github.cottonmc.cotton.gui.widget.data.Insets; -import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment; -import io.github.cottonmc.test.TestItemDescription; - -public class PaddingTestGui extends LightweightGuiDescription { - public PaddingTestGui(int hori, int vert) { - var root = new WGridPanel(); - root.setGaps(hori, vert); - setRootPanel(root); - root.setInsets(Insets.ROOT_PANEL); - - addBox(root, 0, 0, 2, 1); - addBox(root, 0, 1, 1, 2); - addBox(root, 1, 1, 1, 1); - addBox(root, 1, 2, 1, 1); - - root.validate(this); - } - - void addBox(WGridPanel root, int x, int y, int w, int h) { - root.add(new TestItemDescription.WColorBox(0xffff0000), x, y, w, h); - var l = new WLabel(Text.literal(w + "x" + h), 0xff00ffff); - l.setVerticalAlignment(VerticalAlignment.CENTER); - l.setHorizontalAlignment(HorizontalAlignment.CENTER); - root.add(l, x, y, w, h); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/ScrollingTestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/ScrollingTestGui.java deleted file mode 100644 index bfc25c4..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/ScrollingTestGui.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.item.Items; -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WBox; -import io.github.cottonmc.cotton.gui.widget.WButton; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.WLabeledSlider; -import io.github.cottonmc.cotton.gui.widget.WScrollPanel; -import io.github.cottonmc.cotton.gui.widget.data.Axis; -import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment; -import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; - -public class ScrollingTestGui extends LightweightGuiDescription { - public ScrollingTestGui() { - WGridPanel root = (WGridPanel) rootPanel; - WBox box = new WBox(Axis.VERTICAL); - - for (int i = 0; i < 20; i++) { - box.add(new WLabeledSlider(0, 10, Text.literal("Slider #" + i))); - } - - box.add(new WButton(new ItemIcon(Items.APPLE))); - - root.add(new WLabel(Text.literal("Scrolling test")).setVerticalAlignment(VerticalAlignment.CENTER), 0, 0, 5, 2); - root.add(new WScrollPanel(box), 0, 2, 5, 3); - root.validate(this); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/TabTestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/TabTestGui.java deleted file mode 100644 index 8ed93f9..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TabTestGui.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.item.Items; -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.impl.modmenu.WKirbSprite; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.WTabPanel; -import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; - -public class TabTestGui extends LightweightGuiDescription { - public TabTestGui() { - WTabPanel tabs = new WTabPanel(); - tabs.add(new WKirbSprite(), builder -> builder.title(Text.literal("Kirb"))); - tabs.add(new WLabel(Text.literal("just another tab")), builder -> builder.icon(new ItemIcon(Items.ANDESITE))); - - tabs.setSize(7 * 18, 5 * 18); - setRootPanel(tabs); - getRootPanel().validate(this); - } - - @Override - public void addPainters() { - } -} 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 deleted file mode 100644 index 839072e..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TestClientGui.java +++ /dev/null @@ -1,156 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.client.ScreenDrawing; -import io.github.cottonmc.cotton.gui.widget.TooltipBuilder; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WLabel; -import io.github.cottonmc.cotton.gui.widget.WSlider; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.WTiledSprite; -import io.github.cottonmc.cotton.gui.widget.WWidget; -import io.github.cottonmc.cotton.gui.widget.data.Axis; -import io.github.cottonmc.cotton.gui.widget.data.Color; -import io.github.cottonmc.cotton.gui.widget.data.Insets; - -public class TestClientGui extends LightweightGuiDescription { - //private static final Identifier PORTAL1 = new Identifier("libgui-test:portal.png"); - //private static final Identifier PORTAL2 = new Identifier("libgui-test:portal2.png"); - - private int r = 0; - private int g = 0; - private int b = 0; - - public TestClientGui() { - WGridPanel root = new WGridPanel(22); - root.setInsets(Insets.ROOT_PANEL); - this.setRootPanel(root); - WLabel title = new WLabel(Text.literal("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR) { - @Environment(EnvType.CLIENT) - @Override - public void addTooltip(TooltipBuilder tooltip) { - tooltip.add(Text.literal("Radical!")); - } - }; - WTiledSprite wood = new WTiledSprite( - 8, 8, // tile width and height - 500, // animation speed - new Identifier("minecraft:textures/block/birch_planks.png"), - new Identifier("minecraft:textures/block/dark_oak_planks.png"), - new Identifier("minecraft:textures/block/jungle_planks.png") - ); - root.add(wood, 3, 3, 2, 2); - root.add(title, 0, 0); - - WTextField text = new WTextField(); - text.setSuggestion(Text.literal("Search")); - root.add(text, 0, 1, 8, 1); - text.setSize(7*18, 20); - /* - ArrayList data = new ArrayList<>(); - data.add("Wolfram Alpha"); - data.add("Strange Home"); - data.add("Nether Base"); - data.add("Death"); - data.add("Cake"); - data.add("Mushroom Island"); - data.add("A List Item"); - data.add("Notes"); - data.add("Slime Island"); - - BiConsumer configurator = (String s, PortalDestination destination) -> { - destination.label.setText(new LiteralText(s)); - - int hash = s.hashCode(); - Identifier sprite = ((hash & 0x01) == 0) ? PORTAL1 : PORTAL2; - destination.sprite.setImage(sprite); - - int cost = (hash >> 1) & 0x2FF; - destination.cost.setText(new LiteralText(""+cost+" XP")); - }; - WListPanel list = new WListPanel(data, PortalDestination.class, PortalDestination::new, configurator); - list.setListItemHeight(2*18); - list.setBackgroundPainter(PANEL); - root.add(list, 0, 2, 7, 6); - - root.add(new WButton(new LiteralText("Teleport")), 3,8,4,1);*/ - WColorBox col = new WColorBox(); - root.add(col, 3,2,1,3); - - WSlider r = new WSlider(0, 100, Axis.VERTICAL); - root.add(r, 0, 2, 1, 3); - r.setValueChangeListener((i)->{ - this.r = i; - updateCol(col); - System.out.println("h: "+this.r+" s: "+this.g+ " l: "+this.b); - System.out.println("col is now "+Integer.toHexString(col.color)); - }); - WSlider g = new WSlider(0, 100, Axis.VERTICAL); - root.add(g, 1, 2, 1, 3); - g.setValueChangeListener((i)->{ - this.g = i; - updateCol(col); - }); - WSlider b = new WSlider(0, 100, Axis.VERTICAL); - root.add(b, 2, 2, 1, 3); - b.setValueChangeListener((i)->{ - this.b = i; - updateCol(col); - }); - - root.validate(this); - } - /* - public static class PortalDestination extends WPlainPanel { - WSprite sprite; - WLabel label; - WLabel cost; - - public PortalDestination() { - sprite = new WSprite(new Identifier("libgui-test:portal")); - this.add(sprite, 2, 2, 18, 18); - label = new WLabel("Foo"); - this.add(label, 18+ 4, 2, 5*18, 18); - cost = new WLabel("1000 Xp"); - this.add(cost, 2, 20, 6*18, 18); - - this.setSize(7*18, 2*18); - - this.setBackgroundPainter(PANEL); //Would fail on a serverside gui - } - }*/ - - private void updateCol(WColorBox col) { - Color.HSL hsl = new Color.HSL(r/100f, g/100f, b/100f); - col.setColor(hsl.toRgb()); - } - - public static class WColorBox extends WWidget { - protected int color = 0xFF_FFFFFF; - public WColorBox() {} - - public WColorBox(int col) { - this.color = col; - } - - @Override - public boolean canResize() { - return true; - } - - public void setColor(int col) { - this.color = col; - } - - @Override - public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { - ScreenDrawing.coloredRect(matrices, x, y, this.getWidth(), this.getHeight(), color); - } - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/TextFieldTestGui.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/TextFieldTestGui.java deleted file mode 100644 index ce2a7b6..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/TextFieldTestGui.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.minecraft.item.Items; -import net.minecraft.text.Text; - -import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; -import io.github.cottonmc.cotton.gui.widget.WButton; -import io.github.cottonmc.cotton.gui.widget.WGridPanel; -import io.github.cottonmc.cotton.gui.widget.WTextField; -import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; - -public class TextFieldTestGui extends LightweightGuiDescription { - public TextFieldTestGui() { - WGridPanel grid = (WGridPanel) rootPanel; - WTextField textField = new WTextField(Text.literal("Type something")).setMaxLength(Integer.MAX_VALUE); - grid.add(textField, 0, 0, 6, 1); - grid.add(new WButton(new ItemIcon(Items.BARRIER), Text.literal("Clear")).setOnClick(() -> textField.setText("")), 0, 2, 6, 1); - rootPanel.validate(this); - } -} diff --git a/GuiTest/src/main/java/io/github/cottonmc/test/client/WHudTest.java b/GuiTest/src/main/java/io/github/cottonmc/test/client/WHudTest.java deleted file mode 100644 index 98f4d0f..0000000 --- a/GuiTest/src/main/java/io/github/cottonmc/test/client/WHudTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.github.cottonmc.test.client; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.util.math.MatrixStack; - -import io.github.cottonmc.cotton.gui.client.ScreenDrawing; -import io.github.cottonmc.cotton.gui.widget.WWidget; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -@Environment(EnvType.CLIENT) -public class WHudTest extends WWidget { - private static final Logger LOGGER = LogManager.getLogger(); - - @Override - public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { - ScreenDrawing.coloredRect(matrices, x, y, width, height, 0xFF_00FF00); - } - - @Override - public void tick() { - LOGGER.debug("tick!"); - } -} diff --git a/GuiTest/src/main/resources/assets/libgui-test/icon.png b/GuiTest/src/main/resources/assets/libgui-test/icon.png deleted file mode 100644 index 4286522..0000000 Binary files a/GuiTest/src/main/resources/assets/libgui-test/icon.png and /dev/null differ diff --git a/GuiTest/src/main/resources/assets/libgui-test/portal.png b/GuiTest/src/main/resources/assets/libgui-test/portal.png deleted file mode 100644 index cf64bcc..0000000 Binary files a/GuiTest/src/main/resources/assets/libgui-test/portal.png and /dev/null differ diff --git a/GuiTest/src/main/resources/assets/libgui-test/portal2.png b/GuiTest/src/main/resources/assets/libgui-test/portal2.png deleted file mode 100644 index 3a1c211..0000000 Binary files a/GuiTest/src/main/resources/assets/libgui-test/portal2.png and /dev/null differ diff --git a/GuiTest/src/main/resources/assets/libgui-test/saddle.png b/GuiTest/src/main/resources/assets/libgui-test/saddle.png deleted file mode 100644 index 84394b9..0000000 Binary files a/GuiTest/src/main/resources/assets/libgui-test/saddle.png and /dev/null differ diff --git a/GuiTest/src/main/resources/fabric.mod.json b/GuiTest/src/main/resources/fabric.mod.json deleted file mode 100644 index 1528093..0000000 --- a/GuiTest/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "schemaVersion": 1, - "id": "libgui-test", - "version": "${version}", - - "name": "LibGui Test", - "description": "Some example Guis to shake out errors", - "authors": [ - "Falkreon" - ], - "contact": { - "sources": "https://github.com/CottonMC/LibGUI" - }, - - "license": "MIT", - "icon": "assets/libgui-test/icon.png", - - "environment": "*", - "entrypoints": { - "main": [ "io.github.cottonmc.test.LibGuiTest"], - "client": [ "io.github.cottonmc.test.client.LibGuiTestClient" ] - }, - "depends": { - "fabricloader": ">=0.4.0", - "libgui": "*", - "jankson": "*", - "fabric": "*" - } -} diff --git a/build.gradle b/build.gradle index 3ebd1fe..3c6c313 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,29 @@ group = project.maven_group sourceSets { javadoc { } + + testMod { + compileClasspath += main.compileClasspath + runtimeClasspath += main.runtimeClasspath + } +} + +loom { + createRemapConfigurations(sourceSets.testMod) + + runs { + testModClient { + client() + name = 'Test Mod Client' + source sourceSets.testMod + } + + testModServer { + server() + name = 'Test Mod Server' + source sourceSets.testMod + } + } } repositories { @@ -63,6 +86,13 @@ dependencies { modCompileOnly("com.terraformersmc:modmenu:$project.modmenu_version") { exclude group: 'net.fabricmc.fabric-api' } + + // Test mod dependencies + testModImplementation sourceSets.main.output + modTestModImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + modTestModRuntimeOnly("com.terraformersmc:modmenu:$project.modmenu_version") { + exclude group: 'net.fabricmc.fabric-api' + } } processResources { @@ -106,14 +136,10 @@ jar { from "CREDITS.txt", "LICENSE" } -allprojects { - apply plugin: 'checkstyle' - - checkstyle { - configFile = rootProject.file('checkstyle.xml') - configProperties = [suppressions: rootProject.file('checkstyle.suppressions.xml').absolutePath] - toolVersion = '10.9.2' - } +checkstyle { + configFile = rootProject.file('checkstyle.xml') + configProperties = [suppressions: rootProject.file('checkstyle.suppressions.xml').absolutePath] + toolVersion = '10.9.2' } def javadocBuildJar = tasks.register('javadocBuildJar', Jar) { diff --git a/gradle.properties b/gradle.properties index d408d3c..75677e4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,5 @@ # Done to increase the memory available to gradle. org.gradle.jvmargs=-Xmx1G -fabric.loom.multiProjectOptimisation = true # Fabric Properties # check these on https://fabricmc.net/use diff --git a/settings.gradle b/settings.gradle index ecd1298..aa24284 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,5 +9,3 @@ pluginManagement { } rootProject.name = 'LibGui' - -include ':GuiTest' diff --git a/src/testMod/java/io/github/cottonmc/test/GuiBlock.java b/src/testMod/java/io/github/cottonmc/test/GuiBlock.java new file mode 100644 index 0000000..1b1666f --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/GuiBlock.java @@ -0,0 +1,37 @@ +package io.github.cottonmc.test; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.BlockWithEntity; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class GuiBlock extends BlockWithEntity { + + public GuiBlock() { + super(FabricBlockSettings.copy(Blocks.IRON_BLOCK)); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hitResult) { + player.openHandledScreen(state.createScreenHandlerFactory(world, pos)); + return ActionResult.SUCCESS; + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new GuiBlockEntity(pos, state); + } + + @Override + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/GuiBlockEntity.java b/src/testMod/java/io/github/cottonmc/test/GuiBlockEntity.java new file mode 100644 index 0000000..16e7e3f --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/GuiBlockEntity.java @@ -0,0 +1,43 @@ +package io.github.cottonmc.test; + +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.text.Text; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.BlockPos; + +public class GuiBlockEntity extends BlockEntity implements ImplementedInventory, NamedScreenHandlerFactory { + static final int INVENTORY_SIZE = 8; + + DefaultedList items = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); + + public GuiBlockEntity(BlockPos pos, BlockState state) { + super(LibGuiTest.GUI_BLOCKENTITY_TYPE, pos, state); + } + + @Override + public DefaultedList getItems() { + return items; + } + + @Override + public boolean canPlayerUse(PlayerEntity player) { + return pos.isWithinDistance(player.getBlockPos(), 4.5); + } + + @Override + public Text getDisplayName() { + return Text.literal("test title"); + } + + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new TestDescription(LibGuiTest.GUI_SCREEN_HANDLER_TYPE, syncId, inv, ScreenHandlerContext.create(world, pos)); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/GuiItem.java b/src/testMod/java/io/github/cottonmc/test/GuiItem.java new file mode 100644 index 0000000..27c8d5f --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/GuiItem.java @@ -0,0 +1,55 @@ +package io.github.cottonmc.test; + +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.StackReference; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.Rarity; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; + +public class GuiItem extends Item { + public GuiItem() { + super(new Item.Settings().rarity(Rarity.EPIC)); + } + + @Override + public TypedActionResult use(World world, PlayerEntity player, Hand hand) { + player.openHandledScreen(createScreenHandlerFactory(player, hand)); + return new TypedActionResult<>(ActionResult.SUCCESS, player.getStackInHand(hand)); + } + + private NamedScreenHandlerFactory createScreenHandlerFactory(PlayerEntity player, Hand hand) { + EquipmentSlot slot = switch (hand) { + case MAIN_HAND -> EquipmentSlot.MAINHAND; + case OFF_HAND -> EquipmentSlot.OFFHAND; + }; + ItemStack stack = player.getStackInHand(hand); + return new ExtendedScreenHandlerFactory() { + @Override + public Text getDisplayName() { + return stack.getName(); + } + + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) { + return new TestItemDescription(syncId, playerInventory, StackReference.of(player, slot)); + } + + @Override + public void writeScreenOpeningData(ServerPlayerEntity player, PacketByteBuf buf) { + buf.writeEnumConstant(slot); + } + }; + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/ImplementedInventory.java b/src/testMod/java/io/github/cottonmc/test/ImplementedInventory.java new file mode 100644 index 0000000..a1d3911 --- /dev/null +++ b/src/testMod/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.util.collection.DefaultedList; +import net.minecraft.util.math.Direction; + +import java.util.List; + +/** + * A simple {@code SidedInventory} implementation with only default methods + an item list getter. + * + *

Reading and writing to tags

+ * Use {@link Inventories#readNbt(net.minecraft.nbt.NbtCompound, DefaultedList)} and {@link Inventories#writeNbt(net.minecraft.nbt.NbtCompound, DefaultedList)} + * on {@linkplain #getItems() the item list}. + * + *

License: CC0 + * + * @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 getItems(); + + // Creation + + /** + * Creates an inventory from the item list. + * + * @param items the item list + * @return a new inventory + */ + static ImplementedInventory of(DefaultedList 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. + * + *

The default implementation returns an array of all slots. + * + * @param side the side + * @return the available slots + */ + @Override + default int[] getAvailableSlots(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. + * + *

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 canInsert(int slot, ItemStack stack, Direction side) { + return true; + } + + /** + * Returns true if the stack can be extracted from the slot at the side. + * + *

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 canExtract(int slot, ItemStack stack, Direction side) { + return true; + } + + // Inventory + + /** + * Returns the inventory size. + * + *

The default implementation returns the size of {@link #getItems()}. + * + * @return the inventory size + */ + @Override + default int size() { + return getItems().size(); + } + + /** + * @return true if this inventory has only empty stacks, false otherwise + */ + @Override + default boolean isEmpty() { + for (int i = 0; i < size(); i++) { + ItemStack stack = getStack(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 getStack(int slot) { + return getItems().get(slot); + } + + /** + * Takes a stack of the size from the slot. + * + *

(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 removeStack(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. + * + *

The default implementation uses {@link Inventories#removeStack(List, int)} + * + * @param slot the slot + * @return the removed stack + */ + @Override + default ItemStack removeStack(int slot) { + return Inventories.removeStack(getItems(), slot); + } + + /** + * Replaces the current stack in the {@code slot} with the provided stack. + * + *

If the stack is too big for this inventory ({@link Inventory#getMaxCountPerStack()} ()}), + * it gets resized to this inventory's maximum amount. + * + * @param slot the slot + * @param stack the stack + */ + @Override + default void setStack(int slot, ItemStack stack) { + getItems().set(slot, stack); + if (stack.getCount() > getMaxCountPerStack()) { + stack.setCount(getMaxCountPerStack()); + } + } + + /** + * Clears {@linkplain #getItems() the item list}}. + */ + @Override + default void clear() { + getItems().clear(); + } + + @Override + default void markDirty() { + // Override if you want behavior. + } + + @Override + default boolean canPlayerUse(PlayerEntity player) { + return true; + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/LibGuiTest.java b/src/testMod/java/io/github/cottonmc/test/LibGuiTest.java new file mode 100644 index 0000000..1d48daa --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/LibGuiTest.java @@ -0,0 +1,91 @@ +package io.github.cottonmc.test; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.StackReference; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.resource.featuretoggle.FeatureFlags; +import net.minecraft.resource.featuretoggle.FeatureSet; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.util.Identifier; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Optional; + +public class LibGuiTest implements ModInitializer { + public static final String MODID = "libgui-test"; + + public static GuiBlock GUI_BLOCK; + public static Block NO_BLOCK_INVENTORY_BLOCK; + public static BlockItem GUI_BLOCK_ITEM; + public static BlockEntityType GUI_BLOCKENTITY_TYPE; + public static ScreenHandlerType GUI_SCREEN_HANDLER_TYPE; + public static ScreenHandlerType ITEM_SCREEN_HANDLER_TYPE; + public static ScreenHandlerType REALLY_SIMPLE_SCREEN_HANDLER_TYPE; + + @Override + public void onInitialize() { + Registry.register(Registries.ITEM, new Identifier(MODID, "client_gui"), new GuiItem()); + + GUI_BLOCK = new GuiBlock(); + Registry.register(Registries.BLOCK, new Identifier(MODID, "gui"), GUI_BLOCK); + GUI_BLOCK_ITEM = new BlockItem(GUI_BLOCK, new Item.Settings()); + Registry.register(Registries.ITEM, new Identifier(MODID, "gui"), GUI_BLOCK_ITEM); + NO_BLOCK_INVENTORY_BLOCK = new NoBlockInventoryBlock(AbstractBlock.Settings.copy(Blocks.STONE)); + Registry.register(Registries.BLOCK, new Identifier(MODID, "no_block_inventory"), NO_BLOCK_INVENTORY_BLOCK); + Registry.register(Registries.ITEM, new Identifier(MODID, "no_block_inventory"), new BlockItem(NO_BLOCK_INVENTORY_BLOCK, new Item.Settings())); + GUI_BLOCKENTITY_TYPE = FabricBlockEntityTypeBuilder.create(GuiBlockEntity::new, GUI_BLOCK).build(null); + Registry.register(Registries.BLOCK_ENTITY_TYPE, new Identifier(MODID, "gui"), GUI_BLOCKENTITY_TYPE); + + GUI_SCREEN_HANDLER_TYPE = new ScreenHandlerType<>((int syncId, PlayerInventory inventory) -> { + return new TestDescription(GUI_SCREEN_HANDLER_TYPE, syncId, inventory, ScreenHandlerContext.EMPTY); + }, FeatureSet.of(FeatureFlags.VANILLA)); + Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "gui"), GUI_SCREEN_HANDLER_TYPE); + ITEM_SCREEN_HANDLER_TYPE = new ExtendedScreenHandlerType<>((syncId, inventory, buf) -> { + var equipmentSlot = buf.readEnumConstant(EquipmentSlot.class); + StackReference handStack = StackReference.of(inventory.player, equipmentSlot); + return new TestItemDescription(syncId, inventory, handStack); + }); + Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "item_gui"), ITEM_SCREEN_HANDLER_TYPE); + + REALLY_SIMPLE_SCREEN_HANDLER_TYPE = new ScreenHandlerType<>(ReallySimpleDescription::new, FeatureSet.of(FeatureFlags.VANILLA)); + Registry.register(Registries.SCREEN_HANDLER, new Identifier(MODID, "really_simple"), REALLY_SIMPLE_SCREEN_HANDLER_TYPE); + + Optional containerOpt = FabricLoader.getInstance().getModContainer("jankson"); + if (containerOpt.isPresent()) { + ModContainer jankson = containerOpt.get(); + System.out.println("Jankson root path: "+jankson.getRootPath()); + try { + Files.list(jankson.getRootPath()).forEach((path)->{ + path.getFileSystem().getFileStores().forEach((store)->{ + System.out.println(" Filestore: "+store.name()); + }); + System.out.println(" "+path.toAbsolutePath()); + }); + } catch (IOException e) { + e.printStackTrace(); + } + Path modJson = jankson.getPath("/fabric.mod.json"); + System.out.println("Jankson fabric.mod.json path: "+modJson); + System.out.println(Files.exists(modJson) ? "Exists" : "Does Not Exist"); + } else { + System.out.println("Container isn't present!"); + } + } + +} diff --git a/src/testMod/java/io/github/cottonmc/test/NoBlockInventoryBlock.java b/src/testMod/java/io/github/cottonmc/test/NoBlockInventoryBlock.java new file mode 100644 index 0000000..2b784a6 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/NoBlockInventoryBlock.java @@ -0,0 +1,39 @@ +package io.github.cottonmc.test; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import org.jetbrains.annotations.Nullable; + +public class NoBlockInventoryBlock extends Block implements NamedScreenHandlerFactory { + public NoBlockInventoryBlock(Settings settings) { + super(settings); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + player.openHandledScreen(this); + return world.isClient ? ActionResult.SUCCESS : ActionResult.CONSUME; + } + + @Override + public Text getDisplayName() { + return getName(); + } + + @Nullable + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + return new ReallySimpleDescription(syncId, inv); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/ReallySimpleDescription.java b/src/testMod/java/io/github/cottonmc/test/ReallySimpleDescription.java new file mode 100644 index 0000000..bcb9213 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/ReallySimpleDescription.java @@ -0,0 +1,16 @@ +package io.github.cottonmc.test; + +import net.minecraft.entity.player.PlayerInventory; + +import io.github.cottonmc.cotton.gui.SyncedGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; + +// A really simple GUI description that only contains a player inventory panel. +public class ReallySimpleDescription extends SyncedGuiDescription { + public ReallySimpleDescription(int syncId, PlayerInventory playerInventory) { + super(LibGuiTest.REALLY_SIMPLE_SCREEN_HANDLER_TYPE, syncId, playerInventory); + setTitleVisible(false); + ((WGridPanel) getRootPanel()).add(createPlayerInventoryPanel(), 0, 0); + getRootPanel().validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/TestDescription.java b/src/testMod/java/io/github/cottonmc/test/TestDescription.java new file mode 100644 index 0000000..39b09d6 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/TestDescription.java @@ -0,0 +1,80 @@ +package io.github.cottonmc.test; + +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.item.Items; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import io.github.cottonmc.cotton.gui.SyncedGuiDescription; +import io.github.cottonmc.cotton.gui.networking.NetworkSide; +import io.github.cottonmc.cotton.gui.networking.ScreenNetworking; +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.WLabel; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.data.Texture; +import io.github.cottonmc.cotton.gui.widget.icon.TextureIcon; + +public class TestDescription extends SyncedGuiDescription { + private static final Identifier TEST_MESSAGE = new Identifier("libgui", "test"); + private static final Identifier UNREGISTERED_ON_SERVER = new Identifier("libgui", "unregistered_on_server"); + + public TestDescription(ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { + super(type, syncId, playerInventory, getBlockInventory(context, GuiBlockEntity.INVENTORY_SIZE), null); + + WGridPanel root = (WGridPanel)this.getRootPanel(); + + WItemSlot slot = WItemSlot.of(blockInventory, 0, 4, 1); + root.add(slot, 0, 1); + + WButton buttonA = new WButton(Text.literal("Send Message")); + + buttonA.setOnClick(() -> { + ScreenNetworking.of(this, NetworkSide.CLIENT).send(TEST_MESSAGE, buf -> {}); + ScreenNetworking.of(this, NetworkSide.CLIENT).send(UNREGISTERED_ON_SERVER, buf -> {}); + }); + + root.add(buttonA, 0, 3, 4, 1); + + WButton buttonB = new WButton(Text.literal("Show Warnings")); + buttonB.setOnClick(() -> slot.setIcon(new TextureIcon(new Identifier("libgui-test", "saddle.png")))); + + root.add(buttonB, 5, 3, 4, 1); + TextureIcon testIcon = new TextureIcon(new Texture(new Identifier("libgui-test", "icon.png"))); + root.add(new WButton(testIcon, Text.literal("Button C")), 0, 5, 4, 1); + root.add(new WButton(Text.literal("Button D")), 5, 5, 4, 1); + root.add(new WTextField(Text.literal("Type something...")).setMaxLength(64), 0, 7, 5, 1); + + root.add(new WLabel(Text.literal("Large slot:")), 0, 9); + root.add(WItemSlot.outputOf(blockInventory, 0), 4, 9); + + root.add(WItemSlot.of(blockInventory, 7).setIcon(new TextureIcon(new Identifier("libgui-test", "saddle.png"))), 7, 9); + + root.add(createPlayerInventoryPanel(), 0, 11); + System.out.println(root.toString()); + + this.getRootPanel().validate(this); + + getRootPanel().streamChildren() + .forEach(child -> { + if (child instanceof WItemSlot wis) { + // Prevent apples from entering the item slots + wis.setFilter(stack -> !stack.isOf(Items.APPLE)); + } + }); + + ScreenNetworking.of(this, NetworkSide.SERVER).receive(TEST_MESSAGE, buf -> { + System.out.println("Received on the server!"); + }); + + try { + slot.onHidden(); + slot.onShown(); + } catch (Throwable t) { + throw new AssertionError("ValidatedSlot.setVisible crashed", t); + } + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/TestItemDescription.java b/src/testMod/java/io/github/cottonmc/test/TestItemDescription.java new file mode 100644 index 0000000..4c9c1f0 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/TestItemDescription.java @@ -0,0 +1,156 @@ +package io.github.cottonmc.test; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.StackReference; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import io.github.cottonmc.cotton.gui.ItemSyncedGuiDescription; +import io.github.cottonmc.cotton.gui.client.ScreenDrawing; +import io.github.cottonmc.cotton.gui.widget.TooltipBuilder; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.WSlider; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.WTiledSprite; +import io.github.cottonmc.cotton.gui.widget.WWidget; +import io.github.cottonmc.cotton.gui.widget.data.Axis; +import io.github.cottonmc.cotton.gui.widget.data.Color; +import io.github.cottonmc.cotton.gui.widget.data.Insets; + +public class TestItemDescription extends ItemSyncedGuiDescription { + private int r = 0; + private int g = 0; + private int b = 0; + + public TestItemDescription(int syncId, PlayerInventory playerInventory, StackReference owner) { + super(LibGuiTest.ITEM_SCREEN_HANDLER_TYPE, syncId, playerInventory, owner); + WGridPanel root = new WGridPanel(22); + root.setInsets(Insets.ROOT_PANEL); + this.setRootPanel(root); + WLabel title = new WLabel(Text.literal("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR) { + @Environment(EnvType.CLIENT) + @Override + public void addTooltip(TooltipBuilder tooltip) { + tooltip.add(Text.literal("Radical!")); + } + }; + WTiledSprite wood = new WTiledSprite( + 8, 8, // tile width and height + 500, // animation speed + new Identifier("minecraft:textures/block/birch_planks.png"), + new Identifier("minecraft:textures/block/dark_oak_planks.png"), + new Identifier("minecraft:textures/block/jungle_planks.png") + ); + root.add(wood, 3, 3, 2, 2); + root.add(title, 0, 0); + + WTextField text = new WTextField(); + text.setSuggestion(Text.literal("Search")); + root.add(text, 0, 1, 8, 1); + text.setSize(7*18, 20); + /* + ArrayList data = new ArrayList<>(); + data.add("Wolfram Alpha"); + data.add("Strange Home"); + data.add("Nether Base"); + data.add("Death"); + data.add("Cake"); + data.add("Mushroom Island"); + data.add("A List Item"); + data.add("Notes"); + data.add("Slime Island"); + + BiConsumer configurator = (String s, PortalDestination destination) -> { + destination.label.setText(new LiteralText(s)); + + int hash = s.hashCode(); + Identifier sprite = ((hash & 0x01) == 0) ? PORTAL1 : PORTAL2; + destination.sprite.setImage(sprite); + + int cost = (hash >> 1) & 0x2FF; + destination.cost.setText(new LiteralText(""+cost+" XP")); + }; + WListPanel list = new WListPanel(data, PortalDestination.class, PortalDestination::new, configurator); + list.setListItemHeight(2*18); + list.setBackgroundPainter(PANEL); + root.add(list, 0, 2, 7, 6); + + root.add(new WButton(new LiteralText("Teleport")), 3,8,4,1);*/ + WColorBox col = new WColorBox(); + root.add(col, 3,2,1,3); + + WSlider r = new WSlider(0, 100, Axis.VERTICAL); + root.add(r, 0, 2, 1, 3); + r.setValueChangeListener((i)->{ + this.r = i; + updateCol(col); + System.out.println("h: "+this.r+" s: "+this.g+ " l: "+this.b); + System.out.println("col is now "+Integer.toHexString(col.color)); + }); + WSlider g = new WSlider(0, 100, Axis.VERTICAL); + root.add(g, 1, 2, 1, 3); + g.setValueChangeListener((i)->{ + this.g = i; + updateCol(col); + }); + WSlider b = new WSlider(0, 100, Axis.VERTICAL); + root.add(b, 2, 2, 1, 3); + b.setValueChangeListener((i)->{ + this.b = i; + updateCol(col); + }); + + root.validate(this); + } + /* + public static class PortalDestination extends WPlainPanel { + WSprite sprite; + WLabel label; + WLabel cost; + + public PortalDestination() { + sprite = new WSprite(new Identifier("libgui-test:portal")); + this.add(sprite, 2, 2, 18, 18); + label = new WLabel("Foo"); + this.add(label, 18+ 4, 2, 5*18, 18); + cost = new WLabel("1000 Xp"); + this.add(cost, 2, 20, 6*18, 18); + + this.setSize(7*18, 2*18); + + this.setBackgroundPainter(PANEL); //Would fail on a serverside gui + } + }*/ + + private void updateCol(WColorBox col) { + Color.HSL hsl = new Color.HSL(r/100f, g/100f, b/100f); + col.setColor(hsl.toRgb()); + } + + public static class WColorBox extends WWidget { + protected int color = 0xFF_FFFFFF; + public WColorBox() {} + + public WColorBox(int col) { + this.color = col; + } + + @Override + public boolean canResize() { + return true; + } + + public void setColor(int col) { + this.color = col; + } + + @Override + public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + ScreenDrawing.coloredRect(matrices, x, y, this.getWidth(), this.getHeight(), color); + } + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/InsetsTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/InsetsTestGui.java new file mode 100644 index 0000000..f89de7a --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/InsetsTestGui.java @@ -0,0 +1,20 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.data.Insets; + +public class InsetsTestGui extends LightweightGuiDescription { + public InsetsTestGui() { + WGridPanel root = (WGridPanel) rootPanel; + + root.add(new WLabel(Text.literal("Insets demo")), 0, 0); + root.add(new WButton(Text.literal("Default")).setOnClick(() -> root.setInsets(Insets.ROOT_PANEL)), 0, 1, 2, 1); + root.add(new WButton(Text.literal("None")).setOnClick(() -> root.setInsets(Insets.NONE)), 2, 1, 2, 1); + root.add(new WButton(Text.literal("Large")).setOnClick(() -> root.setInsets(new Insets(16))), 4, 1, 2, 1); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/Issue182TestGui.java b/src/testMod/java/io/github/cottonmc/test/client/Issue182TestGui.java new file mode 100644 index 0000000..5d4a739 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/Issue182TestGui.java @@ -0,0 +1,18 @@ +package io.github.cottonmc.test.client; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WBox; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.data.Axis; + +// Used for testing issue #182 (https://github.com/CottonMC/LibGui/issues/182): +// Highlighting/selecting text in the top field makes the bottom one blue. +public final class Issue182TestGui extends LightweightGuiDescription { + public Issue182TestGui() { + WBox root = new WBox(Axis.VERTICAL); + root.add(new WTextField(), 100, 20); + root.add(new WTextField(), 100, 20); + setRootPanel(root); + root.validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/Issue196TestGui.java b/src/testMod/java/io/github/cottonmc/test/client/Issue196TestGui.java new file mode 100644 index 0000000..6de8181 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/Issue196TestGui.java @@ -0,0 +1,16 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WTextField; + +public final class Issue196TestGui extends LightweightGuiDescription { + public Issue196TestGui() { + WTextField textField = new WTextField(Text.literal("Select with tab and type text")); + textField.setText(""); + ((WGridPanel) rootPanel).add(textField, 0, 0, 4, 1); + rootPanel.validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java b/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java new file mode 100644 index 0000000..635040f --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/LibGuiTestClient.java @@ -0,0 +1,77 @@ +package io.github.cottonmc.test.client; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ingame.HandledScreens; +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.CottonClientScreen; +import io.github.cottonmc.cotton.gui.client.CottonHud; +import io.github.cottonmc.cotton.gui.client.CottonInventoryScreen; +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.impl.modmenu.ConfigGui; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.test.LibGuiTest; +import io.github.cottonmc.test.ReallySimpleDescription; +import io.github.cottonmc.test.TestDescription; +import io.github.cottonmc.test.TestItemDescription; + +import java.util.function.Function; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class LibGuiTestClient implements ClientModInitializer { + + @Override + public void onInitializeClient() { + HandledScreens.>register( + LibGuiTest.GUI_SCREEN_HANDLER_TYPE, + CottonInventoryScreen::new + ); + + HandledScreens.>register( + LibGuiTest.REALLY_SIMPLE_SCREEN_HANDLER_TYPE, + CottonInventoryScreen::new + ); + + HandledScreens.>register( + LibGuiTest.ITEM_SCREEN_HANDLER_TYPE, + CottonInventoryScreen::new + ); + + CottonHud.add(new WHudTest(), 10, -20, 10, 10); + CottonHud.add(new WLabel(Text.literal("Test label")), 10, -30, 10, 10); + + ClientCommandRegistrationCallback.EVENT.register((dispatcher, commandRegistryAccess) -> dispatcher.register( + literal("libgui") + .then(literal("config").executes(openScreen(client -> new ConfigGui(client.currentScreen)))) + .then(literal("tab").executes(openScreen(client -> new TabTestGui()))) + .then(literal("scrolling").executes(openScreen(client -> new ScrollingTestGui()))) + .then(literal("insets").executes(openScreen(client -> new InsetsTestGui()))) + .then(literal("textfield").executes(openScreen(client -> new TextFieldTestGui()))) + .then(literal("paddings") + .then(argument("horizontal", IntegerArgumentType.integer(0)) + .then(argument("vertical", IntegerArgumentType.integer(0)) + .executes(context -> { + var hori = IntegerArgumentType.getInteger(context, "horizontal"); + var vert = IntegerArgumentType.getInteger(context, "vertical"); + return openScreen(client -> new PaddingTestGui(hori, vert)).run(context); + })))) + .then(literal("#182").executes(openScreen(client -> new Issue182TestGui()))) + .then(literal("#196").executes(openScreen(client -> new Issue196TestGui()))) + )); + } + + private static Command openScreen(Function screenFactory) { + return context -> { + var client = context.getSource().getClient(); + client.send(() -> client.setScreen(new CottonClientScreen(screenFactory.apply(client)))); + return Command.SINGLE_SUCCESS; + }; + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/PaddingTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/PaddingTestGui.java new file mode 100644 index 0000000..9f5d790 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/PaddingTestGui.java @@ -0,0 +1,35 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.data.HorizontalAlignment; +import io.github.cottonmc.cotton.gui.widget.data.Insets; +import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment; +import io.github.cottonmc.test.TestItemDescription; + +public class PaddingTestGui extends LightweightGuiDescription { + public PaddingTestGui(int hori, int vert) { + var root = new WGridPanel(); + root.setGaps(hori, vert); + setRootPanel(root); + root.setInsets(Insets.ROOT_PANEL); + + addBox(root, 0, 0, 2, 1); + addBox(root, 0, 1, 1, 2); + addBox(root, 1, 1, 1, 1); + addBox(root, 1, 2, 1, 1); + + root.validate(this); + } + + void addBox(WGridPanel root, int x, int y, int w, int h) { + root.add(new TestItemDescription.WColorBox(0xffff0000), x, y, w, h); + var l = new WLabel(Text.literal(w + "x" + h), 0xff00ffff); + l.setVerticalAlignment(VerticalAlignment.CENTER); + l.setHorizontalAlignment(HorizontalAlignment.CENTER); + root.add(l, x, y, w, h); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/ScrollingTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/ScrollingTestGui.java new file mode 100644 index 0000000..bfc25c4 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/ScrollingTestGui.java @@ -0,0 +1,32 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.item.Items; +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WBox; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.WLabeledSlider; +import io.github.cottonmc.cotton.gui.widget.WScrollPanel; +import io.github.cottonmc.cotton.gui.widget.data.Axis; +import io.github.cottonmc.cotton.gui.widget.data.VerticalAlignment; +import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; + +public class ScrollingTestGui extends LightweightGuiDescription { + public ScrollingTestGui() { + WGridPanel root = (WGridPanel) rootPanel; + WBox box = new WBox(Axis.VERTICAL); + + for (int i = 0; i < 20; i++) { + box.add(new WLabeledSlider(0, 10, Text.literal("Slider #" + i))); + } + + box.add(new WButton(new ItemIcon(Items.APPLE))); + + root.add(new WLabel(Text.literal("Scrolling test")).setVerticalAlignment(VerticalAlignment.CENTER), 0, 0, 5, 2); + root.add(new WScrollPanel(box), 0, 2, 5, 3); + root.validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/TabTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/TabTestGui.java new file mode 100644 index 0000000..8ed93f9 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/TabTestGui.java @@ -0,0 +1,26 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.item.Items; +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.impl.modmenu.WKirbSprite; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.WTabPanel; +import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; + +public class TabTestGui extends LightweightGuiDescription { + public TabTestGui() { + WTabPanel tabs = new WTabPanel(); + tabs.add(new WKirbSprite(), builder -> builder.title(Text.literal("Kirb"))); + tabs.add(new WLabel(Text.literal("just another tab")), builder -> builder.icon(new ItemIcon(Items.ANDESITE))); + + tabs.setSize(7 * 18, 5 * 18); + setRootPanel(tabs); + getRootPanel().validate(this); + } + + @Override + public void addPainters() { + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/TestClientGui.java b/src/testMod/java/io/github/cottonmc/test/client/TestClientGui.java new file mode 100644 index 0000000..839072e --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/TestClientGui.java @@ -0,0 +1,156 @@ +package io.github.cottonmc.test.client; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.client.ScreenDrawing; +import io.github.cottonmc.cotton.gui.widget.TooltipBuilder; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WLabel; +import io.github.cottonmc.cotton.gui.widget.WSlider; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.WTiledSprite; +import io.github.cottonmc.cotton.gui.widget.WWidget; +import io.github.cottonmc.cotton.gui.widget.data.Axis; +import io.github.cottonmc.cotton.gui.widget.data.Color; +import io.github.cottonmc.cotton.gui.widget.data.Insets; + +public class TestClientGui extends LightweightGuiDescription { + //private static final Identifier PORTAL1 = new Identifier("libgui-test:portal.png"); + //private static final Identifier PORTAL2 = new Identifier("libgui-test:portal2.png"); + + private int r = 0; + private int g = 0; + private int b = 0; + + public TestClientGui() { + WGridPanel root = new WGridPanel(22); + root.setInsets(Insets.ROOT_PANEL); + this.setRootPanel(root); + WLabel title = new WLabel(Text.literal("Client Test Gui"), WLabel.DEFAULT_TEXT_COLOR) { + @Environment(EnvType.CLIENT) + @Override + public void addTooltip(TooltipBuilder tooltip) { + tooltip.add(Text.literal("Radical!")); + } + }; + WTiledSprite wood = new WTiledSprite( + 8, 8, // tile width and height + 500, // animation speed + new Identifier("minecraft:textures/block/birch_planks.png"), + new Identifier("minecraft:textures/block/dark_oak_planks.png"), + new Identifier("minecraft:textures/block/jungle_planks.png") + ); + root.add(wood, 3, 3, 2, 2); + root.add(title, 0, 0); + + WTextField text = new WTextField(); + text.setSuggestion(Text.literal("Search")); + root.add(text, 0, 1, 8, 1); + text.setSize(7*18, 20); + /* + ArrayList data = new ArrayList<>(); + data.add("Wolfram Alpha"); + data.add("Strange Home"); + data.add("Nether Base"); + data.add("Death"); + data.add("Cake"); + data.add("Mushroom Island"); + data.add("A List Item"); + data.add("Notes"); + data.add("Slime Island"); + + BiConsumer configurator = (String s, PortalDestination destination) -> { + destination.label.setText(new LiteralText(s)); + + int hash = s.hashCode(); + Identifier sprite = ((hash & 0x01) == 0) ? PORTAL1 : PORTAL2; + destination.sprite.setImage(sprite); + + int cost = (hash >> 1) & 0x2FF; + destination.cost.setText(new LiteralText(""+cost+" XP")); + }; + WListPanel list = new WListPanel(data, PortalDestination.class, PortalDestination::new, configurator); + list.setListItemHeight(2*18); + list.setBackgroundPainter(PANEL); + root.add(list, 0, 2, 7, 6); + + root.add(new WButton(new LiteralText("Teleport")), 3,8,4,1);*/ + WColorBox col = new WColorBox(); + root.add(col, 3,2,1,3); + + WSlider r = new WSlider(0, 100, Axis.VERTICAL); + root.add(r, 0, 2, 1, 3); + r.setValueChangeListener((i)->{ + this.r = i; + updateCol(col); + System.out.println("h: "+this.r+" s: "+this.g+ " l: "+this.b); + System.out.println("col is now "+Integer.toHexString(col.color)); + }); + WSlider g = new WSlider(0, 100, Axis.VERTICAL); + root.add(g, 1, 2, 1, 3); + g.setValueChangeListener((i)->{ + this.g = i; + updateCol(col); + }); + WSlider b = new WSlider(0, 100, Axis.VERTICAL); + root.add(b, 2, 2, 1, 3); + b.setValueChangeListener((i)->{ + this.b = i; + updateCol(col); + }); + + root.validate(this); + } + /* + public static class PortalDestination extends WPlainPanel { + WSprite sprite; + WLabel label; + WLabel cost; + + public PortalDestination() { + sprite = new WSprite(new Identifier("libgui-test:portal")); + this.add(sprite, 2, 2, 18, 18); + label = new WLabel("Foo"); + this.add(label, 18+ 4, 2, 5*18, 18); + cost = new WLabel("1000 Xp"); + this.add(cost, 2, 20, 6*18, 18); + + this.setSize(7*18, 2*18); + + this.setBackgroundPainter(PANEL); //Would fail on a serverside gui + } + }*/ + + private void updateCol(WColorBox col) { + Color.HSL hsl = new Color.HSL(r/100f, g/100f, b/100f); + col.setColor(hsl.toRgb()); + } + + public static class WColorBox extends WWidget { + protected int color = 0xFF_FFFFFF; + public WColorBox() {} + + public WColorBox(int col) { + this.color = col; + } + + @Override + public boolean canResize() { + return true; + } + + public void setColor(int col) { + this.color = col; + } + + @Override + public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + ScreenDrawing.coloredRect(matrices, x, y, this.getWidth(), this.getHeight(), color); + } + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/TextFieldTestGui.java b/src/testMod/java/io/github/cottonmc/test/client/TextFieldTestGui.java new file mode 100644 index 0000000..ce2a7b6 --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/TextFieldTestGui.java @@ -0,0 +1,20 @@ +package io.github.cottonmc.test.client; + +import net.minecraft.item.Items; +import net.minecraft.text.Text; + +import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription; +import io.github.cottonmc.cotton.gui.widget.WButton; +import io.github.cottonmc.cotton.gui.widget.WGridPanel; +import io.github.cottonmc.cotton.gui.widget.WTextField; +import io.github.cottonmc.cotton.gui.widget.icon.ItemIcon; + +public class TextFieldTestGui extends LightweightGuiDescription { + public TextFieldTestGui() { + WGridPanel grid = (WGridPanel) rootPanel; + WTextField textField = new WTextField(Text.literal("Type something")).setMaxLength(Integer.MAX_VALUE); + grid.add(textField, 0, 0, 6, 1); + grid.add(new WButton(new ItemIcon(Items.BARRIER), Text.literal("Clear")).setOnClick(() -> textField.setText("")), 0, 2, 6, 1); + rootPanel.validate(this); + } +} diff --git a/src/testMod/java/io/github/cottonmc/test/client/WHudTest.java b/src/testMod/java/io/github/cottonmc/test/client/WHudTest.java new file mode 100644 index 0000000..98f4d0f --- /dev/null +++ b/src/testMod/java/io/github/cottonmc/test/client/WHudTest.java @@ -0,0 +1,25 @@ +package io.github.cottonmc.test.client; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.util.math.MatrixStack; + +import io.github.cottonmc.cotton.gui.client.ScreenDrawing; +import io.github.cottonmc.cotton.gui.widget.WWidget; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +@Environment(EnvType.CLIENT) +public class WHudTest extends WWidget { + private static final Logger LOGGER = LogManager.getLogger(); + + @Override + public void paint(MatrixStack matrices, int x, int y, int mouseX, int mouseY) { + ScreenDrawing.coloredRect(matrices, x, y, width, height, 0xFF_00FF00); + } + + @Override + public void tick() { + LOGGER.debug("tick!"); + } +} diff --git a/src/testMod/resources/assets/libgui-test/icon.png b/src/testMod/resources/assets/libgui-test/icon.png new file mode 100644 index 0000000..4286522 Binary files /dev/null and b/src/testMod/resources/assets/libgui-test/icon.png differ diff --git a/src/testMod/resources/assets/libgui-test/portal.png b/src/testMod/resources/assets/libgui-test/portal.png new file mode 100644 index 0000000..cf64bcc Binary files /dev/null and b/src/testMod/resources/assets/libgui-test/portal.png differ diff --git a/src/testMod/resources/assets/libgui-test/portal2.png b/src/testMod/resources/assets/libgui-test/portal2.png new file mode 100644 index 0000000..3a1c211 Binary files /dev/null and b/src/testMod/resources/assets/libgui-test/portal2.png differ diff --git a/src/testMod/resources/assets/libgui-test/saddle.png b/src/testMod/resources/assets/libgui-test/saddle.png new file mode 100644 index 0000000..84394b9 Binary files /dev/null and b/src/testMod/resources/assets/libgui-test/saddle.png differ diff --git a/src/testMod/resources/fabric.mod.json b/src/testMod/resources/fabric.mod.json new file mode 100644 index 0000000..2b6adc8 --- /dev/null +++ b/src/testMod/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "libgui-test", + "version": "1", + "name": "LibGui Test", + "description": "Some example Guis to shake out errors", + "authors": [ + "Falkreon" + ], + "contact": { + "sources": "https://github.com/CottonMC/LibGUI" + }, + "license": "MIT", + "icon": "assets/libgui-test/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "io.github.cottonmc.test.LibGuiTest" + ], + "client": [ + "io.github.cottonmc.test.client.LibGuiTestClient" + ] + }, + "depends": { + "fabricloader": ">=0.4.0", + "libgui": "*", + "jankson": "*", + "fabric": "*" + } +} -- cgit