diff --git a/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java b/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java index db772f9..81119f7 100644 --- a/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java +++ b/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java @@ -4,6 +4,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import net.halbear.hvf.Entity.VehicleBaseEntity; import net.halbear.hvf.Halsvehicleframework; +import net.halbear.hvf.Util.Client.VehicleCameraPreset; +import net.halbear.hvf.Util.Client.VehicleCameraSettings; import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.entity.EntityRenderer; @@ -20,6 +22,9 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import static net.halbear.hvf.Entity.Renderer.VehicleAnimationManager.DegToRad; +import static net.halbear.hvf.Util.Math.CommonFunctions.getRotationMatrix4f; + public class VehicleBaseRenderer> extends EntityRenderer { private Vector3f LastRotations = new Vector3f(0,0,0); @@ -85,12 +90,14 @@ public class VehicleBaseRenderer= 0 && seatIndex < VehicleSeatOffsets.length) { Vector3d localOffset = VehicleSeatOffsets[seatIndex]; @@ -397,10 +419,13 @@ public class VehicleBaseEntity extends Entity { OriginPosition = OriginPosition.add(new Vector3d(0, getHeight()/2, 0)); break; } - float yawRad = (float) Math.toRadians(GetFloatDataValue("ORIENTATION_YAW")); - float pitchRad = (float) Math.toRadians(GetFloatDataValue("ORIENTATION_PITCH")); - float rollRad = (float) Math.toRadians(GetFloatDataValue("ORIENTATION_ROLL")); - + float AddYaw = GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK"); + float AddPitch = GetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK"); + float AddRoll = GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK"); + float yawRad = (float) Math.toRadians(180F - (GetFloatDataValue("ORIENTATION_YAW") + AddYaw)); + float pitchRad = (float) Math.toRadians(GetFloatDataValue("ORIENTATION_PITCH")+ AddPitch); + float rollRad = (float) Math.toRadians(GetFloatDataValue("ORIENTATION_ROLL")+ AddRoll); + System.out.println((passenger.world.isRemote() ? "CLIENT: " : "SERVER: ") + "AddedValues: " + AddYaw +"_"+AddPitch+"_"+AddRoll); Matrix4f TransformationMatrix = getRotationMatrix4f(yawRad, pitchRad, rollRad); Vector4f SeatPosition = new Vector4f( diff --git a/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandler.java b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandler.java index 4594105..57a125b 100644 --- a/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandler.java +++ b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandler.java @@ -1,10 +1,17 @@ package net.halbear.hvf.Registry.EventHandlers; +import com.mojang.blaze3d.matrix.MatrixStack; +import net.halbear.hvf.Entity.Renderer.VehicleAnimationManager; +import net.halbear.hvf.Entity.VehicleBaseEntity; import net.halbear.hvf.UsageExamples.Aeroplane.Renderer.AeroplaneRenderer; import net.halbear.hvf.UsageExamples.Airboat.Renderer.AirboatRenderer; import net.halbear.hvf.Halsvehicleframework; import net.halbear.hvf.Registry.*; +import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.math.vector.Vector3f; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderLivingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.RenderingRegistry; @@ -12,6 +19,7 @@ import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import static net.halbear.hvf.Registry.Input.ModKeybinds.*; +import static net.halbear.hvf.Util.Math.CommonFunctions.getRotationMatrix4f; @Mod.EventBusSubscriber(modid = Halsvehicleframework.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) public class ClientEventHandler { diff --git a/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandlerForgeEventBus.java b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandlerForgeEventBus.java new file mode 100644 index 0000000..ed0fad8 --- /dev/null +++ b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ClientEventHandlerForgeEventBus.java @@ -0,0 +1,58 @@ +package net.halbear.hvf.Registry.EventHandlers; + +import com.mojang.blaze3d.matrix.MatrixStack; +import net.halbear.hvf.Entity.Renderer.PivotOrigin; +import net.halbear.hvf.Entity.VehicleBaseEntity; +import net.halbear.hvf.Halsvehicleframework; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3f; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import static net.halbear.hvf.Util.Math.CommonFunctions.getRotationMatrix4f; + +@Mod.EventBusSubscriber(modid = Halsvehicleframework.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) +public class ClientEventHandlerForgeEventBus { + public static float DegToRad = (float)Math.PI/180.0F; + + @SubscribeEvent + public static void onRenderVehiclePassenger(RenderLivingEvent.Pre event){ + LivingEntity Passenger = event.getEntity(); + float partialTicks = event.getPartialRenderTick(); + if(Passenger.isPassenger() && Passenger.getRidingEntity() instanceof VehicleBaseEntity){ + VehicleBaseEntity vehicle = (VehicleBaseEntity) Passenger.getRidingEntity(); + Vector3d OriginPosition = new Vector3d(0,0,0).add(vehicle.getBuildInfo().GetOriginOffset()); + PivotOrigin OriginType = vehicle.getBuildInfo().GetOriginType(); + switch(OriginType) { + case PilotSeat: + OriginPosition = OriginPosition.add(vehicle.GetPilotSeat().x,vehicle.GetPilotSeat().y,vehicle.GetPilotSeat().z); + break; + case EntityPosition: + break; + case RelativeToEntityCenter: + OriginPosition = OriginPosition.add(new Vector3d(0, vehicle.getHeight()/2, 0)); + break; + } + Vector3f RotationsToAdd = new Vector3f(-vehicle.GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK") * partialTicks,vehicle.GetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK") * partialTicks,vehicle.GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK") * partialTicks); + Vector3f Rotations = new Vector3f(vehicle.GetVehicleYaw() ,vehicle.GetVehiclePitch(),vehicle.GetVehicleRoll()); + Rotations.add(RotationsToAdd); + MatrixStack matrixStack = event.getMatrixStack(); + matrixStack.push(); + float hipHeight = (float) Passenger.getHeight()/2; + matrixStack.translate(0.0D, hipHeight, 0.0D); + matrixStack.rotate(net.minecraft.util.math.vector.Vector3f.YP.rotationDegrees(180.0F)); + matrixStack.getLast().getMatrix().mul(getRotationMatrix4f(Rotations.getX() * DegToRad,-Rotations.getY() * DegToRad,-Rotations.getZ() * DegToRad)); + matrixStack.translate(0.0D, -hipHeight, 0.0D); + } + } + + @SubscribeEvent + public static void onRenderVehiclePassengerPost(RenderLivingEvent.Post event) { + if (event.getEntity().getRidingEntity() instanceof VehicleBaseEntity) { + event.getMatrixStack().pop(); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java b/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java index be0f4a8..75a1069 100644 --- a/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java +++ b/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java @@ -1,5 +1,6 @@ package net.halbear.hvf.UsageExamples.Aeroplane; +import net.halbear.hvf.Entity.Renderer.PivotOrigin; import net.halbear.hvf.Entity.VehicleBaseEntity; import net.halbear.hvf.Registry.Input.InputCategory; import net.halbear.hvf.Util.Client.VehicleCameraPreset; @@ -24,8 +25,9 @@ public class Aeroplane extends VehicleBaseEntity { .SetPilotSeat(new Vector3d(0.0D, -1D, 0.0D)) .AddPassengerSeat(new Vector3d(2.0D, 0.5D, 0.25D)) .AddPassengerSeat(new Vector3d(-2.0D, 0.5D, 0.25D)) + .SetOrigin(PivotOrigin.RelativeToEntityCenter, new Vector3d(0,0,0)) .SetGravityStrength(3.8) - .SetAtRestAngleOffsets(new Vector3d(0,20,0)) + .SetAtRestAngleOffsets(new Vector3d(0,15,0)) .SetRotateAngleOffsets(new Vector3d(0,0,0)) .SetRotateVelocity(0.7) .AdhereToGravity(true); @@ -38,13 +40,10 @@ public class Aeroplane extends VehicleBaseEntity { SetFloatDataValue("PROPELLER_ROTATION_SPEED",(float)(Math.random() * 40)); GetVehicleController().AddInputFunction("Forward",0.029f, new Vector3d(1,90,1), InputCategory.MoveForward); GetVehicleController().AddInputFunction("Backward",0.049f, new Vector3d(1,90,1), InputCategory.MoveBackward); - GetVehicleController().AddInputFunction("StrafeLeft",0.049f, new Vector3d(1,90,1), InputCategory.StrafeLeft); - GetVehicleController().AddInputFunction("StrafeRight",0.049f, new Vector3d(1,90,1), InputCategory.StrafeRight); - - GetVehicleController().AddInputFunction("GearShiftUp",()-> SetFloatDataValue("ORIENTATION_ROLL", GetFloatDataValue("ORIENTATION_ROLL") + 5)); - GetVehicleController().AddInputFunction("GearShiftDown",()-> SetFloatDataValue("ORIENTATION_ROLL", GetFloatDataValue("ORIENTATION_ROLL") - 5)); - GetVehicleController().AddInputFunction("TurnLeft",()-> SetFloatDataValue("ORIENTATION_YAW", GetFloatDataValue("ORIENTATION_YAW") + 5)); - GetVehicleController().AddInputFunction("TurnRight",()-> SetFloatDataValue("ORIENTATION_YAW", GetFloatDataValue("ORIENTATION_YAW") - 5)); + GetVehicleController().AddInputFunction("StrafeLeft",()-> SetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK", GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK") - 5)); + GetVehicleController().AddInputFunction("StrafeRight",()-> SetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK", GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK") + 5)); + GetVehicleController().AddInputFunction("TurnLeft",()-> SetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK", GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK") - 5)); + GetVehicleController().AddInputFunction("TurnRight",()-> SetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK", GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK") + 5)); } @Override diff --git a/src/main/java/net/halbear/hvf/Util/Client/VehicleCameraSettings.java b/src/main/java/net/halbear/hvf/Util/Client/VehicleCameraSettings.java index 2a54af3..0becdad 100644 --- a/src/main/java/net/halbear/hvf/Util/Client/VehicleCameraSettings.java +++ b/src/main/java/net/halbear/hvf/Util/Client/VehicleCameraSettings.java @@ -1,9 +1,13 @@ package net.halbear.hvf.Util.Client; +import net.halbear.hvf.Entity.VehicleBaseEntity; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.settings.PointOfView; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Quaternion; import net.minecraft.util.math.vector.Vector3f; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.event.TickEvent; @@ -13,6 +17,8 @@ import net.minecraftforge.fml.common.Mod; import java.util.HashMap; import java.util.Map; +import static net.halbear.hvf.Util.Math.CommonFunctions.getRotationMatrix4f; + @Mod.EventBusSubscriber public class VehicleCameraSettings { private static VehicleCameraPreset CurrentPreset = null; @@ -22,6 +28,11 @@ public class VehicleCameraSettings { return CurrentPreset == null ? null : CurrentPreset.GetCameraOffsets(); } + public static void RefreshPreset(){ + if(HvfVehicle && CameraPresets.containsKey(CurrentEntity)) { + CurrentPreset = CameraPresets.get(CurrentEntity).Clone(); + } + } public static Map, VehicleCameraPreset> CameraPresets = new HashMap<>(); public static void AddEntityCameraPreset(EntityType entityType, VehicleCameraPreset vehicleCameraPreset){ @@ -34,14 +45,17 @@ public class VehicleCameraSettings { if (event.phase != TickEvent.Phase.END) { return; } - if (event.player != null && event.player.isPassenger() && event.player.getRidingEntity() != null - && CurrentEntity != event.player.getRidingEntity().getType()) { + if (event.player != null && event.player.isPassenger() && event.player.getRidingEntity() != null) { Entity Current = event.player.getRidingEntity(); CurrentEntity = Current.getType(); HvfVehicle = CameraPresets.containsKey(CurrentEntity); if (HvfVehicle) { CurrentPreset = CameraPresets.get(CurrentEntity).Clone(); } + } else{ + HvfVehicle = false; + CurrentPreset = null; + CurrentEntity = null; } if(CurrentPreset == null) return; if ((!event.player.isPassenger() || !HvfVehicle) @@ -62,9 +76,15 @@ public class VehicleCameraSettings { @SubscribeEvent public static void onCameraSetup(EntityViewRenderEvent.CameraSetup event) { // sets the Yaw, Roll, and Pitch for the camera, ONLY if its a HEM vehcile as to avoid unnecessary ticks if (HvfVehicle) { - event.setRoll(event.getRoll() + CurrentPreset.GetCameraTransformations().getX()); - event.setYaw(event.getYaw() + CurrentPreset.GetCameraTransformations().getY()); - event.setPitch(event.getPitch() + CurrentPreset.GetCameraTransformations().getZ()); + Minecraft minecraftInstance = Minecraft.getInstance(); + if (minecraftInstance.player != null && minecraftInstance.gameRenderer != null) { + PointOfView Cam = minecraftInstance.gameSettings.getPointOfView(); + if (Cam == PointOfView.FIRST_PERSON) { + //event.setRoll(event.getRoll() - CurrentPreset.GetCameraTransformations().getZ()); + //event.setYaw(event.getYaw() + (180F - CurrentPreset.GetCameraTransformations().getX())); + //event.setPitch(event.getPitch() - CurrentPreset.GetCameraTransformations().getY()); + } + } } } diff --git a/src/main/java/net/halbear/hvf/Util/Mixin/CameraMixin.java b/src/main/java/net/halbear/hvf/Util/Mixin/CameraMixin.java index e2fe186..a128e64 100644 --- a/src/main/java/net/halbear/hvf/Util/Mixin/CameraMixin.java +++ b/src/main/java/net/halbear/hvf/Util/Mixin/CameraMixin.java @@ -1,5 +1,6 @@ package net.halbear.hvf.Util.Mixin; +import net.halbear.hvf.Entity.Renderer.PivotOrigin; import net.halbear.hvf.Entity.VehicleBaseEntity; import net.halbear.hvf.Halsvehicleframework; import net.minecraft.client.Minecraft; @@ -10,7 +11,10 @@ import net.minecraft.entity.EntityType; import net.minecraft.tags.EntityTypeTags; import net.minecraft.tags.ITag; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.vector.Matrix4f; +import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3f; +import net.minecraft.util.math.vector.Vector4f; import net.minecraft.world.IBlockReader; import net.minecraftforge.registries.ForgeRegistries; import org.spongepowered.asm.mixin.Mixin; @@ -19,16 +23,19 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import static net.halbear.hvf.Util.Client.VehicleCameraSettings.GetCameraOffsets; +import static net.halbear.hvf.Util.Math.CommonFunctions.getRotationMatrix4f; @Mixin(ActiveRenderInfo.class) public abstract class CameraMixin { @Inject(method = {"update", "func_216772_a","setup"}, at = @At(value = "TAIL"),cancellable = true, remap = true) private void update(IBlockReader currentRenderedLevel, Entity entity, boolean isDetached, boolean isMirrored, float partialTicks, CallbackInfo ci){ - if(entity.isPassenger() && Minecraft.getInstance().gameSettings.getPointOfView() != PointOfView.FIRST_PERSON) { + if(entity.isPassenger()) { boolean entityHaveCameraPreset = entity.getRidingEntity() instanceof VehicleBaseEntity; if (entityHaveCameraPreset) { - Vector3f Position = GetCameraOffsets() != null ? GetCameraOffsets() : new Vector3f(0,0,0); - this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX()); + if(Minecraft.getInstance().gameSettings.getPointOfView() != PointOfView.FIRST_PERSON) { + Vector3f Position = GetCameraOffsets() != null ? GetCameraOffsets() : new Vector3f(0, 0, 0); + this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX()); + } } } diff --git a/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleController.java b/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleController.java index dc4354e..4c01d7c 100644 --- a/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleController.java +++ b/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleController.java @@ -44,28 +44,28 @@ public class VehicleController { switch(functionType){ case MoveForward: AddInputFunction(Input,()->{ if(Vector3.inRange(Vector3.Negative(TerminalVelocity),TerminalVelocity, Parent.getMotion())){ - Parent.AddVelocity(-ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); + Parent.AddVelocity(-ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); } }); break; case MoveBackward: AddInputFunction(Input,()-> { if (Vector3.inRange(Vector3.Negative(TerminalVelocity), TerminalVelocity, Parent.getMotion())) { - Parent.AddVelocity(ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); + Parent.AddVelocity(ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); } }); break; case StrafeLeft: AddInputFunction(Input,()-> { if (Vector3.inRange(Vector3.Negative(TerminalVelocity), TerminalVelocity, Parent.getMotion())) { - Parent.AddVelocity(ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); + Parent.AddVelocity(ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); } }); break; case StrafeRight: AddInputFunction(Input,()-> { if (Vector3.inRange(Vector3.Negative(TerminalVelocity), TerminalVelocity, Parent.getMotion())) { - Parent.AddVelocity(-ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); + Parent.AddVelocity(-ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())); } }); break;