From fd19391d21597dc328b3d6489e2cf24986b22701 Mon Sep 17 00:00:00 2001 From: Halbear Date: Mon, 18 May 2026 20:52:24 +0100 Subject: [PATCH] some tomfoolery with rendering entities --- .../halbear/hem/entity/TestPlaneEntity.java | 178 +++++++++ .../entity/renderer/TestPlaneRenderer.java | 359 ++++++++++++++++++ .../TestPlaneOnEntityTickUpdateProcedure.java | 144 +++++++ ...estPlaneOnInitialEntitySpawnProcedure.java | 23 ++ ...estPlaneRightClickedOnEntityProcedure.java | 27 ++ .../hem/models/item/test_plane_spawn_egg.json | 3 + .../assets/hem/textures/entities/biplane.png | Bin 0 -> 11902 bytes .../hem/textures/entities/biplaneupdated.png | Bin 0 -> 20036 bytes 8 files changed, 734 insertions(+) create mode 100644 src/main/java/studio/halbear/hem/entity/TestPlaneEntity.java create mode 100644 src/main/java/studio/halbear/hem/entity/renderer/TestPlaneRenderer.java create mode 100644 src/main/java/studio/halbear/hem/procedures/TestPlaneOnEntityTickUpdateProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/TestPlaneOnInitialEntitySpawnProcedure.java create mode 100644 src/main/java/studio/halbear/hem/procedures/TestPlaneRightClickedOnEntityProcedure.java create mode 100644 src/main/resources/assets/hem/models/item/test_plane_spawn_egg.json create mode 100644 src/main/resources/assets/hem/textures/entities/biplane.png create mode 100644 src/main/resources/assets/hem/textures/entities/biplaneupdated.png diff --git a/src/main/java/studio/halbear/hem/entity/TestPlaneEntity.java b/src/main/java/studio/halbear/hem/entity/TestPlaneEntity.java new file mode 100644 index 0000000..1a5d0bc --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/TestPlaneEntity.java @@ -0,0 +1,178 @@ + +package studio.halbear.hem.entity; + +import studio.halbear.hem.procedures.TestPlaneRightClickedOnEntityProcedure; +import studio.halbear.hem.procedures.TestPlaneOnInitialEntitySpawnProcedure; +import studio.halbear.hem.procedures.TestPlaneOnEntityTickUpdateProcedure; +import studio.halbear.hem.entity.renderer.TestPlaneRenderer; +import studio.halbear.hem.HemModElements; + +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.FMLPlayMessages; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +import net.minecraft.world.World; +import net.minecraft.world.IServerWorld; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Hand; +import net.minecraft.util.DamageSource; +import net.minecraft.util.ActionResultType; +import net.minecraft.network.IPacket; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.item.SpawnEggItem; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.Item; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.ai.attributes.Attributes; +import net.minecraft.entity.ai.attributes.AttributeModifierMap; +import net.minecraft.entity.SpawnReason; +import net.minecraft.entity.MobEntity; +import net.minecraft.entity.ILivingEntityData; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.EntityClassification; +import net.minecraft.entity.Entity; +import net.minecraft.entity.CreatureEntity; +import net.minecraft.entity.CreatureAttribute; + +import javax.annotation.Nullable; + +import java.util.stream.Stream; +import java.util.Map; +import java.util.HashMap; +import java.util.AbstractMap; + +@HemModElements.ModElement.Tag +public class TestPlaneEntity extends HemModElements.ModElement { + public static EntityType entity = (EntityType.Builder.create(CustomEntity::new, EntityClassification.MONSTER) + .setShouldReceiveVelocityUpdates(true).setTrackingRange(64).setUpdateInterval(3).setCustomClientFactory(CustomEntity::new).size(1f, 1.8f)) + .build("test_plane").setRegistryName("test_plane"); + + public TestPlaneEntity(HemModElements instance) { + super(instance, 311); + FMLJavaModLoadingContext.get().getModEventBus().register(new TestPlaneRenderer.ModelRegisterHandler()); + FMLJavaModLoadingContext.get().getModEventBus().register(new EntityAttributesRegisterHandler()); + } + + @Override + public void initElements() { + elements.entities.add(() -> entity); + elements.items + .add(() -> new SpawnEggItem(entity, -1, -1, new Item.Properties().group(ItemGroup.MISC)).setRegistryName("test_plane_spawn_egg")); + } + + @Override + public void init(FMLCommonSetupEvent event) { + } + + private static class EntityAttributesRegisterHandler { + @SubscribeEvent + public void onEntityAttributeCreation(EntityAttributeCreationEvent event) { + AttributeModifierMap.MutableAttribute ammma = MobEntity.func_233666_p_(); + ammma = ammma.createMutableAttribute(Attributes.MOVEMENT_SPEED, 1); + ammma = ammma.createMutableAttribute(Attributes.MAX_HEALTH, 10); + ammma = ammma.createMutableAttribute(Attributes.ARMOR, 0); + ammma = ammma.createMutableAttribute(Attributes.ATTACK_DAMAGE, 3); + ammma = ammma.createMutableAttribute(Attributes.FOLLOW_RANGE, 16); + event.put(entity, ammma.create()); + } + } + + public static class CustomEntity extends CreatureEntity { + public CustomEntity(FMLPlayMessages.SpawnEntity packet, World world) { + this(entity, world); + } + + public CustomEntity(EntityType type, World world) { + super(type, world); + experienceValue = 0; + setNoAI(false); + enablePersistence(); + } + + @Override + public IPacket createSpawnPacket() { + return NetworkHooks.getEntitySpawningPacket(this); + } + + @Override + protected void registerGoals() { + super.registerGoals(); + + } + + @Override + public CreatureAttribute getCreatureAttribute() { + return CreatureAttribute.UNDEFINED; + } + + @Override + public boolean canDespawn(double distanceToClosestPlayer) { + return false; + } + + @Override + public double getMountedYOffset() { + return super.getMountedYOffset() + -0.6; + } + + @Override + public net.minecraft.util.SoundEvent getHurtSound(DamageSource ds) { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.hurt")); + } + + @Override + public net.minecraft.util.SoundEvent getDeathSound() { + return (net.minecraft.util.SoundEvent) ForgeRegistries.SOUND_EVENTS.getValue(new ResourceLocation("entity.generic.death")); + } + + @Override + public ILivingEntityData onInitialSpawn(IServerWorld world, DifficultyInstance difficulty, SpawnReason reason, + @Nullable ILivingEntityData livingdata, @Nullable CompoundNBT tag) { + ILivingEntityData retval = super.onInitialSpawn(world, difficulty, reason, livingdata, tag); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + TestPlaneOnInitialEntitySpawnProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("entity", entity)).collect(HashMap::new, + (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public ActionResultType func_230254_b_(PlayerEntity sourceentity, Hand hand) { + ItemStack itemstack = sourceentity.getHeldItem(hand); + ActionResultType retval = ActionResultType.func_233537_a_(this.world.isRemote()); + super.func_230254_b_(sourceentity, hand); + sourceentity.startRiding(this); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + TestPlaneRightClickedOnEntityProcedure.executeProcedure(Stream.of(new AbstractMap.SimpleEntry<>("sourceentity", sourceentity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + return retval; + } + + @Override + public void baseTick() { + super.baseTick(); + double x = this.getPosX(); + double y = this.getPosY(); + double z = this.getPosZ(); + Entity entity = this; + + TestPlaneOnEntityTickUpdateProcedure.executeProcedure(Stream + .of(new AbstractMap.SimpleEntry<>("world", world), new AbstractMap.SimpleEntry<>("x", x), new AbstractMap.SimpleEntry<>("y", y), + new AbstractMap.SimpleEntry<>("z", z), new AbstractMap.SimpleEntry<>("entity", entity)) + .collect(HashMap::new, (_m, _e) -> _m.put(_e.getKey(), _e.getValue()), Map::putAll)); + } + } +} diff --git a/src/main/java/studio/halbear/hem/entity/renderer/TestPlaneRenderer.java b/src/main/java/studio/halbear/hem/entity/renderer/TestPlaneRenderer.java new file mode 100644 index 0000000..569b0f8 --- /dev/null +++ b/src/main/java/studio/halbear/hem/entity/renderer/TestPlaneRenderer.java @@ -0,0 +1,359 @@ + +package studio.halbear.hem.entity.renderer; + +import studio.halbear.hem.entity.TestPlaneEntity; + +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.api.distmarker.Dist; + +import net.minecraft.util.ResourceLocation; +import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.model.ModelRenderer; +import net.minecraft.client.renderer.entity.model.EntityModel; +import net.minecraft.client.renderer.entity.MobRenderer; + +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.matrix.MatrixStack; + +@OnlyIn(Dist.CLIENT) +public class TestPlaneRenderer { + public static class ModelRegisterHandler { + @SubscribeEvent + @OnlyIn(Dist.CLIENT) + public void registerModels(ModelRegistryEvent event) { + RenderingRegistry.registerEntityRenderingHandler(TestPlaneEntity.entity, renderManager -> { + return new MobRenderer(renderManager, new ModelUpdatedbiplane(), 0.5f) { + + @Override + public ResourceLocation getEntityTexture(Entity entity) { + return new ResourceLocation("hem:textures/entities/biplaneupdated.png"); + } + }; + }); + } + } + + // Made with Blockbench 5.1.4 + // Exported for Minecraft version 1.15 - 1.16 with MCP mappings + // Paste this class into your mod and generate all required imports + public static class ModelUpdatedbiplane extends EntityModel { + private final ModelRenderer Body; + private final ModelRenderer cube_r1; + private final ModelRenderer cube_r2; + private final ModelRenderer cube_r3; + private final ModelRenderer cube_r4; + private final ModelRenderer cube_r5; + private final ModelRenderer cube_r6; + private final ModelRenderer cube_r7; + private final ModelRenderer cube_r8; + private final ModelRenderer cube_r9; + private final ModelRenderer cube_r10; + private final ModelRenderer cube_r11; + private final ModelRenderer cube_r12; + private final ModelRenderer cube_r13; + private final ModelRenderer cube_r14; + private final ModelRenderer cube_r15; + private final ModelRenderer cube_r16; + private final ModelRenderer cube_r17; + private final ModelRenderer cube_r18; + private final ModelRenderer cube_r19; + private final ModelRenderer cube_r20; + private final ModelRenderer cube_r21; + private final ModelRenderer cube_r22; + private final ModelRenderer cube_r23; + private final ModelRenderer cube_r24; + private final ModelRenderer cube_r25; + private final ModelRenderer cube_r26; + private final ModelRenderer cube_r27; + private final ModelRenderer cube_r28; + private final ModelRenderer cube_r29; + private final ModelRenderer cube_r30; + private final ModelRenderer cube_r31; + private final ModelRenderer cube_r32; + private final ModelRenderer cube_r33; + private final ModelRenderer cube_r34; + private final ModelRenderer cube_r35; + private final ModelRenderer cube_r36; + private final ModelRenderer cube_r37; + private final ModelRenderer cube_r38; + private final ModelRenderer cube_r39; + private final ModelRenderer cube_r40; + private final ModelRenderer cube_r41; + private final ModelRenderer propeller; + private final ModelRenderer cube_r42; + + public ModelUpdatedbiplane() { + textureWidth = 512; + textureHeight = 512; + Body = new ModelRenderer(this); + Body.setRotationPoint(0.0F, 3.0F, -9.0F); + Body.setTextureOffset(144, 0).addBox(-5.0F, 7.25F, -12.0F, 10.0F, 2.0F, 32.0F, 0.0F, false); + Body.setTextureOffset(96, 43).addBox(-2.0F, -6.0F, 34.0F, 4.0F, 2.0F, 10.0F, 0.0F, false); + Body.setTextureOffset(0, 92).addBox(-2.0F, -6.0F, 50.0F, 4.0F, 10.0F, 6.0F, 0.0F, false); + Body.setTextureOffset(0, 92).addBox(-26.0F, -18.0F, -7.0F, 52.0F, 2.0F, 24.0F, 0.0F, false); + Body.setTextureOffset(0, 92).addBox(-26.0F, 5.0F, -2.0F, 52.0F, 2.0F, 24.0F, 0.0F, false); + Body.setTextureOffset(292, 89).addBox(11.0F, 13.0F, -4.0F, 2.0F, 8.0F, 8.0F, 0.0F, false); + Body.setTextureOffset(9, 207).addBox(9.0F, 16.0F, -1.0F, 2.0F, 2.0F, 2.0F, 0.0F, false); + Body.setTextureOffset(292, 89).addBox(-13.0F, 13.0F, -4.0F, 2.0F, 8.0F, 8.0F, 0.0F, true); + Body.setTextureOffset(9, 207).addBox(-11.0F, 16.0F, -1.0F, 2.0F, 2.0F, 2.0F, 0.0F, true); + cube_r1 = new ModelRenderer(this); + cube_r1.setRotationPoint(-9.0F, 18.0F, 0.0F); + Body.addChild(cube_r1); + setRotationAngle(cube_r1, 0.0F, 0.0F, 0.4363F); + cube_r1.setTextureOffset(10, 205).addBox(-2.0F, -12.0F, -1.0F, 2.0F, 12.0F, 2.0F, 0.0F, true); + cube_r2 = new ModelRenderer(this); + cube_r2.setRotationPoint(9.0F, 18.0F, 0.0F); + Body.addChild(cube_r2); + setRotationAngle(cube_r2, 0.0F, 0.0F, -0.4363F); + cube_r2.setTextureOffset(10, 205).addBox(0.0F, -12.0F, -1.0F, 2.0F, 12.0F, 2.0F, 0.0F, false); + cube_r3 = new ModelRenderer(this); + cube_r3.setRotationPoint(-42.0F, 4.0F, 7.0F); + Body.addChild(cube_r3); + setRotationAngle(cube_r3, 0.1745F, 0.1745F, 0.0F); + cube_r3.setTextureOffset(52, 21).addBox(-1.0F, -22.0F, -6.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r4 = new ModelRenderer(this); + cube_r4.setRotationPoint(-39.0F, 4.0F, 26.0F); + Body.addChild(cube_r4); + setRotationAngle(cube_r4, 0.1745F, 0.1745F, 0.0F); + cube_r4.setTextureOffset(100, 203).addBox(-1.0F, -22.0F, -6.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r5 = new ModelRenderer(this); + cube_r5.setRotationPoint(39.0F, 4.0F, 26.0F); + Body.addChild(cube_r5); + setRotationAngle(cube_r5, 0.1745F, -0.1745F, 0.0F); + cube_r5.setTextureOffset(186, 177).addBox(-1.0F, -22.0F, -6.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r6 = new ModelRenderer(this); + cube_r6.setRotationPoint(-11.0F, 4.5F, 21.0F); + Body.addChild(cube_r6); + setRotationAngle(cube_r6, 0.2659F, 0.008F, -0.0169F); + cube_r6.setTextureOffset(162, 177).addBox(-1.0F, -22.5F, -2.0F, 2.0F, 24.0F, 2.0F, 0.0F, false); + cube_r7 = new ModelRenderer(this); + cube_r7.setRotationPoint(11.0F, 4.5F, 21.0F); + Body.addChild(cube_r7); + setRotationAngle(cube_r7, 0.2659F, -0.008F, 0.0169F); + cube_r7.setTextureOffset(170, 177).addBox(-1.0F, -22.5F, -2.0F, 2.0F, 24.0F, 2.0F, 0.0F, false); + cube_r8 = new ModelRenderer(this); + cube_r8.setRotationPoint(-11.1935F, -5.629F, -1.7596F); + Body.addChild(cube_r8); + setRotationAngle(cube_r8, 0.2223F, 0.008F, -0.0169F); + cube_r8.setTextureOffset(52, 21).addBox(-1.0F, -12.0F, -2.0F, 2.0F, 24.0F, 2.0F, 0.0F, false); + cube_r9 = new ModelRenderer(this); + cube_r9.setRotationPoint(11.1935F, -5.629F, -1.7596F); + Body.addChild(cube_r9); + setRotationAngle(cube_r9, 0.2223F, -0.008F, 0.0169F); + cube_r9.setTextureOffset(178, 177).addBox(-1.0F, -12.0F, -2.0F, 2.0F, 24.0F, 2.0F, 0.0F, false); + cube_r10 = new ModelRenderer(this); + cube_r10.setRotationPoint(42.0F, 4.0F, 7.0F); + Body.addChild(cube_r10); + setRotationAngle(cube_r10, 0.1745F, -0.1745F, 0.0F); + cube_r10.setTextureOffset(206, 177).addBox(-1.0F, -22.0F, -6.0F, 2.0F, 23.0F, 2.0F, 0.0F, false); + cube_r11 = new ModelRenderer(this); + cube_r11.setRotationPoint(-26.0F, -18.0F, -7.0F); + Body.addChild(cube_r11); + setRotationAngle(cube_r11, 0.0F, 0.1309F, 0.0F); + cube_r11.setTextureOffset(0, 118).addBox(-29.0F, -0.01F, 0.0F, 29.0F, 2.0F, 24.0F, 0.0F, false); + cube_r12 = new ModelRenderer(this); + cube_r12.setRotationPoint(26.0F, -18.0F, -7.0F); + Body.addChild(cube_r12); + setRotationAngle(cube_r12, 0.0F, -0.1309F, 0.0F); + cube_r12.setTextureOffset(0, 118).addBox(0.0F, -0.01F, 0.0F, 29.0F, 2.0F, 24.0F, 0.0F, true); + cube_r13 = new ModelRenderer(this); + cube_r13.setRotationPoint(-26.0F, 5.0F, -2.0F); + Body.addChild(cube_r13); + setRotationAngle(cube_r13, 0.0F, 0.1309F, 0.0F); + cube_r13.setTextureOffset(64, 177).addBox(-19.0F, -0.01F, 0.0F, 19.0F, 2.0F, 24.0F, 0.0F, false); + cube_r14 = new ModelRenderer(this); + cube_r14.setRotationPoint(26.0F, 5.0F, -2.0F); + Body.addChild(cube_r14); + setRotationAngle(cube_r14, 0.0F, -0.1309F, 0.0F); + cube_r14.setTextureOffset(64, 177).addBox(0.0F, -0.01F, 0.0F, 19.0F, 2.0F, 24.0F, 0.0F, true); + cube_r15 = new ModelRenderer(this); + cube_r15.setRotationPoint(-26.8737F, -5.0F, 6.9632F); + Body.addChild(cube_r15); + setRotationAngle(cube_r15, 0.1686F, 0.6551F, -0.0096F); + cube_r15.setTextureOffset(190, 90).addBox(-19.5F, -12.0F, 1.0F, 39.0F, 24.0F, 0.0F, 0.0F, true); + cube_r16 = new ModelRenderer(this); + cube_r16.setRotationPoint(-26.5867F, -6.1884F, 8.6681F); + Body.addChild(cube_r16); + setRotationAngle(cube_r16, 0.2164F, -0.4589F, -0.102F); + cube_r16.setTextureOffset(190, 90).addBox(-20.5F, -11.0F, 0.0F, 39.0F, 23.0F, 0.0F, 0.0F, true); + cube_r17 = new ModelRenderer(this); + cube_r17.setRotationPoint(26.5867F, -6.1884F, 8.6681F); + Body.addChild(cube_r17); + setRotationAngle(cube_r17, 0.2164F, 0.4589F, 0.102F); + cube_r17.setTextureOffset(190, 90).addBox(-18.5F, -11.0F, 0.0F, 39.0F, 23.0F, 0.0F, 0.0F, false); + cube_r18 = new ModelRenderer(this); + cube_r18.setRotationPoint(26.8737F, -5.0F, 6.9632F); + Body.addChild(cube_r18); + setRotationAngle(cube_r18, 0.1686F, -0.6551F, 0.0096F); + cube_r18.setTextureOffset(190, 90).addBox(-19.5F, -12.0F, 1.0F, 39.0F, 24.0F, 0.0F, 0.0F, false); + cube_r19 = new ModelRenderer(this); + cube_r19.setRotationPoint(0.0F, -1.5F, 0.0F); + Body.addChild(cube_r19); + setRotationAngle(cube_r19, -0.3491F, 0.0F, 0.0F); + cube_r19.setTextureOffset(0, 0).addBox(-0.5F, -2.5F, 1.0F, 1.0F, 9.0F, 1.0F, 0.0F, false); + cube_r20 = new ModelRenderer(this); + cube_r20.setRotationPoint(10.0F, -3.0F, 52.0F); + Body.addChild(cube_r20); + setRotationAngle(cube_r20, -0.3054F, 0.0F, 1.5708F); + cube_r20.setTextureOffset(144, 0).addBox(-1.0F, -9.0F, -6.0F, 2.0F, 18.0F, 12.0F, 0.0F, true); + cube_r21 = new ModelRenderer(this); + cube_r21.setRotationPoint(-10.0F, -3.0F, 52.0F); + Body.addChild(cube_r21); + setRotationAngle(cube_r21, -0.3054F, 0.0F, -1.5708F); + cube_r21.setTextureOffset(144, 0).addBox(-1.0F, -9.0F, -6.0F, 2.0F, 18.0F, 12.0F, 0.0F, false); + cube_r22 = new ModelRenderer(this); + cube_r22.setRotationPoint(0.0F, -15.0F, 50.0F); + Body.addChild(cube_r22); + setRotationAngle(cube_r22, -0.3054F, 0.0F, 0.0F); + cube_r22.setTextureOffset(54, 144).addBox(-1.0F, -6.0F, -4.0F, 2.0F, 18.0F, 12.0F, 0.0F, false); + cube_r23 = new ModelRenderer(this); + cube_r23.setRotationPoint(2.0F, 9.25F, 34.0F); + Body.addChild(cube_r23); + setRotationAngle(cube_r23, 0.2528F, -0.1733F, 0.5888F); + cube_r23.setTextureOffset(135, 133).addBox(-0.25F, -6.3007F, -0.9537F, 0.0F, 6.0F, 17.0F, 0.0F, true); + cube_r24 = new ModelRenderer(this); + cube_r24.setRotationPoint(-2.0F, 9.25F, 34.0F); + Body.addChild(cube_r24); + setRotationAngle(cube_r24, 0.2528F, 0.1733F, -0.5888F); + cube_r24.setTextureOffset(135, 133).addBox(0.25F, -6.3007F, -0.9537F, 0.0F, 6.0F, 17.0F, 0.0F, false); + cube_r25 = new ModelRenderer(this); + cube_r25.setRotationPoint(0.0F, 9.25F, 33.0F); + Body.addChild(cube_r25); + setRotationAngle(cube_r25, 0.2618F, 0.0F, 0.0F); + cube_r25.setTextureOffset(106, 144).addBox(-2.0F, -6.0F, 0.0F, 4.0F, 6.0F, 21.0F, 0.0F, false); + cube_r26 = new ModelRenderer(this); + cube_r26.setRotationPoint(-5.0F, 9.0F, 20.0F); + Body.addChild(cube_r26); + setRotationAngle(cube_r26, 0.0F, 0.1745F, 0.0F); + cube_r26.setTextureOffset(38, 201).addBox(0.0F, -1.75F, 0.0F, 5.0F, 2.0F, 14.0F, 0.0F, true); + cube_r27 = new ModelRenderer(this); + cube_r27.setRotationPoint(5.0F, 9.0F, 20.0F); + Body.addChild(cube_r27); + setRotationAngle(cube_r27, 0.0F, -0.1745F, 0.0F); + cube_r27.setTextureOffset(38, 201).addBox(-5.0F, -1.75F, 0.0F, 5.0F, 2.0F, 14.0F, 0.0F, false); + cube_r28 = new ModelRenderer(this); + cube_r28.setRotationPoint(-7.0F, -11.0F, 20.0F); + Body.addChild(cube_r28); + setRotationAngle(cube_r28, 0.3925F, -1.2393F, 1.1581F); + cube_r28.setTextureOffset(196, 64).addBox(0.0F, -7.0F, -5.0F, 18.0F, 7.0F, 5.0F, 0.0F, true); + cube_r29 = new ModelRenderer(this); + cube_r29.setRotationPoint(7.0F, -11.0F, 20.0F); + Body.addChild(cube_r29); + setRotationAngle(cube_r29, 0.3925F, 1.2393F, -1.1581F); + cube_r29.setTextureOffset(196, 64).addBox(-18.0F, -7.0F, -5.0F, 18.0F, 7.0F, 5.0F, 0.0F, false); + cube_r30 = new ModelRenderer(this); + cube_r30.setRotationPoint(0.0F, -6.0F, 9.0F); + Body.addChild(cube_r30); + setRotationAngle(cube_r30, 0.0F, 0.0F, -1.5708F); + cube_r30.setTextureOffset(42, 182).addBox(-10.0F, -7.0F, 6.0F, 15.0F, 14.0F, 5.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 239).addBox(-15.0F, -7.0F, -28.0F, 15.0F, 14.0F, 0.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 223).addBox(-15.0F, -7.0F, -27.0F, 15.0F, 14.0F, 0.0F, 0.0F, false); + cube_r30.setTextureOffset(96, 55).addBox(-9.0F, -2.0F, -28.0F, 4.0F, 4.0F, 7.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 201).addBox(-14.0F, -7.0F, -26.0F, 14.0F, 14.0F, 5.0F, 0.0F, false); + cube_r30.setTextureOffset(144, 34).addBox(-16.0F, -9.0F, -28.0F, 18.0F, 2.0F, 7.0F, 0.0F, false); + cube_r30.setTextureOffset(42, 0).addBox(0.0F, -7.0F, -28.0F, 2.0F, 14.0F, 7.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 0).addBox(-10.0F, -7.0F, -18.0F, 0.0F, 14.0F, 25.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 0).addBox(1.0F, 0.0F, -26.0F, 15.0F, 0.0F, 66.0F, 0.0F, false); + cube_r30.setTextureOffset(0, 0).addBox(-10.0F, -7.0F, -21.0F, 11.0F, 14.0F, 10.0F, 0.0F, false); + cube_r30.setTextureOffset(54, 144).addBox(-10.0F, -8.0F, -21.0F, 10.0F, 1.0F, 32.0F, 0.0F, false); + cube_r31 = new ModelRenderer(this); + cube_r31.setRotationPoint(0.0F, -6.0F, 9.0F); + Body.addChild(cube_r31); + setRotationAngle(cube_r31, 0.0F, 0.0F, 1.5708F); + cube_r31.setTextureOffset(144, 34).addBox(-2.0F, -9.0F, -28.0F, 18.0F, 2.0F, 7.0F, 0.0F, true); + cube_r31.setTextureOffset(54, 144).addBox(0.0F, -8.0F, -21.0F, 10.0F, 1.0F, 32.0F, 0.0F, true); + cube_r32 = new ModelRenderer(this); + cube_r32.setRotationPoint(0.0F, 36.0F, 9.0F); + Body.addChild(cube_r32); + setRotationAngle(cube_r32, 0.0F, 0.0F, 1.5708F); + cube_r32.setTextureOffset(42, 0).addBox(-28.0F, -7.0F, -28.0F, 2.0F, 14.0F, 7.0F, 0.0F, false); + cube_r33 = new ModelRenderer(this); + cube_r33.setRotationPoint(0.0F, -7.0F, -5.0F); + Body.addChild(cube_r33); + setRotationAngle(cube_r33, 0.0F, -0.4363F, -1.5708F); + cube_r33.setTextureOffset(0, 118).addBox(0.0F, -7.0F, 0.0F, 7.0F, 14.0F, 1.0F, 0.0F, false); + cube_r34 = new ModelRenderer(this); + cube_r34.setRotationPoint(51.0F, -18.5F, 20.0F); + Body.addChild(cube_r34); + setRotationAngle(cube_r34, 0.7342F, -0.1119F, -1.4365F); + cube_r34.setTextureOffset(53, 0).addBox(-24.5F, 0.0F, 0.0F, 24.0F, 0.0F, 43.0F, 0.0F, false); + cube_r35 = new ModelRenderer(this); + cube_r35.setRotationPoint(-51.0F, -18.5F, 20.0F); + Body.addChild(cube_r35); + setRotationAngle(cube_r35, 0.7342F, 0.1119F, 1.4365F); + cube_r35.setTextureOffset(53, 0).addBox(0.5F, 0.0F, 0.0F, 24.0F, 0.0F, 43.0F, 0.0F, true); + cube_r36 = new ModelRenderer(this); + cube_r36.setRotationPoint(8.0F, 4.0F, 5.5F); + Body.addChild(cube_r36); + setRotationAngle(cube_r36, 0.0F, 0.0F, 2.0944F); + cube_r36.setTextureOffset(162, 178).addBox(0.0F, 0.0F, -17.5F, 6.0F, 1.0F, 32.0F, 0.0F, true); + cube_r37 = new ModelRenderer(this); + cube_r37.setRotationPoint(-8.0F, 4.0F, 5.5F); + Body.addChild(cube_r37); + setRotationAngle(cube_r37, 0.0F, 0.0F, -2.0944F); + cube_r37.setTextureOffset(162, 178).addBox(-6.0F, 0.0F, -17.5F, 6.0F, 1.0F, 32.0F, 0.0F, false); + cube_r38 = new ModelRenderer(this); + cube_r38.setRotationPoint(5.0F, 9.0F, 20.0F); + Body.addChild(cube_r38); + setRotationAngle(cube_r38, 0.1515F, -0.0869F, -1.0538F); + cube_r38.setTextureOffset(0, 182).addBox(-0.1927F, -3.9414F, -0.5209F, 6.0F, 4.0F, 15.0F, 0.0F, false); + cube_r39 = new ModelRenderer(this); + cube_r39.setRotationPoint(-5.0F, 9.0F, 20.0F); + Body.addChild(cube_r39); + setRotationAngle(cube_r39, 0.1515F, 0.0869F, 1.0538F); + cube_r39.setTextureOffset(82, 118).addBox(-5.8073F, -4.9414F, -0.5209F, 6.0F, 5.0F, 15.0F, 0.0F, false); + cube_r40 = new ModelRenderer(this); + cube_r40.setRotationPoint(-8.0F, 0.5F, 20.0F); + Body.addChild(cube_r40); + setRotationAngle(cube_r40, 0.1745F, 0.0F, 1.5708F); + cube_r40.setTextureOffset(0, 144).addBox(-6.5F, -4.0F, 0.0F, 10.0F, 4.0F, 34.0F, 0.0F, true); + cube_r41 = new ModelRenderer(this); + cube_r41.setRotationPoint(8.0F, 0.5F, 20.0F); + Body.addChild(cube_r41); + setRotationAngle(cube_r41, 0.1745F, 0.0F, -1.5708F); + cube_r41.setTextureOffset(0, 144).addBox(-3.5F, -4.0F, 0.0F, 10.0F, 4.0F, 34.0F, 0.0F, false); + propeller = new ModelRenderer(this); + propeller.setRotationPoint(0.0F, 1.0F, -20.5F); + Body.addChild(propeller); + cube_r42 = new ModelRenderer(this); + cube_r42.setRotationPoint(0.0F, -7.0F, 29.5F); + propeller.addChild(cube_r42); + setRotationAngle(cube_r42, 0.0F, 0.0F, -1.5708F); + cube_r42.setTextureOffset(32, 0).addBox(-9.0F, -2.0F, -32.0F, 4.0F, 4.0F, 3.0F, 0.0F, false); + cube_r42.setTextureOffset(0, 260).addBox(-22.0F, -15.0F, -29.0F, 30.0F, 30.0F, 0.0F, 0.0F, false); + cube_r42.setTextureOffset(4, 0).addBox(-8.0F, -1.0F, -29.0F, 2.0F, 2.0F, 1.0F, 0.0F, false); + } + + @Override + public void render(MatrixStack matrixStack, IVertexBuilder buffer, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + Body.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } + + public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) { + modelRenderer.rotateAngleX = x; + modelRenderer.rotateAngleY = y; + modelRenderer.rotateAngleZ = z; + } + + public void setRotationAngles(Entity e, float f, float f1, float f2, float f3, float f4) { +float DegToRad = (float)(Math.PI/180.0); + float TargetRotX = (float)e.getPersistentData().getDouble("Pitch") * DegToRad; + float TargetRotY = (float)e.getPersistentData().getDouble("Yaw") * DegToRad; + float TargetRotZ = (float)e.getPersistentData().getDouble("Roll") * DegToRad; + + if(TargetRotX > Body.rotateAngleX) Body.rotateAngleX += 1* DegToRad; + if(TargetRotX < Body.rotateAngleX) Body.rotateAngleX -= 1* DegToRad; + if(TargetRotY > Body.rotateAngleY) Body.rotateAngleY += 1* DegToRad; + if(TargetRotY < Body.rotateAngleY) Body.rotateAngleY -= 1* DegToRad; + if(TargetRotZ> Body.rotateAngleZ) Body.rotateAngleZ += 1* DegToRad; + if(TargetRotZ < Body.rotateAngleZ) Body.rotateAngleZ -= 1* DegToRad; + + propeller.rotateAngleZ = (float)e.getPersistentData().getDouble("PropSpeed") * (float)(Math.PI/180.0); + } + } + +} diff --git a/src/main/java/studio/halbear/hem/procedures/TestPlaneOnEntityTickUpdateProcedure.java b/src/main/java/studio/halbear/hem/procedures/TestPlaneOnEntityTickUpdateProcedure.java new file mode 100644 index 0000000..d86e2c6 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/TestPlaneOnEntityTickUpdateProcedure.java @@ -0,0 +1,144 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.entity.TestPlaneEntity; +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.world.IWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.Entity; +import net.minecraft.block.Blocks; + +import java.util.stream.Collectors; +import java.util.function.Function; +import java.util.Map; +import java.util.List; +import java.util.Comparator; + +public class TestPlaneOnEntityTickUpdateProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("world") == null) { + if (!dependencies.containsKey("world")) + HemMod.LOGGER.warn("Failed to load dependency world for procedure TestPlaneOnEntityTickUpdate!"); + return; + } + if (dependencies.get("x") == null) { + if (!dependencies.containsKey("x")) + HemMod.LOGGER.warn("Failed to load dependency x for procedure TestPlaneOnEntityTickUpdate!"); + return; + } + if (dependencies.get("y") == null) { + if (!dependencies.containsKey("y")) + HemMod.LOGGER.warn("Failed to load dependency y for procedure TestPlaneOnEntityTickUpdate!"); + return; + } + if (dependencies.get("z") == null) { + if (!dependencies.containsKey("z")) + HemMod.LOGGER.warn("Failed to load dependency z for procedure TestPlaneOnEntityTickUpdate!"); + return; + } + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure TestPlaneOnEntityTickUpdate!"); + return; + } + IWorld world = (IWorld) dependencies.get("world"); + double x = dependencies.get("x") instanceof Integer ? (int) dependencies.get("x") : (double) dependencies.get("x"); + double y = dependencies.get("y") instanceof Integer ? (int) dependencies.get("y") : (double) dependencies.get("y"); + double z = dependencies.get("z") instanceof Integer ? (int) dependencies.get("z") : (double) dependencies.get("z"); + Entity entity = (Entity) dependencies.get("entity"); + entity.rotationYaw = (float) (0); + entity.setRenderYawOffset(entity.rotationYaw); + entity.prevRotationYaw = entity.rotationYaw; + if (entity instanceof LivingEntity) { + ((LivingEntity) entity).prevRenderYawOffset = entity.rotationYaw; + ((LivingEntity) entity).rotationYawHead = entity.rotationYaw; + ((LivingEntity) entity).prevRotationYawHead = entity.rotationYaw; + } + entity.rotationPitch = (float) (0); + entity.getPersistentData().putDouble("PropSpeed", ((entity.getPersistentData().getDouble("PropSpeed") + + Math.min(20 * (Math.abs(entity.getMotion().getZ()) + Math.abs(entity.getMotion().getX())), 20)) % 360)); + if (!((world.getBlockState(new BlockPos(x, y - 2, z))).getBlock() == Blocks.AIR)) { + entity.getPersistentData().putDouble("Pitch", + ((-20) * (1 - Math.min(2 * (Math.abs(entity.getMotion().getZ()) + Math.abs(entity.getMotion().getX())), 1)))); + } + if (0.3 > Math.abs(entity.getMotion().getZ()) + Math.abs(entity.getMotion().getX())) { + entity.setMotion( + (Math.sin(Math.toRadians(1 * entity.getPersistentData().getDouble("Yaw"))) + * (entity.getPersistentData().getDouble("Throttle") / 100)), + (entity.getMotion().getY()), (Math.cos(Math.toRadians(1 * entity.getPersistentData().getDouble("Yaw"))) + * (entity.getPersistentData().getDouble("Throttle") / 100))); + } else { + entity.setMotion( + (Math.cos(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Yaw"))) + * (entity.getPersistentData().getDouble("Throttle") / 100) + + Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.sin(Math.toRadians(1 * entity.getPersistentData().getDouble("Pitch"))) + * (entity.getPersistentData().getDouble("Throttle") / 100)), + (Math.cos(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Pitch"))) + * (entity.getPersistentData().getDouble("Throttle") / 100) + + Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Yaw"))) + * (entity.getPersistentData().getDouble("Throttle") / 100)), + (Math.cos(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.cos(Math.toRadians((-1) * entity.getPersistentData().getDouble("Yaw"))) + * (entity.getPersistentData().getDouble("Throttle") / 100) + + Math.sin(Math.toRadians((-1) * entity.getPersistentData().getDouble("Roll"))) + * Math.sin(Math.toRadians(1 * entity.getPersistentData().getDouble("Pitch"))) + * (entity.getPersistentData().getDouble("Throttle") / 100))); + } + if (entity.isBeingRidden()) { + { + List _entfound = world + .getEntitiesWithinAABB(Entity.class, + new AxisAlignedBB(x - (5 / 2d), y - (5 / 2d), z - (5 / 2d), x + (5 / 2d), y + (5 / 2d), z + (5 / 2d)), null) + .stream().sorted(new Object() { + Comparator compareDistOf(double _x, double _y, double _z) { + return Comparator.comparing((Function) (_entcnd -> _entcnd.getDistanceSq(_x, _y, _z))); + } + }.compareDistOf(x, y, z)).collect(Collectors.toList()); + for (Entity entityiterator : _entfound) { + if (entityiterator.isPassenger() && (entityiterator.getRidingEntity()) instanceof TestPlaneEntity.CustomEntity) { + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleIncreasePressure) { + entity.getPersistentData().putDouble("Throttle", Math.min(entity.getPersistentData().getDouble("Throttle") + 1, 100)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleReleasePressure) { + entity.getPersistentData().putDouble("Throttle", Math.max(entity.getPersistentData().getDouble("Throttle") - 1, 0)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleAccelerate) { + entity.getPersistentData().putDouble("Pitch", ((entity.getPersistentData().getDouble("Pitch") + 1) % 360)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleDecelerate) { + entity.getPersistentData().putDouble("Pitch", ((entity.getPersistentData().getDouble("Pitch") - 1) % 360)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleTurnLeft) { + entity.getPersistentData().putDouble("Roll", ((entity.getPersistentData().getDouble("Roll") - 1) % 360)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleTurnRight) { + entity.getPersistentData().putDouble("Roll", ((entity.getPersistentData().getDouble("Roll") + 1) % 360)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleStrafeLeft) { + entity.getPersistentData().putDouble("Yaw", ((entity.getPersistentData().getDouble("Yaw") - 1) % 360)); + } + if ((entityiterator.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null) + .orElse(new HemModVariables.PlayerVariables())).VehicleStrafeRight) { + entity.getPersistentData().putDouble("Yaw", ((entity.getPersistentData().getDouble("Yaw") + 1) % 360)); + } + } + } + } + } + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/TestPlaneOnInitialEntitySpawnProcedure.java b/src/main/java/studio/halbear/hem/procedures/TestPlaneOnInitialEntitySpawnProcedure.java new file mode 100644 index 0000000..09d8ad5 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/TestPlaneOnInitialEntitySpawnProcedure.java @@ -0,0 +1,23 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class TestPlaneOnInitialEntitySpawnProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("entity") == null) { + if (!dependencies.containsKey("entity")) + HemMod.LOGGER.warn("Failed to load dependency entity for procedure TestPlaneOnInitialEntitySpawn!"); + return; + } + Entity entity = (Entity) dependencies.get("entity"); + entity.getPersistentData().putDouble("PropSpeed", 0); + entity.getPersistentData().putDouble("Pitch", 0); + entity.getPersistentData().putDouble("Yaw", 0); + entity.getPersistentData().putDouble("Roll", 0); + } +} diff --git a/src/main/java/studio/halbear/hem/procedures/TestPlaneRightClickedOnEntityProcedure.java b/src/main/java/studio/halbear/hem/procedures/TestPlaneRightClickedOnEntityProcedure.java new file mode 100644 index 0000000..e5bf271 --- /dev/null +++ b/src/main/java/studio/halbear/hem/procedures/TestPlaneRightClickedOnEntityProcedure.java @@ -0,0 +1,27 @@ +package studio.halbear.hem.procedures; + +import studio.halbear.hem.HemModVariables; +import studio.halbear.hem.HemMod; + +import net.minecraft.entity.Entity; + +import java.util.Map; + +public class TestPlaneRightClickedOnEntityProcedure { + + public static void executeProcedure(Map dependencies) { + if (dependencies.get("sourceentity") == null) { + if (!dependencies.containsKey("sourceentity")) + HemMod.LOGGER.warn("Failed to load dependency sourceentity for procedure TestPlaneRightClickedOnEntity!"); + return; + } + Entity sourceentity = (Entity) dependencies.get("sourceentity"); + { + boolean _setval = (true); + sourceentity.getCapability(HemModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { + capability.PilotingVehicle = _setval; + capability.syncPlayerVariables(sourceentity); + }); + } + } +} diff --git a/src/main/resources/assets/hem/models/item/test_plane_spawn_egg.json b/src/main/resources/assets/hem/models/item/test_plane_spawn_egg.json new file mode 100644 index 0000000..7a2c6da --- /dev/null +++ b/src/main/resources/assets/hem/models/item/test_plane_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "item/template_spawn_egg" +} \ No newline at end of file diff --git a/src/main/resources/assets/hem/textures/entities/biplane.png b/src/main/resources/assets/hem/textures/entities/biplane.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6d322e0611173dfb31077a32d23d2d4e329742 GIT binary patch literal 11902 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 M&MocYs}7O>2bCMozyJUM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hem/textures/entities/biplaneupdated.png b/src/main/resources/assets/hem/textures/entities/biplaneupdated.png new file mode 100644 index 0000000000000000000000000000000000000000..4881c99dae2ae0f3ac01d569dbce9319c993b45c GIT binary patch literal 20036 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%0AP0GNxKKBO90 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 literal 0 HcmV?d00001