User Tools

Site Tools


tutorial:blockentityrenderers

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
blockentityrenderers [2019/07/28 07:00] – created fudgetutorial:blockentityrenderers [2019/08/13 15:43] – added more information for client entrypoint fudge
Line 3: Line 3:
 Make sure you [[tutorial:blockentity|added a block entity]] before reading this tutorial!  Make sure you [[tutorial:blockentity|added a block entity]] before reading this tutorial! 
 ===== Introduction ===== ===== Introduction =====
-Some may say blocks by themselves aren't that interesting, +Blocks by themselves aren't that interesting, 
 they just stay static at a certain location and a certain size until broken. they just stay static at a certain location and a certain size until broken.
 We can use block entity renderers to render items and blocks associated with a block entity far more dynamically - render multiple different items,  We can use block entity renderers to render items and blocks associated with a block entity far more dynamically - render multiple different items, 
Line 22: Line 22:
 } }
 </code> </code>
-And register it:+We're going to need to register our ''BlockEntityRenderer'', but only for the client.  
 +This wouldn't matter in a single-player setting, since the server runs in the same process as the client.  
 +However, in a multiplayer setting, where the server runs in a different process than the client, the server code 
 +has no concept of a "BlockEntityRenderer", and as a result would not accept registering one.  
 +To run initialization code only for the client, we need to setup a ''client'' entrypoint.   
 + 
 +Create a new class next to your main class that implements ''ClientModInitializer'': 
 +<code java> 
 +public class ExampleModClient implements ClientModInitializer { 
 +    @Override 
 +    public void onInitializeClient() { 
 +        // Here we will put client-only registration code 
 +    } 
 +
 +</code> 
 + 
 +Set this class as the ''client'' entrypoint in your ''fabric.mod.json'' (modify the path as needed): 
 +<code javascript "fabric.mod.json"> 
 +"entrypoints":
 +    [...] 
 +    "client":
 +      { 
 +        "value": "tutorial.path.to.ExampleModClient" 
 +      } 
 +    ] 
 +}     
 +</code> 
 + 
 +And register the ''BlockEntityRenderer'' in our ClientModInitializer:
 <code java> <code java>
 @Override @Override
-public void onInitialize() { +public void onInitializeClient() {
-    ...+
     BlockEntityRendererRegistry.INSTANCE.register(DemoBlockEntity.class, new MyBlockEntityRenderer());     BlockEntityRendererRegistry.INSTANCE.register(DemoBlockEntity.class, new MyBlockEntityRenderer());
 } }
Line 48: Line 75:
 <code java> <code java>
     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {
-       ...+        [...]
         // Calculate the current offset in the y value         // Calculate the current offset in the y value
         double offset = Math.sin((blockEntity.getWorld().getTime() + partialTicks) / 8.0) / 4.0;         double offset = Math.sin((blockEntity.getWorld().getTime() + partialTicks) / 8.0) / 4.0;
Line 64: Line 91:
 <code java> <code java>
     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {
-        ...+        [...]
         MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND);         MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND);
  
Line 83: Line 110:
     @Override     @Override
     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {     public void render(DemoBlockEntity blockEntity, double x, double y, double z, float partialTicks, int destroyStage) {
-        ...+        [...]
                  
         // Put this right above "MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND);"         // Put this right above "MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND);"
Line 89: Line 116:
         GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, (float) (light & 0xFFFF), (float) ((light >> 16) & 0xFFFF));         GLX.glMultiTexCoord2f(GLX.GL_TEXTURE1, (float) (light & 0xFFFF), (float) ((light >> 16) & 0xFFFF));
                  
-        ...+        [...]
     }     }
 </code> </code>
  
 The jukebox should now have the proper lighting.  The jukebox should now have the proper lighting. 
tutorial/blockentityrenderers.txt · Last modified: 2023/02/09 13:14 by mschae23