summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.gradle105
-rw-r--r--src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java15
-rw-r--r--src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java114
-rw-r--r--src/main/java/moe/nea/funnyteleporters/ColouredChestConfigGUI.java91
4 files changed, 262 insertions, 63 deletions
diff --git a/build.gradle b/build.gradle
index c9c1124..e57aacc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,89 +1,90 @@
plugins {
- id 'fabric-loom' version '1.8-SNAPSHOT'
- id 'maven-publish'
+ id 'fabric-loom' version '1.8-SNAPSHOT'
+ id 'maven-publish'
}
version = project.mod_version
group = project.maven_group
base {
- archivesName = project.archives_base_name
+ archivesName = project.archives_base_name
}
repositories {
- // Add repositories to retrieve artifacts from in here.
- // You should only use this when depending on other mods because
- // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
- // See https://docs.gradle.org/current/userguide/declaring_repositories.html
- // for more information about repositories.
- maven { url 'https://maven.nucleoid.xyz' }
+ // Add repositories to retrieve artifacts from in here.
+ // You should only use this when depending on other mods because
+ // Loom adds the essential maven repositories to download Minecraft and libraries from automatically.
+ // See https://docs.gradle.org/current/userguide/declaring_repositories.html
+ // for more information about repositories.
+ maven { url 'https://maven.nucleoid.xyz' }
}
loom {
- splitEnvironmentSourceSets()
+ splitEnvironmentSourceSets()
- mods {
- "funny-teleporters" {
- sourceSet sourceSets.main
- sourceSet sourceSets.client
- }
- }
+ mods {
+ "funny-teleporters" {
+ sourceSet sourceSets.main
+ sourceSet sourceSets.client
+ }
+ }
}
dependencies {
- // To change the versions see the gradle.properties file
- minecraft "com.mojang:minecraft:${project.minecraft_version}"
- mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
- modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
-
- // Fabric API. This is technically optional, but you probably want it anyway.
- modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
- modImplementation include("eu.pb4:polymer-core:0.9.9+1.21")
+ // To change the versions see the gradle.properties file
+ minecraft "com.mojang:minecraft:${project.minecraft_version}"
+ mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
+ modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
+
+ // Fabric API. This is technically optional, but you probably want it anyway.
+ modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
+ modImplementation include("eu.pb4:polymer-core:0.9.9+1.21")
+ modImplementation include("eu.pb4:sgui:1.6.0+1.21")
}
processResources {
- inputs.property "version", project.version
+ inputs.property "version", project.version
- filesMatching("fabric.mod.json") {
- expand "version": project.version
- }
+ filesMatching("fabric.mod.json") {
+ expand "version": project.version
+ }
}
tasks.withType(JavaCompile).configureEach {
- it.options.release = 21
+ it.options.release = 21
}
java {
- // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
- // if it is present.
- // If you remove this line, sources will not be generated.
- withSourcesJar()
+ // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
+ // if it is present.
+ // If you remove this line, sources will not be generated.
+ withSourcesJar()
- sourceCompatibility = JavaVersion.VERSION_21
- targetCompatibility = JavaVersion.VERSION_21
+ sourceCompatibility = JavaVersion.VERSION_21
+ targetCompatibility = JavaVersion.VERSION_21
}
jar {
- from("LICENSE") {
- rename { "${it}_${project.base.archivesName.get()}"}
- }
+ from("LICENSE") {
+ rename { "${it}_${project.base.archivesName.get()}" }
+ }
}
// configure the maven publication
publishing {
- publications {
- create("mavenJava", MavenPublication) {
- artifactId = project.archives_base_name
- from components.java
- }
- }
-
- // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
- repositories {
- // Add repositories to publish to here.
- // Notice: This block does NOT have the same function as the block in the top level.
- // The repositories here will be used for publishing your artifact, not for
- // retrieving dependencies.
- }
+ publications {
+ create("mavenJava", MavenPublication) {
+ artifactId = project.archives_base_name
+ from components.java
+ }
+ }
+
+ // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
+ repositories {
+ // Add repositories to publish to here.
+ // Notice: This block does NOT have the same function as the block in the top level.
+ // The repositories here will be used for publishing your artifact, not for
+ // retrieving dependencies.
+ }
}
diff --git a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java
index eb68f95..cf756e0 100644
--- a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java
+++ b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlock.java
@@ -2,15 +2,11 @@ package moe.nea.funnyteleporters;
import com.mojang.serialization.MapCodec;
import eu.pb4.polymer.core.api.block.PolymerBlock;
-import net.minecraft.block.AbstractBlock;
import net.minecraft.block.AbstractChestBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
-import net.minecraft.block.ChestBlock;
import net.minecraft.block.DoubleBlockProperties;
-import net.minecraft.block.EnderChestBlock;
-import net.minecraft.block.FacingBlock;
import net.minecraft.block.HorizontalFacingBlock;
import net.minecraft.block.Waterloggable;
import net.minecraft.block.entity.BlockEntity;
@@ -20,10 +16,10 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids;
import net.minecraft.item.ItemPlacementContext;
+import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.state.StateManager;
import net.minecraft.state.property.Properties;
import net.minecraft.state.property.Property;
-import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.BlockMirror;
import net.minecraft.util.BlockRotation;
@@ -33,6 +29,8 @@ import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import net.minecraft.world.WorldAccess;
+import java.util.Objects;
+
public class ColouredChestBlock extends AbstractChestBlock<ColouredChestBlockEntity> implements PolymerBlock, Waterloggable {
static Property<Direction> FACING = HorizontalFacingBlock.FACING;
static Property<Boolean> WATERLOGGED = Properties.WATERLOGGED;
@@ -62,9 +60,10 @@ public class ColouredChestBlock extends AbstractChestBlock<ColouredChestBlockEnt
@Override
protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) {
- // TODO: create a ui or something to configure frequency
- player.sendMessage(Text.literal("Ender Chest geƶffnet" + player));
- return super.onUse(state, world, pos, player, hit);
+ if (player instanceof ServerPlayerEntity serverPlayer) {
+ ((ColouredChestBlockEntity) Objects.requireNonNull(world.getBlockEntity(pos))).openScreen(serverPlayer);
+ }
+ return ActionResult.SUCCESS_NO_ITEM_USED;
}
@Override
diff --git a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
index e26aea1..ba09c5e 100644
--- a/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
+++ b/src/main/java/moe/nea/funnyteleporters/ColouredChestBlockEntity.java
@@ -1,12 +1,36 @@
package moe.nea.funnyteleporters;
-import net.minecraft.block.Block;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.DataResult;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.block.BlockState;
+import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
-import net.minecraft.block.entity.ChestBlockEntity;
+import net.minecraft.entity.player.PlayerEntity;
+import net.minecraft.inventory.Inventories;
+import net.minecraft.inventory.Inventory;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtOps;
+import net.minecraft.registry.RegistryWrapper;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.collection.DefaultedList;
import net.minecraft.util.math.BlockPos;
-public class ColouredChestBlockEntity extends ChestBlockEntity {
+import java.util.List;
+
+public class ColouredChestBlockEntity extends BlockEntity implements Inventory {
+ private DefaultedList<ItemStack> inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY);
+
+ public record ExtraData(
+ List<DyeColor> frequency
+ ) {
+ public static Codec<ExtraData> CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ DyeColor.CODEC.listOf().validate(it -> it.size() == 3 ? DataResult.success(it) : (it.size() > 3 ? DataResult.error(() -> "List " + it + "too long", it.subList(0, 3)) : DataResult.error(() -> "List " + it + " too short"))).fieldOf("frequency").forGetter(ExtraData::frequency)
+ ).apply(instance, ExtraData::new));
+ }
+
public ColouredChestBlockEntity(BlockPos blockPos, BlockState blockState) {
this(FunnyRegistry.COLOURED_CHEST_ENTITY, blockPos, blockState);
}
@@ -14,4 +38,88 @@ public class ColouredChestBlockEntity extends ChestBlockEntity {
protected ColouredChestBlockEntity(BlockEntityType<?> blockEntityType, BlockPos blockPos, BlockState blockState) {
super(blockEntityType, blockPos, blockState);
}
+
+ @Override
+ protected void writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
+ super.writeNbt(nbt, registryLookup);
+ Inventories.writeNbt(nbt, inventory, registryLookup);
+ var result = ExtraData.CODEC.encodeStart(NbtOps.INSTANCE, extra);
+ if (result.hasResultOrPartial()) {
+ nbt.put("extra", result.getPartialOrThrow());
+ }
+ }
+
+ ExtraData extra = new ExtraData(List.of(DyeColor.BLUE, DyeColor.BLUE, DyeColor.BLUE));
+
+ public int size() {
+ return 27;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ for (ItemStack itemStack : inventory) {
+ if (!itemStack.isEmpty()) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public ItemStack getStack(int slot) {
+ if (0 <= slot && slot < size())
+ return inventory.get(slot);
+ return ItemStack.EMPTY;
+ }
+
+ @Override
+ public ItemStack removeStack(int slot, int amount) {
+ ItemStack itemStack = Inventories.splitStack(this.inventory, slot, amount);
+ if (!itemStack.isEmpty()) {
+ markDirty();
+ }
+
+ return itemStack;
+ }
+
+ @Override
+ public ItemStack removeStack(int slot) {
+ markDirty();
+ return Inventories.removeStack(inventory, slot);
+ }
+
+ @Override
+ public void setStack(int slot, ItemStack stack) {
+ if (0 <= slot && slot < size()) {
+ markDirty();
+ inventory.set(slot, stack);
+ }
+ }
+
+ @Override
+ public boolean canPlayerUse(PlayerEntity player) {
+ return true;
+ }
+
+ @Override
+ protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) {
+ super.readNbt(nbt, registryLookup);
+ inventory = DefaultedList.ofSize(size(), ItemStack.EMPTY);
+ Inventories.readNbt(nbt, inventory, registryLookup);
+ if (nbt.contains("extra")) {
+ var extra = ExtraData.CODEC.decode(NbtOps.INSTANCE, nbt.get("extra"));
+ if (extra.hasResultOrPartial()) {
+ this.extra = extra.getPartialOrThrow().getFirst();
+ }
+ }
+ }
+
+ @Override
+ public void clear() {
+ markDirty();
+ inventory.clear();
+ }
+
+ public void openScreen(ServerPlayerEntity player) {
+ new ColouredChestConfigGUI(this, player).open();
+ }
}
+
diff --git a/src/main/java/moe/nea/funnyteleporters/ColouredChestConfigGUI.java b/src/main/java/moe/nea/funnyteleporters/ColouredChestConfigGUI.java
new file mode 100644
index 0000000..8c1aff8
--- /dev/null
+++ b/src/main/java/moe/nea/funnyteleporters/ColouredChestConfigGUI.java
@@ -0,0 +1,91 @@
+package moe.nea.funnyteleporters;
+
+import com.google.common.collect.ImmutableList;
+import eu.pb4.sgui.api.ClickType;
+import eu.pb4.sgui.api.elements.GuiElementInterface;
+import eu.pb4.sgui.api.gui.SimpleGui;
+import net.minecraft.component.DataComponentTypes;
+import net.minecraft.item.DyeItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraft.screen.ScreenHandlerType;
+import net.minecraft.screen.slot.SlotActionType;
+import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.text.Style;
+import net.minecraft.text.Text;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.math.MathHelper;
+
+import java.util.ArrayList;
+import java.util.Collections;
+
+public class ColouredChestConfigGUI extends SimpleGui {
+
+ private final ColouredChestBlockEntity blockEntity;
+
+ public ColouredChestConfigGUI(ColouredChestBlockEntity blockEntity, ServerPlayerEntity player) {
+ super(ScreenHandlerType.GENERIC_3X3, player, false);
+ setTitle(Text.literal("Funny Enderchest"));
+ this.blockEntity = blockEntity;
+ this.updateFromBlockEntity();
+ }
+
+ ItemStack createUpItem(int frequency, String direction) {
+ var is = new ItemStack(Items.ARROW);
+ is.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Frequency " + frequency + " " + direction).setStyle(Style.EMPTY.withItalic(false).withColor(Formatting.AQUA)));
+ return is;
+ }
+
+ private ItemStack createFrequencyItem(int frequency, DyeColor dyeColor) {
+ var is = new ItemStack(DyeItem.byColor(dyeColor));
+ is.set(DataComponentTypes.CUSTOM_NAME, Text.literal("Frequency " + frequency + ": " + dyeColor.getId()).setStyle(Style.EMPTY.withItalic(false).withColor(dyeColor.getSignColor())));
+ return is;
+ }
+
+ @Override
+ public boolean onClick(int index, ClickType type, SlotActionType action, GuiElementInterface element) {
+ if (index == 0)
+ cycleColour(0, 1);
+ else if (index == 6)
+ cycleColour(0, -1);
+ else if (index == 1)
+ cycleColour(1, 1);
+ else if (index == 7)
+ cycleColour(1, -1);
+ else if (index == 2)
+ cycleColour(2, 1);
+ else if (index == 8)
+ cycleColour(2, -1);
+ else return super.onClick(index, type, action, element);
+ return false;
+ }
+
+ void cycleColour(int frequencyIndex, int direction) {
+ var newList = new ArrayList<>(blockEntity.extra.frequency());
+ newList.set(frequencyIndex, cycleColour(newList.get(frequencyIndex), direction));
+ blockEntity.extra = new ColouredChestBlockEntity.ExtraData(Collections.unmodifiableList(newList));
+ updateFromBlockEntity();
+ blockEntity.markDirty();
+ }
+
+ private DyeColor cycleColour(DyeColor dyeColor, int direction) {
+ return DyeColor.values()[MathHelper.floorMod(dyeColor.ordinal() + direction, DyeColor.values().length)];
+ }
+
+ public void updateFromBlockEntity() {
+ setSlot(0, createUpItem(0, "up"));
+ setSlot(3, createFrequencyItem(0, blockEntity.extra.frequency().get(0)));
+ setSlot(6, createUpItem(0, "down"));
+
+ setSlot(1, createUpItem(1, "up"));
+ setSlot(4, createFrequencyItem(1, blockEntity.extra.frequency().get(1)));
+ setSlot(7, createUpItem(1, "down"));
+
+ setSlot(2, createUpItem(2, "up"));
+ setSlot(5, createFrequencyItem(2, blockEntity.extra.frequency().get(2)));
+ setSlot(8, createUpItem(2, "down"));
+ }
+
+
+}