Setting up completely custom entities separate to MCreators workspace

This commit is contained in:
2026-05-18 12:00:58 +01:00
parent 8b46b2b687
commit bd5f58d9b7
6 changed files with 264 additions and 0 deletions
@@ -0,0 +1,34 @@
package studio.halbear.hem_custom.registry.EventHandlers;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.MobRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraft.block.Block;
import studio.halbear.hem_custom.registry.ModEntities;
import studio.halbear.hem_custom.registry.ModStatics;
import studio.halbear.hem_custom.vehicles.Renderer.AeroplaneRenderer;
@Mod.EventBusSubscriber(modid = ModStatics.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class ClientEventHandler {
@SafeVarargs
public static void SetCollectionRenderType(RenderType type, RegistryObject<Block>... blocks_list) { //hal
for (RegistryObject<Block> blockRegistryObject : blocks_list) {
RenderTypeLookup.setRenderLayer(blockRegistryObject.get(), type);
}
}
@SubscribeEvent
public static void init(final FMLClientSetupEvent event) {
RenderingRegistry.registerEntityRenderingHandler(ModEntities.AEROPLANE, AeroplaneRenderer::new);
}
}
@@ -0,0 +1,30 @@
package studio.halbear.hem_custom.registry;
import net.minecraft.entity.EntityClassification;
import net.minecraft.entity.EntityType;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.event.entity.EntityAttributeCreationEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import studio.halbear.hem_custom.vehicles.Entity.Aeroplane;
@Mod.EventBusSubscriber(modid = "hem", bus = Mod.EventBusSubscriber.Bus.MOD)
public class ModEntities {
public static final EntityType<Aeroplane> AEROPLANE = null;
@SubscribeEvent
public static void registerEntities(final RegistryEvent.Register<EntityType<?>> event) {
EntityType<Aeroplane> entity = EntityType.Builder.create(Aeroplane::new, EntityClassification.MISC)
.size(2, 1.5F).build(new ResourceLocation(ModStatics.MOD_ID, "aeroplane").toString());
entity.setRegistryName(new ResourceLocation(ModStatics.MOD_ID, "aeroplane"));
event.getRegistry().register(entity);
}
@SubscribeEvent
public static void registerAttributes(final EntityAttributeCreationEvent event) {
//if an entity has attributes, register them here
}
}
@@ -0,0 +1,5 @@
package studio.halbear.hem_custom.registry;
public class ModStatics {
public final static String MOD_ID = "hem";
}
@@ -0,0 +1,121 @@
package studio.halbear.hem_custom.vehicles.Entity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks;
public class Aeroplane extends Entity {
private static final DataParameter<Float> ORIENTATION_ROLL = EntityDataManager.createKey(Aeroplane.class, DataSerializers.FLOAT);
private static final DataParameter<Float> ORIENTATION_YAW = EntityDataManager.createKey(Aeroplane.class, DataSerializers.FLOAT);
private static final DataParameter<Float> ORIENTATION_PITCH = EntityDataManager.createKey(Aeroplane.class, DataSerializers.FLOAT);
private static final Vector3d[] VehicleSeatOffsets = new Vector3d[]{
new Vector3d(0.0D, -1D, 0.0D),
};
public Aeroplane(EntityType<?> Type, World WorldIn) {
super(Type, WorldIn);
}
@Override
protected void registerData() {
this.dataManager.register(ORIENTATION_ROLL, 0F);
this.dataManager.register(ORIENTATION_PITCH, 0F);
this.dataManager.register(ORIENTATION_YAW, 0F);
}
@Override
protected void readAdditional(CompoundNBT compoundNBT) {
}
@Override
protected void writeAdditional(CompoundNBT compoundNBT) {
}
@Override
public IPacket<?> createSpawnPacket() {
return NetworkHooks.getEntitySpawningPacket(this);
}
public void SetVehicleRoll(float value){
this.dataManager.set(ORIENTATION_ROLL, value);
}
public void SetVehicleYaw(float value){
this.dataManager.set(ORIENTATION_YAW, value);
}
public void SetVehiclePitch(float value){
this.dataManager.set(ORIENTATION_PITCH, value);
}
public float GetVehicleRoll(){
return this.dataManager.get(ORIENTATION_ROLL);
}
public float GetVehicleYaw(){
return this.dataManager.get(ORIENTATION_YAW);
}
public float GetVehiclePitch(){
return this.dataManager.get(ORIENTATION_PITCH);
}
public float[] GetVehicleRotations(){
return new float[]{GetVehicleYaw(),GetVehiclePitch(),GetVehicleRoll()};
}
public void SetVehicleRotations(float Yaw, float Pitch, float Roll){
SetVehicleRoll(Roll);
SetVehicleYaw(Yaw);
SetVehiclePitch(Pitch);
}
@Override
public boolean canBeCollidedWith(){return true;}
@Override
protected boolean canFitPassenger(Entity passenger) {
return this.getPassengers().size() < VehicleSeatOffsets.length;
}
@Override
public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) {
if (this.getPassengers().size() < VehicleSeatOffsets.length && !player.isPassenger()) {
if (!this.world.isRemote()) {
return player.startRiding(this) ? ActionResultType.CONSUME : ActionResultType.PASS;
}
return ActionResultType.func_233537_a_(this.world.isRemote());
}
return ActionResultType.SUCCESS;
}
@Override
public Entity getControllingPassenger() {
return this.getPassengers().isEmpty() ? null : this.getPassengers().get(0);
}
@Override
public void updatePassenger(Entity passenger) {
if (this.isPassenger(passenger)) {
int seatIndex = this.getPassengers().indexOf(passenger);
if (seatIndex >= 0 && seatIndex < VehicleSeatOffsets.length) {
Vector3d localOffset = VehicleSeatOffsets[seatIndex];
Vector3d rotatedOffset = localOffset.rotateYaw((float) Math.toRadians(-this.rotationYaw));
passenger.setPosition(
this.getPosX() + rotatedOffset.x,
this.getPosY() + rotatedOffset.y + passenger.getMountedYOffset(),
this.getPosZ() + rotatedOffset.z
);
} else {
super.updatePassenger(passenger);
}
}
}
}
@@ -0,0 +1,55 @@
package studio.halbear.hem_custom.vehicles.Renderer;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.culling.ClippingHelper;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import studio.halbear.hem_custom.registry.ModStatics;
import studio.halbear.hem_custom.vehicles.Entity.Aeroplane;
import studio.halbear.hem_custom.vehicles.Renderer.Models.AeroplaneModel;
import javax.annotation.Nonnull;
@OnlyIn(Dist.CLIENT)
public class AeroplaneRenderer extends EntityRenderer<Aeroplane> {
private AeroplaneModel model = new AeroplaneModel();
public AeroplaneRenderer(EntityRendererManager renderManagerIn) {
super(renderManagerIn );
}
@Override
public void render(Aeroplane entity, float entityYaw, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int packedLight) {
matrixStack.push();
matrixStack.rotate(Vector3f.YP.rotationDegrees(180.0F - entityYaw));
matrixStack.scale(-1.0F, -1.0F, 1.0F);
matrixStack.translate(0.0D, -1.5D, 0.0D);
IVertexBuilder vertexBuilder = buffer.getBuffer(this.model.getRenderType(getEntityTexture(entity)));
this.model.setRotationAngles(entity, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F);
this.model.render(matrixStack, vertexBuilder, packedLight, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F);
matrixStack.pop();
super.render(entity, entityYaw, partialTicks, matrixStack, buffer, packedLight);
}
@Override
@Nonnull
public ResourceLocation getEntityTexture(Aeroplane entity) {
return new ResourceLocation(ModStatics.MOD_ID,"textures/entities/aeroplane.png");
}
/* @Override
public boolean shouldRender(Aeroplane livingEntity, ClippingHelper camera, double camX, double camY, double camZ) {
return true;
}*/
}
@@ -0,0 +1,19 @@
package studio.halbear.hem_custom.vehicles.Renderer.Models;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.entity.model.EntityModel;
import studio.halbear.hem_custom.vehicles.Entity.Aeroplane;
public class AeroplaneModel extends EntityModel<Aeroplane> {
@Override
public void setRotationAngles(Aeroplane aeroplane, float v, float v1, float v2, float v3, float v4) {
}
@Override
public void render(MatrixStack matrixStack, IVertexBuilder iVertexBuilder, int i, int i1, float v, float v1, float v2, float v3) {
}
//model to go here later
}