Skip to content

Commit

Permalink
block entity renderer
Browse files Browse the repository at this point in the history
  • Loading branch information
Kaupenjoe committed Aug 29, 2022
1 parent df30eb4 commit fcf2672
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 0 deletions.
Expand Up @@ -6,6 +6,7 @@
import net.kaupenjoe.tutorialmod.networking.ModMessages;
import net.kaupenjoe.tutorialmod.networking.packet.EnergySyncS2CPacket;
import net.kaupenjoe.tutorialmod.networking.packet.FluidSyncS2CPacket;
import net.kaupenjoe.tutorialmod.networking.packet.ItemStackSyncS2CPacket;
import net.kaupenjoe.tutorialmod.recipe.GemInfusingStationRecipe;
import net.kaupenjoe.tutorialmod.screen.GemInfusingStationMenu;
import net.kaupenjoe.tutorialmod.util.ModEnergyStorage;
Expand Down Expand Up @@ -46,6 +47,9 @@ public class GemInfusingStationBlockEntity extends BlockEntity implements MenuPr
@Override
protected void onContentsChanged(int slot) {
setChanged();
if(!level.isClientSide()) {
ModMessages.sendToClients(new ItemStackSyncS2CPacket(this, worldPosition));
}
}

@Override
Expand Down Expand Up @@ -91,6 +95,24 @@ public FluidStack getFluidStack() {
return this.FLUID_TANK.getFluid();
}

public ItemStack getRenderStack() {
ItemStack stack;

if(!itemHandler.getStackInSlot(2).isEmpty()) {
stack = itemHandler.getStackInSlot(2);
} else {
stack = itemHandler.getStackInSlot(1);
}

return stack;
}

public void setHandler(ItemStackHandler itemStackHandler) {
for (int i = 0; i < itemStackHandler.getSlots(); i++) {
itemHandler.setStackInSlot(i, itemStackHandler.getStackInSlot(i));
}
}

private LazyOptional<IItemHandler> lazyItemHandler = LazyOptional.empty();
private final Map<Direction, LazyOptional<WrappedHandler>> directionWrappedHandlerMap =
Map.of(Direction.DOWN, LazyOptional.of(() -> new WrappedHandler(itemHandler, (i) -> i == 2, (i, s) -> false)),
Expand Down
@@ -0,0 +1,53 @@
package net.kaupenjoe.tutorialmod.block.entity.renderer;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Vector3f;
import net.kaupenjoe.tutorialmod.block.custom.GemInfusingStationBlock;
import net.kaupenjoe.tutorialmod.block.entity.GemInfusingStationBlockEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.BlockPos;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LightLayer;

public class GemInfusingStationBlockEntityRenderer implements BlockEntityRenderer<GemInfusingStationBlockEntity> {
public GemInfusingStationBlockEntityRenderer(BlockEntityRendererProvider.Context context) {

}

@Override
public void render(GemInfusingStationBlockEntity pBlockEntity, float pPartialTick, PoseStack pPoseStack,
MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) {
ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
ItemStack itemStack = pBlockEntity.getRenderStack();
pPoseStack.pushPose();
pPoseStack.translate(0.5f, 0.65f, 0.5f);
pPoseStack.scale(0.25f, 0.25f, 0.25f);
pPoseStack.mulPose(Vector3f.XP.rotationDegrees(90));

switch (pBlockEntity.getBlockState().getValue(GemInfusingStationBlock.FACING)) {
case NORTH -> pPoseStack.mulPose(Vector3f.ZP.rotationDegrees(0));
case EAST -> pPoseStack.mulPose(Vector3f.ZP.rotationDegrees(90));
case SOUTH -> pPoseStack.mulPose(Vector3f.ZP.rotationDegrees(180));
case WEST -> pPoseStack.mulPose(Vector3f.ZP.rotationDegrees(270));
}

itemRenderer.renderStatic(itemStack, ItemTransforms.TransformType.GUI, getLightLevel(pBlockEntity.getLevel(),
pBlockEntity.getBlockPos()),
OverlayTexture.NO_OVERLAY, pPoseStack, pBufferSource, 1);
pPoseStack.popPose();
}

private int getLightLevel(Level level, BlockPos pos) {
int bLight = level.getBrightness(LightLayer.BLOCK, pos);
int sLight = level.getBrightness(LightLayer.SKY, pos);
return LightTexture.pack(bLight, sLight);
}
}
@@ -1,6 +1,8 @@
package net.kaupenjoe.tutorialmod.event;

import net.kaupenjoe.tutorialmod.TutorialMod;
import net.kaupenjoe.tutorialmod.block.entity.ModBlockEntities;
import net.kaupenjoe.tutorialmod.block.entity.renderer.GemInfusingStationBlockEntityRenderer;
import net.kaupenjoe.tutorialmod.client.ThirstHudOverlay;
import net.kaupenjoe.tutorialmod.networking.ModMessages;
import net.kaupenjoe.tutorialmod.networking.packet.DrinkWaterC2SPacket;
Expand All @@ -9,6 +11,7 @@
import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
Expand Down Expand Up @@ -37,5 +40,11 @@ public static void onKeyRegister(RegisterKeyMappingsEvent event) {
public static void registerGuiOverlays(RegisterGuiOverlaysEvent event) {
event.registerAboveAll("thirst", ThirstHudOverlay.HUD_THIRST);
}

@SubscribeEvent
public static void registerRenderers(final EntityRenderersEvent.RegisterRenderers event) {
event.registerBlockEntityRenderer(ModBlockEntities.GEM_INFUSING_STATION.get(),
GemInfusingStationBlockEntityRenderer::new);
}
}
}
Expand Up @@ -56,6 +56,12 @@ public static void register() {
.encoder(FluidSyncS2CPacket::toBytes)
.consumerMainThread(FluidSyncS2CPacket::handle)
.add();

net.messageBuilder(ItemStackSyncS2CPacket.class, id(), NetworkDirection.PLAY_TO_CLIENT)
.decoder(ItemStackSyncS2CPacket::new)
.encoder(ItemStackSyncS2CPacket::toBytes)
.consumerMainThread(ItemStackSyncS2CPacket::handle)
.add();
}

public static <MSG> void sendToServer(MSG message) {
Expand Down
@@ -0,0 +1,56 @@
package net.kaupenjoe.tutorialmod.networking.packet;

import net.kaupenjoe.tutorialmod.block.entity.GemInfusingStationBlockEntity;
import net.kaupenjoe.tutorialmod.screen.GemInfusingStationMenu;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.network.NetworkEvent;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;

public class ItemStackSyncS2CPacket {
private final ItemStackHandler itemStackHandler;
private final BlockPos pos;

public ItemStackSyncS2CPacket(ItemStackHandler itemStackHandler, BlockPos pos) {
this.itemStackHandler = itemStackHandler;
this.pos = pos;
}

public ItemStackSyncS2CPacket(FriendlyByteBuf buf) {
List<ItemStack> collection = buf.readCollection(ArrayList::new, FriendlyByteBuf::readItem);
itemStackHandler = new ItemStackHandler(collection.size());
for (int i = 0; i < collection.size(); i++) {
itemStackHandler.insertItem(i, collection.get(i), false);
}

this.pos = buf.readBlockPos();
}

public void toBytes(FriendlyByteBuf buf) {
Collection<ItemStack> list = new ArrayList<>();
for(int i = 0; i < itemStackHandler.getSlots(); i++) {
list.add(itemStackHandler.getStackInSlot(i));
}

buf.writeCollection(list, FriendlyByteBuf::writeItem);
buf.writeBlockPos(pos);
}

public boolean handle(Supplier<NetworkEvent.Context> supplier) {
NetworkEvent.Context context = supplier.get();
context.enqueueWork(() -> {
if(Minecraft.getInstance().level.getBlockEntity(pos) instanceof GemInfusingStationBlockEntity blockEntity) {
blockEntity.setHandler(this.itemStackHandler);
}
});
return true;
}
}

0 comments on commit fcf2672

Please sign in to comment.