diff --git a/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleAnimationManager.java b/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleAnimationManager.java index 2bf2581..e5d02fb 100644 --- a/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleAnimationManager.java +++ b/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleAnimationManager.java @@ -10,11 +10,10 @@ public class VehicleAnimationManager { public static float DegToRad = (float)Math.PI/180.0F; public ModelRenderer PropellerAnimation(ModelRenderer BoneIn, T entity, AnimationAxis axis, boolean invertAnimation){ - float PartialTick = entity.GetPartialTick(); - float TargetPropRotation = entity.GetFloatDataValue("TARGET_PROPELLER_ROTATION"); + float PartialTick = VehicleBaseRenderer.PartialTick; float CurrentPropRotation = entity.GetFloatDataValue("PROPELLER_ROTATION"); - float Addition = (TargetPropRotation - CurrentPropRotation) * PartialTick; - float CurrentPropRotationRadians = ((CurrentPropRotation + Addition)% 36000) * (invertAnimation ? -DegToRad : DegToRad); + float Addition = CurrentPropRotation + (entity.GetFloatDataValue("PROPELLER_ROTATION_SPEED") * PartialTick); + float CurrentPropRotationRadians = (CurrentPropRotation + Addition) * (invertAnimation ? -DegToRad : DegToRad); switch(axis){ case X_AXIS: BoneIn.rotateAngleX = CurrentPropRotationRadians; 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 2a90abc..36f6379 100644 --- a/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java +++ b/src/main/java/net/halbear/hvf/Entity/Renderer/VehicleBaseRenderer.java @@ -24,7 +24,7 @@ public class VehicleBaseRenderer STATE_BASED_MODELS = new HashMap<>(); private String RenderState = "DEFAULT"; @@ -77,12 +77,15 @@ public class VehicleBaseRenderer VehicleKeybindActions = vehicleBuildInfo.GetVehicleInputActions(); byte[] VehicleByteActions = new byte[VehicleKeybindActions.size()]; final int[] index = {0}; @@ -182,6 +188,7 @@ public class VehicleBaseEntity extends Entity { public UUID GetPilot(){ if(this.isBeingRidden() && this.getPassengers().get(0) instanceof ServerPlayerEntity){ ServerPlayerEntity player = (ServerPlayerEntity) this.getPassengers().get(0); + if(!this.world.isRemote()){SetStringDataValue("PILOT_UUID",player.getUniqueID().toString());} return player.getUniqueID(); } return null; @@ -216,14 +223,60 @@ public class VehicleBaseEntity extends Entity { @Override public void tick() { super.tick(); + if(GetBooleanDataValue("ADHERES_TO_GRAVITY")){ + if (!this.isOnGround()) { + this.setMotion(this.getMotion().add(0, -GetDoubleDataValue("GRAVITY"), 0)); + } else{ + if(GetFloatDataValue("ORIENTATION_PITCH") % 90 != 0){ + SetFloatDataValue("ORIENTATION_PITCH", Math.round(GetFloatDataValue("ORIENTATION_PITCH")/90.0f) * 90.0f); + } + } + this.move(net.minecraft.entity.MoverType.SELF, this.getMotion()); + this.setMotion(this.getMotion().mul(0.98D, 0.98D, 0.98D)); + } + SetFloatDataValue("ORIENTATION_PITCH",(GetFloatDataValue("ORIENTATION_PITCH") + GetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK"))%360); + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK",0f); + SetFloatDataValue("ORIENTATION_ROLL",(GetFloatDataValue("ORIENTATION_ROLL") + GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK"))%360); + SetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK",0f); + SetFloatDataValue("ORIENTATION_YAW",(GetFloatDataValue("ORIENTATION_YAW") + GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK"))%360); + SetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK",0f); + float CurrentPropRotation = GetFloatDataValue("TARGET_PROPELLER_ROTATION"); + float PropIncrementAmount = GetFloatDataValue("PROPELLER_ROTATION_SPEED"); + SetFloatDataValue("TARGET_PROPELLER_ROTATION",(CurrentPropRotation + PropIncrementAmount) % 360); + SetFloatDataValue("PROPELLER_ROTATION",CurrentPropRotation); + if(this.getMotion().z == 0 && this.getMotion().x == 0 && this.getMotion().y != 0){ + double CenterOfMass = GetDoubleDataValue("CENTRE_OF_MASS_Z"); + float CenterOfMassFloat = (float) CenterOfMass; + if(this.getMotion().y < 0){ + if(GetFloatDataValue("ORIENTATION_PITCH") <= 0 && GetFloatDataValue("ORIENTATION_PITCH") > -90){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", -CenterOfMassFloat); + } else if ( GetFloatDataValue("ORIENTATION_PITCH") <= 360 && GetFloatDataValue("ORIENTATION_PITCH") > 270){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", CenterOfMassFloat); + } else if (GetFloatDataValue("ORIENTATION_PITCH") <= -90 && GetFloatDataValue("ORIENTATION_PITCH") > -180 ){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", - CenterOfMassFloat); + } else if(GetFloatDataValue("ORIENTATION_PITCH") <= 270 && GetFloatDataValue("ORIENTATION_PITCH") > 180){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", CenterOfMassFloat); + } + } else{ + if(GetFloatDataValue("ORIENTATION_PITCH") <= 0 && GetFloatDataValue("ORIENTATION_PITCH") > -90){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", CenterOfMassFloat); + } else if ( GetFloatDataValue("ORIENTATION_PITCH") <= 360 && GetFloatDataValue("ORIENTATION_PITCH") > 270){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", -CenterOfMassFloat); + } else if (GetFloatDataValue("ORIENTATION_PITCH") <= -90 && GetFloatDataValue("ORIENTATION_PITCH") > -180 ){ + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", CenterOfMassFloat); + } else if(GetFloatDataValue("ORIENTATION_PITCH") <= 270 && GetFloatDataValue("ORIENTATION_PITCH") > 180) { + SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", -CenterOfMassFloat); + } + } + } + if(!this.getPassengers().isEmpty()){ + //PlayerEntity player = (PlayerEntity) this.getControllingPassenger(); + //player.sendMessage(new StringTextComponent(GetFloatDataValue("ORIENTATION_PITCH") + ""),player.getUniqueID()); + } TickUpdateEvent(); if(this.world.isRemote()){ ClientSideTickEvent(); } else{ - float CurrentPropRotation = GetFloatDataValue("TARGET_PROPELLER_ROTATION"); - float PropIncrementAmount = GetFloatDataValue("PROPELLER_ROTATION_SPEED"); - SetFloatDataValue("TARGET_PROPELLER_ROTATION",(CurrentPropRotation + PropIncrementAmount) % 36000); - SetFloatDataValue("PROPELLER_ROTATION",CurrentPropRotation); ServerSideTickEvent(); } } @@ -255,6 +308,7 @@ public class VehicleBaseEntity extends Entity { public ActionResultType processInitialInteract(PlayerEntity player, Hand hand) { if (this.getPassengers().size() < VehicleSeatOffsets.length && !player.isPassenger()) { if (!this.world.isRemote()) { + if(this.getPassengers().isEmpty()){SetStringDataValue("PILOT_UUID",player.getUniqueID().toString());} return player.startRiding(this) ? ActionResultType.CONSUME : ActionResultType.PASS; } return ActionResultType.func_233537_a_(this.world.isRemote()); diff --git a/src/main/java/net/halbear/hvf/Registry/EventHandlers/ModEventHandler.java b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ModEventHandler.java index 7b299b4..daa9845 100644 --- a/src/main/java/net/halbear/hvf/Registry/EventHandlers/ModEventHandler.java +++ b/src/main/java/net/halbear/hvf/Registry/EventHandlers/ModEventHandler.java @@ -13,6 +13,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import java.util.Arrays; +import java.util.Objects; @Mod.EventBusSubscriber(modid = Halsvehicleframework.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) public class ModEventHandler { @@ -27,7 +28,8 @@ public class ModEventHandler { for(int i = 0; i < InputManager.ActiveKeys.size(); i++){ bytesFromBytes[i] = InputManager.ActiveKeys.get(i); } - if(!Arrays.equals(bytesFromBytes, vehicle.GetByteArrayValue("INPUT_DATA"))) { + System.out.println(vehicle.GetStringDataValue("PILOT_UUID") + "\n" + player.getUniqueID()); + if(Objects.equals(vehicle.GetStringDataValue("PILOT_UUID"), player.getUniqueID().toString()) && !Arrays.equals(bytesFromBytes, vehicle.GetByteArrayValue("INPUT_DATA"))) { InputArrayNetworking.INSTANCE.sendToServer(new InputArrayPacket(bytesFromBytes)); } if(!InputManager.ActiveKeys.equals(InputManager.LastActiveKeys)){ 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 96d283d..e8ececc 100644 --- a/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java +++ b/src/main/java/net/halbear/hvf/UsageExamples/Aeroplane/Aeroplane.java @@ -21,7 +21,9 @@ public class Aeroplane extends VehicleBaseEntity { .SetMaxSpeedMS(70) .SetCentreOfMass(new Vector3d(0,0,2)) .SetPilotSeat(new Vector3d(0.0D, -1D, 0.0D)) - .AddPassengerSeat(new Vector3d(0.0D, -1D, 1.0D)); + .AddPassengerSeat(new Vector3d(0.0D, -1D, 1.0D)) + .SetGravityStrength(9.8) + .AdhereToGravity(true); public Aeroplane(EntityType Type, World WorldIn) { super(Type, WorldIn, buildInfo); diff --git a/src/main/java/net/halbear/hvf/UsageExamples/Airboat/Airboat.java b/src/main/java/net/halbear/hvf/UsageExamples/Airboat/Airboat.java index d0c925c..69b99ef 100644 --- a/src/main/java/net/halbear/hvf/UsageExamples/Airboat/Airboat.java +++ b/src/main/java/net/halbear/hvf/UsageExamples/Airboat/Airboat.java @@ -20,6 +20,7 @@ public class Airboat extends VehicleBaseEntity { .SetMaxSpeedMS(70) .SetGasCelCount(8) .SetGasCelCapacity(1000) + .SetCentreOfMass(new Vector3d(0,0,1)) .SetPilotSeat(new Vector3d(0.0D, -2D, 0.0D)) .AddPassengerSeat(new Vector3d(0.0D, -2D, 2.0D)) .AddPassengerSeat(new Vector3d(0.0D, -2D, -2.0D)); 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 851a289..0f17a9c 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.VehicleBaseEntity; import net.halbear.hvf.Halsvehicleframework; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; @@ -28,8 +29,8 @@ 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) { - ITag> myEntityTag = EntityTypeTags.getTagById(new ResourceLocation("forge", "hvf_camera_affected_vehicle").toString()); - boolean entityHaveCameraPreset = myEntityTag.contains(entity.getRidingEntity().getType()); + //ITag> myEntityTag = EntityTypeTags.getTagById(new ResourceLocation("forge", "hvf_camera_affected_vehicle").toString()); + boolean entityHaveCameraPreset = entity.getRidingEntity() instanceof VehicleBaseEntity;//myEntityTag.contains(entity.getRidingEntity().getType()); if (entityHaveCameraPreset) { Vector3f Position = GetCameraOffsets(); this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX()); diff --git a/src/main/java/net/halbear/hvf/Util/ServerSynchronisation/InputArrayPacket.java b/src/main/java/net/halbear/hvf/Util/ServerSynchronisation/InputArrayPacket.java index 9d1c630..b0202e7 100644 --- a/src/main/java/net/halbear/hvf/Util/ServerSynchronisation/InputArrayPacket.java +++ b/src/main/java/net/halbear/hvf/Util/ServerSynchronisation/InputArrayPacket.java @@ -1,6 +1,7 @@ package net.halbear.hvf.Util.ServerSynchronisation; import net.halbear.hvf.Entity.VehicleBaseEntity; +import net.halbear.hvf.Registry.Input.InputManager; import net.minecraft.entity.Entity; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.network.PacketBuffer; @@ -29,23 +30,26 @@ public class InputArrayPacket { Context.enqueueWork(()->{ ServerPlayerEntity player = Context.getSender(); if (player != null) { - String Message = ""; + StringBuilder Message = new StringBuilder(); Entity playerEntity = player.getEntity(); if(playerEntity.isPassenger()){ Entity PotentialVehicle = playerEntity.getRidingEntity(); - Message += " Entity: " + PotentialVehicle.getName().getString(); + Message.append(" Entity: ").append(PotentialVehicle.getName().getString()); if(PotentialVehicle instanceof VehicleBaseEntity){ - Message += " Is a HVF vehicle!"; + Message.append(" Is a HVF vehicle!"); VehicleBaseEntity Vehicle = (VehicleBaseEntity)PotentialVehicle; if(Vehicle.GetPilot() == player.getUniqueID()) { Vehicle.SetByteArrayValue("INPUT_DATA", packet.byteArray); - Message += " Packet Sent By Pilot - SUCCESS"; + Message.append(" Packet Sent By Pilot - SUCCESS\nActive Inputs:"); + for(int i = 0; i < packet.byteArray.length; i++){ + Message.append(InputManager.INPUT_BYTE_VALUES_REVERSE_LOOKUP.get(packet.byteArray[i])).append(", "); + } } else{ - Message += " Packet Sent By Passenger - REJECTED"; + Message.append(" Packet Sent By Passenger - REJECTED"); } } } - player.sendMessage(new StringTextComponent(Message),player.getUniqueID()); + player.sendMessage(new StringTextComponent(Message.toString()),player.getUniqueID()); } }); Context.setPacketHandled(true); diff --git a/src/main/java/net/halbear/hvf/Util/VehicleData/EngineCategories.java b/src/main/java/net/halbear/hvf/Util/VehicleData/EngineCategories.java index 078bc65..6042593 100644 --- a/src/main/java/net/halbear/hvf/Util/VehicleData/EngineCategories.java +++ b/src/main/java/net/halbear/hvf/Util/VehicleData/EngineCategories.java @@ -9,5 +9,6 @@ public enum EngineCategories { Steam_Locomotive, Diesel_Train_Engine, Ship_Diesel_Engine, - Rocket_Engine + Rocket_Engine, + NO_COMBUSTION_ENGINE } diff --git a/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleRotatesBy.java b/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleRotatesBy.java new file mode 100644 index 0000000..ae194b4 --- /dev/null +++ b/src/main/java/net/halbear/hvf/Util/VehicleData/VehicleRotatesBy.java @@ -0,0 +1,6 @@ +package net.halbear.hvf.Util.VehicleData; + +public enum VehicleRotatesBy { + CUSTOM_ROTATIONS_ONLY, + BasedOnVelocityAndCenterOfMass +}