User Tools

Site Tools


tutorial:entity

Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:entity [2021/07/15 18:41] – [Registering Entity Renderer] Updating the page for recent versions. logdawg970tutorial:entity [2023/09/13 20:30] (current) – ↷ Links adapted because of a move operation nebelnidas
Line 1: Line 1:
 ===== Creating an Entity ===== ===== Creating an Entity =====
  
-//The source code for this project can be found [[https://github.com/Draylar/entity-testing|here]] on the entity branch.//+//The source code for this project can be found [[https://github.com/Draylar/entity-testing/tree/entity|here]].//
  
 Entities are a movable object in a world with logic attached to them. A few examples include: Entities are a movable object in a world with logic attached to them. A few examples include:
Line 10: Line 10:
 Living Entities are Entities that have health and can deal damage.  Living Entities are Entities that have health and can deal damage. 
 There are various classes that branch off `LivingEntity` for different purposes, including: There are various classes that branch off `LivingEntity` for different purposes, including:
-  * ''HostileEntity'' for Zombies, Creepersand Skeletons +  * ''HostileEntity'' for Zombies, Creepers and Skeletons 
-  * ''AnimalEntity'' for Sheep, Cowsand Pigs+  * ''AnimalEntity'' for Sheep, Cows and Pigs
   * ''WaterCreatureEntity'' for things that swim   * ''WaterCreatureEntity'' for things that swim
-  * ''FishEntity'' for fishies+  * ''FishEntity'' for fishies (use instead of ''WaterCreatureEntity'' for schooling behavior)
    
-What you extend depends on your needs and goals are. +What you extend depends on what your needs and goals are. 
 As you get further down the chain, the entity logic becomes more specific and curated to certain tasks. As you get further down the chain, the entity logic becomes more specific and curated to certain tasks.
 The two generic entity classes that come after ''LivingEntity'' are: The two generic entity classes that come after ''LivingEntity'' are:
Line 61: Line 61:
      */      */
     public static final EntityType<CubeEntity> CUBE = Registry.register(     public static final EntityType<CubeEntity> CUBE = Registry.register(
-            Registry.ENTITY_TYPE,+            Registries.ENTITY_TYPE,
             new Identifier("entitytesting", "cube"),             new Identifier("entitytesting", "cube"),
             FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, CubeEntity::new).dimensions(EntityDimensions.fixed(0.75f, 0.75f)).build()             FabricEntityTypeBuilder.create(SpawnGroup.CREATURE, CubeEntity::new).dimensions(EntityDimensions.fixed(0.75f, 0.75f)).build()
Line 151: Line 151:
             return new CubeEntityRenderer(context);             return new CubeEntityRenderer(context);
         });         });
 +        // In 1.17, use EntityRendererRegistry.register (seen below) instead of EntityRendererRegistry.INSTANCE.register (seen above)
 +        EntityRendererRegistry.register(EntityTesting.CUBE, (context) -> {
 +            return new CubeEntityRenderer(context);
 +        });
 +        
 +        EntityModelLayerRegistry.registerModelLayer(MODEL_CUBE_LAYER, CubeEntityModel::getTexturedModelData);
     }     }
 } }
Line 161: Line 167:
  
 Standard models define "parts", or ''ModelPart'' instances at the top of the class,  Standard models define "parts", or ''ModelPart'' instances at the top of the class, 
-initialize them in the constructor, and render them in the ''render'' method. +initialize them in the constructor, obtain data in the ''getTexturedModelData'' method, and render them in the ''render'' method. 
 Note that ''setAngles'' and ''render'' are both required overrides of the ''EntityModel'' class. Note that ''setAngles'' and ''render'' are both required overrides of the ''EntityModel'' class.
- 
-''ModelPart'' has several constructors, with the most simple one taking in: 
-  * the current model instance 
-  * textureOffsetU as an ''int'' 
-  * textureOffsetV as an ''int'' 
-  
-Texture offsets provide the location of the model's texture within your texture file.  
-Our entity is a single cube, so the base ''ModelPart'' texture starts at 0, 0. 
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
Line 177: Line 175:
     private final ModelPart base;     private final ModelPart base;
  
-    public CubeEntityModel() { +    public CubeEntityModel(ModelPart modelPart) { 
-        base = new ModelPart(this, 0, 0);+        this.base = modelPart.getChild(EntityModelPartNames.CUBE);
     }     }
          
Line 185: Line 183:
 </code> </code>
  
-After creating a part, we need to add a shape to it. +After creating a part, we need to add a shape to it
 +To do so, we must add a child to the root. The texture location for the new part is located in ''.uv'', 
 +the offset for it is located in the first 3 numbers of ''.cuboid'', and the size is the last 3 numbers in ''.cuboid''
 Note that the origin of a model starts at the corner, so you will need to offset the part to center it: Note that the origin of a model starts at the corner, so you will need to offset the part to center it:
  
Line 194: Line 194:
  
     public CubeEntityModel() {     public CubeEntityModel() {
-        base = new ModelPart(this, 0, 0); +        [...]
-        base.addCuboid(-6, -6, -6, 12, 12, 12);+
     }     }
          
-    [...] +    // You can use BlockBench, make your model and export it to get this method for your entity model. 
-}+    public static TexturedModelData getTexturedModelData() { 
 +        ModelData modelData = new ModelData(); 
 +    ModelPartData modelPartData = modelData.getRoot(); 
 +        modelPartData.addChild(EntityModelPartNames.CUBE, ModelPartBuilder.create().uv(0, 0).cuboid(-6F, 12F, -6F, 12F, 12F, 12F), ModelTransform.pivot(0F, 0F, 0F)); 
 +    }
 </code> </code>
  
Line 213: Line 216:
          
     public CubeEntityModel() [...]     public CubeEntityModel() [...]
 +    
 +    public static TexturedModelData getTexturedModelData() [...]
  
     @Override     @Override
     public void setAngles(CubeEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {     public void setAngles(CubeEntity entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {
- 
     }     }
  
     @Override     @Override
     public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {     public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) {
-        // translate model down +        ImmutableList.of(this.base).forEach((modelRenderer) -> { 
-        matrices.translate(0, 1.125, 0); +            modelRenderer.render(matrices, vertices, light, overlay, red, green, blue, alpha); 
- +        });
-        // render cube +
-        base.render(matrices, vertices, light, overlay);+
     }     }
 } }
Line 231: Line 233:
  
 To complete our model, we need to add a texture file. The default texture size is 64 wide and 32 tall; To complete our model, we need to add a texture file. The default texture size is 64 wide and 32 tall;
-you can change this by changing ''textureWidth'' and ''textureHeight'' in your model constructor.+you can change this by adding a return of your texturedModelData
 We will set it to 64x64 for our texture: We will set it to 64x64 for our texture:
  
Line 241: Line 243:
     private final ModelPart base;     private final ModelPart base;
  
-    public CubeEntityModel() { +    [...] 
-        this.textureHeight = 64; +     
-        this.textureWidth = 64; +    public static TexturedModelData getTexturedModelData() {
-   +
         [...]         [...]
 +        return TexturedModelData.of(modelData, 64, 64);
     }     }
  
Line 254: Line 256:
 ===== Spawning your Entity ===== ===== Spawning your Entity =====
  
 +Be sure to add your client entrypoint to fabric.mod.json.
 +You can do this like so:
 +<code json>
 +
 +  "entrypoints": {
 +    "main": [
 +      "mod.fabricmc.entitytesting.EntityTesting"
 +    ],
 +    "client": [
 +      "mod.fabricmc.entitytesting.EntityTestingClient"
 +    ]
 +  },
 +</code>
 You can spawn your entity by typing ''/summon entitytesting:cube'' in-game. Press f3+b to view hitboxes: You can spawn your entity by typing ''/summon entitytesting:cube'' in-game. Press f3+b to view hitboxes:
 {{https://i.imgur.com/MmQvluB.png}} {{https://i.imgur.com/MmQvluB.png}}
Line 260: Line 275:
 ===== Adding tasks & activities ===== ===== Adding tasks & activities =====
  
-To add activities see [[:villager_activities|here]].+To add activities see [[tutorial:villager_activities|here]].
  
tutorial/entity.1626374496.txt.gz · Last modified: 2021/07/15 18:41 by logdawg970