ソースを参照

为铁砧添加 TileEntityRenderer

LTCatt 6 年 前
親
コミット
acdd696c0c

+ 1 - 0
src/main/java/com/hexdragon/enchrebirth/EnchRebirth.java

@@ -12,5 +12,6 @@ public class EnchRebirth {
     public EnchRebirth() {
         IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
         RegMain.CONTAINERS.register(modEventBus);
+        RegMain.TILE_ENTITIES.register(modEventBus);
     }
 }

+ 41 - 0
src/main/java/com/hexdragon/enchrebirth/block/AnvilRenderer.java

@@ -0,0 +1,41 @@
+package com.hexdragon.enchrebirth.block;
+
+import com.mojang.blaze3d.matrix.MatrixStack;
+import net.minecraft.block.BlockState;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.BlockRendererDispatcher;
+import net.minecraft.client.renderer.IRenderTypeBuffer;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.model.IBakedModel;
+import net.minecraft.client.renderer.model.ItemCameraTransforms;
+import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
+import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.Items;
+import net.minecraftforge.client.model.data.EmptyModelData;
+
+public class AnvilRenderer extends TileEntityRenderer<AnvilTileEntity> {
+
+    public AnvilRenderer(TileEntityRendererDispatcher rendererDispatcherIn) {
+        super(rendererDispatcherIn);
+    }
+
+    @Override
+    public void render(AnvilTileEntity tileEntityIn, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn, int combinedLightIn, int combinedOverlayIn) {
+        matrixStackIn.push();
+        matrixStackIn.translate(1, 0, 0);
+        BlockRendererDispatcher blockRenderer = Minecraft.getInstance().getBlockRendererDispatcher();
+        BlockState state = Blocks.CHEST.getDefaultState();
+        blockRenderer.renderBlock(state, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, EmptyModelData.INSTANCE);
+        matrixStackIn.pop();
+
+        matrixStackIn.push();
+        matrixStackIn.translate(0, 1, 0);
+        ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer();
+        ItemStack stack = new ItemStack(Items.DIAMOND);
+        IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stack, tileEntityIn.getWorld(), null);
+        itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.FIXED, true, matrixStackIn, bufferIn, combinedLightIn, combinedOverlayIn, ibakedmodel);
+        matrixStackIn.pop();
+    }
+}

+ 10 - 0
src/main/java/com/hexdragon/enchrebirth/block/AnvilTileEntity.java

@@ -0,0 +1,10 @@
+package com.hexdragon.enchrebirth.block;
+
+import com.hexdragon.enchrebirth.registry.RegMain;
+import net.minecraft.tileentity.TileEntity;
+
+public class AnvilTileEntity extends TileEntity {
+    public AnvilTileEntity() {
+        super(RegMain.tileEntityAnvil.get());
+    }
+}

+ 13 - 1
src/main/java/com/hexdragon/enchrebirth/mixin/block/AnvilBlockMixin.java

@@ -1,15 +1,19 @@
 package com.hexdragon.enchrebirth.mixin.block;
 
 import com.hexdragon.enchrebirth.block.AnvilContainerRe;
+import com.hexdragon.enchrebirth.block.AnvilTileEntity;
 import net.minecraft.block.AnvilBlock;
 import net.minecraft.block.BlockState;
 import net.minecraft.block.FallingBlock;
 import net.minecraft.inventory.container.INamedContainerProvider;
 import net.minecraft.inventory.container.SimpleNamedContainerProvider;
+import net.minecraft.tileentity.TileEntity;
 import net.minecraft.util.IWorldPosCallable;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.util.text.TranslationTextComponent;
+import net.minecraft.world.IBlockReader;
 import net.minecraft.world.World;
+import net.minecraftforge.common.extensions.IForgeBlock;
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.injection.At;
 import org.spongepowered.asm.mixin.injection.Inject;
@@ -17,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
 import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
 
 @Mixin(AnvilBlock.class)
-public abstract class AnvilBlockMixin extends FallingBlock {
+public abstract class AnvilBlockMixin extends FallingBlock implements IForgeBlock {
     public AnvilBlockMixin(Properties properties) {super(properties);}
 
     // 将铁砧的处理事件替换为 Mod 所提供的事件
@@ -29,4 +33,12 @@ public abstract class AnvilBlockMixin extends FallingBlock {
         cir.cancel();
     }
 
+    // 注册 TileEntity
+    @Override public boolean hasTileEntity(BlockState state) {
+        return true;
+    }
+    @Override public TileEntity createTileEntity(BlockState state, IBlockReader world) {
+        return new AnvilTileEntity();
+    }
+
 }

+ 10 - 1
src/main/java/com/hexdragon/enchrebirth/registry/RegClientSetup.java → src/main/java/com/hexdragon/enchrebirth/registry/RegClient.java

@@ -1,22 +1,31 @@
 package com.hexdragon.enchrebirth.registry;
 
 import com.hexdragon.enchrebirth.EnchRebirth;
+import com.hexdragon.enchrebirth.block.AnvilRenderer;
 import com.hexdragon.enchrebirth.block.AnvilScreenRe;
 import com.hexdragon.enchrebirth.block.GrindstoneScreenRe;
 import net.minecraft.client.gui.ScreenManager;
 import net.minecraftforge.api.distmarker.Dist;
 import net.minecraftforge.api.distmarker.OnlyIn;
 import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.fml.client.registry.ClientRegistry;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
 
 @Mod.EventBusSubscriber(modid = EnchRebirth.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) @OnlyIn(Dist.CLIENT)
-public class RegClientSetup {
+public class RegClient {
 
     @SubscribeEvent
     public static void clientSetup(final FMLClientSetupEvent e) {
+        // 注册 Screen
         ScreenManager.registerFactory(RegMain.containerGrindstone.get(), GrindstoneScreenRe::new);
         ScreenManager.registerFactory(RegMain.containerAnvil.get(), AnvilScreenRe::new);
     }
 
+    @SubscribeEvent
+    public static void onClientEvent(FMLClientSetupEvent event) {
+        // 注册 Renderer
+        ClientRegistry.bindTileEntityRenderer(RegMain.tileEntityAnvil.get(), (AnvilRenderer::new));
+    }
+
 }

+ 7 - 0
src/main/java/com/hexdragon/enchrebirth/registry/RegMain.java

@@ -2,10 +2,13 @@ package com.hexdragon.enchrebirth.registry;
 
 import com.hexdragon.enchrebirth.EnchRebirth;
 import com.hexdragon.enchrebirth.block.AnvilContainerRe;
+import com.hexdragon.enchrebirth.block.AnvilTileEntity;
 import com.hexdragon.enchrebirth.block.GrindstoneContainerRe;
+import net.minecraft.block.Blocks;
 import net.minecraft.entity.player.PlayerInventory;
 import net.minecraft.inventory.container.ContainerType;
 import net.minecraft.network.PacketBuffer;
+import net.minecraft.tileentity.TileEntityType;
 import net.minecraftforge.common.extensions.IForgeContainerType;
 import net.minecraftforge.fml.RegistryObject;
 import net.minecraftforge.registries.DeferredRegister;
@@ -18,4 +21,8 @@ public class RegMain {
     public static final RegistryObject<ContainerType<GrindstoneContainerRe>> containerGrindstone = CONTAINERS.register("grindstone", () -> IForgeContainerType.create((int windowId, PlayerInventory inv, PacketBuffer data) -> new GrindstoneContainerRe(windowId, inv)));
     public static final RegistryObject<ContainerType<AnvilContainerRe>> containerAnvil = CONTAINERS.register("anvil", () -> IForgeContainerType.create((int windowId, PlayerInventory inv, PacketBuffer data) -> new AnvilContainerRe(windowId, inv)));
 
+    // TileEntity
+    public static final DeferredRegister<TileEntityType<?>> TILE_ENTITIES = DeferredRegister.create(ForgeRegistries.TILE_ENTITIES, EnchRebirth.MODID);
+    public static RegistryObject<TileEntityType<AnvilTileEntity>> tileEntityAnvil = TILE_ENTITIES.register("obsidian_ter_tileentity", () -> TileEntityType.Builder.create(AnvilTileEntity::new, Blocks.ANVIL).build(null));
+
 }