Skip to content

Commit

Permalink
start of entities work
Browse files Browse the repository at this point in the history
  • Loading branch information
natanmaia95 committed Sep 5, 2024
1 parent 09ade57 commit 845d58c
Show file tree
Hide file tree
Showing 10 changed files with 252 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

import com.nateplays.my_neoforge_mod.attribute.ModAttributes;
import com.nateplays.my_neoforge_mod.block.ModBlocks;
import com.nateplays.my_neoforge_mod.entity.ModEntities;
import com.nateplays.my_neoforge_mod.entity.client.MosswineRenderer;
import com.nateplays.my_neoforge_mod.item.ModCreativeModeTabs;
import com.nateplays.my_neoforge_mod.item.ModItems;
import com.nateplays.my_neoforge_mod.item.armor.ModArmorItems;
import com.nateplays.my_neoforge_mod.item.armor.ModArmorMaterials;
import net.minecraft.client.renderer.entity.EntityRenderers;
import org.slf4j.Logger;

import com.mojang.logging.LogUtils;
Expand Down Expand Up @@ -55,6 +58,8 @@ public MyNeoForgeMod(IEventBus modEventBus, ModContainer modContainer)
ModArmorItems.register(modEventBus);
ModBlocks.register(modEventBus);

ModEntities.register(modEventBus);


// Register the item to a creative tab
modEventBus.addListener(this::addCreative);
Expand Down Expand Up @@ -100,7 +105,7 @@ public static class ClientModEvents
@SubscribeEvent
public static void onClientSetup(FMLClientSetupEvent event)
{

EntityRenderers.register(ModEntities.MOSSWINE.get(), MosswineRenderer::new);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.nateplays.my_neoforge_mod.attribute;

import com.nateplays.my_neoforge_mod.MyNeoForgeMod;
import com.nateplays.my_neoforge_mod.entity.ModEntities;
import com.nateplays.my_neoforge_mod.entity.custom.MosswineEntity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
Expand All @@ -15,10 +17,10 @@
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD, modid = MyNeoForgeMod.MODID)
public class ModAttributeHandler {

// @SubscribeEvent
// public static void onEntityAttributeCreation(EntityAttributeCreationEvent event) {
// event.put(ModEntities.CUSTOM_ENTITY, createCustomEntityAttributes().build());
// }
@SubscribeEvent
public static void registerAttributes(EntityAttributeCreationEvent event) {
event.put(ModEntities.MOSSWINE.get(), MosswineEntity.createAttributes().build());
}

public static AttributeSupplier.Builder createPlayerHuntAttributes() {
return LivingEntity.createLivingAttributes()
Expand All @@ -30,9 +32,4 @@ public static void entityAttributeModificationEvent(EntityAttributeModificationE
event.add(EntityType.PLAYER, ModAttributes.EATING_SPEED);
}






}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.nateplays.my_neoforge_mod.entity;

import com.nateplays.my_neoforge_mod.MyNeoForgeMod;
import com.nateplays.my_neoforge_mod.entity.custom.MosswineEntity;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;

public class ModEntities {
public static final DeferredRegister<EntityType<?>> ENTITY_TYPES =
DeferredRegister.create(Registries.ENTITY_TYPE, MyNeoForgeMod.MODID);

public static final DeferredHolder<EntityType<?>, EntityType<MosswineEntity>> MOSSWINE =
ENTITY_TYPES.register("mosswine", () -> EntityType.Builder.of(MosswineEntity::new, MobCategory.CREATURE)
.sized(0.8f, 0.8f).build("mosswine")
);

public static void register(IEventBus eventBus) {
ENTITY_TYPES.register(eventBus);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.nateplays.my_neoforge_mod.entity.animations;

public class ModAnimationDefinitions {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.nateplays.my_neoforge_mod.entity.client;

import com.nateplays.my_neoforge_mod.MyNeoForgeMod;
import net.minecraft.client.model.geom.ModelLayerLocation;
import net.minecraft.resources.ResourceLocation;

public class ModModelLayers {
public static final ModelLayerLocation MOSSWINE_LAYER = new ModelLayerLocation(
ResourceLocation.fromNamespaceAndPath(MyNeoForgeMod.MODID, "mosswine_layer"), "main");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.nateplays.my_neoforge_mod.entity.client;// Made with Blockbench 4.10.4
// Exported for Minecraft version 1.17 or later with Mojang mappings
// Paste this class into your mod and generate all required imports


import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.HierarchicalModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.model.geom.PartPose;
import net.minecraft.client.model.geom.builders.*;
import net.minecraft.world.entity.Entity;

public class MosswineModel<T extends Entity> extends HierarchicalModel<T> {
// This layer location should be baked with EntityRendererProvider.Context in the entity renderer and passed into this model's constructor
// public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(new ResourceLocation("modid", "mosswine"), "main");
private final ModelPart body;
private final ModelPart legfrontright;
private final ModelPart legfrontleft;
private final ModelPart legbackleft;
private final ModelPart legbackright;
private final ModelPart head;
private final ModelPart snout;

public MosswineModel(ModelPart root) {
this.body = root.getChild("body");
this.legfrontright = root.getChild("legfrontright");
this.legfrontleft = root.getChild("legfrontleft");
this.legbackleft = root.getChild("legbackleft");
this.legbackright = root.getChild("legbackright");
this.head = root.getChild("head");
this.snout = head.getChild("snout");
}

public static LayerDefinition createBodyLayer() {
MeshDefinition meshdefinition = new MeshDefinition();
PartDefinition partdefinition = meshdefinition.getRoot();

PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0).addBox(-5.0F, -13.0F, -5.0F, 10.0F, 8.0F, 13.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F));

PartDefinition legfrontright = partdefinition.addOrReplaceChild("legfrontright", CubeListBuilder.create().texOffs(33, 0).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.0F, 19.0F, -2.0F));

PartDefinition legfrontleft = partdefinition.addOrReplaceChild("legfrontleft", CubeListBuilder.create().texOffs(33, 0).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(3.0F, 19.0F, -2.0F));

PartDefinition legbackleft = partdefinition.addOrReplaceChild("legbackleft", CubeListBuilder.create().texOffs(33, 0).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(3.0F, 19.0F, 7.0F));

PartDefinition legbackright = partdefinition.addOrReplaceChild("legbackright", CubeListBuilder.create().texOffs(33, 0).addBox(-2.0F, 0.0F, -2.0F, 4.0F, 5.0F, 4.0F, new CubeDeformation(0.0F)), PartPose.offset(-3.0F, 19.0F, 7.0F));

PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 21).addBox(-4.0F, -4.0F, -6.0F, 8.0F, 7.0F, 8.0F, new CubeDeformation(0.0F))
.texOffs(27, 31).addBox(-3.0F, -5.0F, -7.0F, 6.0F, 4.0F, 5.0F, new CubeDeformation(0.0F))
.texOffs(0, 0).addBox(-5.0F, -3.0F, -4.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F))
.texOffs(0, 0).addBox(4.0F, -3.0F, -4.0F, 1.0F, 3.0F, 3.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 16.0F, -5.0F));

PartDefinition snout = head.addOrReplaceChild("snout", CubeListBuilder.create(), PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0.1745F, 0.0F, 0.0F));

PartDefinition cube_r1 = snout.addOrReplaceChild("cube_r1", CubeListBuilder.create().texOffs(32, 21).addBox(-2.0F, -1.5F, -3.0F, 4.0F, 3.0F, 6.0F, new CubeDeformation(0.0F)), PartPose.offsetAndRotation(0.0F, 0.7467F, -5.9651F, -0.1745F, 0.0F, 0.0F));

return LayerDefinition.create(meshdefinition, 64, 64);
}

@Override
public void setupAnim(Entity entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) {

}

// @Override
// public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) {
// body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// legfrontright.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// legfrontleft.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// legbackleft.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// legbackright.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
// }

@Override
public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) {
body.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
legfrontright.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
legfrontleft.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
legbackleft.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
legbackright.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
head.render(poseStack, vertexConsumer, packedLight, packedOverlay, color);
}

@Override
public ModelPart root() {
return this.body;
}

// @Override
// public ModelPart root() {
// return body;
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.nateplays.my_neoforge_mod.entity.client;

import com.mojang.blaze3d.vertex.PoseStack;
import com.nateplays.my_neoforge_mod.MyNeoForgeMod;
import com.nateplays.my_neoforge_mod.entity.custom.MosswineEntity;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.resources.ResourceLocation;

public class MosswineRenderer extends MobRenderer<MosswineEntity, MosswineModel<MosswineEntity>> {

public MosswineRenderer(EntityRendererProvider.Context context) {
super(context, new MosswineModel<>(context.bakeLayer(ModModelLayers.MOSSWINE_LAYER)), 0.8f);
}

/**
* Returns the location of an entity's texture.
*
* @param entity
*/
@Override
public ResourceLocation getTextureLocation(MosswineEntity entity) {
return ResourceLocation.fromNamespaceAndPath(MyNeoForgeMod.MODID, "textures/entity/mosswine.png");
}

@Override
public void render(MosswineEntity entity, float entityYaw, float partialTicks, PoseStack poseStack, MultiBufferSource buffer, int packedLight) {
if (entity.isBaby()) {
poseStack.scale(0.6f, 0.6f, 0.6f);
}

super.render(entity, entityYaw, partialTicks, poseStack, buffer, packedLight);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.nateplays.my_neoforge_mod.entity.custom;

import com.nateplays.my_neoforge_mod.entity.ModEntities;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.attributes.AttributeSupplier;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.goal.BreedGoal;
import net.minecraft.world.entity.ai.goal.FloatGoal;
import net.minecraft.world.entity.ai.goal.TemptGoal;
import net.minecraft.world.entity.animal.Animal;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level;
import net.neoforged.neoforge.common.Tags;
import org.jetbrains.annotations.Nullable;

public class MosswineEntity extends Animal {


public MosswineEntity(EntityType<? extends Animal> entityType, Level level) {
super(entityType, level);
}

@Override
protected void registerGoals() {
this.goalSelector.addGoal(0, new FloatGoal(this));

this.goalSelector.addGoal(1, new BreedGoal(this, 1.2));
this.goalSelector.addGoal(1, new TemptGoal(this, 1.2, Ingredient.of(Tags.Items.MUSHROOMS), false));
}

public static AttributeSupplier.Builder createAttributes() {
return createMobAttributes()
.add(Attributes.MAX_HEALTH, 10.0).add(Attributes.MOVEMENT_SPEED, 0.25);
}

/**
* Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on the animal type)
*
* @param stack
*/
@Override
public boolean isFood(ItemStack stack) {
return stack.is(Tags.Items.MUSHROOMS);
}

@Override
public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) {
return ModEntities.MOSSWINE.get().create(level);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.nateplays.my_neoforge_mod.event;

import com.nateplays.my_neoforge_mod.MyNeoForgeMod;
import com.nateplays.my_neoforge_mod.entity.client.ModModelLayers;
import com.nateplays.my_neoforge_mod.entity.client.MosswineModel;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.client.event.EntityRenderersEvent;

@EventBusSubscriber(modid = MyNeoForgeMod.MODID, bus = EventBusSubscriber.Bus.MOD)
public class ModEventBusClientEvents {

@SubscribeEvent
public static void registerLayer(EntityRenderersEvent.RegisterLayerDefinitions event) {
event.registerLayerDefinition(ModModelLayers.MOSSWINE_LAYER, MosswineModel::createBodyLayer);
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 845d58c

Please sign in to comment.