From 9a75033ab1279f04d312c4cd95e8e0a6f1d172ee Mon Sep 17 00:00:00 2001 From: glisco Date: Tue, 29 Mar 2022 19:17:28 +0200 Subject: [PATCH] add prismarine forge, add gui indicator for lava in forge, change deepslate forge controller to use deepslate bricks texture, sort controllers in item group --- gradle.properties | 2 +- .../alloyforgery/AlloyForgeScreenHandler.java | 53 ++----- .../wraith/alloyforgery/AlloyForgery.java | 14 +- .../alloyforgery/AlloyForgeryItemGroup.java | 50 +++++++ .../block/ForgeControllerBlock.java | 63 ++++---- .../block/ForgeControllerBlockEntity.java | 33 ++--- .../block/ImplementedInventory.java | 135 ------------------ .../alloyforgery/client/AlloyForgeScreen.java | 22 ++- .../compat/rei/AlloyForgingDisplay.java | 5 - .../alloyforgery/forges/ForgeRegistry.java | 28 ++-- .../alloyforgery/forges/FuelDataLoader.java | 4 +- .../alloyforgery/recipe/AlloyForgeRecipe.java | 2 +- .../prismarine_bricks_forge_controller.json | 27 ++++ .../assets/alloy_forgery/lang/de_de.json | 1 + .../assets/alloy_forgery/lang/en_pt.json | 1 + .../assets/alloy_forgery/lang/en_us.json | 7 +- .../assets/alloy_forgery/lang/enws.json | 1 + .../assets/alloy_forgery/lang/lol_us.json | 1 + .../prismarine_bricks_forge_controller.json | 8 ++ ...prismarine_bricks_forge_controller_on.json | 6 + .../prismarine_bricks_forge_controller.json | 3 + ...eepslate_bricks_forge_controller_front.png | Bin 316 -> 519 bytes ...slate_bricks_forge_controller_front_on.png | Bin 446 -> 959 bytes ...deepslate_bricks_forge_controller_side.png | Bin 260 -> 379 bytes .../deepslate_bricks_forge_controller_top.png | Bin 260 -> 379 bytes ...ismarine_bricks_forge_controller_front.png | Bin 0 -> 533 bytes ...arine_bricks_forge_controller_front_on.png | Bin 0 -> 906 bytes ...ricks_forge_controller_front_on.png.mcmeta | 6 + ...rismarine_bricks_forge_controller_side.png | Bin 0 -> 506 bytes ...prismarine_bricks_forge_controller_top.png | Bin 0 -> 506 bytes .../textures/gui/forge_controller.png | Bin 1223 -> 4522 bytes .../alloy_forges/prismarine_bricks_forge.json | 6 + 32 files changed, 222 insertions(+), 256 deletions(-) create mode 100644 src/main/java/wraith/alloyforgery/AlloyForgeryItemGroup.java delete mode 100644 src/main/java/wraith/alloyforgery/block/ImplementedInventory.java create mode 100644 src/main/resources/assets/alloy_forgery/blockstates/prismarine_bricks_forge_controller.json create mode 100644 src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller.json create mode 100644 src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller_on.json create mode 100644 src/main/resources/assets/alloy_forgery/models/item/prismarine_bricks_forge_controller.json create mode 100644 src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front.png create mode 100644 src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front_on.png create mode 100644 src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front_on.png.mcmeta create mode 100644 src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_side.png create mode 100644 src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_top.png create mode 100644 src/main/resources/data/alloy_forgery/alloy_forges/prismarine_bricks_forge.json diff --git a/gradle.properties b/gradle.properties index cd03096..fe0a948 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,7 +21,7 @@ rei_version=8.0.438 modmenu_version=3.0.1 # https://github.com/glisco03/owo-lib -owo_version=0.5.4+1.18 +owo_version=0.6.0+1.18 # https://modrinth.com/mod/lithium lithium_version=mc1.18.2-0.7.9 diff --git a/src/main/java/wraith/alloyforgery/AlloyForgeScreenHandler.java b/src/main/java/wraith/alloyforgery/AlloyForgeScreenHandler.java index 3412082..ca9a08c 100644 --- a/src/main/java/wraith/alloyforgery/AlloyForgeScreenHandler.java +++ b/src/main/java/wraith/alloyforgery/AlloyForgeScreenHandler.java @@ -1,5 +1,6 @@ package wraith.alloyforgery; +import io.wispforest.owo.client.screens.ScreenUtils; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; @@ -9,6 +10,7 @@ import net.minecraft.screen.PropertyDelegate; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; +import wraith.alloyforgery.block.ForgeControllerBlockEntity; import wraith.alloyforgery.forges.ForgeFuelRegistry; public class AlloyForgeScreenHandler extends ScreenHandler { @@ -17,7 +19,7 @@ public class AlloyForgeScreenHandler extends ScreenHandler { private final PropertyDelegate propertyDelegate; public AlloyForgeScreenHandler(int syncId, PlayerInventory inventory) { - this(syncId, inventory, new SimpleInventory(12), new ArrayPropertyDelegate(2)); + this(syncId, inventory, new SimpleInventory(ForgeControllerBlockEntity.INVENTORY_SIZE), new ArrayPropertyDelegate(3)); } public AlloyForgeScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory, PropertyDelegate propertyDelegate) { @@ -27,10 +29,8 @@ public AlloyForgeScreenHandler(int syncId, PlayerInventory playerInventory, Inve this.propertyDelegate = propertyDelegate; this.addProperties(propertyDelegate); - int m, l; - //Fuel Slot - this.addSlot(new Slot(controllerInventory, 11, 8, 58) { + this.addSlot(new Slot(controllerInventory, 11, 8, 74) { @Override public boolean canInsert(ItemStack stack) { return ForgeFuelRegistry.hasFuel(stack.getItem()); @@ -38,7 +38,7 @@ public boolean canInsert(ItemStack stack) { }); //Recipe Output - this.addSlot(new Slot(controllerInventory, 10, 145, 34) { + this.addSlot(new Slot(controllerInventory, 10, 145, 50) { @Override public boolean canInsert(ItemStack stack) { return false; @@ -46,47 +46,18 @@ public boolean canInsert(ItemStack stack) { }); //Recipe Inputs - for (m = 0; m < 2; m++) { - for (l = 0; l < 5; l++) { - this.addSlot(new Slot(controllerInventory, l + m * 5, 44 + l * 18, 27 + m * 18)); + for (int m = 0; m < 2; m++) { + for (int l = 0; l < 5; l++) { + this.addSlot(new Slot(controllerInventory, l + m * 5, 44 + l * 18, 43 + m * 18)); } } - //Player inventory - for (m = 0; m < 3; ++m) { - for (l = 0; l < 9; ++l) { - this.addSlot(new Slot(playerInventory, l + m * 9 + 9, 8 + l * 18, 91 + m * 18)); - } - } - //Player Hotbar - for (m = 0; m < 9; ++m) { - this.addSlot(new Slot(playerInventory, m, 8 + m * 18, 149)); - } + ScreenUtils.generatePlayerSlots(8, 107, playerInventory, this::addSlot); } @Override public ItemStack transferSlot(PlayerEntity player, int invSlot) { - ItemStack newStack = ItemStack.EMPTY; - Slot slot = this.slots.get(invSlot); - if (slot.hasStack()) { - ItemStack originalStack = slot.getStack(); - newStack = originalStack.copy(); - if (invSlot < this.controllerInventory.size()) { - if (!this.insertItem(originalStack, this.controllerInventory.size(), this.slots.size(), true)) { - return ItemStack.EMPTY; - } - } else if (!this.insertItem(originalStack, 0, this.controllerInventory.size(), false)) { - return ItemStack.EMPTY; - } - - if (originalStack.isEmpty()) { - slot.setStack(ItemStack.EMPTY); - } else { - slot.markDirty(); - } - } - - return newStack; + return ScreenUtils.handleSlotTransfer(this, invSlot, this.controllerInventory.size()); } public int getSmeltProgress() { @@ -97,6 +68,10 @@ public int getFuelProgress() { return propertyDelegate.get(1); } + public int getLavaProgress() { + return propertyDelegate.get(2); + } + @Override public boolean canUse(PlayerEntity player) { return this.controllerInventory.canPlayerUse(player); diff --git a/src/main/java/wraith/alloyforgery/AlloyForgery.java b/src/main/java/wraith/alloyforgery/AlloyForgery.java index d21e91c..90795fb 100644 --- a/src/main/java/wraith/alloyforgery/AlloyForgery.java +++ b/src/main/java/wraith/alloyforgery/AlloyForgery.java @@ -1,18 +1,15 @@ package wraith.alloyforgery; +import io.wispforest.owo.itemgroup.OwoItemGroup; import io.wispforest.owo.moddata.ModDataLoader; import io.wispforest.owo.particles.ClientParticles; import io.wispforest.owo.particles.systems.ParticleSystem; import io.wispforest.owo.particles.systems.ParticleSystemController; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.particle.ParticleTypes; import net.minecraft.resource.ResourceType; import net.minecraft.screen.ScreenHandlerType; @@ -30,7 +27,7 @@ public class AlloyForgery implements ModInitializer { public static final String MOD_ID = "alloy_forgery"; - public static ItemGroup ALLOY_FORGERY_GROUP; + public static final OwoItemGroup ALLOY_FORGERY_GROUP = new AlloyForgeryItemGroup(id("alloy_forgery")); public static BlockEntityType FORGE_CONTROLLER_BLOCK_ENTITY; public static ScreenHandlerType ALLOY_FORGE_SCREEN_HANDLER_TYPE; @@ -45,12 +42,11 @@ public class AlloyForgery implements ModInitializer { @Override @SuppressWarnings("UnstableApiUsage") public void onInitialize() { - ALLOY_FORGERY_GROUP = FabricItemGroupBuilder.create(id("alloy_forgery")).icon(() -> new ItemStack(Items.BRICKS)).build(); ALLOY_FORGE_SCREEN_HANDLER_TYPE = ScreenHandlerRegistry.registerSimple(id("alloy_forge"), AlloyForgeScreenHandler::new); - ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new FuelDataLoader()); + ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(FuelDataLoader.INSTANCE); - ModDataLoader.load(new ForgeRegistry.Loader()); + ModDataLoader.load(ForgeRegistry.Loader.INSTANCE); FORGE_CONTROLLER_BLOCK_ENTITY = ForgeControllerBlockEntity.Type.INSTANCE; Registry.register(Registry.BLOCK_ENTITY_TYPE, id("forge_controller"), FORGE_CONTROLLER_BLOCK_ENTITY); @@ -58,6 +54,8 @@ public void onInitialize() { Registry.register(Registry.RECIPE_TYPE, AlloyForgeRecipe.Type.ID, AlloyForgeRecipe.Type.INSTANCE); Registry.register(Registry.RECIPE_SERIALIZER, AlloyForgeRecipe.Type.ID, AlloyForgeRecipeSerializer.INSTANCE); + + ALLOY_FORGERY_GROUP.initialize(); } public static Identifier id(String path) { diff --git a/src/main/java/wraith/alloyforgery/AlloyForgeryItemGroup.java b/src/main/java/wraith/alloyforgery/AlloyForgeryItemGroup.java new file mode 100644 index 0000000..f153d82 --- /dev/null +++ b/src/main/java/wraith/alloyforgery/AlloyForgeryItemGroup.java @@ -0,0 +1,50 @@ +package wraith.alloyforgery; + +import io.wispforest.owo.itemgroup.OwoItemGroup; +import io.wispforest.owo.itemgroup.gui.ItemGroupButton; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.DefaultedList; +import wraith.alloyforgery.block.ForgeControllerBlock; +import wraith.alloyforgery.forges.ForgeRegistry; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class AlloyForgeryItemGroup extends OwoItemGroup { + + private List controllerCache = null; + + protected AlloyForgeryItemGroup(Identifier id) { + super(id); + } + + @Override + public ItemStack createIcon() { + return this.controllerCache.isEmpty() ? Items.BRICKS.getDefaultStack() : this.controllerCache.get(0); + } + + @Override + public void appendStacks(DefaultedList stacks) { + if (controllerCache == null) this.createControllerCache(); + stacks.addAll(this.controllerCache); + } + + private void createControllerCache() { + final var blockList = new ArrayList<>(ForgeRegistry.getControllerBlocks()); + blockList.sort(Comparator.comparingInt(value -> ((ForgeControllerBlock) value).forgeDefinition.forgeTier())); + + this.controllerCache = new ArrayList<>(blockList.size()); + blockList.forEach(block -> this.controllerCache.add(block.asItem().getDefaultStack())); + } + + @Override + protected void setup() { + this.addButton(ItemGroupButton.github("https://github.com/LordDeatHunter/Alloy-Forgery")); + this.addButton(ItemGroupButton.curseforge("https://www.curseforge.com/minecraft/mc-mods/alloy-forgery")); + this.addButton(ItemGroupButton.modrinth("https://modrinth.com/mod/alloy-forgery")); + this.addButton(ItemGroupButton.discord("https://discord.gg/Pa5wDVm8Xv")); + } +} diff --git a/src/main/java/wraith/alloyforgery/block/ForgeControllerBlock.java b/src/main/java/wraith/alloyforgery/block/ForgeControllerBlock.java index 569bd7d..81d175c 100644 --- a/src/main/java/wraith/alloyforgery/block/ForgeControllerBlock.java +++ b/src/main/java/wraith/alloyforgery/block/ForgeControllerBlock.java @@ -10,7 +10,6 @@ import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.particle.ParticleTypes; -import net.minecraft.screen.NamedScreenHandlerFactory; import net.minecraft.state.StateManager; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; @@ -44,43 +43,26 @@ public ForgeControllerBlock(ForgeDefinition forgeDefinition) { this.setDefaultState(this.getStateManager().getDefaultState().with(LIT, false)); } - @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(LIT, FACING); - } - - @Nullable - @Override - public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { - return world.isClient ? null : checkType(type, AlloyForgery.FORGE_CONTROLLER_BLOCK_ENTITY, (world1, pos, state1, blockEntity) -> blockEntity.tick()); - } - @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!world.isClient) { final var playerStack = player.getStackInHand(hand); final var fuelDefinition = ForgeFuelRegistry.getFuelForItem(playerStack.getItem()); - final var controller = (ForgeControllerBlockEntity) world.getBlockEntity(pos); + if (!(world.getBlockEntity(pos) instanceof ForgeControllerBlockEntity controller)) return ActionResult.PASS; if (fuelDefinition.hasReturnType() && controller.canAddFuel(fuelDefinition.fuel())) { - if (!player.getAbilities().creativeMode) + if (!player.getAbilities().creativeMode) { player.setStackInHand(hand, new ItemStack(fuelDefinition.returnType())); + } controller.addFuel(fuelDefinition.fuel()); } else { - if (!controller.verifyMultiblock()) { player.sendMessage(new TranslatableText("message.alloy_forgery.invalid_multiblock").formatted(Formatting.GRAY), true); return ActionResult.SUCCESS; } - NamedScreenHandlerFactory screenHandlerFactory = state.createScreenHandlerFactory(world, pos); - + final var screenHandlerFactory = state.createScreenHandlerFactory(world, pos); if (screenHandlerFactory != null) { player.openHandledScreen(screenHandlerFactory); } @@ -91,18 +73,13 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt return ActionResult.SUCCESS; } - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return getDefaultState().with(FACING, ctx.getPlayerFacing().getOpposite()); - } - @Override public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { if (state.getBlock() != newState.getBlock()) { - final var forgeController = (ForgeControllerBlockEntity) world.getBlockEntity(pos); - ItemScatterer.spawn(world, pos, forgeController); - ItemScatterer.spawn(world, pos.getX(), pos.getY(), pos.getZ(), forgeController.getFuelStack()); + if (world.getBlockEntity(pos) instanceof ForgeControllerBlockEntity forgeController) { + ItemScatterer.spawn(world, pos, forgeController); + ItemScatterer.spawn(world, pos.getX(), pos.getY(), pos.getZ(), forgeController.getFuelStack()); + } super.onStateReplaced(state, world, pos, newState, moved); } } @@ -128,9 +105,31 @@ public void randomDisplayTick(BlockState state, World world, BlockPos pos, Rando } } + @Override + public BlockRenderType getRenderType(BlockState state) { + return BlockRenderType.MODEL; + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(LIT, FACING); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { + return world.isClient ? null : checkType(type, AlloyForgery.FORGE_CONTROLLER_BLOCK_ENTITY, (world1, pos, state1, blockEntity) -> blockEntity.tick()); + } + + @Nullable + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + return getDefaultState().with(FACING, ctx.getPlayerFacing().getOpposite()); + } + @Override public int getComparatorOutput(BlockState state, World world, BlockPos pos) { - final var controller = (ForgeControllerBlockEntity) world.getBlockEntity(pos); + if (!(world.getBlockEntity(pos) instanceof ForgeControllerBlockEntity controller)) return 0; return controller.getCurrentSmeltTime() == 0 ? 0 : Math.max(1, Math.round(controller.getSmeltProgress() * 0.46875f)); } diff --git a/src/main/java/wraith/alloyforgery/block/ForgeControllerBlockEntity.java b/src/main/java/wraith/alloyforgery/block/ForgeControllerBlockEntity.java index effb857..02d0b48 100644 --- a/src/main/java/wraith/alloyforgery/block/ForgeControllerBlockEntity.java +++ b/src/main/java/wraith/alloyforgery/block/ForgeControllerBlockEntity.java @@ -2,6 +2,7 @@ import com.google.common.collect.ImmutableList; import io.wispforest.owo.ops.ItemOps; +import io.wispforest.owo.util.ImplementedInventory; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants; import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant; import net.fabricmc.fabric.api.transfer.v1.storage.StorageView; @@ -47,7 +48,8 @@ public class ForgeControllerBlockEntity extends BlockEntity implements Implement private static final int[] RIGHT_SLOTS = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; private static final int[] LEFT_SLOTS = new int[]{11}; - private final DefaultedList items = DefaultedList.ofSize(12, ItemStack.EMPTY); + public static final int INVENTORY_SIZE = 12; + private final DefaultedList items = DefaultedList.ofSize(INVENTORY_SIZE, ItemStack.EMPTY); private final FluidHolder fluidHolder = new FluidHolder(); private final ForgeDefinition forgeDefinition; @@ -59,6 +61,7 @@ public class ForgeControllerBlockEntity extends BlockEntity implements Implement private int smeltProgress; private int fuelProgress; + private int lavaProgress; public ForgeControllerBlockEntity(BlockPos pos, BlockState state) { super(AlloyForgery.FORGE_CONTROLLER_BLOCK_ENTITY, pos, state); @@ -68,24 +71,22 @@ public ForgeControllerBlockEntity(BlockPos pos, BlockState state) { multiblockPositions = generateMultiblockPositions(pos.toImmutable(), state.get(ForgeControllerBlock.FACING)); } - private final PropertyDelegate PROPERTIES = new PropertyDelegate() { + private final PropertyDelegate properties = new PropertyDelegate() { @Override public int get(int index) { - return index == 0 ? smeltProgress : fuelProgress; + return switch (index) { + case 0 -> smeltProgress; + case 1 -> fuelProgress; + default -> lavaProgress; + }; } @Override - public void set(int index, int value) { - if (index == 0) { - smeltProgress = value; - } else { - fuelProgress = value; - } - } + public void set(int index, int value) {} @Override public int size() { - return 2; + return 3; } }; @@ -142,8 +143,9 @@ public int getCurrentSmeltTime() { public void tick() { this.smeltProgress = Math.round((this.currentSmeltTime / (float) forgeDefinition.maxSmeltTime()) * 19); this.fuelProgress = Math.round((this.fuel / (float) forgeDefinition.fuelCapacity()) * 48); + this.lavaProgress = Math.round((this.fluidHolder.getAmount() / (float) FluidConstants.BUCKET) * 50); - world.updateComparators(pos, Blocks.AIR); + world.updateComparators(pos, getCachedState().getBlock()); if (!verifyMultiblock()) { this.currentSmeltTime = 0; @@ -239,7 +241,6 @@ public void tick() { @SuppressWarnings("BooleanMethodIsAlwaysInverted") public boolean verifyMultiblock() { - final BlockState belowController = world.getBlockState(multiblockPositions.get(0)); if (!(belowController.isOf(Blocks.HOPPER) || forgeDefinition.isBlockValid(belowController.getBlock()))) return false; @@ -252,9 +253,7 @@ public boolean verifyMultiblock() { } public static ImmutableList generateMultiblockPositions(BlockPos controllerPos, Direction controllerFacing) { - final List posses = new ArrayList<>(); - final BlockPos center = controllerPos.offset(controllerFacing.getOpposite()); for (BlockPos pos : BlockPos.iterate(center.add(1, -1, 1), center.add(-1, -1, -1))) { @@ -265,7 +264,6 @@ public static ImmutableList generateMultiblockPositions(BlockPos contr posses.add(0, controllerPos.down()); for (int i = 0; i < 2; i++) { - final var newCenter = center.add(0, i, 0); posses.add(newCenter.east()); @@ -275,7 +273,6 @@ public static ImmutableList generateMultiblockPositions(BlockPos contr } posses.remove(controllerPos); - return ImmutableList.copyOf(posses); } @@ -310,7 +307,7 @@ public Text getDisplayName() { @Nullable @Override public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { - return new AlloyForgeScreenHandler(syncId, inv, this, PROPERTIES); + return new AlloyForgeScreenHandler(syncId, inv, this, properties); } @Override diff --git a/src/main/java/wraith/alloyforgery/block/ImplementedInventory.java b/src/main/java/wraith/alloyforgery/block/ImplementedInventory.java deleted file mode 100644 index 93f5020..0000000 --- a/src/main/java/wraith/alloyforgery/block/ImplementedInventory.java +++ /dev/null @@ -1,135 +0,0 @@ -package wraith.alloyforgery.block; - -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventories; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.collection.DefaultedList; - -/** - * A simple {@code Inventory} implementation with only default methods + an item list getter. - *

- * Originally by Juuz - */ -public interface ImplementedInventory extends Inventory { - - /** - * Retrieves the item list of this inventory. - * Must return the same instance every time it's called. - */ - DefaultedList getItems(); - - /** - * Creates an inventory from the item list. - */ - static ImplementedInventory of(DefaultedList items) { - return () -> items; - } - - /** - * Creates a new inventory with the specified size. - */ - static ImplementedInventory ofSize(int size) { - return of(DefaultedList.ofSize(size, ItemStack.EMPTY)); - } - - /** - * Returns the inventory size. - */ - @Override - default int size() { - return getItems().size(); - } - - /** - * Checks if the inventory is empty. - * - * @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; - } - - /** - * Retrieves the item in the slot. - */ - @Override - default ItemStack getStack(int slot) { - return getItems().get(slot); - } - - /** - * Removes items from an inventory slot. - * - * @param slot The slot to remove from. - * @param count How many items to remove. If there are less items in the slot than what are requested, - * takes all items in that slot. - */ - @Override - default ItemStack removeStack(int slot, int count) { - ItemStack result = Inventories.splitStack(getItems(), slot, count); - if (!result.isEmpty()) { - markDirty(); - } - return result; - } - - /** - * Removes all items from an inventory slot. - * - * @param slot The slot to remove from. - */ - @Override - default ItemStack removeStack(int slot) { - return Inventories.removeStack(getItems(), slot); - } - - /** - * Replaces the current stack in an inventory slot with the provided stack. - * - * @param slot The inventory slot of which to replace the itemstack. - * @param stack The replacing itemstack. If the stack is too big for - * this inventory ({@link Inventory#getMaxCountPerStack()}), - * it gets resized to this inventory's maximum amount. - */ - @Override - default void setStack(int slot, ItemStack stack) { - getItems().set(slot, stack); - if (stack.getCount() > getMaxCountPerStack()) { - stack.setCount(getMaxCountPerStack()); - } - } - - /** - * Clears the inventory. - */ - @Override - default void clear() { - getItems().clear(); - } - - /** - * Marks the state as dirty. - * Must be called after changes in the inventory, so that the game can properly save - * the inventory contents and notify neighboring blocks of inventory changes. - */ - @Override - default void markDirty() { - // Override if you want behavior. - } - - /** - * @return true if the player can use the inventory, false otherwise. - */ - @Override - default boolean canPlayerUse(PlayerEntity player) { - return true; - } -} \ No newline at end of file diff --git a/src/main/java/wraith/alloyforgery/client/AlloyForgeScreen.java b/src/main/java/wraith/alloyforgery/client/AlloyForgeScreen.java index fd4d21b..1b407bd 100644 --- a/src/main/java/wraith/alloyforgery/client/AlloyForgeScreen.java +++ b/src/main/java/wraith/alloyforgery/client/AlloyForgeScreen.java @@ -2,8 +2,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.util.SpriteIdentifier; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.text.Text; import net.minecraft.util.Identifier; import wraith.alloyforgery.AlloyForgeScreenHandler; @@ -12,12 +14,14 @@ public class AlloyForgeScreen extends HandledScreen { private static final Identifier TEXTURE = AlloyForgery.id("textures/gui/forge_controller.png"); + private final SpriteIdentifier lavaSpriteId = new SpriteIdentifier(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, new Identifier("block/lava_still")); public AlloyForgeScreen(AlloyForgeScreenHandler handler, PlayerInventory inventory, Text title) { super(handler, inventory, title); this.backgroundWidth = 176; - this.backgroundHeight = 173; + this.backgroundHeight = 189; this.playerInventoryTitleY = this.backgroundHeight - 93; + this.titleY = this.titleY + 16; } @Override @@ -26,14 +30,26 @@ protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int RenderSystem.setShaderTexture(0, TEXTURE); drawTexture(matrices, this.x, this.y, 0, 0, backgroundWidth, backgroundHeight); - drawTexture(matrices, this.x + 147, this.y + 8, 176, 0, 15, handler.getSmeltProgress()); - drawTexture(matrices, this.x + 5, this.y + 54 - handler.getFuelProgress(), 176, 68 - handler.getFuelProgress(), 22, handler.getFuelProgress()); + drawTexture(matrices, this.x + 147, this.y + 24, 176, 0, 15, handler.getSmeltProgress()); + drawTexture(matrices, this.x + 5, this.y + 70 - handler.getFuelProgress(), 176, 68 - handler.getFuelProgress(), 22, handler.getFuelProgress()); for (int i = 2; i < 12; i++) { final var slot = handler.slots.get(i); if (!slot.hasStack()) continue; drawTexture(matrices, this.x + slot.x - 1, this.y + slot.y - 1, 208, 0, 18, 18); } + + var lavaSprite = lavaSpriteId.getSprite(); + RenderSystem.setShaderTexture(0, PlayerScreenHandler.BLOCK_ATLAS_TEXTURE); + + final var fullFrames = this.handler.getLavaProgress() / 16; + for (int i = 0; i < fullFrames; i++) { + drawTexture(matrices, this.x + 63 + i * 16, this.y + 4, lavaSprite.getX(), lavaSprite.getY() + 2, + 16, 10, 1024, 1024); + } + + drawTexture(matrices, this.x + 63 + fullFrames * 16, this.y + 4, lavaSprite.getX(), lavaSprite.getY() + 2, + (this.handler.getLavaProgress() - fullFrames * 16), 10, 1024, 1024); } public int rootX() { diff --git a/src/main/java/wraith/alloyforgery/compat/rei/AlloyForgingDisplay.java b/src/main/java/wraith/alloyforgery/compat/rei/AlloyForgingDisplay.java index 0b392da..260539d 100644 --- a/src/main/java/wraith/alloyforgery/compat/rei/AlloyForgingDisplay.java +++ b/src/main/java/wraith/alloyforgery/compat/rei/AlloyForgingDisplay.java @@ -22,7 +22,6 @@ public class AlloyForgingDisplay implements Display { public final Map overrides; public AlloyForgingDisplay(AlloyForgeRecipe recipe) { - this.inputs = recipe.getIngredients().stream().map(EntryIngredients::ofIngredient).toList(); this.output = EntryIngredients.of(recipe.getOutput()); @@ -32,10 +31,6 @@ public AlloyForgingDisplay(AlloyForgeRecipe recipe) { this.overrides = recipe.getTierOverrides(); } - public Map getOverrides() { - return overrides; - } - @Override public List getInputEntries() { return inputs; diff --git a/src/main/java/wraith/alloyforgery/forges/ForgeRegistry.java b/src/main/java/wraith/alloyforgery/forges/ForgeRegistry.java index f457524..a305553 100644 --- a/src/main/java/wraith/alloyforgery/forges/ForgeRegistry.java +++ b/src/main/java/wraith/alloyforgery/forges/ForgeRegistry.java @@ -25,6 +25,18 @@ public class ForgeRegistry { private static final Set CONTROLLER_BLOCKS = new HashSet<>(); private static final Set CONTROLLER_BLOCKS_VIEW = Collections.unmodifiableSet(CONTROLLER_BLOCKS); + static void registerDefinition(Identifier forgeDefinitionId, ForgeDefinition definition) { + final var controllerBlock = new ForgeControllerBlock(definition); + final var controllerBlockRegistryId = AlloyForgery.id(Registry.BLOCK.getId(definition.material()).getPath() + "_forge_controller"); + + Registry.register(Registry.BLOCK, controllerBlockRegistryId, controllerBlock); + Registry.register(Registry.ITEM, controllerBlockRegistryId, new ForgeControllerItem(controllerBlock, new Item.Settings().group(AlloyForgery.ALLOY_FORGERY_GROUP))); + + TagInjector.injectBlocks(MINEABLE_PICKAXE, controllerBlock); + + store(forgeDefinitionId, definition, controllerBlock); + } + public static Optional getForgeDefinition(Identifier id) { return FORGE_DEFINITION_REGISTRY.containsKey(id) ? Optional.of(FORGE_DEFINITION_REGISTRY.get(id)) : Optional.empty(); } @@ -45,18 +57,6 @@ public static Set controllerBlocksView() { return CONTROLLER_BLOCKS_VIEW; } - static void registerDefinition(Identifier forgeDefinitionId, ForgeDefinition definition) { - final var controllerBlock = new ForgeControllerBlock(definition); - final var controllerBlockRegistryId = AlloyForgery.id(Registry.BLOCK.getId(definition.material()).getPath() + "_forge_controller"); - - Registry.register(Registry.BLOCK, controllerBlockRegistryId, controllerBlock); - Registry.register(Registry.ITEM, controllerBlockRegistryId, new ForgeControllerItem(controllerBlock, new Item.Settings().group(AlloyForgery.ALLOY_FORGERY_GROUP))); - - TagInjector.injectBlocks(MINEABLE_PICKAXE, controllerBlock); - - store(forgeDefinitionId, definition, controllerBlock); - } - private static void store(Identifier id, ForgeDefinition definition, ForgeControllerBlock block) { FORGE_DEFINITION_REGISTRY.put(id, definition); CONTROLLER_BLOCK_REGISTRY.put(id, block); @@ -65,6 +65,10 @@ private static void store(Identifier id, ForgeDefinition definition, ForgeContro public static final class Loader implements ModDataConsumer { + public static final Loader INSTANCE = new Loader(); + + private Loader() {} + @Override public String getDataSubdirectory() { return "alloy_forges"; diff --git a/src/main/java/wraith/alloyforgery/forges/FuelDataLoader.java b/src/main/java/wraith/alloyforgery/forges/FuelDataLoader.java index 1d8ba98..c2fd151 100644 --- a/src/main/java/wraith/alloyforgery/forges/FuelDataLoader.java +++ b/src/main/java/wraith/alloyforgery/forges/FuelDataLoader.java @@ -14,7 +14,9 @@ public class FuelDataLoader extends JsonDataLoader implements IdentifiableResourceReloadListener { - public FuelDataLoader() { + public static final FuelDataLoader INSTANCE = new FuelDataLoader(); + + private FuelDataLoader() { super(new Gson(), "alloy_forge_fuels"); } diff --git a/src/main/java/wraith/alloyforgery/recipe/AlloyForgeRecipe.java b/src/main/java/wraith/alloyforgery/recipe/AlloyForgeRecipe.java index f175eb1..dfec6ca 100644 --- a/src/main/java/wraith/alloyforgery/recipe/AlloyForgeRecipe.java +++ b/src/main/java/wraith/alloyforgery/recipe/AlloyForgeRecipe.java @@ -107,7 +107,7 @@ public ImmutableMap getTierOverrides() { return tierOverrides; } - public static record OverrideRange(int lowerBound, int upperBound) { + public record OverrideRange(int lowerBound, int upperBound) { public OverrideRange(int lowerBound) { this(lowerBound, -1); diff --git a/src/main/resources/assets/alloy_forgery/blockstates/prismarine_bricks_forge_controller.json b/src/main/resources/assets/alloy_forgery/blockstates/prismarine_bricks_forge_controller.json new file mode 100644 index 0000000..90e33eb --- /dev/null +++ b/src/main/resources/assets/alloy_forgery/blockstates/prismarine_bricks_forge_controller.json @@ -0,0 +1,27 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller", + "y": 90 + },"facing=east,lit=true": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller_on", + "y": 90 + },"facing=north,lit=false": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller" + },"facing=north,lit=true": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller_on" + },"facing=south,lit=false": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller", + "y": 180 + },"facing=south,lit=true": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller_on", + "y": 180 + },"facing=west,lit=false": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller", + "y": 270 + },"facing=west,lit=true": { + "model": "alloy_forgery:block/prismarine_bricks_forge_controller_on", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/alloy_forgery/lang/de_de.json b/src/main/resources/assets/alloy_forgery/lang/de_de.json index e907445..d61b5f2 100644 --- a/src/main/resources/assets/alloy_forgery/lang/de_de.json +++ b/src/main/resources/assets/alloy_forgery/lang/de_de.json @@ -4,6 +4,7 @@ "block.alloy_forgery.deepslate_bricks_forge_controller": "Schmelzensteuerung (Tiefenschieferziegel)", "block.alloy_forgery.end_stone_bricks_forge_controller": "Schmelzensteuerung (Endstein)", "block.alloy_forgery.polished_blackstone_forge_controller": "Schmelzensteuerung (Polierter Schwarzstein)", + "block.alloy_forgery.prismarine_bricks_forge_controller": "Schmelzensteuerung (Prismarinziegel)", "tooltip.alloy_forgery.forge_tier": "Stufe: %d", "tooltip.alloy_forgery.fuel_capacity": "Brennstoffkapazität: %d", diff --git a/src/main/resources/assets/alloy_forgery/lang/en_pt.json b/src/main/resources/assets/alloy_forgery/lang/en_pt.json index 4191821..3e6d665 100644 --- a/src/main/resources/assets/alloy_forgery/lang/en_pt.json +++ b/src/main/resources/assets/alloy_forgery/lang/en_pt.json @@ -4,6 +4,7 @@ "block.alloy_forgery.deepslate_bricks_forge_controller": "Metal Forgery o' Bricks o' tough rock", "block.alloy_forgery.end_stone_bricks_forge_controller": "Metal Forgery o' Foreign Stone Bricks", "block.alloy_forgery.polished_blackstone_forge_controller": "Metal Forgery o' Good lookin' Bricks o' Rock o' Black", + "block.alloy_forgery.prismarine_bricks_forge_controller": "Metal Forgery o' Bricks o' Prismarine", "tooltip.alloy_forgery.forge_tier": "Level: %d", "tooltip.alloy_forgery.fuel_capacity": "Fuel Barrel: %d", diff --git a/src/main/resources/assets/alloy_forgery/lang/en_us.json b/src/main/resources/assets/alloy_forgery/lang/en_us.json index ad8a3be..b6e34bd 100644 --- a/src/main/resources/assets/alloy_forgery/lang/en_us.json +++ b/src/main/resources/assets/alloy_forgery/lang/en_us.json @@ -4,6 +4,7 @@ "block.alloy_forgery.deepslate_bricks_forge_controller": "Deepslate Brick Forge Controller", "block.alloy_forgery.end_stone_bricks_forge_controller": "End Stone Brick Forge Controller", "block.alloy_forgery.polished_blackstone_forge_controller": "Polished Blackstone Forge Controller", + "block.alloy_forgery.prismarine_bricks_forge_controller": "Prismarine Bricks Forge Controller", "tooltip.alloy_forgery.forge_tier": "Tier: %d", "tooltip.alloy_forgery.fuel_capacity": "Fuel Capacity: %d", @@ -15,5 +16,9 @@ "container.alloy_forgery.rei.fuel_per_tick": "Fuel per tick: %d", "message.alloy_forgery.invalid_multiblock": "Invalid Multiblock Configuration", - "itemGroup.alloy_forgery.alloy_forgery": "Alloy Forgery" + "itemGroup.alloy_forgery.alloy_forgery": "Alloy Forgery", + "itemGroup.alloy_forgery.alloy_forgery.button.discord": "Discord", + "itemGroup.alloy_forgery.alloy_forgery.button.curseforge": "CurseForge", + "itemGroup.alloy_forgery.alloy_forgery.button.modrinth": "Modrinth", + "itemGroup.alloy_forgery.alloy_forgery.button.github": "GitHub" } \ No newline at end of file diff --git a/src/main/resources/assets/alloy_forgery/lang/enws.json b/src/main/resources/assets/alloy_forgery/lang/enws.json index a6a700b..45bf57a 100644 --- a/src/main/resources/assets/alloy_forgery/lang/enws.json +++ b/src/main/resources/assets/alloy_forgery/lang/enws.json @@ -4,6 +4,7 @@ "block.alloy_forgery.deepslate_bricks_forge_controller": "Mechanical Implement Fabricated of Deepethslate for Incorporating Various Minerals", "block.alloy_forgery.end_stone_bricks_forge_controller": "Mechanical Implement Fabricated of End Stone for Incorporating Various Minerals", "block.alloy_forgery.polished_blackstone_forge_controller": "Mechanical Implement Fabricated of Polish'd Blackstone for Incorporating Various Minerals", + "block.alloy_forgery.prismarine_bricks_forge_controller": "Mechanical Implement Fabricated of Prismarine Bricks for Incorporating Various Minerals", "tooltip.alloy_forgery.forge_tier": "Grade: %d", "tooltip.alloy_forgery.fuel_capacity": "Combustible Archive: %d", diff --git a/src/main/resources/assets/alloy_forgery/lang/lol_us.json b/src/main/resources/assets/alloy_forgery/lang/lol_us.json index 82f5793..3539d53 100644 --- a/src/main/resources/assets/alloy_forgery/lang/lol_us.json +++ b/src/main/resources/assets/alloy_forgery/lang/lol_us.json @@ -4,6 +4,7 @@ "block.alloy_forgery.deepslate_bricks_forge_controller": "dank brick forge control", "block.alloy_forgery.end_stone_bricks_forge_controller": "cat litter briKz control for da forge", "block.alloy_forgery.polished_blackstone_forge_controller": "forge w/ preteh blek stakd rOk", + "block.alloy_forgery.prismarine_bricks_forge_controller": "prismarine brik, but for forg", "tooltip.alloy_forgery.forge_tier": "cat lvl: %d", "tooltip.alloy_forgery.fuel_capacity": "snak storage: %d", diff --git a/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller.json b/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller.json new file mode 100644 index 0000000..01d9453 --- /dev/null +++ b/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller.json @@ -0,0 +1,8 @@ +{ + "parent": "block/orientable", + "textures": { + "top": "alloy_forgery:blocks/prismarine_bricks_forge_controller_top", + "front": "alloy_forgery:blocks/prismarine_bricks_forge_controller_front", + "side": "alloy_forgery:blocks/prismarine_bricks_forge_controller_side" + } +} diff --git a/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller_on.json b/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller_on.json new file mode 100644 index 0000000..bb681b4 --- /dev/null +++ b/src/main/resources/assets/alloy_forgery/models/block/prismarine_bricks_forge_controller_on.json @@ -0,0 +1,6 @@ +{ + "parent": "alloy_forgery:block/prismarine_bricks_forge_controller", + "textures": { + "front": "alloy_forgery:blocks/prismarine_bricks_forge_controller_front_on" + } +} diff --git a/src/main/resources/assets/alloy_forgery/models/item/prismarine_bricks_forge_controller.json b/src/main/resources/assets/alloy_forgery/models/item/prismarine_bricks_forge_controller.json new file mode 100644 index 0000000..123431b --- /dev/null +++ b/src/main/resources/assets/alloy_forgery/models/item/prismarine_bricks_forge_controller.json @@ -0,0 +1,3 @@ +{ + "parent": "alloy_forgery:block/prismarine_bricks_forge_controller" +} \ No newline at end of file diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_front.png b/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_front.png index bef0619527750bee604e664904b0f696cb33eb72..abc68ad44cf6a2052e459ee48ba55476432a81a3 100644 GIT binary patch delta 504 zcmVG|j^Sr@1x uieq+ry=|Y1pSZ2p#uzICAjD=)0R95M>C=SYQ8aV_0000Nn{1`?E`#5T=VksA|fKZef%9A9WBhwb#-+OR1~$96;)JJR23DKrKIJh zq@^UKq=bdUg@r_fgoOEc1$lY-d3ks^Ik@XNIZ|DJy8_K>^K@|xskkM3x;4>Nk%#qy z@XFu+vaeMhm|n4tp)gl5?^l(}8eNwQcglACHT0~H`lf&X!0{DAM^qDZG~*A5?mhkL z#{Wj%YnQIIFtG34Ty6N}>~=Y)_Pw32PibuoOTTvb@6nCgoNm4AzcL%AJ_)uD3Aq!; u+c-N^0;Ap#2I6!GU9s9FUp| z(h71Z5^z9jRt?&<8lE z+qMC)EQ|B=b5f;JNjaxk-xVwyTFhrz7Q*)dNJ-~UKRm@10fQ?6K+pFv3q=5yw6qEi zUWH|OZ4DeJ1h6a%R|K3KW`Qi_TAq~lh@p4_K&#pfgKBvI^5$s>04x9q->0CbY19oB zFceQ{RlBsRU4P{VINlp_fAw|MUa)PO;%j&L?f2)gamu$wgQd^zT+(j0LxASl8P3HE za=NYpWRNURElbt6c3l=T8rgCGlsBGDEu(R2SpaOBCXKqG+R`M5p$%v|4w|NsI668S z0etiIR{$i_ODdqCX8>?Tfa~^nqjU#=jvsLF@kiko$bUVs{r-n)z2!Q$9f$q>{TutF z?+WEhNr$vwe|)OynNj#}85%VW1M!qT=G3<7+wN2hzqvZ0}8a|$5w-pDZ|an|E-66HRaG$Din z0njvUYQNO_`Z~9W4?e$ZvbF1~ypN4_%n!$VLq7fG=jnVPO{T4^x2j#5kE_ZT<%2|} zQW^DKLH)aL`Qoj&fiPvIMblW?2Vb@+-djZoL4T@wb_SsMAQ}|4M%_>#k`IIsH~C<5 zoG6oAAUOi&d@$#ODFC;S4-QTg=JhzWM>HQ-DcABh_#g#wKA02}VY{m8Tf1<-H$xw6 z?YdL-z+`&Q)CYeT94({zAX!*h`D`#4KrqDgJWRvj`Li_l)`FP8usn}f?G*sNe>tEp z{(qeFfdrWI!T*8}q%LSxyHn2#F+MmrNyW55xt5RV0{Lv_dEt0(7?b+Q8yr> z4=wCZJtt3-0n2NGb;2mA$Q WdVWUjGQPF|0000VGd0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0000^P)t-s|NE!=@;2XbCT?zSSXfxBGBQg{PeDOJ zej6J&H#aRUEifb@D_w$zKlOa2is|#t!M8r~=+%r31 z>zwbLW;TWcvQmm6M%ehPJ!EbrC8Q8S(9nw1#^4CorU;qrmU=(g1kHPML-N{zcD%imEKf)(3=SL5TTnh(}fWgD= zL3!lLBRRJ5csN)*pnD(zlLw$;d5|RAc(kZq0+>8hWGLw6SUqxk+y^&Dy#F80|HHra ZashrkD9@(eNi_ff002ovPDHLkV1n;~r@#OJ diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_side.png b/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_side.png index 7b7c19b86b50fbfe782b76cd69c0e1ed7a4ddf81..917e6da885702056d5d0e62b38a6091d9f085e2f 100644 GIT binary patch delta 364 zcmV-y0h9iO0{a4x7=H)`0000V^Z#K00004VQb$4nuFf3k0003sNkl?S0Mxd zM1O>B!4HyDWP#dEh^Ap|a$3&-P;zc{I^ z(fke}EPUSLq-A7dXMs|_ZnDp7iO7PD1xO`4YbPvc_U0>$Q=)&|7blh{gb*@ZhrN3u zvoa`3pGyj1=D;?wyvBj5EL^V*P;yefTWu9LnqcOj>w92kVXZGx?D7;elkac<0000< KMNUMnLSTXy?WfuR delta 244 zcmey()WS4DqMn7Bfq~)e-A6${inG8YvY3H^?=T269?xHq0u*E{4sv&5Sa(k5C6L3C z?&#~tz_78O`%fY(kS`kG6XKeemlqKc;qBw^=;&x+Zmz4VtD>UPv_A4IP(g*Ki(^Q| zEm>c4p+g1&G0W%KI;}NWw*B0zleUh(7=QiG72c7!?H11h#F`|98Ea)>S;&f!WHJ(yY9U= rKg(+Ju>NAOmjeHd>zDSe-6p?zlCY54-qQ_0M=*H0`njxgN@xNAR#acg diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_top.png b/src/main/resources/assets/alloy_forgery/textures/blocks/deepslate_bricks_forge_controller_top.png index 7b7c19b86b50fbfe782b76cd69c0e1ed7a4ddf81..917e6da885702056d5d0e62b38a6091d9f085e2f 100644 GIT binary patch delta 364 zcmV-y0h9iO0{a4x7=H)`0000V^Z#K00004VQb$4nuFf3k0003sNkl?S0Mxd zM1O>B!4HyDWP#dEh^Ap|a$3&-P;zc{I^ z(fke}EPUSLq-A7dXMs|_ZnDp7iO7PD1xO`4YbPvc_U0>$Q=)&|7blh{gb*@ZhrN3u zvoa`3pGyj1=D;?wyvBj5EL^V*P;yefTWu9LnqcOj>w92kVXZGx?D7;elkac<0000< KMNUMnLSTXy?WfuR delta 244 zcmey()WS4DqMn7Bfq~)e-A6${inG8YvY3H^?=T269?xHq0u*E{4sv&5Sa(k5C6L3C z?&#~tz_78O`%fY(kS`kG6XKeemlqKc;qBw^=;&x+Zmz4VtD>UPv_A4IP(g*Ki(^Q| zEm>c4p+g1&G0W%KI;}NWw*B0zleUh(7=QiG72c7!?H11h#F`|98Ea)>S;&f!WHJ(yY9U= rKg(+Ju>NAOmjeHd>zDSe-6p?zlCY54-qQ_0M=*H0`njxgN@xNAR#acg diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front.png b/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front.png new file mode 100644 index 0000000000000000000000000000000000000000..55ddfc489ea6bde75b078f38e7e7161b4b1b26e7 GIT binary patch literal 533 zcmV+w0_y#VP)Px$&q+i3@%)B0Nj86k|@zw1|1;S+N>OCBk|vs(xhU#z>%n72y#Y6NcDcISKn;ea zH!_uyvpKVxRFm8>U1b5x06W3PKRVcsxOmEELV(J|>K`89h8{m#O#s%eg!B&&fb2&y z4bwzp8FA`vNc1P-@|}mJ&SNzIpzelrk6U!QzgV8fZAY;5=Px&L`g(JR9J=Wn9pkyK@`V7mI>DFs)d9uY7pxW6p>I23ieLsoqaXW+wh?6u%ViSw7UI@G$Y1qWalJZk=L(4ZL)&;!{7AyGLNB?#PkFw; zxrs|GESI%Uz32Kq073=4dNLI_Vj`62;lumLrqum6l_~(oFJ7kH@DVCIzynzT3CYPp z#HQ=WZ+8JG~mWO$ZvNkNXFOz6;(GO z>%N&BfH8CpM8e*}it8eql4loA;#I0lwF2z1ln$OTSEni2oJc_F9U^WGum~I;pP*EH z&G`#gSXeIWzh$m_V|kI0L&x;=0Yueb)h|G>?#g6S^0}k9@uTCoUY!-!rP=U(Tlu?X zffsD$rI*v#PMr611po$<4ofemf#4vi0hlxg18qGXtQ#IET~Nx^BEJ_xJUBZo zLfRlXIT+Ff>Nl}z4IbpPGNcFc*!wr1`8woc`DM2WI=P?hn@T{rUYt gj|ZW||1l4K0&2G9cfrT6`v3p{07*qoM6N<$f>%MMEdT%j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front_on.png.mcmeta b/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front_on.png.mcmeta new file mode 100644 index 0000000..b2e2153 --- /dev/null +++ b/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_front_on.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_side.png b/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_side.png new file mode 100644 index 0000000000000000000000000000000000000000..3de6a0476fa495fffe39dd90b6dd0a39217d2758 GIT binary patch literal 506 zcmVPx$v`IukR5*=ol0R?LP!z>~wGugcq(unJ#9Py)OdUIPs~UA=s95<5OneEx3_B7l zfiWr|H4=~vNKUL9q1euqqYP!R-^+99o8G(kymQX|bMW@#hx^kw;juH#QlkD5&&`uo ze5D(t%(72$1pXa}bjA?;HmGpMZ>sN1>W~qx=oTviOd8leZkug+*wzE(bY3`9R zq?Hm_cKbP0r4VrnE8V#Kwjl;6q^1fio2c?K9&i{%Y>gpQQ< z8o=cHmsZV|Xn1^5J6P$am9({{w_`3xH!T+ySBN;VK+2r3Nm#(TTyiPSai6!wa2Q23fxjeGHsk7i#57A0Rp-c( ztji_Cw$v3lVme?iVRkrJ|m@9hbj2>vHJ`3lTS^K+4=btb(r? zHuqjU{BJM1J+pVPH3rJsLFkp^lRq0ItaRgIyGrSZDpfY)Y5xW3BIPb#K(mRqv4G3Z w`o9UAlDa*^!S(xh_m<7tdidT|`e+>B9~C(W*G5Zk@c;k-07*qoM6N<$f(Eee-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_top.png b/src/main/resources/assets/alloy_forgery/textures/blocks/prismarine_bricks_forge_controller_top.png new file mode 100644 index 0000000000000000000000000000000000000000..3de6a0476fa495fffe39dd90b6dd0a39217d2758 GIT binary patch literal 506 zcmVPx$v`IukR5*=ol0R?LP!z>~wGugcq(unJ#9Py)OdUIPs~UA=s95<5OneEx3_B7l zfiWr|H4=~vNKUL9q1euqqYP!R-^+99o8G(kymQX|bMW@#hx^kw;juH#QlkD5&&`uo ze5D(t%(72$1pXa}bjA?;HmGpMZ>sN1>W~qx=oTviOd8leZkug+*wzE(bY3`9R zq?Hm_cKbP0r4VrnE8V#Kwjl;6q^1fio2c?K9&i{%Y>gpQQ< z8o=cHmsZV|Xn1^5J6P$am9({{w_`3xH!T+ySBN;VK+2r3Nm#(TTyiPSai6!wa2Q23fxjeGHsk7i#57A0Rp-c( ztji_Cw$v3lVme?iVRkrJ|m@9hbj2>vHJ`3lTS^K+4=btb(r? zHuqjU{BJM1J+pVPH3rJsLFkp^lRq0ItaRgIyGrSZDpfY)Y5xW3BIPb#K(mRqv4G3Z w`o9UAlDa*^!S(xh_m<7tdidT|`e+>B9~C(W*G5Zk@c;k-07*qoM6N<$f(Eee-T(jq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/alloy_forgery/textures/gui/forge_controller.png b/src/main/resources/assets/alloy_forgery/textures/gui/forge_controller.png index 745b1915c8ea7c8f6864ddc0c909400c582f3aef..1d8c472a1ad88a0c2beb187666e84e1ef55fee4c 100644 GIT binary patch literal 4522 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 PcoP{RSIEwVYO?