From d9cf7264d648cb4ea2aa9fbc4fe4ef741125041b Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:56:21 -0400 Subject: [PATCH 01/14] Added item acceptor block --- .../dev/hephaestus/glowcase/Glowcase.java | 23 +- .../glowcase/GlowcaseCommonProxy.java | 4 + .../glowcase/GlowcaseNetworking.java | 8 +- .../glowcase/block/ItemAcceptorBlock.java | 214 ++++++++++++++++++ .../block/entity/ItemAcceptorBlockEntity.java | 109 +++++++++ .../glowcase/client/GlowcaseClient.java | 12 +- .../glowcase/client/GlowcaseClientProxy.java | 21 +- .../ingame/ItemAcceptorBlockEditScreen.java | 66 ++++++ .../ItemAcceptorBlockEntityRenderer.java | 52 +++++ .../packet/C2SEditItemAcceptorBlock.java | 44 ++++ .../blockstates/item_acceptor_block.json | 40 ++++ .../resources/assets/glowcase/lang/en_us.json | 5 + .../models/block/cube_inner_faces.json | 147 ++++++++++++ .../models/block/item_acceptor_block.json | 18 ++ .../models/block/item_acceptor_block_on.json | 6 + .../block/item_acceptor_block_side.json | 18 ++ .../block/item_acceptor_block_side_on.json | 6 + .../models/item/item_acceptor_block.json | 3 + .../glowcase/textures/block/invisible.png | Bin 0 -> 126 bytes .../data/glowcase/tags/item/items.json | 3 +- 20 files changed, 761 insertions(+), 38 deletions(-) create mode 100644 src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java create mode 100644 src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java create mode 100644 src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java create mode 100644 src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java create mode 100644 src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java create mode 100644 src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json create mode 100644 src/main/resources/assets/glowcase/models/block/cube_inner_faces.json create mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block.json create mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json create mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json create mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json create mode 100644 src/main/resources/assets/glowcase/models/item/item_acceptor_block.json create mode 100644 src/main/resources/assets/glowcase/textures/block/invisible.png diff --git a/src/main/java/dev/hephaestus/glowcase/Glowcase.java b/src/main/java/dev/hephaestus/glowcase/Glowcase.java index b9c7057..8cb4a0a 100644 --- a/src/main/java/dev/hephaestus/glowcase/Glowcase.java +++ b/src/main/java/dev/hephaestus/glowcase/Glowcase.java @@ -2,16 +2,8 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; -import dev.hephaestus.glowcase.block.HyperlinkBlock; -import dev.hephaestus.glowcase.block.ItemDisplayBlock; -import dev.hephaestus.glowcase.block.PopupBlock; -import dev.hephaestus.glowcase.block.SpriteBlock; -import dev.hephaestus.glowcase.block.TextBlock; -import dev.hephaestus.glowcase.block.entity.HyperlinkBlockEntity; -import dev.hephaestus.glowcase.block.entity.ItemDisplayBlockEntity; -import dev.hephaestus.glowcase.block.entity.PopupBlockEntity; -import dev.hephaestus.glowcase.block.entity.SpriteBlockEntity; -import dev.hephaestus.glowcase.block.entity.TextBlockEntity; +import dev.hephaestus.glowcase.block.*; +import dev.hephaestus.glowcase.block.entity.*; import dev.hephaestus.glowcase.compat.PolydexCompatibility; import dev.hephaestus.glowcase.item.LockItem; import net.fabricmc.api.ModInitializer; @@ -20,11 +12,7 @@ import net.minecraft.block.Block; import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.item.*; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; @@ -59,6 +47,10 @@ public class Glowcase implements ModInitializer { public static final Supplier SPRITE_BLOCK_ITEM = registerItem("sprite_block", () -> new BlockItem(SPRITE_BLOCK.get(), new Item.Settings())); public static final Supplier> SPRITE_BLOCK_ENTITY = registerBlockEntity("sprite_block", () -> BlockEntityType.Builder.create(SpriteBlockEntity::new, SPRITE_BLOCK.get()).build(null)); + public static final Supplier ITEM_ACCEPTOR_BLOCK = registerBlock("item_acceptor_block", ItemAcceptorBlock::new); + public static final Supplier ITEM_ACCEPTOR_BLOCK_ITEM = registerItem("item_acceptor_block", () -> new BlockItem(ITEM_ACCEPTOR_BLOCK.get(), new Item.Settings())); + public static final Supplier> ITEM_ACCEPTOR_BLOCK_ENTITY = registerBlockEntity("item_acceptor_block", () -> BlockEntityType.Builder.create(ItemAcceptorBlockEntity::new, ITEM_ACCEPTOR_BLOCK.get()).build(null)); + public static final Supplier LOCK_ITEM = registerItem("lock", () -> new LockItem(new Item.Settings())); public static final Supplier ITEM_GROUP = registerItemGroup("items", () -> FabricItemGroup.builder() @@ -70,6 +62,7 @@ public class Glowcase implements ModInitializer { entries.add(TEXT_BLOCK_ITEM.get()); entries.add(POPUP_BLOCK_ITEM.get()); entries.add(SPRITE_BLOCK_ITEM.get()); + entries.add(ITEM_ACCEPTOR_BLOCK_ITEM.get()); entries.add(LOCK_ITEM.get()); }) .build() diff --git a/src/main/java/dev/hephaestus/glowcase/GlowcaseCommonProxy.java b/src/main/java/dev/hephaestus/glowcase/GlowcaseCommonProxy.java index 13e4ccd..46c095d 100644 --- a/src/main/java/dev/hephaestus/glowcase/GlowcaseCommonProxy.java +++ b/src/main/java/dev/hephaestus/glowcase/GlowcaseCommonProxy.java @@ -30,4 +30,8 @@ public void openPopupBlockViewScreen(BlockPos pos) { public void openSpriteBlockEditScreen(BlockPos pos) { //No-op } + + public void openItemAcceptorBlockEditScreen(BlockPos pos) { + //No-op + } } diff --git a/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java b/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java index fc73803..3b8172d 100644 --- a/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java +++ b/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java @@ -1,10 +1,6 @@ package dev.hephaestus.glowcase; -import dev.hephaestus.glowcase.packet.C2SEditHyperlinkBlock; -import dev.hephaestus.glowcase.packet.C2SEditItemDisplayBlock; -import dev.hephaestus.glowcase.packet.C2SEditTextBlock; -import dev.hephaestus.glowcase.packet.C2SEditPopupBlock; -import dev.hephaestus.glowcase.packet.C2SEditSpriteBlock; +import dev.hephaestus.glowcase.packet.*; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -15,11 +11,13 @@ public static void init() { PayloadTypeRegistry.playC2S().register(C2SEditTextBlock.ID, C2SEditTextBlock.PACKET_CODEC); PayloadTypeRegistry.playC2S().register(C2SEditPopupBlock.ID, C2SEditPopupBlock.PACKET_CODEC); PayloadTypeRegistry.playC2S().register(C2SEditSpriteBlock.ID, C2SEditSpriteBlock.PACKET_CODEC); + PayloadTypeRegistry.playC2S().register(C2SEditItemAcceptorBlock.ID, C2SEditItemAcceptorBlock.PACKET_CODEC); ServerPlayNetworking.registerGlobalReceiver(C2SEditHyperlinkBlock.ID, C2SEditHyperlinkBlock::receive); ServerPlayNetworking.registerGlobalReceiver(C2SEditItemDisplayBlock.ID, C2SEditItemDisplayBlock::receive); ServerPlayNetworking.registerGlobalReceiver(C2SEditTextBlock.ID, C2SEditTextBlock::receive); ServerPlayNetworking.registerGlobalReceiver(C2SEditPopupBlock.ID, C2SEditPopupBlock::receive); ServerPlayNetworking.registerGlobalReceiver(C2SEditSpriteBlock.ID, C2SEditSpriteBlock::receive); + ServerPlayNetworking.registerGlobalReceiver(C2SEditItemAcceptorBlock.ID, C2SEditItemAcceptorBlock::receive); } } diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java new file mode 100644 index 0000000..6366494 --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -0,0 +1,214 @@ +package dev.hephaestus.glowcase.block; + +import dev.hephaestus.glowcase.Glowcase; +import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; +import net.minecraft.block.*; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.ChestBlockEntity; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemPlacementContext; +import net.minecraft.item.ItemStack; +import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.state.StateManager; +import net.minecraft.state.property.BooleanProperty; +import net.minecraft.state.property.DirectionProperty; +import net.minecraft.state.property.Properties; +import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Formatting; +import net.minecraft.util.Hand; +import net.minecraft.util.ItemActionResult; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.random.Random; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.util.shape.VoxelShapes; +import net.minecraft.world.BlockView; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ItemAcceptorBlock extends GlowcaseBlock implements BlockEntityProvider { + private static final VoxelShape OUTLINE = VoxelShapes.cuboid(0, 0, 0, 1, 1, 1); + public static final DirectionProperty FACING = Properties.HOPPER_FACING; + public static final BooleanProperty POWERED = Properties.POWERED; + + public ItemAcceptorBlock() { + super(); + this.setDefaultState(this.getDefaultState().with(FACING, Direction.DOWN).with(POWERED, false)); + } + + @Override + protected void appendProperties(StateManager.Builder builder) { + super.appendProperties(builder); + builder.add(FACING, POWERED); + } + + @Override + public BlockState getPlacementState(ItemPlacementContext ctx) { + Direction direction = ctx.getSide().getOpposite(); + return this.getDefaultState().with(FACING, direction.getAxis() == Direction.Axis.Y ? Direction.DOWN : direction); + } + + @Override + public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack stack) { + if (world.isClient && placer instanceof PlayerEntity player && canEditGlowcase(player, pos)) { + //load any ctrl-picked NBT clientside + NbtComponent blockEntityTag = stack.get(DataComponentTypes.BLOCK_ENTITY_DATA); + if (blockEntityTag != null && world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be) { + blockEntityTag.applyToBlockEntity(be, world.getRegistryManager()); + } + + Glowcase.proxy.openItemAcceptorBlockEditScreen(pos); + } + } + + @Override + protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { + if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) return ActionResult.CONSUME; + if (canEditGlowcase(player, pos) && world.isClient) { + Glowcase.proxy.openItemAcceptorBlockEditScreen(be.getPos()); + } + return ActionResult.SUCCESS; + } + + @Override + protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { + if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) return ItemActionResult.CONSUME; + + if (!stack.isEmpty()) { + if (!world.isClient() && !world.getBlockTickScheduler().isQueued(pos, this) && be.isItemAccepted(stack)) { + // Remove items + ItemStack newStack = stack.copyWithCount(be.count); + stack.setCount(stack.getCount() - be.count); + + // Schedule redstone pulse + world.scheduleBlockTick(pos, this, 2); + + // Attempt to insert items + Inventory inventory = getInventoryAt(world, pos.offset(state.get(FACING))); + + if (inventory != null) { + addToFirstFreeSlot(inventory, newStack); + } + } + return ItemActionResult.SUCCESS; + } + return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } + + private static Inventory getInventoryAt(World world, BlockPos pos) { + BlockState state = world.getBlockState(pos); + Block block = state.getBlock(); + + if (block instanceof InventoryProvider inventoryProvider) { + return inventoryProvider.getInventory(state, world, pos); + } else if (state.hasBlockEntity() && world.getBlockEntity(pos) instanceof Inventory inventory) { + if (inventory instanceof ChestBlockEntity && block instanceof ChestBlock chestBlock) { + return ChestBlock.getInventory(chestBlock, state, world, pos, true); + } + + return inventory; + } + + return null; + } + + private ItemStack addToFirstFreeSlot(Inventory inventory, ItemStack stack) { + int i = inventory.getMaxCount(stack); + + for (int j = 0; j < inventory.size(); j++) { + ItemStack itemStack = inventory.getStack(j); + if (itemStack.isEmpty() || ItemStack.areItemsAndComponentsEqual(stack, itemStack)) { + int k = Math.min(stack.getCount(), i - itemStack.getCount()); + if (k > 0) { + if (itemStack.isEmpty()) { + inventory.setStack(j, stack.split(k)); + } else { + stack.decrement(k); + itemStack.increment(k); + } + } + + if (stack.isEmpty()) { + break; + } + } + } + + return stack; + } + + @Override + protected void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { + if (state.get(POWERED)) { + world.setBlockState(pos, state.with(POWERED, false), Block.NOTIFY_LISTENERS); + } else { + world.setBlockState(pos, state.with(POWERED, true), Block.NOTIFY_LISTENERS); + world.scheduleBlockTick(pos, this, 2); + } + + this.updateNeighbors(world, pos, state); + } + + protected void updateNeighbors(World world, BlockPos pos, BlockState state) { + Direction direction = state.get(FACING); + BlockPos blockPos = pos.offset(direction); + world.updateNeighbor(blockPos, this, pos); + world.updateNeighborsExcept(blockPos, this, direction.getOpposite()); + } + + @Override + protected boolean emitsRedstonePower(BlockState state) { + return true; + } + + @Override + protected int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + return state.getWeakRedstonePower(world, pos, direction); + } + + @Override + protected int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { + return state.get(POWERED) && state.get(FACING) == direction.getOpposite() ? 15 : 0; + } + + @Override + protected void onStateReplaced(BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { + if (!state.isOf(newState.getBlock())) { + if (!world.isClient && state.get(POWERED) && world.getBlockTickScheduler().isQueued(pos, this)) { + this.updateNeighbors(world, pos, state.with(POWERED, false)); + } + } + } + + @Nullable + @Override + public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + return new ItemAcceptorBlockEntity(pos, state); + } + + @Override + public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return OUTLINE; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { + return OUTLINE; + } + + @Override + public void appendTooltip(ItemStack itemStack, Item.TooltipContext context, List tooltip, TooltipType options) { + tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.0").formatted(Formatting.GRAY)); + tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.1").formatted(Formatting.DARK_GRAY)); + } +} diff --git a/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java new file mode 100644 index 0000000..a865ea2 --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java @@ -0,0 +1,109 @@ +package dev.hephaestus.glowcase.block.entity; + +import dev.hephaestus.glowcase.Glowcase; +import dev.hephaestus.glowcase.client.render.block.entity.BakedBlockEntityRenderer; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.network.listener.ClientPlayPacketListener; +import net.minecraft.network.packet.Packet; +import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.tag.TagKey; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ItemAcceptorBlockEntity extends BlockEntity { + private Identifier item = Identifier.ofVanilla("air"); + public int count = 1; + public boolean isItemTag = false; + private List itemTagList = List.of(); + + public ItemAcceptorBlockEntity(BlockPos pos, BlockState state) { + super(Glowcase.ITEM_ACCEPTOR_BLOCK_ENTITY.get(), pos, state); + } + + @Override + public void writeNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLookup) { + super.writeNbt(tag, registryLookup); + + tag.putString("item", this.item.toString()); + tag.putInt("count", this.count); + tag.putBoolean("isItemTag", this.isItemTag); + } + + @Override + public void readNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLookup) { + super.readNbt(tag, registryLookup); + + setItem(Identifier.tryParse(tag.getString("item"))); + this.count = tag.getInt("count"); + this.isItemTag = tag.getBoolean("isItemTag"); + } + + public Identifier getItem() { + return item; + } + + public void setItem(Identifier item) { + this.item = item; + + TagKey itemTag = TagKey.of(RegistryKeys.ITEM, item); + itemTagList = Registries.ITEM.stream().filter(it -> it.getDefaultStack().isIn(itemTag)).toList(); + } + + public ItemStack getDisplayItemStack() { + if (isItemTag) { + if (itemTagList.isEmpty()) { + return ItemStack.EMPTY; + } + + return itemTagList.get((int) (Util.getMeasuringTimeMs() / 1000f) % itemTagList.size()).getDefaultStack(); + } else { + return Registries.ITEM.get(item).getDefaultStack(); + } + } + + public boolean isItemAccepted(ItemStack stack) { + boolean isEqual = isItemTag + ? stack.isIn(TagKey.of(RegistryKeys.ITEM, item)) + : stack.isOf(Registries.ITEM.get(item)); + + return isEqual && stack.getCount() >= count; + } + + @SuppressWarnings({"MethodCallSideOnly", "VariableUseSideOnly"}) + @Override + public void markRemoved() { + if (world != null && world.isClient) { + BakedBlockEntityRenderer.Manager.markForRebuild(getPos()); + } + super.markRemoved(); + } + + // standard blockentity boilerplate + + public void dispatch() { + if (world instanceof ServerWorld sworld) sworld.getChunkManager().markForUpdate(pos); + } + + @Override + public NbtCompound toInitialChunkDataNbt(RegistryWrapper.WrapperLookup registryLookup) { + return createNbt(registryLookup); + } + + @Nullable + @Override + public Packet toUpdatePacket() { + return BlockEntityUpdateS2CPacket.create(this); + } +} diff --git a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java index d65470a..8e35f46 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java +++ b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java @@ -1,15 +1,12 @@ package dev.hephaestus.glowcase.client; import dev.hephaestus.glowcase.Glowcase; -import dev.hephaestus.glowcase.client.render.block.entity.BakedBlockEntityRenderer; -import dev.hephaestus.glowcase.client.render.block.entity.HyperlinkBlockEntityRenderer; -import dev.hephaestus.glowcase.client.render.block.entity.ItemDisplayBlockEntityRenderer; -import dev.hephaestus.glowcase.client.render.block.entity.TextBlockEntityRenderer; -import dev.hephaestus.glowcase.client.render.block.entity.PopupBlockEntityRenderer; -import dev.hephaestus.glowcase.client.render.block.entity.SpriteBlockEntityRenderer; +import dev.hephaestus.glowcase.client.render.block.entity.*; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.rendering.v1.InvalidateRenderStateCallback; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; public class GlowcaseClient implements ClientModInitializer { @@ -22,8 +19,11 @@ public void onInitializeClient() { BlockEntityRendererFactories.register(Glowcase.ITEM_DISPLAY_BLOCK_ENTITY.get(), ItemDisplayBlockEntityRenderer::new); BlockEntityRendererFactories.register(Glowcase.POPUP_BLOCK_ENTITY.get(), PopupBlockEntityRenderer::new); BlockEntityRendererFactories.register(Glowcase.SPRITE_BLOCK_ENTITY.get(), SpriteBlockEntityRenderer::new); + BlockEntityRendererFactories.register(Glowcase.ITEM_ACCEPTOR_BLOCK_ENTITY.get(), ItemAcceptorBlockEntityRenderer::new); WorldRenderEvents.AFTER_TRANSLUCENT.register(BakedBlockEntityRenderer.Manager::render); InvalidateRenderStateCallback.EVENT.register(BakedBlockEntityRenderer.Manager::reset); + + BlockRenderLayerMap.INSTANCE.putBlock(Glowcase.ITEM_ACCEPTOR_BLOCK.get(), RenderLayer.getCutout()); } } diff --git a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClientProxy.java b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClientProxy.java index 6582ed2..1573d2c 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClientProxy.java +++ b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClientProxy.java @@ -1,17 +1,8 @@ package dev.hephaestus.glowcase.client; import dev.hephaestus.glowcase.GlowcaseCommonProxy; -import dev.hephaestus.glowcase.block.entity.HyperlinkBlockEntity; -import dev.hephaestus.glowcase.block.entity.ItemDisplayBlockEntity; -import dev.hephaestus.glowcase.block.entity.PopupBlockEntity; -import dev.hephaestus.glowcase.block.entity.SpriteBlockEntity; -import dev.hephaestus.glowcase.block.entity.TextBlockEntity; -import dev.hephaestus.glowcase.client.gui.screen.ingame.HyperlinkBlockEditScreen; -import dev.hephaestus.glowcase.client.gui.screen.ingame.ItemDisplayBlockEditScreen; -import dev.hephaestus.glowcase.client.gui.screen.ingame.TextBlockEditScreen; -import dev.hephaestus.glowcase.client.gui.screen.ingame.PopupBlockEditScreen; -import dev.hephaestus.glowcase.client.gui.screen.ingame.PopupBlockViewScreen; -import dev.hephaestus.glowcase.client.gui.screen.ingame.SpriteBlockEditScreen; +import dev.hephaestus.glowcase.block.entity.*; +import dev.hephaestus.glowcase.client.gui.screen.ingame.*; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ConfirmLinkScreen; import net.minecraft.util.math.BlockPos; @@ -69,4 +60,12 @@ public void openSpriteBlockEditScreen(BlockPos pos) { MinecraftClient.getInstance().setScreen(new SpriteBlockEditScreen(be)); } } + + @Override + public void openItemAcceptorBlockEditScreen(BlockPos pos) { + MinecraftClient client = MinecraftClient.getInstance(); + if (client.world != null && client.world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be) { + MinecraftClient.getInstance().setScreen(new ItemAcceptorBlockEditScreen(be)); + } + } } diff --git a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java new file mode 100644 index 0000000..a5733b1 --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java @@ -0,0 +1,66 @@ +package dev.hephaestus.glowcase.client.gui.screen.ingame; + +import com.google.common.primitives.Ints; +import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; +import dev.hephaestus.glowcase.packet.C2SEditItemAcceptorBlock; +import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.text.Text; +import net.minecraft.util.Identifier; + +public class ItemAcceptorBlockEditScreen extends GlowcaseScreen { + private final ItemAcceptorBlockEntity itemAcceptorBlockEntity; + + private TextFieldWidget itemWidget; + private TextFieldWidget countWidget; + + public ItemAcceptorBlockEditScreen(ItemAcceptorBlockEntity itemAcceptorBlockEntity) { + this.itemAcceptorBlockEntity = itemAcceptorBlockEntity; + } + + @Override + public void init() { + super.init(); + + if (this.client == null) return; + + Identifier item = this.itemAcceptorBlockEntity.getItem(); + + this.itemWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 - 25, 150, 20, Text.empty()); + if (!item.equals(Identifier.ofVanilla("air"))) { + this.itemWidget.setText((this.itemAcceptorBlockEntity.isItemTag ? "#" : "") + item); + } + this.itemWidget.setPlaceholder(Text.translatable("gui.glowcase.itemOrTag")); + this.itemWidget.setTextPredicate(s -> s.matches("#?[a-z0-9_.-]*:?[a-z0-9_./-]*")); + + this.countWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 + 5, 150, 20, Text.empty()); + this.countWidget.setText(String.valueOf(this.itemAcceptorBlockEntity.count)); + this.countWidget.setPlaceholder(Text.translatable("gui.glowcase.count")); + this.countWidget.setTextPredicate(s -> s.matches("\\d*")); + + this.addDrawableChild(this.itemWidget); + this.addDrawableChild(this.countWidget); + } + + @Override + public void close() { + String text = itemWidget.getText(); + boolean isItemTag = text.startsWith("#"); + if (isItemTag) { + text = text.substring(1); + } + + if (!text.isEmpty() && Identifier.tryParse(text) instanceof Identifier id) { + this.itemAcceptorBlockEntity.setItem(id); + this.itemAcceptorBlockEntity.isItemTag = isItemTag; + } else { + this.itemAcceptorBlockEntity.setItem(Identifier.ofVanilla("air")); + } + + if (Ints.tryParse(countWidget.getText()) instanceof Integer integer) { + this.itemAcceptorBlockEntity.count = Math.max(0, integer); + } + + C2SEditItemAcceptorBlock.of(this.itemAcceptorBlockEntity).send(); + super.close(); + } +} diff --git a/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java new file mode 100644 index 0000000..7dd36ae --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java @@ -0,0 +1,52 @@ +package dev.hephaestus.glowcase.client.render.block.entity; + +import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; +import dev.hephaestus.glowcase.block.entity.ItemDisplayBlockEntity; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.render.LightmapTextureManager; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.block.entity.BlockEntityRenderer; +import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; +import net.minecraft.client.render.model.json.ModelTransformationMode; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.Entity; +import net.minecraft.text.Text; +import net.minecraft.util.Colors; +import net.minecraft.util.Util; +import net.minecraft.util.math.RotationAxis; +import net.minecraft.util.math.Vec2f; + +public record ItemAcceptorBlockEntityRenderer(BlockEntityRendererFactory.Context context) implements BlockEntityRenderer +{ + private static final MinecraftClient mc = MinecraftClient.getInstance(); + + public void render(ItemAcceptorBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { + Entity camera = mc.getCameraEntity(); + + if (camera == null) return; + + // Render item + float yaw = (float) Math.toRadians(Util.getMeasuringTimeMs() / 1000f * 57.595f); + matrices.push(); + matrices.translate(0.5D, 0.5D, 0.5D); + matrices.multiply(RotationAxis.POSITIVE_Y.rotation(yaw)); + matrices.scale(0.5F, 0.5F, 0.5F); + context.getItemRenderer().renderItem(entity.getDisplayItemStack(), ModelTransformationMode.FIXED, light, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers, entity.getWorld(), 0); + + // Render count + Vec2f pitchAndYaw = ItemDisplayBlockEntity.getPitchAndYaw(camera, entity.getPos(), tickDelta); + float scale = 0.0375F; + matrices.multiply(RotationAxis.POSITIVE_Y.rotation(pitchAndYaw.y - yaw)); + matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180)); + matrices.translate(0, 0.75, 0); + matrices.scale(scale, scale, scale); + + Text count = Text.literal(String.valueOf(entity.count)); + matrices.translate(-context.getTextRenderer().getWidth(count) / 2F, -4, 0); + context.getTextRenderer().draw(count, 0, 0, Colors.WHITE, false, matrices.peek().getPositionMatrix(), vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + + matrices.pop(); + } +} diff --git a/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java new file mode 100644 index 0000000..40b46e2 --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java @@ -0,0 +1,44 @@ +package dev.hephaestus.glowcase.packet; + +import dev.hephaestus.glowcase.Glowcase; +import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.network.RegistryByteBuf; +import net.minecraft.network.codec.PacketCodec; +import net.minecraft.network.codec.PacketCodecs; +import net.minecraft.network.packet.CustomPayload; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; + +public record C2SEditItemAcceptorBlock(BlockPos pos, Identifier item, int count, boolean isItemTag) implements C2SEditBlockEntity { + public static final Id ID = new Id<>(Glowcase.id("channel.item_acceptor.save")); + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + BlockPos.PACKET_CODEC, C2SEditItemAcceptorBlock::pos, + Identifier.PACKET_CODEC, C2SEditItemAcceptorBlock::item, + PacketCodecs.INTEGER, C2SEditItemAcceptorBlock::count, + PacketCodecs.BOOL, C2SEditItemAcceptorBlock::isItemTag, + C2SEditItemAcceptorBlock::new + ); + + public static C2SEditItemAcceptorBlock of(ItemAcceptorBlockEntity be) { + return new C2SEditItemAcceptorBlock(be.getPos(), be.getItem(), be.count, be.isItemTag); + } + + @Override + public Id getId() { + return ID; + } + + @Override + public void receive(ServerWorld world, BlockEntity blockEntity) { + if (!(blockEntity instanceof ItemAcceptorBlockEntity be)) return; + + be.setItem(this.item()); + be.count = this.count(); + be.isItemTag = this.isItemTag(); + + be.markDirty(); + be.dispatch(); + } +} diff --git a/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json b/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json new file mode 100644 index 0000000..8166d51 --- /dev/null +++ b/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json @@ -0,0 +1,40 @@ +{ + "variants": { + "facing=down,powered=false": { + "model": "glowcase:block/item_acceptor_block" + }, + "facing=east,powered=false": { + "model": "glowcase:block/item_acceptor_block_side", + "y": 90 + }, + "facing=north,powered=false": { + "model": "glowcase:block/item_acceptor_block_side" + }, + "facing=south,powered=false": { + "model": "glowcase:block/item_acceptor_block_side", + "y": 180 + }, + "facing=west,powered=false": { + "model": "glowcase:block/item_acceptor_block_side", + "y": 270 + }, + "facing=down,powered=true": { + "model": "glowcase:block/item_acceptor_block_on" + }, + "facing=east,powered=true": { + "model": "glowcase:block/item_acceptor_block_side_on", + "y": 90 + }, + "facing=north,powered=true": { + "model": "glowcase:block/item_acceptor_block_side_on" + }, + "facing=south,powered=true": { + "model": "glowcase:block/item_acceptor_block_side_on", + "y": 180 + }, + "facing=west,powered=true": { + "model": "glowcase:block/item_acceptor_block_side_on", + "y": 270 + } + } +} diff --git a/src/main/resources/assets/glowcase/lang/en_us.json b/src/main/resources/assets/glowcase/lang/en_us.json index 84c8cec..a5bb619 100644 --- a/src/main/resources/assets/glowcase/lang/en_us.json +++ b/src/main/resources/assets/glowcase/lang/en_us.json @@ -5,6 +5,7 @@ "block.glowcase.item_display_block": "Item Display Block", "block.glowcase.popup_block": "Popup Block", "block.glowcase.sprite_block": "Sprite Block", + "block.glowcase.item_acceptor_block": "Item Acceptor Block", "gui.glowcase.scale": "Scale: %d", "gui.glowcase.alignment": "Alignment: %s", "gui.glowcase.gives_item": "Gives Item: %s", @@ -20,6 +21,8 @@ "gui.glowcase.unlocked_block": "%s is now unlocked \uD83D\uDD13", "gui.glowcase.title": "Title", "gui.glowcase.url": "URL", + "gui.glowcase.itemOrTag": "Item or Item Tag", + "gui.glowcase.count": "Count", "block.glowcase.generic.tooltip": "Interact with a glowcase item to edit", "block.glowcase.text_block.tooltip.0": "Displays formatted text", "block.glowcase.text_block.tooltip.1": "Supports Placeholder QuickText", @@ -31,5 +34,7 @@ "block.glowcase.popup_block.tooltip.1": "Supports Placeholder QuickText", "block.glowcase.sprite_block.tooltip.0": "Displays a sprite", "block.glowcase.sprite_block.tooltip.1": "Can be extended with resource packs", + "block.glowcase.item_acceptor_block.tooltip.0": "Emits a redstone pulse when given the required item", + "block.glowcase.item_acceptor_block.tooltip.1": "Interact in Creative mode to edit", "item.glowcase.lock.tooltip.0": "Locks and unlocks containers" } diff --git a/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json b/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json new file mode 100644 index 0000000..41bceb8 --- /dev/null +++ b/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json @@ -0,0 +1,147 @@ +{ + "parent": "block/cube_all", + "elements": [ + { + "from": [ + 0, + 0, + 0 + ], + "to": [ + 16, + 16, + 16 + ], + "faces": { + "north": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#north", + "cullface": "north" + }, + "east": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#east", + "cullface": "east" + }, + "south": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#south", + "cullface": "south" + }, + "west": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#west", + "cullface": "west" + }, + "up": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#up", + "cullface": "up" + }, + "down": { + "uv": [ + 0, + 0, + 16, + 16 + ], + "texture": "#down", + "cullface": "down" + } + } + }, + { + "from": [ + 15.998, + 0.002, + 0.002 + ], + "to": [ + 0.002, + 15.998, + 15.998 + ], + "faces": { + "north": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_south" + }, + "east": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_west" + }, + "south": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_north" + }, + "west": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_east" + }, + "up": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_up" + }, + "down": { + "uv": [ + 16, + 0, + 0, + 16 + ], + "texture": "#inner_down" + } + } + } + ] +} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json new file mode 100644 index 0000000..e526767 --- /dev/null +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json @@ -0,0 +1,18 @@ +{ + "parent": "glowcase:block/cube_inner_faces", + "textures": { + "particle": "block/glass", + "down": "block/observer_back", + "up": "block/glass", + "north": "block/glass", + "east": "block/glass", + "south": "block/glass", + "west": "block/glass", + "inner_down": "block/smooth_stone", + "inner_up": "glowcase:block/invisible", + "inner_north": "glowcase:block/invisible", + "inner_east": "glowcase:block/invisible", + "inner_south": "glowcase:block/invisible", + "inner_west": "glowcase:block/invisible" + } +} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json new file mode 100644 index 0000000..09ba376 --- /dev/null +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json @@ -0,0 +1,6 @@ +{ + "parent": "glowcase:block/item_acceptor_block", + "textures": { + "down": "block/observer_back_on" + } +} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json new file mode 100644 index 0000000..5ff659a --- /dev/null +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json @@ -0,0 +1,18 @@ +{ + "parent": "glowcase:block/cube_inner_faces", + "textures": { + "particle": "block/glass", + "down": "block/smooth_stone", + "up": "block/glass", + "north": "block/observer_back", + "east": "block/glass", + "south": "block/glass", + "west": "block/glass", + "inner_down": "block/smooth_stone", + "inner_up": "glowcase:block/invisible", + "inner_north": "glowcase:block/invisible", + "inner_east": "glowcase:block/invisible", + "inner_south": "block/smooth_stone", + "inner_west": "glowcase:block/invisible" + } +} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json new file mode 100644 index 0000000..1564670 --- /dev/null +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json @@ -0,0 +1,6 @@ +{ + "parent": "glowcase:block/item_acceptor_block_side", + "textures": { + "north": "block/observer_back_on" + } +} diff --git a/src/main/resources/assets/glowcase/models/item/item_acceptor_block.json b/src/main/resources/assets/glowcase/models/item/item_acceptor_block.json new file mode 100644 index 0000000..3833156 --- /dev/null +++ b/src/main/resources/assets/glowcase/models/item/item_acceptor_block.json @@ -0,0 +1,3 @@ +{ + "parent": "glowcase:block/item_acceptor_block" +} diff --git a/src/main/resources/assets/glowcase/textures/block/invisible.png b/src/main/resources/assets/glowcase/textures/block/invisible.png new file mode 100644 index 0000000000000000000000000000000000000000..dde5384b499bad0372cf4cf78c81299bd2771364 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL19l9#}EtuWC_;A2_ijA1_=p3jRFje%Ux=c Pfzk|~u6{1-oD!M Date: Fri, 15 Nov 2024 20:01:02 -0500 Subject: [PATCH 02/14] Added missing imports --- src/main/java/dev/hephaestus/glowcase/Glowcase.java | 2 ++ src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java | 1 + .../java/dev/hephaestus/glowcase/client/GlowcaseClient.java | 1 + 3 files changed, 4 insertions(+) diff --git a/src/main/java/dev/hephaestus/glowcase/Glowcase.java b/src/main/java/dev/hephaestus/glowcase/Glowcase.java index c8b3c59..5c59f52 100644 --- a/src/main/java/dev/hephaestus/glowcase/Glowcase.java +++ b/src/main/java/dev/hephaestus/glowcase/Glowcase.java @@ -3,6 +3,7 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import dev.hephaestus.glowcase.block.HyperlinkBlock; +import dev.hephaestus.glowcase.block.ItemAcceptorBlock; import dev.hephaestus.glowcase.block.ItemDisplayBlock; import dev.hephaestus.glowcase.block.OutlineBlock; import dev.hephaestus.glowcase.block.ParticleDisplayBlock; @@ -10,6 +11,7 @@ import dev.hephaestus.glowcase.block.SpriteBlock; import dev.hephaestus.glowcase.block.TextBlock; import dev.hephaestus.glowcase.block.entity.HyperlinkBlockEntity; +import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; import dev.hephaestus.glowcase.block.entity.ItemDisplayBlockEntity; import dev.hephaestus.glowcase.block.entity.OutlineBlockEntity; import dev.hephaestus.glowcase.block.entity.ParticleDisplayBlockEntity; diff --git a/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java b/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java index 5e6ddbd..4a4ff36 100644 --- a/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java +++ b/src/main/java/dev/hephaestus/glowcase/GlowcaseNetworking.java @@ -1,6 +1,7 @@ package dev.hephaestus.glowcase; import dev.hephaestus.glowcase.packet.C2SEditHyperlinkBlock; +import dev.hephaestus.glowcase.packet.C2SEditItemAcceptorBlock; import dev.hephaestus.glowcase.packet.C2SEditItemDisplayBlock; import dev.hephaestus.glowcase.packet.C2SEditOutlineBlock; import dev.hephaestus.glowcase.packet.C2SEditParticleDisplayBlock; diff --git a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java index 40f6720..883580f 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java +++ b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java @@ -3,6 +3,7 @@ import dev.hephaestus.glowcase.Glowcase; import dev.hephaestus.glowcase.client.render.block.entity.BakedBlockEntityRenderer; import dev.hephaestus.glowcase.client.render.block.entity.HyperlinkBlockEntityRenderer; +import dev.hephaestus.glowcase.client.render.block.entity.ItemAcceptorBlockEntityRenderer; import dev.hephaestus.glowcase.client.render.block.entity.ItemDisplayBlockEntityRenderer; import dev.hephaestus.glowcase.client.render.block.entity.OutlineBlockEntityRenderer; import dev.hephaestus.glowcase.client.render.block.entity.PopupBlockEntityRenderer; From 2517f2e2fd84371e6e16fbcdd10f160902645d29 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Fri, 15 Nov 2024 20:04:16 -0500 Subject: [PATCH 03/14] Changed stack decrement code to use decrementUnlessCreative --- .../java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java index 6366494..284d14c 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -88,7 +88,7 @@ protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, Worl if (!world.isClient() && !world.getBlockTickScheduler().isQueued(pos, this) && be.isItemAccepted(stack)) { // Remove items ItemStack newStack = stack.copyWithCount(be.count); - stack.setCount(stack.getCount() - be.count); + stack.decrementUnlessCreative(be.count, player); // Schedule redstone pulse world.scheduleBlockTick(pos, this, 2); From 797fa23905da280e3a1788aefdeca76754fbcb86 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sat, 16 Nov 2024 00:21:57 -0500 Subject: [PATCH 04/14] Reordered statements to fix interaction behavior order --- .../glowcase/block/ItemAcceptorBlock.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java index 284d14c..a8ff47e 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -74,18 +74,21 @@ public void onPlaced(World world, BlockPos pos, BlockState state, LivingEntity p @Override protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) return ActionResult.CONSUME; - if (canEditGlowcase(player, pos) && world.isClient) { - Glowcase.proxy.openItemAcceptorBlockEditScreen(be.getPos()); + if (canEditGlowcase(player, pos)) { + if (world.isClient) { + Glowcase.proxy.openItemAcceptorBlockEditScreen(be.getPos()); + } + return ActionResult.SUCCESS; } - return ActionResult.SUCCESS; + return ActionResult.PASS; } @Override protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) return ItemActionResult.CONSUME; - if (!stack.isEmpty()) { - if (!world.isClient() && !world.getBlockTickScheduler().isQueued(pos, this) && be.isItemAccepted(stack)) { + if (be.isItemAccepted(stack) && !world.getBlockTickScheduler().isQueued(pos, this)) { + if (!world.isClient()) { // Remove items ItemStack newStack = stack.copyWithCount(be.count); stack.decrementUnlessCreative(be.count, player); @@ -100,6 +103,7 @@ protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, Worl addToFirstFreeSlot(inventory, newStack); } } + return ItemActionResult.SUCCESS; } return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; From 9b71435dc165b460b36150dd35fb94c4eee8c08f Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:58:48 -0500 Subject: [PATCH 05/14] Added rotate translation string --- .../client/gui/screen/ingame/SpriteBlockEditScreen.java | 2 +- src/main/resources/assets/glowcase/lang/en_us.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/SpriteBlockEditScreen.java b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/SpriteBlockEditScreen.java index 7e21327..458a10c 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/SpriteBlockEditScreen.java +++ b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/SpriteBlockEditScreen.java @@ -35,7 +35,7 @@ public void init() { } }); - this.rotationWidget = ButtonWidget.builder(Text.literal("Rotate"), (action) -> { + this.rotationWidget = ButtonWidget.builder(Text.translatable("gui.glowcase.rotate"), (action) -> { this.spriteBlockEntity.rotation += 45; if (this.spriteBlockEntity.rotation >= 360) { this.spriteBlockEntity.rotation = 0; diff --git a/src/main/resources/assets/glowcase/lang/en_us.json b/src/main/resources/assets/glowcase/lang/en_us.json index 5ea28e9..aaee77c 100644 --- a/src/main/resources/assets/glowcase/lang/en_us.json +++ b/src/main/resources/assets/glowcase/lang/en_us.json @@ -25,6 +25,7 @@ "gui.glowcase.url": "URL", "gui.glowcase.offset": "Offset", "gui.glowcase.scale": "Scale", + "gui.glowcase.rotate": "Rotate", "gui.glowcase.x": "X", "gui.glowcase.y": "Y", "gui.glowcase.z": "Z", From bc9c63246cb6bb3eda0f44ce62ee0d085dc76a95 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:59:25 -0500 Subject: [PATCH 06/14] New item acceptor block model and textures --- .../blockstates/item_acceptor_block.json | 22 +++++++----------- .../models/block/item_acceptor_block.json | 18 ++++---------- .../models/block/item_acceptor_block_on.json | 2 +- .../textures/block/item_acceptor_front.png | Bin 0 -> 515 bytes .../textures/block/item_acceptor_front_on.png | Bin 0 -> 515 bytes 5 files changed, 13 insertions(+), 29 deletions(-) create mode 100644 src/main/resources/assets/glowcase/textures/block/item_acceptor_front.png create mode 100644 src/main/resources/assets/glowcase/textures/block/item_acceptor_front_on.png diff --git a/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json b/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json index 8166d51..23ffb5a 100644 --- a/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json +++ b/src/main/resources/assets/glowcase/blockstates/item_acceptor_block.json @@ -1,39 +1,33 @@ { "variants": { - "facing=down,powered=false": { + "facing=north,powered=false": { "model": "glowcase:block/item_acceptor_block" }, "facing=east,powered=false": { - "model": "glowcase:block/item_acceptor_block_side", + "model": "glowcase:block/item_acceptor_block", "y": 90 }, - "facing=north,powered=false": { - "model": "glowcase:block/item_acceptor_block_side" - }, "facing=south,powered=false": { - "model": "glowcase:block/item_acceptor_block_side", + "model": "glowcase:block/item_acceptor_block", "y": 180 }, "facing=west,powered=false": { - "model": "glowcase:block/item_acceptor_block_side", + "model": "glowcase:block/item_acceptor_block", "y": 270 }, - "facing=down,powered=true": { + "facing=north,powered=true": { "model": "glowcase:block/item_acceptor_block_on" }, "facing=east,powered=true": { - "model": "glowcase:block/item_acceptor_block_side_on", + "model": "glowcase:block/item_acceptor_block_on", "y": 90 }, - "facing=north,powered=true": { - "model": "glowcase:block/item_acceptor_block_side_on" - }, "facing=south,powered=true": { - "model": "glowcase:block/item_acceptor_block_side_on", + "model": "glowcase:block/item_acceptor_block_on", "y": 180 }, "facing=west,powered=true": { - "model": "glowcase:block/item_acceptor_block_side_on", + "model": "glowcase:block/item_acceptor_block_on", "y": 270 } } diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json index e526767..3859e40 100644 --- a/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block.json @@ -1,18 +1,8 @@ { - "parent": "glowcase:block/cube_inner_faces", + "parent": "minecraft:block/orientable", "textures": { - "particle": "block/glass", - "down": "block/observer_back", - "up": "block/glass", - "north": "block/glass", - "east": "block/glass", - "south": "block/glass", - "west": "block/glass", - "inner_down": "block/smooth_stone", - "inner_up": "glowcase:block/invisible", - "inner_north": "glowcase:block/invisible", - "inner_east": "glowcase:block/invisible", - "inner_south": "glowcase:block/invisible", - "inner_west": "glowcase:block/invisible" + "front": "glowcase:block/item_acceptor_front", + "side": "minecraft:block/observer_side", + "top": "minecraft:block/furnace_top" } } diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json index 09ba376..d606fbf 100644 --- a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json +++ b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_on.json @@ -1,6 +1,6 @@ { "parent": "glowcase:block/item_acceptor_block", "textures": { - "down": "block/observer_back_on" + "front": "glowcase:block/item_acceptor_front_on" } } diff --git a/src/main/resources/assets/glowcase/textures/block/item_acceptor_front.png b/src/main/resources/assets/glowcase/textures/block/item_acceptor_front.png new file mode 100644 index 0000000000000000000000000000000000000000..74e40bf887f45cc20b3d9e3b8ec33c635b493eb4 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|+7TN@iUCnr-Alm7nxxpU_pJ$kgNs!CHsK|)ky{rdG4ER33(nqG`d zs*KF3sj1f1*5TpdEIT7QfZ90=JR*x382Ao>Fr%o3R|8N`ti&~6n999M?Mpgz!Aj=DgrJ-z)S2P%z!QxCn zwjm=E10Rr%0^-be7O;2*kPQN#$`~150DTOjQLJPDN=#s9U;(N#Ffuk^TmUf>WFPAS zh&hvhY!F}qn#u%L8DwbzWI=Tq8W@0NWu+okp5tWA1v1M$T^vI+f>Zl?`C1G(nqNEk zJ(bz>|8m?%b-ncMt#7;=nJ%+zDHD@32@Dk7H%Z_{jptF9%&Lak9tP$Jt{y(7Kh|*# z#!r69JMS!Gh>5n8$h0=d#Wzp$Py+qky;o literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/glowcase/textures/block/item_acceptor_front_on.png b/src/main/resources/assets/glowcase/textures/block/item_acceptor_front_on.png new file mode 100644 index 0000000000000000000000000000000000000000..9039e19a68dcdacd578534335637996fce82b1c5 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}x0G|+7TN@iUCnr-Alm7nxxpU_pJ9ez9s!CHsK|)ky{rdI)8JIOSHLox- zZDeLhO-;47whj*uzax6Z4XB;7z$3Dlfr0NZ2s0kfUy%Y76f1F!C<)F_D=AMbN@WO0 z%*-p%^K%VRFx4~s-u!(sP{o$i2+uT6Pb~%xAcvJfijkFp5yjH>5 zlYndxU;>)L1XdYjX#r$Gbr~8MfMk=Gs2vIN`+Ek+EcbMA4ABTq?d#=hG2m!^?cn!R zX3zi2aUa$7(zmz1@or?g%(A6SOwJ@QP;}oUffqHNM_n?j8ftqOm?OA)_?Z4!$2Ax~ z`6chXvy34o+EOC(>eOA$cNJIq@)rC$(Uo`quFSo)Royr9Yz1cS{XETRazhdSdMUY& Y%qEXn*WKLJ?GJK}r>mdKI;Vst0H2Y8^8f$< literal 0 HcmV?d00001 From 82a291dfba711924f29f6713658d4f028477726e Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sat, 16 Nov 2024 23:59:39 -0500 Subject: [PATCH 07/14] Removed cutout render layer --- .../java/dev/hephaestus/glowcase/client/GlowcaseClient.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java index 883580f..d3073f4 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java +++ b/src/main/java/dev/hephaestus/glowcase/client/GlowcaseClient.java @@ -10,10 +10,8 @@ import dev.hephaestus.glowcase.client.render.block.entity.SpriteBlockEntityRenderer; import dev.hephaestus.glowcase.client.render.block.entity.TextBlockEntityRenderer; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.rendering.v1.InvalidateRenderStateCallback; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; public class GlowcaseClient implements ClientModInitializer { @@ -31,7 +29,5 @@ public void onInitializeClient() { WorldRenderEvents.AFTER_TRANSLUCENT.register(BakedBlockEntityRenderer.Manager::render); InvalidateRenderStateCallback.EVENT.register(BakedBlockEntityRenderer.Manager::reset); - - BlockRenderLayerMap.INSTANCE.putBlock(Glowcase.ITEM_ACCEPTOR_BLOCK.get(), RenderLayer.getCutout()); } } From 82f0856cdc4e6c4f010b5ac29dc1d386d61c5114 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 00:00:20 -0500 Subject: [PATCH 08/14] Fixed casing --- .../glowcase/block/entity/ItemAcceptorBlockEntity.java | 4 ++-- .../client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java | 2 +- src/main/resources/assets/glowcase/lang/en_us.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java index a865ea2..3a6a3c7 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java +++ b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java @@ -38,7 +38,7 @@ public void writeNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLook tag.putString("item", this.item.toString()); tag.putInt("count", this.count); - tag.putBoolean("isItemTag", this.isItemTag); + tag.putBoolean("is_item_tag", this.isItemTag); } @Override @@ -47,7 +47,7 @@ public void readNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLooku setItem(Identifier.tryParse(tag.getString("item"))); this.count = tag.getInt("count"); - this.isItemTag = tag.getBoolean("isItemTag"); + this.isItemTag = tag.getBoolean("is_item_tag"); } public Identifier getItem() { diff --git a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java index a5733b1..29afb86 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java +++ b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java @@ -29,7 +29,7 @@ public void init() { if (!item.equals(Identifier.ofVanilla("air"))) { this.itemWidget.setText((this.itemAcceptorBlockEntity.isItemTag ? "#" : "") + item); } - this.itemWidget.setPlaceholder(Text.translatable("gui.glowcase.itemOrTag")); + this.itemWidget.setPlaceholder(Text.translatable("gui.glowcase.item_or_tag")); this.itemWidget.setTextPredicate(s -> s.matches("#?[a-z0-9_.-]*:?[a-z0-9_./-]*")); this.countWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 + 5, 150, 20, Text.empty()); diff --git a/src/main/resources/assets/glowcase/lang/en_us.json b/src/main/resources/assets/glowcase/lang/en_us.json index aaee77c..c460df7 100644 --- a/src/main/resources/assets/glowcase/lang/en_us.json +++ b/src/main/resources/assets/glowcase/lang/en_us.json @@ -37,7 +37,7 @@ "gui.glowcase.count_std_dev": "Amount Deviation", "gui.glowcase.tick_rate_mean": "Mean Tick Rate", "gui.glowcase.tick_rate_std_dev": "Tick Rate Deviation", - "gui.glowcase.itemOrTag": "Item or Item Tag", + "gui.glowcase.item_or_tag": "Item or Item Tag", "gui.glowcase.count": "Count", "block.glowcase.generic.tooltip": "Interact with a glowcase item to edit", "block.glowcase.text_block.tooltip.0": "Displays formatted text", From 1a7cea2368e0c6f6e633a0ba2f72068858a0c937 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 00:01:04 -0500 Subject: [PATCH 09/14] Reworked item acceptor rendering and behavior --- .../glowcase/block/ItemAcceptorBlock.java | 26 +++++-- .../block/entity/ItemAcceptorBlockEntity.java | 8 +++ .../ingame/ItemAcceptorBlockEditScreen.java | 18 ++++- .../ItemAcceptorBlockEntityRenderer.java | 70 ++++++++++++++----- .../mixin/client/RenderSystemAccessor.java | 15 ++++ .../packet/C2SEditItemAcceptorBlock.java | 6 +- .../resources/assets/glowcase/lang/en_us.json | 1 + src/main/resources/glowcase.mixins.json | 1 + 8 files changed, 115 insertions(+), 30 deletions(-) create mode 100644 src/main/java/dev/hephaestus/glowcase/mixin/client/RenderSystemAccessor.java diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java index a8ff47e..aae4954 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -38,12 +38,12 @@ public class ItemAcceptorBlock extends GlowcaseBlock implements BlockEntityProvider { private static final VoxelShape OUTLINE = VoxelShapes.cuboid(0, 0, 0, 1, 1, 1); - public static final DirectionProperty FACING = Properties.HOPPER_FACING; + public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; public static final BooleanProperty POWERED = Properties.POWERED; public ItemAcceptorBlock() { super(); - this.setDefaultState(this.getDefaultState().with(FACING, Direction.DOWN).with(POWERED, false)); + this.setDefaultState(this.getDefaultState().with(FACING, Direction.NORTH).with(POWERED, false)); } @Override @@ -55,7 +55,7 @@ protected void appendProperties(StateManager.Builder builder) @Override public BlockState getPlacementState(ItemPlacementContext ctx) { Direction direction = ctx.getSide().getOpposite(); - return this.getDefaultState().with(FACING, direction.getAxis() == Direction.Axis.Y ? Direction.DOWN : direction); + return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite()); } @Override @@ -97,7 +97,7 @@ protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, Worl world.scheduleBlockTick(pos, this, 2); // Attempt to insert items - Inventory inventory = getInventoryAt(world, pos.offset(state.get(FACING))); + Inventory inventory = getInventoryAt(world, pos.offset(getOutputDirection(world, pos, state))); if (inventory != null) { addToFirstFreeSlot(inventory, newStack); @@ -164,7 +164,7 @@ protected void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, } protected void updateNeighbors(World world, BlockPos pos, BlockState state) { - Direction direction = state.get(FACING); + Direction direction = getOutputDirection(world, pos, state); BlockPos blockPos = pos.offset(direction); world.updateNeighbor(blockPos, this, pos); world.updateNeighborsExcept(blockPos, this, direction.getOpposite()); @@ -177,12 +177,12 @@ protected boolean emitsRedstonePower(BlockState state) { @Override protected int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { - return state.getWeakRedstonePower(world, pos, direction); + return 0; //state.getWeakRedstonePower(world, pos, direction); } @Override protected int getWeakRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { - return state.get(POWERED) && state.get(FACING) == direction.getOpposite() ? 15 : 0; + return state.get(POWERED) && getOutputDirection(world, pos, state) == direction.getOpposite() ? 15 : 0; } @Override @@ -194,6 +194,18 @@ protected void onStateReplaced(BlockState state, World world, BlockPos pos, Bloc } } + public Direction getOutputDirection(BlockView world, BlockPos pos, BlockState state) { + if (world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity blockEntity) { + return switch (blockEntity.outputDirection) { + case BOTTOM -> Direction.DOWN; + case BACK -> state.get(FACING).getOpposite(); + case TOP -> Direction.UP; + }; + } + + return state.get(FACING).getOpposite(); + } + @Nullable @Override public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { diff --git a/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java index 3a6a3c7..9748fde 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java +++ b/src/main/java/dev/hephaestus/glowcase/block/entity/ItemAcceptorBlockEntity.java @@ -25,6 +25,7 @@ public class ItemAcceptorBlockEntity extends BlockEntity { private Identifier item = Identifier.ofVanilla("air"); public int count = 1; + public OutputDirection outputDirection = OutputDirection.BACK; public boolean isItemTag = false; private List itemTagList = List.of(); @@ -39,6 +40,7 @@ public void writeNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLook tag.putString("item", this.item.toString()); tag.putInt("count", this.count); tag.putBoolean("is_item_tag", this.isItemTag); + tag.putString("output_direction", this.outputDirection.name()); } @Override @@ -48,6 +50,7 @@ public void readNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLooku setItem(Identifier.tryParse(tag.getString("item"))); this.count = tag.getInt("count"); this.isItemTag = tag.getBoolean("is_item_tag"); + this.outputDirection = OutputDirection.valueOf(tag.getString("output_direction")); } public Identifier getItem() { @@ -106,4 +109,9 @@ public NbtCompound toInitialChunkDataNbt(RegistryWrapper.WrapperLookup registryL public Packet toUpdatePacket() { return BlockEntityUpdateS2CPacket.create(this); } + + public enum OutputDirection + { + TOP, BACK, BOTTOM + } } diff --git a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java index 29afb86..3472589 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java +++ b/src/main/java/dev/hephaestus/glowcase/client/gui/screen/ingame/ItemAcceptorBlockEditScreen.java @@ -3,6 +3,7 @@ import com.google.common.primitives.Ints; import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; import dev.hephaestus.glowcase.packet.C2SEditItemAcceptorBlock; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -12,6 +13,7 @@ public class ItemAcceptorBlockEditScreen extends GlowcaseScreen { private TextFieldWidget itemWidget; private TextFieldWidget countWidget; + private ButtonWidget outputDirectionToggle; public ItemAcceptorBlockEditScreen(ItemAcceptorBlockEntity itemAcceptorBlockEntity) { this.itemAcceptorBlockEntity = itemAcceptorBlockEntity; @@ -25,20 +27,32 @@ public void init() { Identifier item = this.itemAcceptorBlockEntity.getItem(); - this.itemWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 - 25, 150, 20, Text.empty()); + this.itemWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 - 40, 150, 20, Text.empty()); + this.itemWidget.setMaxLength(128); if (!item.equals(Identifier.ofVanilla("air"))) { this.itemWidget.setText((this.itemAcceptorBlockEntity.isItemTag ? "#" : "") + item); } this.itemWidget.setPlaceholder(Text.translatable("gui.glowcase.item_or_tag")); this.itemWidget.setTextPredicate(s -> s.matches("#?[a-z0-9_.-]*:?[a-z0-9_./-]*")); - this.countWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 + 5, 150, 20, Text.empty()); + this.countWidget = new TextFieldWidget(this.textRenderer, width / 2 - 75, height / 2 - 10, 150, 20, Text.empty()); this.countWidget.setText(String.valueOf(this.itemAcceptorBlockEntity.count)); this.countWidget.setPlaceholder(Text.translatable("gui.glowcase.count")); this.countWidget.setTextPredicate(s -> s.matches("\\d*")); + this.outputDirectionToggle = ButtonWidget.builder(Text.translatable("gui.glowcase.output_direction", this.itemAcceptorBlockEntity.outputDirection.toString()), action -> { + switch (itemAcceptorBlockEntity.outputDirection) { + case TOP -> itemAcceptorBlockEntity.outputDirection = ItemAcceptorBlockEntity.OutputDirection.BACK; + case BACK -> itemAcceptorBlockEntity.outputDirection = ItemAcceptorBlockEntity.OutputDirection.BOTTOM; + case BOTTOM -> itemAcceptorBlockEntity.outputDirection = ItemAcceptorBlockEntity.OutputDirection.TOP; + } + + this.outputDirectionToggle.setMessage(Text.translatable("gui.glowcase.output_direction", this.itemAcceptorBlockEntity.outputDirection.toString())); + }).dimensions(width / 2 - 75, height / 2 + 20, 150, 20).build(); + this.addDrawableChild(this.itemWidget); this.addDrawableChild(this.countWidget); + this.addDrawableChild(this.outputDirectionToggle); } @Override diff --git a/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java index 7dd36ae..7fef5fe 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java +++ b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java @@ -1,52 +1,84 @@ package dev.hephaestus.glowcase.client.render.block.entity; +import dev.hephaestus.glowcase.Glowcase; +import dev.hephaestus.glowcase.block.ItemAcceptorBlock; import dev.hephaestus.glowcase.block.entity.ItemAcceptorBlockEntity; -import dev.hephaestus.glowcase.block.entity.ItemDisplayBlockEntity; +import dev.hephaestus.glowcase.mixin.client.RenderSystemAccessor; +import net.minecraft.block.BlockState; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.render.DiffuseLighting; import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; +import net.minecraft.client.render.item.ItemRenderer; +import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformationMode; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.Entity; -import net.minecraft.text.Text; import net.minecraft.util.Colors; -import net.minecraft.util.Util; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.RotationAxis; -import net.minecraft.util.math.Vec2f; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; -public record ItemAcceptorBlockEntityRenderer(BlockEntityRendererFactory.Context context) implements BlockEntityRenderer -{ +public record ItemAcceptorBlockEntityRenderer(BlockEntityRendererFactory.Context context) implements BlockEntityRenderer { private static final MinecraftClient mc = MinecraftClient.getInstance(); + private static final Quaternionf ITEM_LIGHT_ROTATION_3D = RotationAxis.POSITIVE_X.rotationDegrees(-15).mul(RotationAxis.POSITIVE_Y.rotationDegrees(15)); + private static final Quaternionf ITEM_LIGHT_ROTATION_FLAT = RotationAxis.POSITIVE_X.rotationDegrees(-45); public void render(ItemAcceptorBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { Entity camera = mc.getCameraEntity(); if (camera == null) return; + ItemRenderer itemRenderer = context.getItemRenderer(); + BakedModel itemModel = itemRenderer.getModel(entity.getDisplayItemStack(), entity.getWorld(), null, 0); + // Render item - float yaw = (float) Math.toRadians(Util.getMeasuringTimeMs() / 1000f * 57.595f); + float yaw = 0; matrices.push(); - matrices.translate(0.5D, 0.5D, 0.5D); - matrices.multiply(RotationAxis.POSITIVE_Y.rotation(yaw)); + matrices.translate(0.5, 0.5, 0.5); + BlockState blockState = entity.getWorld().getBlockState(entity.getPos()); + if (blockState.isOf(Glowcase.ITEM_ACCEPTOR_BLOCK.get())) { + yaw = getRotationYForSide2D(blockState.get(ItemAcceptorBlock.FACING)); + } + matrices.peek().getPositionMatrix().mul(new Matrix4f().rotateY(yaw).translate(-0.125f, 0.125f, 0.51F).scale(1, 1, 0.01F)); matrices.scale(0.5F, 0.5F, 0.5F); - context.getItemRenderer().renderItem(entity.getDisplayItemStack(), ModelTransformationMode.FIXED, light, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers, entity.getWorld(), 0); + + Vector3f[] lights = new Vector3f[2]; + System.arraycopy(RenderSystemAccessor.getShaderLightDirections(), 0, lights, 0, 2); + + if (itemModel.isSideLit()) { + matrices.peek().getNormalMatrix().rotate(ITEM_LIGHT_ROTATION_3D); + DiffuseLighting.enableGuiDepthLighting(); + } else { + matrices.peek().getNormalMatrix().rotate(ITEM_LIGHT_ROTATION_FLAT); + DiffuseLighting.disableGuiDepthLighting(); + } + + itemRenderer.renderItem(entity.getDisplayItemStack(), ModelTransformationMode.GUI, light, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers, entity.getWorld(), 0); + + System.arraycopy(lights, 0, RenderSystemAccessor.getShaderLightDirections(), 0, 2); // Render count - Vec2f pitchAndYaw = ItemDisplayBlockEntity.getPitchAndYaw(camera, entity.getPos(), tickDelta); - float scale = 0.0375F; - matrices.multiply(RotationAxis.POSITIVE_Y.rotation(pitchAndYaw.y - yaw)); - matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180)); - matrices.translate(0, 0.75, 0); - matrices.scale(scale, scale, scale); + if (entity.count > 1) { + float scale = 0.0625F; + matrices.translate(0, 0, 1); + matrices.scale(scale, -scale, scale); - Text count = Text.literal(String.valueOf(entity.count)); - matrices.translate(-context.getTextRenderer().getWidth(count) / 2F, -4, 0); - context.getTextRenderer().draw(count, 0, 0, Colors.WHITE, false, matrices.peek().getPositionMatrix(), vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + TextRenderer textRenderer = context.getTextRenderer(); + String string = String.valueOf(entity.count); + textRenderer.draw(string, 9 - textRenderer.getWidth(string), 1, Colors.WHITE, false, matrices.peek().getPositionMatrix(), vertexConsumers, TextRenderer.TextLayerType.NORMAL, 0, LightmapTextureManager.MAX_LIGHT_COORDINATE); + } matrices.pop(); } + + private static float getRotationYForSide2D(Direction side) { + return -side.asRotation() * (float) Math.PI / 180f; + } } diff --git a/src/main/java/dev/hephaestus/glowcase/mixin/client/RenderSystemAccessor.java b/src/main/java/dev/hephaestus/glowcase/mixin/client/RenderSystemAccessor.java new file mode 100644 index 0000000..767547d --- /dev/null +++ b/src/main/java/dev/hephaestus/glowcase/mixin/client/RenderSystemAccessor.java @@ -0,0 +1,15 @@ +package dev.hephaestus.glowcase.mixin.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(RenderSystem.class) +public interface RenderSystemAccessor +{ + @Accessor(remap = false) + static Vector3f[] getShaderLightDirections() { + throw new AssertionError(); + } +} diff --git a/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java index 40b46e2..3318bd4 100644 --- a/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/packet/C2SEditItemAcceptorBlock.java @@ -11,18 +11,19 @@ import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; -public record C2SEditItemAcceptorBlock(BlockPos pos, Identifier item, int count, boolean isItemTag) implements C2SEditBlockEntity { +public record C2SEditItemAcceptorBlock(BlockPos pos, Identifier item, int count, boolean isItemTag, ItemAcceptorBlockEntity.OutputDirection outputDirection) implements C2SEditBlockEntity { public static final Id ID = new Id<>(Glowcase.id("channel.item_acceptor.save")); public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( BlockPos.PACKET_CODEC, C2SEditItemAcceptorBlock::pos, Identifier.PACKET_CODEC, C2SEditItemAcceptorBlock::item, PacketCodecs.INTEGER, C2SEditItemAcceptorBlock::count, PacketCodecs.BOOL, C2SEditItemAcceptorBlock::isItemTag, + PacketCodecs.BYTE.xmap(index -> ItemAcceptorBlockEntity.OutputDirection.values()[index], outputDirection -> (byte) outputDirection.ordinal()), C2SEditItemAcceptorBlock::outputDirection, C2SEditItemAcceptorBlock::new ); public static C2SEditItemAcceptorBlock of(ItemAcceptorBlockEntity be) { - return new C2SEditItemAcceptorBlock(be.getPos(), be.getItem(), be.count, be.isItemTag); + return new C2SEditItemAcceptorBlock(be.getPos(), be.getItem(), be.count, be.isItemTag, be.outputDirection); } @Override @@ -37,6 +38,7 @@ public void receive(ServerWorld world, BlockEntity blockEntity) { be.setItem(this.item()); be.count = this.count(); be.isItemTag = this.isItemTag(); + be.outputDirection = this.outputDirection(); be.markDirty(); be.dispatch(); diff --git a/src/main/resources/assets/glowcase/lang/en_us.json b/src/main/resources/assets/glowcase/lang/en_us.json index c460df7..ee6ba9b 100644 --- a/src/main/resources/assets/glowcase/lang/en_us.json +++ b/src/main/resources/assets/glowcase/lang/en_us.json @@ -39,6 +39,7 @@ "gui.glowcase.tick_rate_std_dev": "Tick Rate Deviation", "gui.glowcase.item_or_tag": "Item or Item Tag", "gui.glowcase.count": "Count", + "gui.glowcase.output_direction": "Output Direction: %s", "block.glowcase.generic.tooltip": "Interact with a glowcase item to edit", "block.glowcase.text_block.tooltip.0": "Displays formatted text", "block.glowcase.text_block.tooltip.1": "Supports Placeholder QuickText", diff --git a/src/main/resources/glowcase.mixins.json b/src/main/resources/glowcase.mixins.json index 6644548..58245ae 100644 --- a/src/main/resources/glowcase.mixins.json +++ b/src/main/resources/glowcase.mixins.json @@ -9,6 +9,7 @@ ], "client": [ "client.KeyboardMixin", + "client.RenderSystemAccessor", "client.TextureManagerAccessor" ], "server": [], From d02e3865d1875eddd9978e06ccd45119686e99c0 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 00:11:22 -0500 Subject: [PATCH 10/14] Tweaked particle display block sprite --- .../glowcase/textures/item/particle_display.png | Bin 155 -> 439 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/glowcase/textures/item/particle_display.png b/src/main/resources/assets/glowcase/textures/item/particle_display.png index 644c04ed3424c423ceed26c59bce031be00cab1f..26bbfef6228693a8d7dee83c0f261f880a469f2e 100644 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}c0G|-o|NsA+o0|i9l9#QH0V(E^Aiv=M{~4~I;svT@;4JWnEM{QfI|Rav zq8eTeKtZt**NBqf{Irtt#G+J&fW*wa5EvANUC^Kzq`DG+E s+xOKYj?KEW1z7F7Yh{Oz0N>38QqDps$45NQ00000NkvXXt^-0~f@lgkr~m)} From b2b3204b8adc235124a2c0d0f7d3c9403edab785 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 12:48:58 -0500 Subject: [PATCH 11/14] Increased delay and tweaked interaction behavior --- .../glowcase/block/ItemAcceptorBlock.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java index aae4954..826c966 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -85,28 +85,32 @@ protected ActionResult onUse(BlockState state, World world, BlockPos pos, Player @Override protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) return ItemActionResult.CONSUME; + if (!(world.getBlockEntity(pos) instanceof ItemAcceptorBlockEntity be)) { + return ItemActionResult.CONSUME; + } - if (be.isItemAccepted(stack) && !world.getBlockTickScheduler().isQueued(pos, this)) { - if (!world.isClient()) { - // Remove items - ItemStack newStack = stack.copyWithCount(be.count); - stack.decrementUnlessCreative(be.count, player); + if (!be.isItemAccepted(stack)) { + return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + } - // Schedule redstone pulse - world.scheduleBlockTick(pos, this, 2); + if (world.getBlockTickScheduler().isQueued(pos, this) || state.get(POWERED)) { + return ItemActionResult.SKIP_DEFAULT_BLOCK_INTERACTION; + } - // Attempt to insert items - Inventory inventory = getInventoryAt(world, pos.offset(getOutputDirection(world, pos, state))); + if (!world.isClient()) { + // Remove items + ItemStack newStack = stack.copyWithCount(be.count); + stack.decrementUnlessCreative(be.count, player); - if (inventory != null) { - addToFirstFreeSlot(inventory, newStack); - } + // Attempt to insert items + if (getInventoryAt(world, pos.offset(getOutputDirection(world, pos, state))) instanceof Inventory inventory) { + addToFirstFreeSlot(inventory, newStack); } - return ItemActionResult.SUCCESS; + // Schedule redstone pulse + world.scheduleBlockTick(pos, this, 2); } - return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; + return ItemActionResult.SUCCESS; } private static Inventory getInventoryAt(World world, BlockPos pos) { @@ -157,7 +161,7 @@ protected void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, world.setBlockState(pos, state.with(POWERED, false), Block.NOTIFY_LISTENERS); } else { world.setBlockState(pos, state.with(POWERED, true), Block.NOTIFY_LISTENERS); - world.scheduleBlockTick(pos, this, 2); + world.scheduleBlockTick(pos, this, 4); } this.updateNeighbors(world, pos, state); @@ -177,7 +181,7 @@ protected boolean emitsRedstonePower(BlockState state) { @Override protected int getStrongRedstonePower(BlockState state, BlockView world, BlockPos pos, Direction direction) { - return 0; //state.getWeakRedstonePower(world, pos, direction); + return 0; } @Override From 9441f71aab686419bf44bd075c76757724ad9929 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 12:52:01 -0500 Subject: [PATCH 12/14] Removed unused block models --- .../models/block/cube_inner_faces.json | 147 ------------------ .../block/item_acceptor_block_side.json | 18 --- .../block/item_acceptor_block_side_on.json | 6 - 3 files changed, 171 deletions(-) delete mode 100644 src/main/resources/assets/glowcase/models/block/cube_inner_faces.json delete mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json delete mode 100644 src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json diff --git a/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json b/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json deleted file mode 100644 index 41bceb8..0000000 --- a/src/main/resources/assets/glowcase/models/block/cube_inner_faces.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "parent": "block/cube_all", - "elements": [ - { - "from": [ - 0, - 0, - 0 - ], - "to": [ - 16, - 16, - 16 - ], - "faces": { - "north": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#north", - "cullface": "north" - }, - "east": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#east", - "cullface": "east" - }, - "south": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#south", - "cullface": "south" - }, - "west": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#west", - "cullface": "west" - }, - "up": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#up", - "cullface": "up" - }, - "down": { - "uv": [ - 0, - 0, - 16, - 16 - ], - "texture": "#down", - "cullface": "down" - } - } - }, - { - "from": [ - 15.998, - 0.002, - 0.002 - ], - "to": [ - 0.002, - 15.998, - 15.998 - ], - "faces": { - "north": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_south" - }, - "east": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_west" - }, - "south": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_north" - }, - "west": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_east" - }, - "up": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_up" - }, - "down": { - "uv": [ - 16, - 0, - 0, - 16 - ], - "texture": "#inner_down" - } - } - } - ] -} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json deleted file mode 100644 index 5ff659a..0000000 --- a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "parent": "glowcase:block/cube_inner_faces", - "textures": { - "particle": "block/glass", - "down": "block/smooth_stone", - "up": "block/glass", - "north": "block/observer_back", - "east": "block/glass", - "south": "block/glass", - "west": "block/glass", - "inner_down": "block/smooth_stone", - "inner_up": "glowcase:block/invisible", - "inner_north": "glowcase:block/invisible", - "inner_east": "glowcase:block/invisible", - "inner_south": "block/smooth_stone", - "inner_west": "glowcase:block/invisible" - } -} diff --git a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json b/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json deleted file mode 100644 index 1564670..0000000 --- a/src/main/resources/assets/glowcase/models/block/item_acceptor_block_side_on.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "glowcase:block/item_acceptor_block_side", - "textures": { - "north": "block/observer_back_on" - } -} From 3129428dccc72bdb53c87e71bc8e099c23ca8d8b Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 13:20:32 -0500 Subject: [PATCH 13/14] Reworded the tooltips --- .../dev/hephaestus/glowcase/block/ItemAcceptorBlock.java | 4 +++- src/main/resources/assets/glowcase/lang/en_us.json | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java index 826c966..1a8424f 100644 --- a/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java +++ b/src/main/java/dev/hephaestus/glowcase/block/ItemAcceptorBlock.java @@ -229,6 +229,8 @@ public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos @Override public void appendTooltip(ItemStack itemStack, Item.TooltipContext context, List tooltip, TooltipType options) { tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.0").formatted(Formatting.GRAY)); - tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.1").formatted(Formatting.DARK_GRAY)); + tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.1").formatted(Formatting.BLUE)); + tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.2").formatted(Formatting.BLUE)); + tooltip.add(Text.translatable("block.glowcase.item_acceptor_block.tooltip.3").formatted(Formatting.DARK_GRAY)); } } diff --git a/src/main/resources/assets/glowcase/lang/en_us.json b/src/main/resources/assets/glowcase/lang/en_us.json index ee6ba9b..43fe6e6 100644 --- a/src/main/resources/assets/glowcase/lang/en_us.json +++ b/src/main/resources/assets/glowcase/lang/en_us.json @@ -53,7 +53,9 @@ "block.glowcase.sprite_block.tooltip.1": "Can be extended with resource packs", "block.glowcase.outline_block.tooltip.0": "Displays an outline", "block.glowcase.particle_display_block.tooltip.0": "Displays particles", - "block.glowcase.item_acceptor_block.tooltip.0": "Emits a redstone pulse when given the required item", - "block.glowcase.item_acceptor_block.tooltip.1": "Interact in Creative mode to edit", + "block.glowcase.item_acceptor_block.tooltip.0": "Accepts an item stack as input", + "block.glowcase.item_acceptor_block.tooltip.1": " Pushes the item stack to an inventory", + "block.glowcase.item_acceptor_block.tooltip.2": " Emits a redstone pulse", + "block.glowcase.item_acceptor_block.tooltip.3": "Interact in Creative mode to edit", "item.glowcase.lock.tooltip.0": "Locks and unlocks containers" } From 788dd8e20b31514caacf872a2487ae601b32bd48 Mon Sep 17 00:00:00 2001 From: Chai <7232280+Chailotl@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:30:01 -0500 Subject: [PATCH 14/14] Update ItemAcceptorBlockEntityRenderer.java --- .../render/block/entity/ItemAcceptorBlockEntityRenderer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java index 7fef5fe..4935bde 100644 --- a/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java +++ b/src/main/java/dev/hephaestus/glowcase/client/render/block/entity/ItemAcceptorBlockEntityRenderer.java @@ -26,12 +26,11 @@ import org.joml.Vector3f; public record ItemAcceptorBlockEntityRenderer(BlockEntityRendererFactory.Context context) implements BlockEntityRenderer { - private static final MinecraftClient mc = MinecraftClient.getInstance(); private static final Quaternionf ITEM_LIGHT_ROTATION_3D = RotationAxis.POSITIVE_X.rotationDegrees(-15).mul(RotationAxis.POSITIVE_Y.rotationDegrees(15)); private static final Quaternionf ITEM_LIGHT_ROTATION_FLAT = RotationAxis.POSITIVE_X.rotationDegrees(-45); public void render(ItemAcceptorBlockEntity entity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { - Entity camera = mc.getCameraEntity(); + Entity camera = MinecraftClient.getInstance().getCameraEntity(); if (camera == null) return;