From bd5f58d9b7dbb7d25202600817d53a50ae9e07be Mon Sep 17 00:00:00 2001 From: Halbear Date: Mon, 18 May 2026 12:00:58 +0100 Subject: [PATCH] Setting up completely custom entities separate to MCreators workspace --- .../EventHandlers/ClientEventHandler.java | 34 +++++ .../hem_custom/registry/ModEntities.java | 30 +++++ .../hem_custom/registry/ModStatics.java | 5 + .../hem_custom/vehicles/Entity/Aeroplane.java | 121 ++++++++++++++++++ .../vehicles/Renderer/AeroplaneRenderer.java | 55 ++++++++ .../Renderer/Models/AeroplaneModel.java | 19 +++ 6 files changed, 264 insertions(+) create mode 100644 src/main/java/studio/halbear/hem_custom/registry/EventHandlers/ClientEventHandler.java create mode 100644 src/main/java/studio/halbear/hem_custom/registry/ModEntities.java create mode 100644 src/main/java/studio/halbear/hem_custom/registry/ModStatics.java create mode 100644 src/main/java/studio/halbear/hem_custom/vehicles/Entity/Aeroplane.java create mode 100644 src/main/java/studio/halbear/hem_custom/vehicles/Renderer/AeroplaneRenderer.java create mode 100644 src/main/java/studio/halbear/hem_custom/vehicles/Renderer/Models/AeroplaneModel.java diff --git a/src/main/java/studio/halbear/hem_custom/registry/EventHandlers/ClientEventHandler.java b/src/main/java/studio/halbear/hem_custom/registry/EventHandlers/ClientEventHandler.java new file mode 100644 index 0000000..81315f8 --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/registry/EventHandlers/ClientEventHandler.java @@ -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... blocks_list) { //hal + for (RegistryObject blockRegistryObject : blocks_list) { + RenderTypeLookup.setRenderLayer(blockRegistryObject.get(), type); + } + } + + @SubscribeEvent + public static void init(final FMLClientSetupEvent event) { + RenderingRegistry.registerEntityRenderingHandler(ModEntities.AEROPLANE, AeroplaneRenderer::new); + } +} diff --git a/src/main/java/studio/halbear/hem_custom/registry/ModEntities.java b/src/main/java/studio/halbear/hem_custom/registry/ModEntities.java new file mode 100644 index 0000000..6eb01b3 --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/registry/ModEntities.java @@ -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 = null; + + @SubscribeEvent + public static void registerEntities(final RegistryEvent.Register> event) { + EntityType 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 + } +} diff --git a/src/main/java/studio/halbear/hem_custom/registry/ModStatics.java b/src/main/java/studio/halbear/hem_custom/registry/ModStatics.java new file mode 100644 index 0000000..a34987a --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/registry/ModStatics.java @@ -0,0 +1,5 @@ +package studio.halbear.hem_custom.registry; + +public class ModStatics { + public final static String MOD_ID = "hem"; +} diff --git a/src/main/java/studio/halbear/hem_custom/vehicles/Entity/Aeroplane.java b/src/main/java/studio/halbear/hem_custom/vehicles/Entity/Aeroplane.java new file mode 100644 index 0000000..d40c7d3 --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/vehicles/Entity/Aeroplane.java @@ -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 ORIENTATION_ROLL = EntityDataManager.createKey(Aeroplane.class, DataSerializers.FLOAT); + private static final DataParameter ORIENTATION_YAW = EntityDataManager.createKey(Aeroplane.class, DataSerializers.FLOAT); + private static final DataParameter 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); + } + } + } +} diff --git a/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/AeroplaneRenderer.java b/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/AeroplaneRenderer.java new file mode 100644 index 0000000..06c0f76 --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/AeroplaneRenderer.java @@ -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 { + 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; + }*/ +} diff --git a/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/Models/AeroplaneModel.java b/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/Models/AeroplaneModel.java new file mode 100644 index 0000000..c2622ff --- /dev/null +++ b/src/main/java/studio/halbear/hem_custom/vehicles/Renderer/Models/AeroplaneModel.java @@ -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 { + @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 +}