diff --git a/src/main/java/mininggadgets/blockentities/ModificationTableBlockEntity.java b/src/main/java/mininggadgets/blockentities/ModificationTableBlockEntity.java index 7c38cca..9899416 100644 --- a/src/main/java/mininggadgets/blockentities/ModificationTableBlockEntity.java +++ b/src/main/java/mininggadgets/blockentities/ModificationTableBlockEntity.java @@ -1,18 +1,48 @@ package mininggadgets.blockentities; +import mininggadgets.init.MGBlockEntities; +import mininggadgets.items.MiningGadget; +import mininggadgets.items.upgrade.Upgrade; +import mininggadgets.items.upgrade.UpgradeTools; import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NbtCompound; import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.util.math.BlockPos; +import reborncore.api.blockentity.InventoryProvider; +import reborncore.client.screen.BuiltScreenHandlerProvider; +import reborncore.client.screen.builder.BuiltScreenHandler; +import reborncore.client.screen.builder.ScreenHandlerBuilder; +import reborncore.common.blockentity.MachineBaseBlockEntity; +import reborncore.common.util.RebornInventory; +import java.util.ArrayList; +import java.util.List; -import static mininggadgets.init.MGContent.MODIFICATIONTABLE_ENTITY; +public class ModificationTableBlockEntity extends MachineBaseBlockEntity implements InventoryProvider, BuiltScreenHandlerProvider { + private final int inventorySize = 2; + + public RebornInventory inventory = new RebornInventory<>(inventorySize, "ModificationTableBlockEntity", 64, this); + public List upgradesCache = new ArrayList<>(); + + public enum Slots { + TOOL(0), + UPGRADE(1); + + private final int id; + + Slots(int number) { + id = number; + } + + public int getId() { + return id; + } + } -public class ModificationTableBlockEntity extends BlockEntity { public ModificationTableBlockEntity(BlockPos pos, BlockState state) { - super(MODIFICATIONTABLE_ENTITY, pos, state); + super(MGBlockEntities.MODIFICATION_TABLE, pos, state); } @Override @@ -40,5 +70,45 @@ public NbtCompound writeNbt(NbtCompound nbt) { return super.writeNbt(nbt); } + @Override + public RebornInventory getInventory() { + return inventory; + } + + @Override + public boolean canBeUpgraded() { + return false; + } + + @Override + public boolean hasSlotConfig() { + return false; + } + + @Override + public BuiltScreenHandler createScreenHandler(int syncID, PlayerEntity player) { + return new ScreenHandlerBuilder("modification_table") + .player(player.getInventory()).inventory().hotbar().addInventory() + .blockEntity(this) + .slot(Slots.TOOL.getId(), -16, 84, this::itemIsGadget) + .addInventory().create(this, syncID); + } + public boolean itemIsGadget(ItemStack itemStack) { + return itemStack.getItem() instanceof MiningGadget; + } + + public void updateUpgradeCache(final int index) { + ItemStack stack = this.getStack(index); + if ((stack.isEmpty() && !upgradesCache.isEmpty()) || !(stack.getItem() instanceof MiningGadget)) { + upgradesCache.clear(); + } else { + upgradesCache.clear(); + upgradesCache = UpgradeTools.getUpgrades(stack); + } + } + + public List getUpgradesCache() { + return upgradesCache; + } } diff --git a/src/main/java/mininggadgets/blocks/GenericMachineBlock.java b/src/main/java/mininggadgets/blocks/GenericMachineBlock.java new file mode 100644 index 0000000..07bdc55 --- /dev/null +++ b/src/main/java/mininggadgets/blocks/GenericMachineBlock.java @@ -0,0 +1,42 @@ +package mininggadgets.blocks; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; +import reborncore.api.blockentity.IMachineGuiHandler; +import reborncore.common.blocks.BlockMachineBase; + +import java.util.function.BiFunction; + +public class GenericMachineBlock extends BlockMachineBase { + + private final IMachineGuiHandler gui; + BiFunction blockEntityClass; + + public GenericMachineBlock(IMachineGuiHandler gui, BiFunction blockEntityClass) { + super(); + this.blockEntityClass = blockEntityClass; + this.gui = gui; + } + + public GenericMachineBlock(Block.Settings settings, IMachineGuiHandler gui, BiFunction blockEntityClass) { + super(settings); + this.blockEntityClass = blockEntityClass; + this.gui = gui; + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + if (blockEntityClass == null) { + return null; + } + return blockEntityClass.apply(pos, state); + } + + + @Override + public IMachineGuiHandler getGui() { + return gui; + } +} diff --git a/src/main/java/mininggadgets/blocks/ModificationTable.java b/src/main/java/mininggadgets/blocks/ModificationTable.java index 1232f8b..f0a16d1 100644 --- a/src/main/java/mininggadgets/blocks/ModificationTable.java +++ b/src/main/java/mininggadgets/blocks/ModificationTable.java @@ -1,38 +1,101 @@ package mininggadgets.blocks; +import mininggadgets.blockentities.ModificationTableBlockEntity; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.BlockState; -import net.minecraft.block.Material; +import net.minecraft.block.*; import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.util.function.BooleanBiFunction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; import net.minecraft.world.World; -import net.minecraft.world.event.listener.GameEventListener; -import org.jetbrains.annotations.Nullable; + +import java.util.stream.Stream; public class ModificationTable extends Block implements BlockEntityProvider { + public static DirectionProperty FACING = HorizontalFacingBlock.FACING; + + private static final VoxelShape SHAPE_N = Stream.of( + Block.createCuboidShape(2, 11, 12, 14, 16, 16), + Block.createCuboidShape(0,0,0,16,10,16), + Block.createCuboidShape(1,10,1,15,11,9), + Block.createCuboidShape(0,10,11,16,11,16), + Block.createCuboidShape(0,11,0,16,12,10), + Block.createCuboidShape(13,12,2,14,13,8) + ).reduce((v1, v2) -> VoxelShapes.combine(v1, v2, BooleanBiFunction.OR)).get(); + + private static final VoxelShape SHAPE_E = Stream.of( + Block.createCuboidShape(0, 11, 2, 4, 16, 14), + Block.createCuboidShape(0, 0, 0, 16, 10, 16), + Block.createCuboidShape(7, 10, 1, 15, 11, 15), + Block.createCuboidShape(0, 10, 0, 5, 11, 16), + Block.createCuboidShape(6, 11, 0, 16, 12, 16), + Block.createCuboidShape(8, 12, 13, 14, 13, 14) + ).reduce((v1, v2) -> VoxelShapes.combine(v1, v2, BooleanBiFunction.OR)).get(); + + private static final VoxelShape SHAPE_S = Stream.of( + Block.createCuboidShape(2, 11, 0, 14, 16, 4), + Block.createCuboidShape(0, 0, 0, 16, 10, 16), + Block.createCuboidShape(1, 10, 7, 15, 11, 15), + Block.createCuboidShape(0, 10, 0, 16, 11, 5), + Block.createCuboidShape(0, 11, 6, 16, 12, 16), + Block.createCuboidShape(2, 12, 8, 3, 13, 14) + ).reduce((v1, v2) -> VoxelShapes.combine(v1, v2, BooleanBiFunction.OR)).get(); + + private static final VoxelShape SHAPE_W = Stream.of( + Block.createCuboidShape(12, 11, 2, 16, 16, 14), + Block.createCuboidShape(0, 0, 0, 16, 10, 16), + Block.createCuboidShape(1, 10, 1, 9, 11, 15), + Block.createCuboidShape(11, 10, 0, 16, 11, 16), + Block.createCuboidShape(0, 11, 0, 10, 12, 16), + Block.createCuboidShape(2, 12, 2, 8, 13, 3) + ).reduce((v1, v2) -> VoxelShapes.combine(v1, v2, BooleanBiFunction.OR)).get(); + public ModificationTable() { super(FabricBlockSettings.of(Material.METAL).strength(2.0f)); + + this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH)); } - @Nullable @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return null; + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return switch (state.get(FACING)) { + case NORTH -> SHAPE_N; + case EAST -> SHAPE_E; + case SOUTH -> SHAPE_S; + case WEST -> SHAPE_W; + default -> throw new IllegalStateException("Invalid State"); + }; } - @Nullable @Override - public BlockEntityTicker getTicker(World world, BlockState state, BlockEntityType type) { - return BlockEntityProvider.super.getTicker(world, state, type); + public BlockState getPlacementState(ItemPlacementContext context) { + return this.getDefaultState().with(FACING, context.getPlayerLookDirection().getOpposite()); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new ModificationTableBlockEntity(pos, state); } - @Nullable @Override - public GameEventListener getGameEventListener(World world, T blockEntity) { - return BlockEntityProvider.super.getGameEventListener(world, blockEntity); + public void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + if (newState.getBlock() != this) { + BlockEntity blockEntity = world.getBlockEntity(pos); + if (blockEntity != null) { + // handler stuff. + } + super.onStateReplaced(state, world, pos, newState, moved); + } } } diff --git a/src/main/java/mininggadgets/client/GuiType.java b/src/main/java/mininggadgets/client/GuiType.java new file mode 100644 index 0000000..64d9823 --- /dev/null +++ b/src/main/java/mininggadgets/client/GuiType.java @@ -0,0 +1,126 @@ +package mininggadgets.client; + +import mininggadgets.MiningGadgets; +import mininggadgets.blockentities.ModificationTableBlockEntity; +import mininggadgets.client.gui.GuiModificationTable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.screen.ScreenHandler; +import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.text.LiteralText; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; +import reborncore.RebornCore; +import reborncore.api.blockentity.IMachineGuiHandler; +import reborncore.client.screen.BuiltScreenHandlerProvider; +import reborncore.client.screen.builder.BuiltScreenHandler; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class GuiType implements IMachineGuiHandler { + private static final Map> TYPES = new HashMap<>(); + + public static final GuiType MODIFICATION_TABLE = register("modificationtable", () -> () -> GuiModificationTable::new); + + private static GuiType register(String id, Supplier>> factorySupplierMeme) { + return register(new Identifier(MiningGadgets.MOD_ID, id), factorySupplierMeme); + } + + public static GuiType register(Identifier identifier, Supplier>> factorySupplierMeme) { + if (TYPES.containsKey(identifier)) { + throw new RuntimeException("Duplicate gui type found"); + } + GuiType type = new GuiType<>(identifier, factorySupplierMeme); + TYPES.put(identifier, type); + return type; + } + + private final Identifier identifier; + private final Supplier>> guiFactory; + private final ScreenHandlerType screenHandlerType; + + @Environment(EnvType.CLIENT) + private GuiType(Identifier identifier, Supplier>> factorySupplierMeme) { + this.identifier = identifier; + this.guiFactory = factorySupplierMeme; + this.screenHandlerType = ScreenHandlerRegistry.registerExtended(identifier, getScreenHandlerFactory()); + RebornCore.clientOnly(() -> () -> ScreenRegistry.register(screenHandlerType, getGuiFactory())); + } + + private ScreenHandlerRegistry.ExtendedClientHandlerFactory getScreenHandlerFactory() { + return (syncId, playerInventory, packetByteBuf) -> { + final BlockEntity blockEntity = playerInventory.player.world.getBlockEntity(packetByteBuf.readBlockPos()); + assert blockEntity != null; + BuiltScreenHandler screenHandler = ((BuiltScreenHandlerProvider) blockEntity).createScreenHandler(syncId, playerInventory.player); + + //Set the screen handler type, not ideal but works lol + screenHandler.setType(screenHandlerType); + + return screenHandler; + }; + } + + @Environment(EnvType.CLIENT) + private GuiFactory getGuiFactory() { + return guiFactory.get().get(); + } + + @Override + public void open(PlayerEntity player, BlockPos pos, World world) { + if (!world.isClient) { + //This is awful + player.openHandledScreen(new ExtendedScreenHandlerFactory() { + @Override + public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf packetByteBuf) { + packetByteBuf.writeBlockPos(pos); + } + + @Override + public Text getDisplayName() { + return new LiteralText("What is this for?"); + } + + @Nullable + @Override + public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { + final BlockEntity blockEntity = player.world.getBlockEntity(pos); + BuiltScreenHandler screenHandler = ((BuiltScreenHandlerProvider) blockEntity).createScreenHandler(syncId, player); + screenHandler.setType(screenHandlerType); + return screenHandler; + } + }); + } + } + + public Identifier getIdentifier() { + return identifier; + } + + @Environment(EnvType.CLIENT) + public interface GuiFactory extends ScreenRegistry.Factory> { + HandledScreen create(int syncId, PlayerEntity playerEntity, T blockEntity); + + @Override + default HandledScreen create(BuiltScreenHandler builtScreenHandler, PlayerInventory playerInventory, Text text) { + PlayerEntity playerEntity = playerInventory.player; + //noinspection unchecked + T blockEntity = (T) builtScreenHandler.getBlockEntity(); + return create(builtScreenHandler.syncId, playerEntity, blockEntity); + } + } + +} \ No newline at end of file diff --git a/src/main/java/mininggadgets/client/gui/GuiModificationTable.java b/src/main/java/mininggadgets/client/gui/GuiModificationTable.java new file mode 100644 index 0000000..15bc4c1 --- /dev/null +++ b/src/main/java/mininggadgets/client/gui/GuiModificationTable.java @@ -0,0 +1,141 @@ +package mininggadgets.client.gui; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; +import mininggadgets.MiningGadgets; +import mininggadgets.blockentities.ModificationTableBlockEntity; +import mininggadgets.items.MiningGadget; +import mininggadgets.items.UpgradeCard; +import mininggadgets.items.upgrade.Upgrade; +import mininggadgets.items.upgrade.UpgradeTools; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import reborncore.client.gui.builder.GuiBase; +import reborncore.client.screen.builder.BuiltScreenHandler; +import reborncore.common.util.ItemHandlerUtils; + +import java.util.ArrayList; +import java.util.List; + +public class GuiModificationTable extends GuiBase { + private static final Identifier background = new Identifier(MiningGadgets.MOD_ID, "textures/gui/modification_table.png"); + + ModificationTableBlockEntity blockEntity; + ScrollingUpgrades scrollingUpgrades; + + public GuiModificationTable(int syncId, final PlayerEntity player, final ModificationTableBlockEntity blockEntity) { + super(player, blockEntity, blockEntity.createScreenHandler(syncId, player)); + this.blockEntity = blockEntity; + } + + @Override + public void init() { + super.init(); + + this.scrollingUpgrades = new ScrollingUpgrades(MinecraftClient.getInstance(), this.backgroundWidth - 14, 72, getGuiTop() + 17, getGuiLeft() + 7, this); + } + + @Override + public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) { + super.render(matrixStack, mouseX, mouseY, partialTicks); + + this.scrollingUpgrades.render(matrixStack, mouseX, mouseY, partialTicks);; + } + + @Override + protected void drawBackground(MatrixStack matrixStack, float lastFrameDuration, int mouseX, int mouseY) { + super.drawBackground(matrixStack, lastFrameDuration, mouseX, mouseY); + + RenderSystem.setShaderTexture(0, background); + int relX = (this.width - this.backgroundWidth) / 2; + int relY = (this.height - this.backgroundHeight) / 2; + drawTexture(matrixStack, relX - 23, relY, 0, 0, this.backgroundWidth + 23, this.backgroundHeight); + } + + @Override + protected void drawForeground(MatrixStack matrixStack, int mouseX, int mouseY) { + super.drawForeground(matrixStack, mouseX, mouseY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int mouseButton) { + ItemStack gadget = this.blockEntity.inventory.getStack(0); + if (!gadget.isEmpty() && gadget.getItem() instanceof MiningGadget) { + if (scrollingUpgrades.isMouseOver(mouseX, mouseY)) { +// if (UpgradeTools.containsUpgrade(gadget, ((UpgradeCard) heldStack.getItem()).getUpgrade())) { +// return false; +// } + +// PacketHandler.sendToServer(new PacketInsertUpgrade(this.tePos, heldStack)); +// this.menu.setCarried(ItemStack.EMPTY); + } + } + return super.mouseClicked(mouseX, mouseY, mouseButton); + } + + private static class ScrollingUpgrades extends ScrollPanel { + GuiModificationTable parent; + Upgrade upgrade = null; + + ScrollingUpgrades(MinecraftClient client, int width, int height, int top, int left, GuiModificationTable parent) { + super(client, width, height, top, left); + this.parent = parent; + } + + @Override + protected int getContentHeight() { + return (int) Math.ceil(this.parent.blockEntity.getUpgradesCache().size() / 7f) * 20; + } + + @Override + protected void drawPanel(MatrixStack mStack, int entryRight, int relativeY, Tessellator tess, int mouseX, int mouseY) { + Upgrade currentUpgrade = null; + int x = (entryRight - this.width) + 3; + int y = relativeY; + + int index = 0; + for (Upgrade upgrade : this.parent.blockEntity.getUpgradesCache()) { + MinecraftClient.getInstance().getItemRenderer().renderGuiItemIcon(new ItemStack(upgrade.getCard()), x, y); + + if( isMouseOver(mouseX, mouseY) && (mouseX > x && mouseX < x + 15 && mouseY > y && mouseY < y + 15) ) + currentUpgrade = upgrade; + + x += 22; + index ++; + if( index % 7 == 0 ) { + y += 20; + x = (entryRight - this.width) + 3; + } + } + + if(currentUpgrade == null || !currentUpgrade.equals(this.upgrade)) + this.upgrade = currentUpgrade; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if( !isMouseOver(mouseX, mouseY) || this.upgrade == null ) + return false; + +// PacketHandler.sendToServer(new PacketExtractUpgrade(this.parent.tePos, this.upgrade.getName(), this.upgrade.getName().length())); + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public void render(MatrixStack stack, int mouseX, int mouseY, float partialTicks) { + super.render(stack, mouseX, mouseY, partialTicks); + + List textList = null; + + if( this.upgrade != null ) + textList = new ArrayList<>(this.upgrade.getStack().getTooltip(this.parent.getMinecraft().player, TooltipContext.Default.NORMAL)); +// this.parent.renderTooltip(stack, textList, mouseX, mouseY); + } + } +} diff --git a/src/main/java/mininggadgets/client/gui/ScrollPanel.java b/src/main/java/mininggadgets/client/gui/ScrollPanel.java new file mode 100644 index 0000000..db26551 --- /dev/null +++ b/src/main/java/mininggadgets/client/gui/ScrollPanel.java @@ -0,0 +1,323 @@ +package mininggadgets.client.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.render.*; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.TranslatableText; +import net.minecraft.util.math.Matrix4f; + +import java.util.Collections; +import java.util.List; + + +public abstract class ScrollPanel extends Screen { + private final MinecraftClient client; + protected final int width; + protected final int height; + protected final int top; + protected final int bottom; + protected final int right; + protected final int left; + private boolean scrolling; + protected float scrollDistance; + protected boolean captureMouse = true; + protected final int border; + + private final int barWidth; + private final int barLeft; + private final int bgColorFrom; + private final int bgColorTo; + private final int barBgColor; + private final int barColor; + private final int barBorderColor; + + public ScrollPanel(MinecraftClient client, int width, int height, int top, int left) { + this(client, width, height, top, left, 4); + } + + public ScrollPanel(MinecraftClient client, int width, int height, int top, int left, int border) { + this(client, width, height, top, left, border, 6); + } + + public ScrollPanel(MinecraftClient client, int width, int height, int top, int left, int border, int barWidth) { + this(client, width, height, top, left, border, barWidth, 0xC0101010, 0xD0101010); + } + + public ScrollPanel(MinecraftClient client, int width, int height, int top, int left, int border, int barWidth, int bgColorFrom, int bgColorTo) + { + this(client, width, height, top, left, border, barWidth, bgColorFrom, bgColorTo, 0xFF000000, 0xFF808080, 0xFFC0C0C0); + } + + public ScrollPanel(MinecraftClient client, int width, int height, int top, int left, int border, int barWidth, int bgColorFrom, int bgColorTo, int barBgColor, int barColor, int barBorderColor) + { + super(new TranslatableText("test")); + this.client = client; + this.width = width; + this.height = height; + this.top = top; + this.left = left; + this.bottom = height + this.top; + this.right = width + this.left; + this.barLeft = this.left + this.width - barWidth; + this.border = border; + this.barWidth = barWidth; + this.bgColorFrom = bgColorFrom; + this.bgColorTo = bgColorTo; + this.barBgColor = barBgColor; + this.barColor = barColor; + this.barBorderColor = barBorderColor; + } + + protected abstract int getContentHeight(); + + protected void drawBackground() {}; + + protected void drawBackground(MatrixStack matrix, Tessellator tess, float partialTicks) + { + BufferBuilder worldr = tess.getBuffer(); + + if (this.client.world != null) + { + this.drawGradientRect(matrix, this.left, this.top, this.right, this.bottom, bgColorFrom, bgColorTo); + } + else // Draw dark dirt background + { + RenderSystem.setShader(GameRenderer::getPositionTexColorShader); + RenderSystem.setShaderTexture(0, 0); + final float texScale = 32.0F; + worldr.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR_TEXTURE); + worldr.vertex(this.left, this.bottom, 0.0D).texture(this.left / texScale, (this.bottom + (int)this.scrollDistance) / texScale).color(0x20, 0x20, 0x20, 0xFF).next(); + worldr.vertex(this.right, this.bottom, 0.0D).texture(this.right / texScale, (this.bottom + (int)this.scrollDistance) / texScale).color(0x20, 0x20, 0x20, 0xFF).next(); + worldr.vertex(this.right, this.top, 0.0D).texture(this.right / texScale, (this.top + (int)this.scrollDistance) / texScale).color(0x20, 0x20, 0x20, 0xFF).next(); + worldr.vertex(this.left, this.top, 0.0D).texture(this.left / texScale, (this.top + (int)this.scrollDistance) / texScale).color(0x20, 0x20, 0x20, 0xFF).next(); + tess.draw(); + } + } + + protected abstract void drawPanel(MatrixStack mStack, int entryRight, int relativeY, Tessellator tess, int mouseX, int mouseY); + + protected boolean clickPanel(double mouseX, double mouseY, int button) { return false; } + + private int getMaxScroll() + { + return this.getContentHeight() - (this.height - this.border); + } + + private void applyScrollLimits() + { + int max = getMaxScroll(); + + if (max < 0) + { + max /= 2; + } + + if (this.scrollDistance < 0.0F) + { + this.scrollDistance = 0.0F; + } + + if (this.scrollDistance > max) + { + this.scrollDistance = max; + } + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scroll) + { + if (scroll != 0) + { + this.scrollDistance += -scroll * getScrollAmount(); + applyScrollLimits(); + return true; + } + return false; + } + + protected int getScrollAmount() + { + return 20; + } + + @Override + public boolean isMouseOver(double mouseX, double mouseY) + { + return mouseX >= this.left && mouseX <= this.left + this.width && + mouseY >= this.top && mouseY <= this.bottom; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) + { + + if (super.mouseClicked(mouseX, mouseY, button)) + return true; + + this.scrolling = button == 0 && mouseX >= barLeft && mouseX < barLeft + barWidth; + if (this.scrolling) + { + return true; + } + int mouseListY = ((int)mouseY) - this.top - this.getContentHeight() + (int)this.scrollDistance - border; + if (mouseX >= left && mouseX <= right && mouseListY < 0) + { + return this.clickPanel(mouseX - left, mouseY - this.top + (int)this.scrollDistance - border, button); + } + return false; + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) + { + if (super.mouseReleased(mouseX, mouseY, button)) + return true; + boolean ret = this.scrolling; + this.scrolling = false; + return ret; + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) + { + if (this.scrolling) + { + int maxScroll = height - getBarHeight(); + double moved = deltaY / maxScroll; + this.scrollDistance += getMaxScroll() * moved; + applyScrollLimits(); + return true; + } + return false; + } + + @Override + public void render(MatrixStack matrix, int mouseX, int mouseY, float partialTicks) + { + this.drawBackground(); + + Tessellator tess = Tessellator.getInstance(); + BufferBuilder worldr = tess.getBuffer(); + + double scale = client.getWindow().getScaleFactor(); + RenderSystem.enableScissor((int)(left * scale), (int)(client.getWindow().getHeight() - (bottom * scale)), + (int)(width * scale), (int)(height * scale)); + + this.drawBackground(matrix, tess, partialTicks); + + int baseY = this.top + border - (int)this.scrollDistance; + this.drawPanel(matrix, right, baseY, tess, mouseX, mouseY); + + RenderSystem.disableDepthTest(); + + int extraHeight = (this.getContentHeight() + border) - height; + if (extraHeight > 0) + { + int barHeight = getBarHeight(); + + int barTop = (int)this.scrollDistance * (height - barHeight) / extraHeight + this.top; + if (barTop < this.top) + { + barTop = this.top; + } + + int barBgAlpha = this.barBgColor >> 24 & 0xff; + int barBgRed = this.barBgColor >> 16 & 0xff; + int barBgGreen = this.barBgColor >> 8 & 0xff; + int barBgBlue = this.barBgColor & 0xff; + + RenderSystem.setShader(GameRenderer::getPositionColorShader); + RenderSystem.disableTexture(); + worldr.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + worldr.vertex(barLeft, this.bottom, 0.0D).color(barBgRed, barBgGreen, barBgBlue, barBgAlpha).next(); + worldr.vertex(barLeft + barWidth, this.bottom, 0.0D).color(barBgRed, barBgGreen, barBgBlue, barBgAlpha).next(); + worldr.vertex(barLeft + barWidth, this.top, 0.0D).color(barBgRed, barBgGreen, barBgBlue, barBgAlpha).next(); + worldr.vertex(barLeft, this.top, 0.0D).color(barBgRed, barBgGreen, barBgBlue, barBgAlpha).next(); + tess.draw(); + + int barAlpha = this.barColor >> 24 & 0xff; + int barRed = this.barColor >> 16 & 0xff; + int barGreen = this.barColor >> 8 & 0xff; + int barBlue = this.barColor & 0xff; + + worldr.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + worldr.vertex(barLeft, barTop + barHeight, 0.0D).color(barRed, barGreen, barBlue, barAlpha).next(); + worldr.vertex(barLeft + barWidth, barTop + barHeight, 0.0D).color(barRed, barGreen, barBlue, barAlpha).next(); + worldr.vertex(barLeft + barWidth, barTop, 0.0D).color(barRed, barGreen, barBlue, barAlpha).next(); + worldr.vertex(barLeft, barTop, 0.0D).color(barRed, barGreen, barBlue, barAlpha).next(); + tess.draw(); + + int barBorderAlpha = this.barBorderColor >> 24 & 0xff; + int barBorderRed = this.barBorderColor >> 16 & 0xff; + int barBorderGreen = this.barBorderColor >> 8 & 0xff; + int barBorderBlue = this.barBorderColor & 0xff; + + worldr.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + worldr.vertex(barLeft, barTop + barHeight - 1, 0.0D).color(barBorderRed, barBorderGreen, barBorderBlue, barBorderAlpha).next(); + worldr.vertex(barLeft + barWidth - 1, barTop + barHeight - 1, 0.0D).color(barBorderRed, barBorderGreen, barBorderBlue, barBorderAlpha).next(); + worldr.vertex(barLeft + barWidth - 1, barTop, 0.0D).color(barBorderRed, barBorderGreen, barBorderBlue, barBorderAlpha).next(); + worldr.vertex(barLeft, barTop, 0.0D).color(barBorderRed, barBorderGreen, barBorderBlue, barBorderAlpha).next(); + tess.draw(); + } + + RenderSystem.enableTexture(); + RenderSystem.disableBlend(); + RenderSystem.disableScissor(); + } + + private int getBarHeight() + { + int barHeight = (height * height) / this.getContentHeight(); + + if (barHeight < 32) barHeight = 32; + + if (barHeight > height - border*2) + barHeight = height - border*2; + + return barHeight; + } + + protected void drawGradientRect(MatrixStack mStack, int left, int top, int right, int bottom, int color1, int color2) + { + drawGradientRect(mStack.peek().getModel(), 0, left, top, right, bottom, color1, color2); + } + + public static void drawGradientRect(Matrix4f mat, int zLevel, int left, int top, int right, int bottom, int startColor, int endColor) + { + float startAlpha = (float)(startColor >> 24 & 255) / 255.0F; + float startRed = (float)(startColor >> 16 & 255) / 255.0F; + float startGreen = (float)(startColor >> 8 & 255) / 255.0F; + float startBlue = (float)(startColor & 255) / 255.0F; + float endAlpha = (float)(endColor >> 24 & 255) / 255.0F; + float endRed = (float)(endColor >> 16 & 255) / 255.0F; + float endGreen = (float)(endColor >> 8 & 255) / 255.0F; + float endBlue = (float)(endColor & 255) / 255.0F; + + RenderSystem.enableDepthTest(); + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder buffer = tessellator.getBuffer(); + buffer.begin(VertexFormat.DrawMode.QUADS, VertexFormats.POSITION_COLOR); + buffer.vertex(mat, right, top, zLevel).color(startRed, startGreen, startBlue, startAlpha).next(); + buffer.vertex(mat, left, top, zLevel).color(startRed, startGreen, startBlue, startAlpha).next(); + buffer.vertex(mat, left, bottom, zLevel).color( endRed, endGreen, endBlue, endAlpha).next(); + buffer.vertex(mat, right, bottom, zLevel).color( endRed, endGreen, endBlue, endAlpha).next(); + tessellator.draw(); + + RenderSystem.disableBlend(); + RenderSystem.enableTexture(); + } + + @Override + public List children() + { + return Collections.emptyList(); + } +} diff --git a/src/main/java/mininggadgets/events/ModRegistry.java b/src/main/java/mininggadgets/events/ModRegistry.java index 540d7d2..9795ea8 100644 --- a/src/main/java/mininggadgets/events/ModRegistry.java +++ b/src/main/java/mininggadgets/events/ModRegistry.java @@ -1,10 +1,8 @@ package mininggadgets.events; import mininggadgets.MiningGadgets; -import mininggadgets.blockentities.ModificationTableBlockEntity; import mininggadgets.blockentities.RenderBlockBlockEntity; import mininggadgets.blocks.MinersLight; -import mininggadgets.blocks.ModificationTable; import mininggadgets.blocks.RenderBlock; import mininggadgets.init.MGContent; import mininggadgets.items.MiningGadget; @@ -14,6 +12,9 @@ import net.minecraft.item.Item; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; +import reborncore.RebornRegistry; + +import java.util.Arrays; public class ModRegistry { @@ -30,12 +31,14 @@ private static void registerItems() { private static void registerBlocks() { MGContent.RENDER_BLOCK = setup(new RenderBlock(), "renderblock"); MGContent.MINERS_LIGHT = setup(new MinersLight(), "minerslight"); - MGContent.MODIFICATION_TABLE_BLOCK = setup(new ModificationTable(), "modificationtableblock"); + + Item.Settings itemGroup = new Item.Settings().group(MiningGadgets.ITEMGROUP); + + Arrays.stream(MGContent.Machine.values()).forEach(value -> RebornRegistry.registerBlock(value.block, itemGroup)); } private static void registerBlockEntities() { MGContent.RENDERBLOCK_ENTITY = setup(FabricBlockEntityTypeBuilder.create(RenderBlockBlockEntity::new, MGContent.RENDER_BLOCK).build(null), "renderblock"); - MGContent.MODIFICATIONTABLE_ENTITY = setup(FabricBlockEntityTypeBuilder.create(ModificationTableBlockEntity::new, MGContent.MODIFICATION_TABLE_BLOCK).build(null), "modificationtableblock"); } private static I setup(I item, String name) { @@ -49,7 +52,7 @@ public static B setup(B block, String name) { } public static BlockEntityType setup(BlockEntityType blockEntity, String name) { - Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier(MiningGadgets.MOD_ID, "renderblock_tile"), blockEntity); + Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier(MiningGadgets.MOD_ID, name), blockEntity); return blockEntity; } } diff --git a/src/main/java/mininggadgets/init/InitUtils.java b/src/main/java/mininggadgets/init/InitUtils.java index 1afe584..63d71fb 100644 --- a/src/main/java/mininggadgets/init/InitUtils.java +++ b/src/main/java/mininggadgets/init/InitUtils.java @@ -1,11 +1,32 @@ package mininggadgets.init; +import mininggadgets.MiningGadgets; +import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.Identifier; import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.registry.Registry; +import reborncore.RebornRegistry; import reborncore.common.powerSystem.RcEnergyItem; public class InitUtils { + public static I setup(I item, String name) { + RebornRegistry.registerIdent(item, new Identifier(MiningGadgets.MOD_ID, name)); + return item; + } + + public static B setup(B block, String name) { + RebornRegistry.registerIdent(block, new Identifier(MiningGadgets.MOD_ID, name)); + return block; + } + + public static SoundEvent setup(String name) { + Identifier identifier = new Identifier(MiningGadgets.MOD_ID, name); + return Registry.register(Registry.SOUND_EVENT, identifier, new SoundEvent(identifier)); + } + public static void initPoweredItems(Item item, DefaultedList itemList) { ItemStack uncharged = new ItemStack(item); ItemStack charged = new ItemStack(item); diff --git a/src/main/java/mininggadgets/init/MGBlockEntities.java b/src/main/java/mininggadgets/init/MGBlockEntities.java new file mode 100644 index 0000000..84e0a72 --- /dev/null +++ b/src/main/java/mininggadgets/init/MGBlockEntities.java @@ -0,0 +1,42 @@ +package mininggadgets.init; + +import mininggadgets.MiningGadgets; +import mininggadgets.blockentities.ModificationTableBlockEntity; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.ItemConvertible; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import org.apache.commons.lang3.Validate; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.BiFunction; + +public class MGBlockEntities { + + private static final List> TYPES = new ArrayList<>(); + + public static final BlockEntityType MODIFICATION_TABLE = register(ModificationTableBlockEntity::new, "modification_table", MGContent.Machine.MODIFICATION_TABLE); + + public static BlockEntityType register(BiFunction supplier, String name, ItemConvertible... items) { + return register(supplier, name, Arrays.stream(items).map(itemConvertible -> Block.getBlockFromItem(itemConvertible.asItem())).toArray(Block[]::new)); + } + + public static BlockEntityType register(BiFunction supplier, String name, Block... blocks) { + Validate.isTrue(blocks.length > 0, "no blocks for blockEntity entity type!"); + return register(new Identifier(MiningGadgets.MOD_ID, name).toString(), FabricBlockEntityTypeBuilder.create(supplier::apply, blocks)); + } + + public static BlockEntityType register(String id, FabricBlockEntityTypeBuilder builder) { + BlockEntityType blockEntityType = builder.build(null); + Registry.register(Registry.BLOCK_ENTITY_TYPE, new Identifier(id), blockEntityType); + MGBlockEntities.TYPES.add(blockEntityType); + return blockEntityType; + } +} diff --git a/src/main/java/mininggadgets/init/MGContent.java b/src/main/java/mininggadgets/init/MGContent.java index 70371d6..bb0b4fb 100644 --- a/src/main/java/mininggadgets/init/MGContent.java +++ b/src/main/java/mininggadgets/init/MGContent.java @@ -1,16 +1,44 @@ package mininggadgets.init; +import mininggadgets.blockentities.ModificationTableBlockEntity; +import mininggadgets.blocks.GenericMachineBlock; +import mininggadgets.client.GuiType; import net.minecraft.block.Block; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.item.Item; +import net.minecraft.item.ItemConvertible; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.ScreenHandlerType; + +import java.util.Locale; public class MGContent { public static Item MINING_GADGET; public static Block RENDER_BLOCK; public static Block MINERS_LIGHT; - public static Block MODIFICATION_TABLE_BLOCK; public static BlockEntityType RENDERBLOCK_ENTITY; - public static BlockEntityType MODIFICATIONTABLE_ENTITY; + + public enum Machine implements ItemConvertible { + MODIFICATION_TABLE(new GenericMachineBlock(GuiType.MODIFICATION_TABLE, ModificationTableBlockEntity::new)); + + public final String name; + public final Block block; + + Machine(B block) { + this.name = this.toString().toLowerCase(Locale.ROOT); + this.block = block; + InitUtils.setup(block, name); + } + + public ItemStack getStack() { + return new ItemStack(block); + } + + @Override + public Item asItem() { + return block.asItem(); + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/blockstates/modification_table.json b/src/main/resources/assets/mininggadgets/blockstates/modification_table.json new file mode 100644 index 0000000..03bf549 --- /dev/null +++ b/src/main/resources/assets/mininggadgets/blockstates/modification_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "mininggadgets:block/modification_table" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/blockstates/modificationtable.json b/src/main/resources/assets/mininggadgets/blockstates/modificationtable.json deleted file mode 100644 index 77ee37c..0000000 --- a/src/main/resources/assets/mininggadgets/blockstates/modificationtable.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "mininggadgets:block/modificationtable" - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/lang/en_us.json b/src/main/resources/assets/mininggadgets/lang/en_us.json index 3cdc25a..b2c4308 100644 --- a/src/main/resources/assets/mininggadgets/lang/en_us.json +++ b/src/main/resources/assets/mininggadgets/lang/en_us.json @@ -1,6 +1,6 @@ { "block.mininggadgets.minerslight": "Miner's Light", - "block.mininggadgets.modificationtable": "Modification Table", + "block.mininggadgets.modification_table": "Modification Table", "block.mininggadgets.renderblock": "Render Block (Don't use)", "block.mininggadgets.renderblock.name": "What ever it wants to be!", "item.mininggadgets.mininggadget": "Mining Gadget", diff --git a/src/main/resources/assets/mininggadgets/lang/ru_ru.json b/src/main/resources/assets/mininggadgets/lang/ru_ru.json index e7e35b9..1a2d5a2 100644 --- a/src/main/resources/assets/mininggadgets/lang/ru_ru.json +++ b/src/main/resources/assets/mininggadgets/lang/ru_ru.json @@ -1,6 +1,6 @@ { "block.mininggadgets.minerslight": "Шахтёрский свет", - "block.mininggadgets.modificationtable": "Стол модификаций", + "block.mininggadgets.modification_table": "Стол модификаций", "block.mininggadgets.renderblock": "Рэндэр блок (не использовать)", "block.mininggadgets.renderblock.name": "Всё, чем он хочет быть!", "item.mininggadgets.mininggadget": "Горный гаджет", diff --git a/src/main/resources/assets/mininggadgets/lang/zh_tw.json b/src/main/resources/assets/mininggadgets/lang/zh_tw.json index d1af802..bb03edb 100644 --- a/src/main/resources/assets/mininggadgets/lang/zh_tw.json +++ b/src/main/resources/assets/mininggadgets/lang/zh_tw.json @@ -1,6 +1,6 @@ { "block.mininggadgets.minerslight":"礦工之光", -"block.mininggadgets.modificationtable":"修改表", +"block.mininggadgets.modification_table":"修改表", "block.mininggadgets.renderblock":"渲染塊(不要使用)", "block.mininggadgets.renderblock.name":"無論它想要成為什麼!", "item.mininggadgets.mininggadget":"採礦小工具", diff --git a/src/main/resources/assets/mininggadgets/models/block/modification_table.json b/src/main/resources/assets/mininggadgets/models/block/modification_table.json new file mode 100644 index 0000000..8ac229e --- /dev/null +++ b/src/main/resources/assets/mininggadgets/models/block/modification_table.json @@ -0,0 +1,12 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "down": "mininggadgets:block/modification_table_bottom", + "up": "mininggadgets:block/modification_table_top", + "north": "mininggadgets:block/modification_table_side", + "south": "mininggadgets:block/modification_table_side", + "east": "mininggadgets:block/modification_table_side", + "west": "mininggadgets:block/modification_table_side", + "particle": "mininggadgets:block/modification_table_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/models/block/modificationtable.json b/src/main/resources/assets/mininggadgets/models/block/modificationtable.json deleted file mode 100644 index ae3dabc..0000000 --- a/src/main/resources/assets/mininggadgets/models/block/modificationtable.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "parent": "minecraft:block/cube", - "textures": { - "down": "mininggadgets:block/modificationtable_bottom", - "up": "mininggadgets:block/modificationtable_top", - "north": "mininggadgets:block/modificationtable_side", - "south": "mininggadgets:block/modificationtable_side", - "east": "mininggadgets:block/modificationtable_side", - "west": "mininggadgets:block/modificationtable_side", - "particle": "mininggadgets:block/modificationtable_side" - } -} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/models/item/modification_table.json b/src/main/resources/assets/mininggadgets/models/item/modification_table.json new file mode 100644 index 0000000..f643f91 --- /dev/null +++ b/src/main/resources/assets/mininggadgets/models/item/modification_table.json @@ -0,0 +1,3 @@ +{ + "parent": "mininggadgets:block/modification_table" +} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/models/item/modificationtable.json b/src/main/resources/assets/mininggadgets/models/item/modificationtable.json deleted file mode 100644 index d7522a1..0000000 --- a/src/main/resources/assets/mininggadgets/models/item/modificationtable.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "mininggadgets:block/modificationtable" -} \ No newline at end of file diff --git a/src/main/resources/assets/mininggadgets/textures/block/modificationtable.png b/src/main/resources/assets/mininggadgets/textures/block/modification_table.png similarity index 100% rename from src/main/resources/assets/mininggadgets/textures/block/modificationtable.png rename to src/main/resources/assets/mininggadgets/textures/block/modification_table.png diff --git a/src/main/resources/assets/mininggadgets/textures/block/modificationtable_bottom.png b/src/main/resources/assets/mininggadgets/textures/block/modification_table_bottom.png similarity index 100% rename from src/main/resources/assets/mininggadgets/textures/block/modificationtable_bottom.png rename to src/main/resources/assets/mininggadgets/textures/block/modification_table_bottom.png diff --git a/src/main/resources/assets/mininggadgets/textures/block/modification_table_front.png b/src/main/resources/assets/mininggadgets/textures/block/modification_table_front.png new file mode 100644 index 0000000..293b7b4 Binary files /dev/null and b/src/main/resources/assets/mininggadgets/textures/block/modification_table_front.png differ diff --git a/src/main/resources/assets/mininggadgets/textures/block/modificationtable_side.png b/src/main/resources/assets/mininggadgets/textures/block/modification_table_side.png similarity index 100% rename from src/main/resources/assets/mininggadgets/textures/block/modificationtable_side.png rename to src/main/resources/assets/mininggadgets/textures/block/modification_table_side.png diff --git a/src/main/resources/assets/mininggadgets/textures/block/modificationtable_top.png b/src/main/resources/assets/mininggadgets/textures/block/modification_table_top.png similarity index 100% rename from src/main/resources/assets/mininggadgets/textures/block/modificationtable_top.png rename to src/main/resources/assets/mininggadgets/textures/block/modification_table_top.png diff --git a/src/main/resources/assets/mininggadgets/textures/gui/modification_table.png b/src/main/resources/assets/mininggadgets/textures/gui/modification_table.png new file mode 100644 index 0000000..d5d63bf Binary files /dev/null and b/src/main/resources/assets/mininggadgets/textures/gui/modification_table.png differ diff --git a/src/main/resources/assets/mininggadgets/textures/gui/modificationtable.png b/src/main/resources/assets/mininggadgets/textures/gui/modificationtable.png deleted file mode 100644 index 569dbac..0000000 Binary files a/src/main/resources/assets/mininggadgets/textures/gui/modificationtable.png and /dev/null differ