From 63243e254d9856c830eb078c5401c0c58e1163fc Mon Sep 17 00:00:00 2001 From: Sollace Date: Mon, 20 Nov 2023 22:30:21 +0000 Subject: [PATCH] Added the shaping bench --- .../unicopia/block/UBlocks.java | 2 + .../block/cloud/ShapingBenchBlock.java | 41 ++++++ .../block/cloud/UnstableCloudBlock.java | 4 + .../unicopia/client/UnicopiaClient.java | 2 + .../client/gui/ShapingBenchScreen.java | 12 ++ .../container/ShapingBenchScreenHandler.java | 96 +++++++++++++ .../unicopia/container/UScreenHandlers.java | 2 + .../unicopia/item/URecipes.java | 5 + .../item/cloud/CloudShapingRecipe.java | 32 +++++ .../unicopia/blockstates/shaping_bench.json | 7 + .../resources/assets/unicopia/lang/en_us.json | 3 +- .../unicopia/models/block/shaping_bench.json | 130 ++++++++++++++++++ .../unicopia/models/item/shaping_bench.json | 3 + .../textures/block/shaping_bench_bottom.png | Bin 0 -> 653 bytes .../textures/block/shaping_bench_inside.png | Bin 0 -> 655 bytes .../textures/block/shaping_bench_rim.png | Bin 0 -> 403 bytes .../textures/block/shaping_bench_side.png | Bin 0 -> 654 bytes .../textures/block/shaping_bench_top.png | Bin 0 -> 623 bytes .../blocks/carving/carved_cloud_cutting.json | 6 + .../carving/cloud_brick_slab_cutting.json | 6 + .../carving/cloud_brick_stairs_cutting.json | 6 + .../blocks/carving/cloud_bricks_cutting.json | 6 + .../blocks/carving/cloud_pillar_cutting.json | 6 + .../carving/cloud_plank_slab_cutting.json | 6 + .../carving/cloud_plank_stairs_cutting.json | 6 + .../blocks/carving/cloud_planks_cutting.json | 6 + .../blocks/carving/cloud_slab_cutting.json | 6 + .../blocks/carving/cloud_stairs_cutting.json | 6 + .../carving/dense_cloud_slab_cutting.json | 6 + .../carving/dense_cloud_stairs_cutting.json | 6 + .../carving/unstable_cloud_cutting.json | 6 + .../recipes/blocks/shaping_bench.json | 13 ++ 32 files changed, 429 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java create mode 100644 src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java create mode 100644 src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java create mode 100644 src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java create mode 100644 src/main/resources/assets/unicopia/blockstates/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/models/block/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/models/item/shaping_bench.json create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png create mode 100644 src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/carved_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_brick_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_brick_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_bricks_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_pillar_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_plank_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_plank_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_planks_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/cloud_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/dense_cloud_slab_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/dense_cloud_stairs_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/carving/unstable_cloud_cutting.json create mode 100644 src/main/resources/data/unicopia/recipes/blocks/shaping_bench.json diff --git a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java index 889676c5..078f267d 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java +++ b/src/main/java/com/minelittlepony/unicopia/block/UBlocks.java @@ -12,6 +12,7 @@ import com.minelittlepony.unicopia.block.cloud.CompactedCloudBlock; import com.minelittlepony.unicopia.block.cloud.NaturalCloudBlock; import com.minelittlepony.unicopia.block.cloud.OrientedCloudBlock; import com.minelittlepony.unicopia.block.cloud.PoreousCloudStairsBlock; +import com.minelittlepony.unicopia.block.cloud.ShapingBenchBlock; import com.minelittlepony.unicopia.block.cloud.CloudBedBlock; import com.minelittlepony.unicopia.block.cloud.CloudBlock; import com.minelittlepony.unicopia.block.cloud.SoggyCloudBlock; @@ -147,6 +148,7 @@ public interface UBlocks { Block MYSTERIOUS_EGG = register("mysterious_egg", new PileBlock(Settings.copy(Blocks.SLIME_BLOCK), PileBlock.MYSTERIOUS_EGG_SHAPES), ItemGroups.NATURAL); Block SLIME_PUSTULE = register("slime_pustule", new SlimePustuleBlock(Settings.copy(Blocks.SLIME_BLOCK)), ItemGroups.NATURAL); + Block SHAPING_BENCH = register("shaping_bench", new ShapingBenchBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL)), ItemGroups.FUNCTIONAL); Block CLOUD = register("cloud", new NaturalCloudBlock(Settings.create().mapColor(MapColor.OFF_WHITE).hardness(0.3F).resistance(0).sounds(BlockSoundGroup.WOOL), true, () -> UBlocks.SOGGY_CLOUD, () -> UBlocks.COMPACTED_CLOUD), ItemGroups.NATURAL); diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java new file mode 100644 index 00000000..624836d9 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/ShapingBenchBlock.java @@ -0,0 +1,41 @@ +package com.minelittlepony.unicopia.block.cloud; + +import org.jetbrains.annotations.Nullable; + +import com.minelittlepony.unicopia.container.ShapingBenchScreenHandler; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.screen.NamedScreenHandlerFactory; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.SimpleNamedScreenHandlerFactory; +import net.minecraft.stat.Stats; +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 ShapingBenchBlock extends CloudBlock { + public ShapingBenchBlock(Settings settings) { + super(settings, false); + } + + @Override + public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (world.isClient) { + return ActionResult.SUCCESS; + } + player.openHandledScreen(state.createScreenHandlerFactory(world, pos)); + player.incrementStat(Stats.INTERACT_WITH_STONECUTTER); + return ActionResult.CONSUME; + } + + @Override + @Nullable + public NamedScreenHandlerFactory createScreenHandlerFactory(BlockState state, World world, BlockPos pos) { + return new SimpleNamedScreenHandlerFactory((syncId, playerInventory, player) -> { + return new ShapingBenchScreenHandler(syncId, playerInventory, ScreenHandlerContext.create(world, pos)); + }, getName()); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java index 554e20b6..30bf49c4 100644 --- a/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java +++ b/src/main/java/com/minelittlepony/unicopia/block/cloud/UnstableCloudBlock.java @@ -59,6 +59,10 @@ public class UnstableCloudBlock extends CloudBlock { } world.playSound(null, pos, SoundEvents.BLOCK_WOOL_HIT, SoundCategory.BLOCKS, 1, 1); + if (world.isClient) { + return; + } + if (fallDistance > 3) { world.breakBlock(pos, true); return; diff --git a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java index fc89eaa0..32b01a8e 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java +++ b/src/main/java/com/minelittlepony/unicopia/client/UnicopiaClient.java @@ -11,6 +11,7 @@ import com.minelittlepony.unicopia.InteractionManager; import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.client.gui.LanSettingsScreen; +import com.minelittlepony.unicopia.client.gui.ShapingBenchScreen; import com.minelittlepony.unicopia.client.gui.UHud; import com.minelittlepony.unicopia.client.gui.spellbook.SpellbookScreen; import com.minelittlepony.unicopia.client.minelittlepony.MineLPDelegate; @@ -101,6 +102,7 @@ public class UnicopiaClient implements ClientModInitializer { URenderers.bootstrap(); HandledScreens.register(UScreenHandlers.SPELL_BOOK, SpellbookScreen::new); + HandledScreens.register(UScreenHandlers.SHAPING_BENCH, ShapingBenchScreen::new); ClientTickEvents.END_CLIENT_TICK.register(this::onTick); ClientTickEvents.END_WORLD_TICK.register(this::onWorldTick); diff --git a/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java b/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java new file mode 100644 index 00000000..e38e96d7 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/client/gui/ShapingBenchScreen.java @@ -0,0 +1,12 @@ +package com.minelittlepony.unicopia.client.gui; + +import net.minecraft.client.gui.screen.ingame.StonecutterScreen; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.StonecutterScreenHandler; +import net.minecraft.text.Text; + +public class ShapingBenchScreen extends StonecutterScreen { + public ShapingBenchScreen(StonecutterScreenHandler handler, PlayerInventory inventory, Text title) { + super(handler, inventory, title); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java new file mode 100644 index 00000000..3ff1ac4a --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/ShapingBenchScreenHandler.java @@ -0,0 +1,96 @@ +package com.minelittlepony.unicopia.container; + +import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.item.URecipes; + +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.inventory.Inventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandlerContext; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.screen.StonecutterScreenHandler; +import net.minecraft.screen.slot.Slot; +import net.minecraft.world.World; + +public class ShapingBenchScreenHandler extends StonecutterScreenHandler { + + private final ScreenHandlerContext context; + private final World world; + + private ItemStack inputStack = ItemStack.EMPTY; + + public ShapingBenchScreenHandler(int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { + super(syncId, playerInventory, context); + this.context = context; + this.world = playerInventory.player.getWorld(); + } + + public ShapingBenchScreenHandler(int syncId, PlayerInventory playerInventory) { + super(syncId, playerInventory); + this.context = ScreenHandlerContext.EMPTY; + this.world = playerInventory.player.getWorld(); + } + + @Override + public ScreenHandlerType getType() { + return UScreenHandlers.SHAPING_BENCH; + } + + @Override + public boolean canUse(PlayerEntity player) { + return canUse(context, player, UBlocks.SHAPING_BENCH); + } + + @Override + public void onContentChanged(Inventory inventory) { + ItemStack stack = slots.get(0).getStack(); + if (!stack.isOf(inputStack.getItem())) { + inputStack = stack.copy(); + getAvailableRecipes().clear(); + setProperty(0, -1); + slots.get(1).setStackNoCallbacks(ItemStack.EMPTY); + if (!stack.isEmpty()) { + getAvailableRecipes().addAll(world.getRecipeManager().getAllMatches(URecipes.CLOUD_SHAPING, input, world)); + } + } + } + + @Override + public ItemStack quickMove(PlayerEntity player, int slot) { + ItemStack originalStack = ItemStack.EMPTY; + Slot srcSlot = slots.get(slot); + if (srcSlot != null && srcSlot.hasStack()) { + ItemStack movingStack = srcSlot.getStack(); + Item item = movingStack.getItem(); + originalStack = movingStack.copy(); + if (slot == 1) { + item.onCraft(movingStack, player.getWorld(), player); + if (!insertItem(movingStack, 2, 38, true)) { + return ItemStack.EMPTY; + } + srcSlot.onQuickTransfer(movingStack, originalStack); + } else if (slot == 0 + ? !insertItem(movingStack, 2, 38, false) + : (world.getRecipeManager().getFirstMatch(URecipes.CLOUD_SHAPING, new SimpleInventory(movingStack), world).isPresent() + ? !insertItem(movingStack, 0, 1, false) + : (slot >= 2 && slot < 29 + ? !insertItem(movingStack, 29, 38, false) + : slot >= 29 && slot < 38 && !insertItem(movingStack, 2, 29, false)))) { + return ItemStack.EMPTY; + } + if (movingStack.isEmpty()) { + srcSlot.setStack(ItemStack.EMPTY); + } + srcSlot.markDirty(); + if (movingStack.getCount() == originalStack.getCount()) { + return ItemStack.EMPTY; + } + srcSlot.onTakeItem(player, movingStack); + this.sendContentUpdates(); + } + return originalStack; + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java b/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java index f2fba259..f62a097a 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java +++ b/src/main/java/com/minelittlepony/unicopia/container/UScreenHandlers.java @@ -6,10 +6,12 @@ import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.ScreenHandlerType; import net.minecraft.registry.Registry; +import net.minecraft.resource.featuretoggle.FeatureFlags; import net.minecraft.registry.Registries; public interface UScreenHandlers { ScreenHandlerType SPELL_BOOK = register("spell_book", new ExtendedScreenHandlerType<>(SpellbookScreenHandler::new)); + ScreenHandlerType SHAPING_BENCH = register("shaping_bench", new ScreenHandlerType<>(ShapingBenchScreenHandler::new, FeatureFlags.VANILLA_FEATURES)); static ScreenHandlerType register(String name, ScreenHandlerType type) { return Registry.register(Registries.SCREEN_HANDLER, Unicopia.id(name), type); diff --git a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java index d04d170d..2c0a8573 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/URecipes.java +++ b/src/main/java/com/minelittlepony/unicopia/item/URecipes.java @@ -4,21 +4,25 @@ import java.util.List; import com.google.gson.JsonArray; import com.minelittlepony.unicopia.ability.magic.spell.crafting.*; +import com.minelittlepony.unicopia.item.cloud.CloudShapingRecipe; import net.fabricmc.fabric.api.loot.v2.LootTableEvents; import net.minecraft.loot.LootTable; import net.minecraft.loot.context.LootContextTypes; +import net.minecraft.recipe.CuttingRecipe; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.ShapedRecipe; import net.minecraft.recipe.ShapelessRecipe; import net.minecraft.recipe.SpecialRecipeSerializer; +import net.minecraft.recipe.StonecuttingRecipe; import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; public interface URecipes { RecipeType SPELLBOOK = RecipeType.register("unicopia:spellbook"); + RecipeType CLOUD_SHAPING = RecipeType.register("unicopia:cloud_shaping"); RecipeSerializer ZAP_APPLE_SERIALIZER = RecipeSerializer.register("unicopia:crafting_zap_apple", new ZapAppleRecipe.Serializer()); RecipeSerializer GLOWING_SERIALIZER = RecipeSerializer.register("unicopia:crafting_glowing", new SpecialRecipeSerializer<>(GlowingRecipe::new)); @@ -28,6 +32,7 @@ public interface URecipes { RecipeSerializer TRAIT_REQUIREMENT = RecipeSerializer.register("unicopia:spellbook/crafting", new SpellCraftingRecipe.Serializer()); RecipeSerializer TRAIT_COMBINING = RecipeSerializer.register("unicopia:spellbook/combining", new SpellEnhancingRecipe.Serializer()); RecipeSerializer SPELL_DUPLICATING = RecipeSerializer.register("unicopia:spellbook/duplicating", new SpellDuplicatingRecipe.Serializer()); + RecipeSerializer CLOUD_SHAPING_SERIALIZER = RecipeSerializer.register("unicopia:cloud_shaping", new CuttingRecipe.Serializer<>(CloudShapingRecipe::new) {}); static DefaultedList getIngredients(JsonArray json) { DefaultedList defaultedList = DefaultedList.of(); diff --git a/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java new file mode 100644 index 00000000..c88a5abd --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/cloud/CloudShapingRecipe.java @@ -0,0 +1,32 @@ +package com.minelittlepony.unicopia.item.cloud; + +import com.minelittlepony.unicopia.block.UBlocks; +import com.minelittlepony.unicopia.item.URecipes; + +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.StonecuttingRecipe; +import net.minecraft.util.Identifier; + +public class CloudShapingRecipe extends StonecuttingRecipe { + public CloudShapingRecipe(Identifier id, String group, Ingredient input, ItemStack output) { + super(id, group, input, output); + } + + @Override + public RecipeType getType() { + return URecipes.CLOUD_SHAPING; + } + + @Override + public RecipeSerializer getSerializer() { + return URecipes.CLOUD_SHAPING_SERIALIZER; + } + + @Override + public ItemStack createIcon() { + return new ItemStack(UBlocks.SHAPING_BENCH); + } +} diff --git a/src/main/resources/assets/unicopia/blockstates/shaping_bench.json b/src/main/resources/assets/unicopia/blockstates/shaping_bench.json new file mode 100644 index 00000000..fb0ebd3e --- /dev/null +++ b/src/main/resources/assets/unicopia/blockstates/shaping_bench.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "unicopia:block/shaping_bench" + } + } +} diff --git a/src/main/resources/assets/unicopia/lang/en_us.json b/src/main/resources/assets/unicopia/lang/en_us.json index e66dbb7e..f1dfae00 100644 --- a/src/main/resources/assets/unicopia/lang/en_us.json +++ b/src/main/resources/assets/unicopia/lang/en_us.json @@ -270,7 +270,8 @@ "block.unicopia.chiselled_chitin_hull": "Chiselled Chitin Hull", "block.unicopia.chiselled_chitin_slab": "Chiselled Chitin Slab", "block.unicopia.chiselled_chitin_stairs": "Chiselled Chitin Stairs", - + + "block.unicopia.shaping_bench": "Shaping Bench", "block.unicopia.cloud": "Cloud", "block.unicopia.cloud_slab": "Cloud Slab", "block.unicopia.cloud_stairs": "Cloud Stairs", diff --git a/src/main/resources/assets/unicopia/models/block/shaping_bench.json b/src/main/resources/assets/unicopia/models/block/shaping_bench.json new file mode 100644 index 00000000..55eb5b56 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/block/shaping_bench.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "3": "unicopia:block/shaping_bench_rim", + "4": "unicopia:block/shaping_bench_inside", + "side": "unicopia:block/shaping_bench_side", + "bottom": "unicopia:block/shaping_bench_bottom", + "particle": "unicopia:block/shaping_bench_top", + "top": "unicopia:block/shaping_bench_top" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 4, 16], + "faces": { + "north": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "east": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "south": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "west": {"uv": [0, 12, 16, 16], "texture": "#side"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#3"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#bottom"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 13, 14], + "faces": { + "north": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "east": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "south": {"uv": [2, 3, 14, 12], "texture": "#side"}, + "west": {"uv": [2, 3, 14, 12], "texture": "#side"} + } + }, + { + "from": [2, 16, 2], + "to": [14, 17, 14], + "faces": { + "north": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "east": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "south": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "west": {"uv": [2, 2, 14, 3], "texture": "#top"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#top"} + } + }, + { + "from": [0, 13, 14], + "to": [16, 16, 16], + "faces": { + "east": {"uv": [0, 2, 2, 5], "texture": "#side"}, + "south": {"uv": [0, 2, 16, 5], "texture": "#side"}, + "west": {"uv": [14, 2, 16, 5], "texture": "#side"}, + "up": {"uv": [0, 14, 16, 16], "texture": "#top"}, + "down": {"uv": [0, 0, 16, 2], "texture": "#3"} + } + }, + { + "from": [0, 13, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [0, 2, 16, 5], "texture": "#side"}, + "east": {"uv": [14, 2, 16, 5], "texture": "#side"}, + "west": {"uv": [0, 2, 2, 5], "texture": "#side"}, + "up": {"uv": [0, 1, 16, 3], "texture": "#top"}, + "down": {"uv": [0, 14, 16, 16], "texture": "#3"} + } + }, + { + "from": [0, 13, 2], + "to": [2, 16, 14], + "faces": { + "west": {"uv": [2, 2, 14, 5], "texture": "#side"}, + "up": {"uv": [1, 2, 3, 14], "texture": "#top"}, + "down": {"uv": [0, 2, 2, 14], "texture": "#3"} + } + }, + { + "from": [14, 13, 2], + "to": [16, 16, 14], + "faces": { + "east": {"uv": [2, 2, 14, 5], "texture": "#side"}, + "up": {"uv": [13, 2, 15, 14], "texture": "#top"}, + "down": {"uv": [14, 2, 16, 14], "texture": "#3"} + } + }, + { + "from": [13, 16, 0], + "to": [16, 18, 3], + "faces": { + "north": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "east": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "south": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "west": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "up": {"uv": [13, 0, 16, 3], "texture": "#4"} + } + }, + { + "from": [0, 16, 0], + "to": [3, 18, 3], + "faces": { + "north": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "east": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "south": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "west": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "up": {"uv": [0, 0, 3, 3], "texture": "#4"} + } + }, + { + "from": [13, 16, 13], + "to": [16, 18, 16], + "faces": { + "north": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "east": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "south": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "west": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "up": {"uv": [13, 13, 16, 16], "texture": "#4"} + } + }, + { + "from": [0, 16, 13], + "to": [3, 18, 16], + "faces": { + "north": {"uv": [2, 12, 5, 14], "texture": "#top"}, + "east": {"uv": [11, 12, 14, 14], "texture": "#top"}, + "south": {"uv": [0, 0, 3, 2], "texture": "#side"}, + "west": {"uv": [13, 0, 16, 2], "texture": "#side"}, + "up": {"uv": [0, 13, 3, 16], "texture": "#4"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/models/item/shaping_bench.json b/src/main/resources/assets/unicopia/models/item/shaping_bench.json new file mode 100644 index 00000000..4ad37e87 --- /dev/null +++ b/src/main/resources/assets/unicopia/models/item/shaping_bench.json @@ -0,0 +1,3 @@ +{ + "parent": "unicopia:block/shaping_bench" +} \ No newline at end of file diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..c7793827397828ec1579a713df43e232d26bed83 GIT binary patch literal 653 zcmV;80&@L{P)WfFh;kd)px(Nm6pUd2@4~x)tr6e=4xhOu*RC-9=LIi=L0OU%_iilW1L^X)lxYa4BAR8(8Fm@%Qi-RYyF zn<7)Vxw+A8+nR`wl|}*yo|Ppf#Ehw;&E0u?dQ=3CFGn9^@ay+4NOM#daDOslGi2yR}b zRbvh$MFf%4=TpAEzN&w6Bbe}kCL+z7BO=o?a@8!IYeEnoWLWQ=x3@Pv{yLHc5z$5; z6VRqjHs4xRg=*89%-V1Ew*Rrq=3C3iB_{K9I>pn=lP(tGf||B5#;Pi^lD+MsEE)wA zMPMjoWtp0N|NcGCcjxZvfl#gv1yzNrLV=12CMJFKm6^ndN)kcz>-|?-a}g`@dcCgI z*96GQ88a#f9KhU6N&c8AQZ9PDh#>(SumA`n9KLCXpdq+ZsxY zKJxbNmd&@UETRHatM`B3b8owvnAvU=6)^)x;s3kHYo@B=&FR-pYYirAFiJ&PxoqXa z)DRPGdqd`&FBKI(AAh2%NQzoBMjuH53f>$R4gU}ba2!WcAi45IRHCv}5GjhxWR8h8 nU6LYz`TkKr5LPTi1ry^xAl{j>o-HS_00000NkvXXu0mjf%B?UX literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_inside.png new file mode 100644 index 0000000000000000000000000000000000000000..92c9b36d3859cc9973d30934f57c946b1a005488 GIT binary patch literal 655 zcmV;A0&x9_P)Q5+Ea?fgjx8_P0LX2RHxRv}IZD03;&^3M5Z^ z-+NV|s!Trd`u56vn8`JnK207Gtn1p%%np7yQJ`6glrZ|}D(bV(KH205J|AZGeP{YK z0bpiK(qq(%*Z zecu;zb8T9&MVOf*01zX{kv%e)=b5n$D9%A(nMqbM`Q#{L-}XcRfy!dkplPf9eP_Oz zwMlDjZfxtu=mT4RFG4|P>iKl;s*1U>tsCwRo!Hq+MTv|S8LaQCzP!AAxX8@9J>6DT ze#SYA%6VCqvmnRV8-`j+D#< p13?&lAT9`ksX@Wx<0G@r{11y_hNCWG2ciG~002ovPDHLkV1h4xJlOyM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_rim.png new file mode 100644 index 0000000000000000000000000000000000000000..0873c673c58b5124aae7a9c6b7daf962c664c200 GIT binary patch literal 403 zcmV;E0c`$>P) z!EV$*5JX?~^z3qtkg-A(CF1|ThYvuzUdPT6i8bTt=D-0sns;oeo>ZmQ{l|TgX@6he z&*M0TQq0S2!^04%Yy@EFw%krH&o4oT>wLBGaooIk_2NbC-fH{V8X_gROw=Ocn`+a>^u9(%Uq9Zr6#ndxTLve6EAhzQR0 zEMun4rz3*x`!?91;`tB4JegO$v%cV+PMe_gv002ovPDHLkV1jt-!f5~i literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_side.png new file mode 100644 index 0000000000000000000000000000000000000000..5ff82a577901df92daecd47b1062c738c72bdf96 GIT binary patch literal 654 zcmV;90&)F`P)Ub<5JX@9%zPG*MIs4?2w2MfPZiM&MOsSWh2eyp>FLfwQPl;i@T%nbkLSM-qIqjo z1qGtQx-L?3l7J#8-n~OYzI(cPb90lsU+?Vo?R9>6`cjIzm_R~FSyjz>nV6ZnIXE2l zhxPdTqn(Z?e8oat>7P31!&wkk5GV>juGG>ZGXd6Gi{88Nzr3|Z-#QPUA8gDqs|r=6 zx6aRhezJYq$V<|H=@t=oxm>2ZI}0fA^S84IqA_D4Y-WatfIzI6b53q=Hp@1X8lzzQ48IZkG|k@pxSKclYVdn^#p6 zmFenLS~bQHDUtK(Y#E8Vf}$i7Fn32)TkGu#OwW~}OJ%Ofyv`*i1#Gvsx4CT_F#|W} zcs#ao9oN2fcXhh=cAeK!ZCaCA+s)Rtn@zg)mXRSQv#Lr=2m%~LrHwJ7>Yd8gHgSSR zGAW9MVUU&e`t7x?Sj)Skr~=ijG3KDEP*X^7F+oe^IC;W|EcCTW_j5$8}^% z>gjyasv;{<(OP4%wM|XT`qs6m>zWHkK~u>};u86>!rR|&v$aN!jK!+czbB0hiwssS zFtlky4u`|vYpu20?Lt+N5;ZsW&wD8NsP%CFVAAB{6C966r9d+BO;lE8sUT9kBbsBP oO+!)yFyH+B>Iks{QNhIc4+IX06!FuAod5s;07*qoM6N<$g5qI2TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png b/src/main/resources/assets/unicopia/textures/block/shaping_bench_top.png new file mode 100644 index 0000000000000000000000000000000000000000..07c51185175c894e71686c52e35de7c4f62c4a94 GIT binary patch literal 623 zcmV-#0+9WQP)M-l8ANh?n9%5Px$b&q##A` ztCNz002E10Tj~N6q{;oi8T(v-;38t8LcOb`WX;Smt|JQt0;o5M+k(@dCqbBwqbL9| zLsOH80GM;m+s*Jeqi}pV>SnW9GZR&%)yB_XKUwY;;u^HCt-3qc>vdc%mv(qMBncWB zDJje`hlcuRic<+7NhZJV&d8#rj6Qt3+peZIfvlxM zLS~{xA;F{wnks8wJt9hYA#gzjePl6o`m1`&0}u05dCs1PbTN zS?|B!^SFHs1c2hxi5c