Seat positions and more physics work

This commit is contained in:
Halbear
2026-06-01 23:57:22 +01:00
parent 5dc13c2f42
commit 73f958423c
15 changed files with 463 additions and 89 deletions
@@ -2,6 +2,7 @@ package net.halbear.hvf.Entity.Renderer;
import net.halbear.hvf.Entity.*;
import net.halbear.hvf.Halsvehicleframework;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.client.renderer.model.ModelRenderer;
@@ -30,18 +31,20 @@ public class VehicleAnimationManager<T extends VehicleBaseEntity> {
}
public ModelRenderer WheelAnimationAccurate(ModelRenderer BoneIn, T entity, double WheelDiameterInMetres, AnimationAxis axis, boolean invertAnimation){
Vector3d Normalised = entity.getMotion().normalize();
float Modifier = (float) ((Normalised.x * Math.sin(entity.GetVehicleYaw())) +(Math.cos(entity.GetVehicleYaw()) * Normalised.z));
float PartialTick = VehicleBaseRenderer.PartialTick;
double RotationDeg = ((360 * entity.GetPositionDifference())/ (WheelDiameterInMetres * Math.PI))%360;
double RotationDeg = ((360 * Modifier * entity.GetPositionDifference()/100)/ (WheelDiameterInMetres * Math.PI))%360;
float RotationRad = (float)(RotationDeg * DegToRad);
switch(axis){
case X_AXIS:
BoneIn.rotateAngleX = BoneIn.rotateAngleX + (RotationRad*PartialTick);
BoneIn.rotateAngleX += (RotationRad*PartialTick);
break;
case Y_AXIS:
BoneIn.rotateAngleY = BoneIn.rotateAngleY + (RotationRad*PartialTick);
BoneIn.rotateAngleY += (RotationRad*PartialTick);
break;
case Z_AXIS:
BoneIn.rotateAngleZ = BoneIn.rotateAngleZ + (RotationRad*PartialTick);
BoneIn.rotateAngleZ += (RotationRad*PartialTick);
break;
}
return BoneIn;
@@ -4,6 +4,7 @@ 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.Math.ExtendedVectors.Vector3;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.entity.EntityRenderer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
@@ -22,8 +23,8 @@ import java.util.Map;
public class VehicleBaseRenderer<T extends VehicleBaseEntity, M extends EntityModel<VehicleBaseEntity>> extends EntityRenderer<T> {
private Vector3f LastRotations = new Vector3f(0,0,0);
private PivotOrigin OriginType = PivotOrigin.RelativeToEntityCenter;
private Vector3d OriginOffset = new Vector3d(0,0,0);
public PivotOrigin OriginType = PivotOrigin.RelativeToEntityCenter;
public Vector3d OriginOffset = new Vector3d(0,0,0);
public static float PartialTick = 0.0f;
private final Map<String, M[]> STATE_BASED_MODELS = new HashMap<>();
@@ -80,11 +81,13 @@ public class VehicleBaseRenderer<T extends VehicleBaseEntity, M extends EntityMo
PartialTick = partialTicks;
RenderState = entity.GetRenderState();
if(!STATE_BASED_MODELS.containsKey(RenderState)) RenderState = "DEFAULT";
SetPivotPoint(entity.getBuildInfo().GetOriginType(), entity.getBuildInfo().GetOriginOffset());
matrixStack.push();
EventBeforeRender(entity, entityYaw, partialTicks, matrixStack, buffer, packedLight);
Vector3d OriginPosition = new Vector3d(0,0,0).add(OriginOffset);
Vector3f RotationsToAdd = new Vector3f(entity.GetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK") * partialTicks,entity.GetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK") * partialTicks,entity.GetFloatDataValue("ADD_ORIENTATION_ROLL_NEXT_TICK") * partialTicks);
Vector3f Rotations = new Vector3f(180.0F - entity.GetVehicleYaw(),entity.GetVehiclePitch(),entity.GetVehicleRoll());
Vector3 Offsets = entity.TouchingGround() ? new Vector3(entity.GetDoubleDataValue("ANGLE_OFFSET_YAW"),entity.GetDoubleDataValue("ANGLE_OFFSET_PITCH"),entity.GetDoubleDataValue("ANGLE_OFFSET_ROLL")) : new Vector3(0,0,0);
Vector3f Rotations = new Vector3f(180.0F - entity.GetVehicleYaw() + Offsets.GetXF(),entity.GetVehiclePitch()+ Offsets.GetYF(),entity.GetVehicleRoll()+ Offsets.GetZF());
Rotations.add(RotationsToAdd);
switch(OriginType) {
case PilotSeat:
@@ -1,7 +1,10 @@
package net.halbear.hvf.Entity;
import net.halbear.hvf.Entity.Renderer.PivotOrigin;
import net.halbear.hvf.Entity.Renderer.VehicleAnimationManager;
import net.halbear.hvf.Registry.Input.InputManager;
import net.halbear.hvf.Util.Math.CommonFunctions;
import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3;
import net.halbear.hvf.Util.VehicleData.EngineCategories;
import net.halbear.hvf.Util.VehicleData.VehicleBuildInfo;
import net.halbear.hvf.Util.VehicleData.VehicleClassification;
@@ -17,12 +20,14 @@ 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.util.math.vector.*;
import net.minecraft.world.World;
import net.minecraftforge.fml.network.NetworkHooks;
import java.util.*;
import static net.halbear.hvf.Util.Math.CommonFunctions.RotateIn3dSpaceFromOrigin;
public class VehicleBaseEntity extends Entity {
public static final DataParameter<CompoundNBT> VEHICLE_SYNCHED_PARAMETERS = EntityDataManager.createKey(VehicleBaseEntity.class, DataSerializers.COMPOUND_NBT);
@@ -40,20 +45,11 @@ public class VehicleBaseEntity extends Entity {
private Vector3d LastPositionVector = new Vector3d(0,0,0);
private Vector3d CurrentPositionVector = new Vector3d(0,0,0);
private final VehicleController Controller;
public void SetPartialTick(float PartialTick){this.PartialTick = PartialTick;}
public float GetPartialTick(){return PartialTick;}
public VehicleAnimationManager GetAnimationManager(){return ANIMATION_MANAGER;}
public Vector3d GetPilotSeat(){return VehicleSeatOffsets.length > 0 ? VehicleSeatOffsets[0] : new Vector3d(0,0,0);}
public VehicleController GetVehicleController(){
return Controller;
}
public VehicleBuildInfo vehicleBuildInfo;
public VehicleBaseEntity(EntityType<?> entityTypeIn, World worldIn, VehicleBuildInfo vehicleBuildInfo) {
super(entityTypeIn, worldIn);
this.vehicleBuildInfo = vehicleBuildInfo;
Controller = new VehicleController(this);
this.setNoGravity(vehicleBuildInfo.GetAdheresToGravity());
List<Vector3d> VehicleSeats = new ArrayList<Vector3d>();
@@ -65,9 +61,20 @@ public class VehicleBaseEntity extends Entity {
float PropRotation = (float)(360 * Math.random());
BASE_DOUBLE_PARAMETERS.put("GRAVITY",!vehicleBuildInfo.GetAdheresToGravity() ? 0 : vehicleBuildInfo.GetGravityStrength()/200.0);
BASE_BOOL_PARAMETERS.put("ADHERES_TO_GRAVITY",vehicleBuildInfo.GetAdheresToGravity());
BASE_BOOL_PARAMETERS.put("ON_GROUND",true);
BASE_DOUBLE_PARAMETERS.put("CENTRE_OF_MASS_X",vehicleBuildInfo.GetCentreOfMass().x);
BASE_DOUBLE_PARAMETERS.put("CENTRE_OF_MASS_Y",vehicleBuildInfo.GetCentreOfMass().y);
BASE_DOUBLE_PARAMETERS.put("CENTRE_OF_MASS_Z",vehicleBuildInfo.GetCentreOfMass().z);
BASE_DOUBLE_PARAMETERS.put("AT_REST_ANGLE_OFFSET_YAW",vehicleBuildInfo.GetAtRestAngleOffsets().x);
BASE_DOUBLE_PARAMETERS.put("AT_REST_ANGLE_OFFSET_PITCH",vehicleBuildInfo.GetAtRestAngleOffsets().y);
BASE_DOUBLE_PARAMETERS.put("AT_REST_ANGLE_OFFSET_ROLL",vehicleBuildInfo.GetAtRestAngleOffsets().z);
BASE_DOUBLE_PARAMETERS.put("ANGLE_OFFSET_YAW",0d);
BASE_DOUBLE_PARAMETERS.put("ANGLE_OFFSET_PITCH",0d);
BASE_DOUBLE_PARAMETERS.put("ANGLE_OFFSET_ROLL",0d);
BASE_DOUBLE_PARAMETERS.put("AT_ROTATE_SPEED_ANGLE_OFFSET_YAW",vehicleBuildInfo.GetRotateAngleOffsets().x);
BASE_DOUBLE_PARAMETERS.put("AT_ROTATE_SPEED_ANGLE_OFFSET_PITCH",vehicleBuildInfo.GetRotateAngleOffsets().y);
BASE_DOUBLE_PARAMETERS.put("AT_ROTATE_SPEED_ANGLE_OFFSET_ROLL",vehicleBuildInfo.GetRotateAngleOffsets().z);
BASE_DOUBLE_PARAMETERS.put("ROTATE_VELOCITY",vehicleBuildInfo.GetRotateVelocity());
BASE_FLOAT_PARAMETERS.put("ORIENTATION_YAW",0f);
BASE_FLOAT_PARAMETERS.put("ADD_ORIENTATION_YAW_NEXT_TICK",0f);
BASE_FLOAT_PARAMETERS.put("ORIENTATION_PITCH",0f);
@@ -113,7 +120,7 @@ public class VehicleBaseEntity extends Entity {
case Ship:
break;
}
this.stepHeight = vehicleBuildInfo.GetStepHeight();
CompoundNBT SyncedData = this.dataManager.get(VEHICLE_SYNCHED_PARAMETERS).copy();
BASE_FLOAT_PARAMETERS.forEach(SyncedData::putFloat);
BASE_DOUBLE_PARAMETERS.forEach(SyncedData::putDouble);
@@ -126,6 +133,19 @@ public class VehicleBaseEntity extends Entity {
this.CurrentPositionVector = this.getPositionVec();
}
public VehicleBuildInfo getBuildInfo(){return vehicleBuildInfo;}
public void SetPartialTick(float PartialTick){this.PartialTick = PartialTick;}
public float GetPartialTick(){return PartialTick;}
public VehicleAnimationManager GetAnimationManager(){return ANIMATION_MANAGER;}
public Vector3d GetPilotSeat(){return VehicleSeatOffsets.length > 0 ? VehicleSeatOffsets[0] : new Vector3d(0,0,0);}
public VehicleController GetVehicleController(){
return Controller;
}
public Vector3d GetLastEntityPosition(){
return this.LastPositionVector;
}
@@ -194,7 +214,7 @@ public class VehicleBaseEntity extends Entity {
public void SetVehicleYaw(float value){SetFloatDataValue("ORIENTATION_YAW", value);}
public void SetVehiclePitch(float value){SetFloatDataValue("ORIENTATION_PITCH", value); }
public float GetVehicleRoll(){return GetFloatDataValue("ORIENTATION_ROLL"); }
public float GetVehicleYaw(){ return GetFloatDataValue("ORIENTATION_YAW"); }
public float GetVehicleYaw(){ return 180F - GetFloatDataValue("ORIENTATION_YAW"); }
public float GetVehiclePitch(){return GetFloatDataValue("ORIENTATION_PITCH"); }
public float[] GetVehicleRotations(){
return new float[]{GetVehicleYaw(),GetVehiclePitch(),GetVehicleRoll()};
@@ -245,6 +265,7 @@ public class VehicleBaseEntity extends Entity {
PhysicsTick();
SubClassTickUpdateEvent();
TickUpdateEvent();
SetBooleanDataValue("ON_GROUND",getMotion().y == 0);
if(this.world.isRemote()){
SubClassServerSideTickEvent();
ClientSideTickEvent();
@@ -263,7 +284,19 @@ public class VehicleBaseEntity extends Entity {
SetFloatDataValue("ADD_ORIENTATION_YAW_NEXT_TICK",0f);
}
public boolean TouchingGround(){return GetBooleanDataValue("ON_GROUND");}
public void PhysicsTick(){
Vector3d Velocity = Vector3.Positive(getMotion());
Vector3d NormalisedVelocity = Velocity.normalize();
double OverallVelocity = Velocity.x * NormalisedVelocity.x + Velocity.z * NormalisedVelocity.z;
double Scalar = Math.max(Math.min(OverallVelocity/GetDoubleDataValue("ROTATE_VELOCITY"),1),0);
Vector3d AtRest = new Vector3d(GetDoubleDataValue("AT_REST_ANGLE_OFFSET_YAW"),GetDoubleDataValue("AT_REST_ANGLE_OFFSET_PITCH"),GetDoubleDataValue("AT_REST_ANGLE_OFFSET_ROLL"));
Vector3d AtRotate = new Vector3d(GetDoubleDataValue("AT_ROTATE_SPEED_ANGLE_OFFSET_YAW"),GetDoubleDataValue("AT_ROTATE_SPEED_ANGLE_OFFSET_PITCH"),GetDoubleDataValue("AT_ROTATE_SPEED_ANGLE_OFFSET_ROLL"));
Vector3d AngleOffsets = Vector3.Lerp(AtRest,AtRotate,Scalar);
SetDoubleDataValue("ANGLE_OFFSET_YAW",AngleOffsets.x);
SetDoubleDataValue("ANGLE_OFFSET_PITCH",AngleOffsets.y);
SetDoubleDataValue("ANGLE_OFFSET_ROLL",AngleOffsets.z);
if(GetBooleanDataValue("ADHERES_TO_GRAVITY")){
if (!this.isOnGround()) {
this.setMotion(this.getMotion().add(0, -GetDoubleDataValue("GRAVITY"), 0));
@@ -276,29 +309,12 @@ public class VehicleBaseEntity extends Entity {
this.setMotion(this.getMotion().mul(0.98D, 0.98D, 0.98D));
}
RotationTick();
if(this.getMotion().z == 0 && this.getMotion().x == 0 && this.getMotion().y != 0){
if(Scalar < 1&& 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);
}
float YVelocity = (float) this.getMotion().y;
if(YVelocity < 0){
SetFloatDataValue("ADD_ORIENTATION_PITCH_NEXT_TICK", (float) (-CenterOfMassFloat * (Math.max(1-Scalar,0))));
}
}
}
@@ -348,11 +364,73 @@ public class VehicleBaseEntity extends Entity {
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));
PivotOrigin OriginType = vehicleBuildInfo.GetOriginType();
Vector3d OriginPosition = vehicleBuildInfo.GetOriginOffset();
switch(OriginType) {
case PilotSeat:
OriginPosition = OriginPosition.add(GetPilotSeat().x,GetPilotSeat().y,GetPilotSeat().z);
break;
case EntityPosition:
break;
case RelativeToEntityCenter:
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 CosYaw = (float)Math.cos(yawRad);
float SinYaw = (float)Math.sin(yawRad);
float CosPitch = (float)Math.cos(pitchRad);
float SinPitch = (float)Math.sin(pitchRad);
float CosRoll = (float)Math.cos(rollRad);
float SinRoll = (float)Math.sin(rollRad);
float m00 = CosYaw * CosRoll + SinYaw * SinPitch * SinRoll;
float m01 = -CosYaw * SinRoll + SinYaw * SinPitch * CosRoll;
float m02 = SinYaw * CosPitch;
float m10 = SinRoll * CosPitch;
float m11 = CosRoll * CosPitch;
float m12 = -SinPitch;
float m20 = -SinYaw * CosRoll + CosYaw * SinPitch * SinRoll;
float m21 = SinYaw * SinRoll + CosYaw * SinPitch * CosRoll;
float m22 = CosYaw * CosPitch;
Matrix4f TransformationMatrix = new Matrix4f(new float[]{
m00,m01,m02,0f,
m10,m11,m12,0f,
m20,m21,m22,0f,
0f,0f,0f,1f
});
Vector4f SeatPosition = new Vector4f(
(float) (localOffset.x + OriginPosition.x),
(float) (localOffset.y + OriginPosition.y),
(float) (localOffset.z + OriginPosition.z),
1.0f
);
SeatPosition.transform(TransformationMatrix);
/*Quaternion TotalRotation = new Quaternion(0.0F, 0.0F, 0.0F, 1.0F);
TotalRotation.multiply(Vector3f.YP.rotation(yawRad));
Vector3f LocalPitchAxis = new Vector3f((float)Math.cos(yawRad), 0.0F, (float)Math.sin(yawRad));
TotalRotation.multiply(LocalPitchAxis.rotation(pitchRad));
Vector3f LocalRollAxis = new Vector3f((float)-Math.sin(yawRad),0.0F,(float)Math.cos(yawRad));
LocalRollAxis.transform(Vector3f.XP.rotation(pitchRad));
TotalRotation.multiply(LocalRollAxis.rotation(rollRad));
Vector3f localOffsetFloat = new Vector3(RelativeSeatOffset).GetFloat();
localOffsetFloat.transform(TotalRotation);*/
passenger.setPosition(
this.getPosX() + rotatedOffset.x,
this.getPosY() + rotatedOffset.y + passenger.getMountedYOffset(),
this.getPosZ() + rotatedOffset.z
this.getPosX() + SeatPosition.getX() - OriginPosition.x,
this.getPosY() + SeatPosition.getY() + passenger.getMountedYOffset() - OriginPosition.y,
this.getPosZ() + SeatPosition.getZ() - OriginPosition.z
);
} else {
super.updatePassenger(passenger);
@@ -28,7 +28,6 @@ public class ModEventHandler {
for(int i = 0; i < InputManager.ActiveKeys.size(); i++){
bytesFromBytes[i] = InputManager.ActiveKeys.get(i);
}
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));
}
@@ -29,6 +29,13 @@ public class InputManager {
public static void AddBinding(KeyBinding keyBinding, String BindingName){
KEY_BINDING_MAP.put(keyBinding,BindingName);
ReCalculateByteArrays();
}
public static void AddBindings(KeyBinding[] keyBinding, String[] BindingName){
for(int i = 0; i < (Math.min(keyBinding.length, BindingName.length)); i++) {
KEY_BINDING_MAP.put(keyBinding[i], BindingName[i]);
}
ReCalculateByteArrays();
}
public static void ReCalculateByteArrays(){
@@ -41,6 +41,18 @@ public class ModKeybinds {
GLFW.GLFW_KEY_D,
"key.categories.general_vehicle_controls"
);
public static KeyBinding TURN_LEFT_KEY = new KeyBinding(
"key.hals_vehicle_framework.turn_left",
InputMappings.Type.KEYSYM,
GLFW.GLFW_KEY_A,
"key.categories.general_vehicle_controls"
);
public static KeyBinding TURN_RIGHT_KEY = new KeyBinding(
"key.hals_vehicle_framework.turn_right",
InputMappings.Type.KEYSYM,
GLFW.GLFW_KEY_D,
"key.categories.general_vehicle_controls"
);
//Wheeled Land Vehicles (Cars)
public static KeyBinding ACCELERATE_KEY = new KeyBinding(
@@ -55,18 +67,6 @@ public class ModKeybinds {
GLFW.GLFW_KEY_S,
"key.categories.land_vehicle_controls"
);
public static KeyBinding TURN_LEFT_KEY = new KeyBinding(
"key.hals_vehicle_framework.turn_left",
InputMappings.Type.KEYSYM,
GLFW.GLFW_KEY_A,
"key.categories.land_vehicle_controls"
);
public static KeyBinding TURN_RIGHT_KEY = new KeyBinding(
"key.hals_vehicle_framework.turn_right",
InputMappings.Type.KEYSYM,
GLFW.GLFW_KEY_D,
"key.categories.land_vehicle_controls"
);
public static KeyBinding CLUTCH_KEY = new KeyBinding(
"key.hals_vehicle_framework.clutch",
KeyConflictContext.IN_GAME,
@@ -1,6 +1,7 @@
package net.halbear.hvf.UsageExamples.Aeroplane;
import net.halbear.hvf.Entity.VehicleBaseEntity;
import net.halbear.hvf.Registry.Input.InputCategory;
import net.halbear.hvf.Util.Client.VehicleCameraPreset;
import net.halbear.hvf.Util.Client.VehicleCameraSettings;
import net.halbear.hvf.Util.VehicleData.EngineCategories;
@@ -13,7 +14,7 @@ import net.minecraft.world.World;
public class Aeroplane extends VehicleBaseEntity {
private static final VehicleBuildInfo buildInfo = new VehicleBuildInfo(VehicleClassification.Aeroplane)
public static final VehicleBuildInfo buildInfo = new VehicleBuildInfo(VehicleClassification.Aeroplane)
.SetEngineCount(1)
.SetEngineType(EngineCategories.Aircraft_Propeller)
.SetMaxEngineRPM(3000)
@@ -21,8 +22,12 @@ 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))
.SetGravityStrength(9.8)
.AddPassengerSeat(new Vector3d(2.0D, 0.5D, 0.25D))
.AddPassengerSeat(new Vector3d(-2.0D, 0.5D, 0.25D))
.SetGravityStrength(3.8)
.SetAtRestAngleOffsets(new Vector3d(0,20,0))
.SetRotateAngleOffsets(new Vector3d(0,0,0))
.SetRotateVelocity(0.7)
.AdhereToGravity(true);
public Aeroplane(EntityType<?> Type, World WorldIn) {
@@ -31,6 +36,15 @@ public class Aeroplane extends VehicleBaseEntity {
new VehicleCameraPreset(new Vector3f(0,0,4.5f),
new Vector3f(0,0,0),70,60));
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));
}
@Override
@@ -6,6 +6,7 @@ import net.halbear.hvf.Halsvehicleframework;
import net.halbear.hvf.UsageExamples.Aeroplane.Renderer.Models.AeroplaneModel;
import net.halbear.hvf.Entity.Renderer.VehicleBaseRenderer;
import net.halbear.hvf.UsageExamples.Aeroplane.Renderer.Models.DamagedPlane;
import net.halbear.hvf.UsageExamples.Aeroplane.Renderer.Models.Updatedbiplane;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.entity.EntityRendererManager;
import net.minecraft.client.renderer.entity.model.EntityModel;
@@ -16,18 +17,8 @@ import net.minecraftforge.api.distmarker.OnlyIn;
public class AeroplaneRenderer extends VehicleBaseRenderer {
public AeroplaneRenderer(EntityRendererManager renderManagerIn) {
super(renderManagerIn, new EntityModel<?>[]{new AeroplaneModel()},"textures/entities/biplaneupdated.png", Halsvehicleframework.MOD_ID);
super(renderManagerIn, new EntityModel<?>[]{new Updatedbiplane()},"textures/entities/biplaneupdated.png", Halsvehicleframework.MOD_ID);
AddRendererState("DAMAGED",new EntityModel<?>[]{new DamagedPlane()});
AddRendererState("SUPER_DAMAGED",new EntityModel<?>[]{new DamagedPlane()},"textures/entities/biplaneupdated_DAMAGED.png");
}
@Override
public void EventBeforeRender(VehicleBaseEntity entity, float entityYaw, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int packedLight){
}
@Override
public void EventAfterRender(VehicleBaseEntity entity, float entityYaw, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int packedLight){
}
}
@@ -21,9 +21,9 @@ public class Airboat extends VehicleBaseEntity {
.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));
.SetPilotSeat(new Vector3d(0.0D, -1D, 0.0D))
.AddPassengerSeat(new Vector3d(0.0D, -1D, 2.0D))
.AddPassengerSeat(new Vector3d(0.0D, -1D, -2.0D));
public Airboat(EntityType<?> Type, World WorldIn) {
super(Type, WorldIn, buildInfo);
@@ -19,7 +19,7 @@ public class VehicleCameraSettings {
private static EntityType<?> CurrentEntity;
private static boolean HvfVehicle = false;
public static Vector3f GetCameraOffsets(){
return CurrentPreset.GetCameraOffsets();
return CurrentPreset == null ? null : CurrentPreset.GetCameraOffsets();
}
public static Map<EntityType<?>, VehicleCameraPreset> CameraPresets = new HashMap<>();
@@ -0,0 +1,37 @@
package net.halbear.hvf.Util.Math;
import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
public class CommonFunctions {
public static Vector3d RotateIn3dSpaceFromOrigin(Vector3d Point, Vector3d Origin, double YawRad, double PitchRad, double RollRad){
Vector3d relativeOffset = Point.subtract(Origin);
double CosYaw = Math.cos(YawRad);
double SinYaw = Math.sin(YawRad);
double CosPitch = Math.cos(PitchRad);
double SinPitch = Math.sin(PitchRad);
double CosRoll = Math.cos(RollRad);
double SinRoll = Math.sin(RollRad);
Vector3d Forward = new Vector3d(SinYaw * CosPitch, -SinPitch, CosYaw * CosPitch);
Vector3d Up = new Vector3d(
-CosYaw * SinRoll + SinYaw * SinPitch * CosRoll,
CosPitch * CosRoll,
SinYaw * SinRoll + CosYaw * SinPitch * CosRoll
);
Vector3d Right = new Vector3d(Forward.x,Forward.y,Forward.z);
Right.crossProduct(Up);
Vector3d Rotated = new Vector3d(
(Right.getX() * relativeOffset.x) + (Up.getX() * relativeOffset.y) + (Forward.getX() * relativeOffset.z),
(Right.getY() * relativeOffset.x) + (Up.getY() * relativeOffset.y) + (Forward.getY() * relativeOffset.z),
(Right.getZ() * relativeOffset.x) + (Up.getZ() * relativeOffset.y) + (Forward.getZ() * relativeOffset.z));
return Rotated.add(Origin);
}
}
@@ -0,0 +1,150 @@
package net.halbear.hvf.Util.Math.ExtendedVectors;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraft.util.math.vector.Vector3i;
import org.lwjgl.system.CallbackI;
public class Vector3 {
public double x, y, z;
public Vector3(double x, double y, double z){
this.x = x;
this.y = y;
this.z = z;
}
public Vector3(Vector3d vectorIn) {
this.x = vectorIn.x;
this.y = vectorIn.y;
this.z = vectorIn.z;
}
public double GetX(){return x;}
public double GetY(){return y;}
public double GetZ(){return z;}
public float GetXF(){return (float)x;}
public float GetYF(){return (float)y;}
public float GetZF(){return (float)z;}
public static Vector3i Positive(Vector3i in){
return new Vector3i(in.getX() < 0 ? -in.getX(): in.getX(),in.getY() < 0 ? -in.getY() : in.getY(),in.getZ() < 0 ? -in.getZ() : in.getZ());
}
public static Vector3f Positive(Vector3f in){
return new Vector3f(in.getX() < 0 ? -in.getX(): in.getX(),in.getY() < 0 ? -in.getY() : in.getY(),in.getZ() < 0 ? -in.getZ() : in.getZ());
}
public static Vector3d Positive(Vector3d in){
return new Vector3d(in.x < 0 ? -in.x : in.x,in.y < 0 ? -in.y : in.y,in.z < 0 ? -in.z : in.z);
}
public static Vector3 Positive(Vector3 in){
return new Vector3(in.x < 0 ? -in.x : in.x,in.y < 0 ? -in.y : in.y,in.z < 0 ? -in.z : in.z);
}
public Vector3 Positive(){
return new Vector3(x < 0 ? -x : x,y < 0 ? -y : y,z < 0 ? -z : z);
}
public static Vector3i Lerp(Vector3i a,Vector3i b, int t){
return new Vector3i(MathHelper.lerp(t,a.getX(),b.getX()),MathHelper.lerp(t,a.getY(),b.getY()),MathHelper.lerp(t,a.getZ(),b.getZ()));
}
public static Vector3f Lerp(Vector3f a,Vector3f b, float t){
return new Vector3f(MathHelper.lerp(t,a.getX(),b.getX()),MathHelper.lerp(t,a.getY(),b.getY()),MathHelper.lerp(t,a.getZ(),b.getZ()));
}
public static Vector3d Lerp(Vector3d a,Vector3d b, double t){
return new Vector3d(MathHelper.lerp(t,a.x,b.x),MathHelper.lerp(t,a.y,b.y),MathHelper.lerp(t,a.z,b.z));
}
public static Vector3 Lerp(Vector3 a,Vector3 b, double t){
return new Vector3(MathHelper.lerp(t,a.x,b.x),MathHelper.lerp(t,a.y,b.y),MathHelper.lerp(t,a.z,b.z));
}
public Vector3 Lerp(Vector3 b, double t){
return new Vector3(MathHelper.lerp(t,x,b.x),MathHelper.lerp(t,y,b.y),MathHelper.lerp(t,z,b.z));
}
public static Vector3 Clamp(double MaxX, double MaxY, double MaxZ,double MinX, double MinY, double MinZ, Vector3 vectorIn){
return new Vector3( Math.min(Math.max(vectorIn.x, MaxX),MinX), Math.min(Math.max(vectorIn.y, MaxY),MinY), Math.min(Math.max(vectorIn.z, MaxZ),MinZ));
}
public static Vector3f Clamp(float MaxX, float MaxY, float MaxZ,float MinX, float MinY, float MinZ, Vector3f vectorIn){
return new Vector3f( Math.min(Math.max(vectorIn.getX(), MaxX),MinX), Math.min(Math.max(vectorIn.getY(), MaxY),MinY), Math.min(Math.max(vectorIn.getZ(), MaxZ),MinZ));
}
public static Vector3i Clamp(int MaxX, int MaxY, int MaxZ,int MinX, int MinY, int MinZ, Vector3i vectorIn){
return new Vector3i( Math.min(Math.max(vectorIn.getX(), MaxX),MinX), Math.min(Math.max(vectorIn.getY(), MaxY),MinY), Math.min(Math.max(vectorIn.getZ(), MaxZ),MinZ));
}
public static Vector3d Clamp(double MaxX, double MaxY, double MaxZ,double MinX, double MinY, double MinZ, Vector3d vectorIn){
return new Vector3d( Math.min(Math.max(vectorIn.x, MaxX),MinX), Math.min(Math.max(vectorIn.y, MaxY),MinY), Math.min(Math.max(vectorIn.z, MaxZ),MinZ));
}
public void Clamp(double MaxX, double MaxY, double MaxZ,double MinX, double MinY, double MinZ){
this.x = Math.min(Math.max(this.x, MaxX),MinX);
this.y = Math.min(Math.max(this.y, MaxY),MinY);
this.z = Math.min(Math.max(this.z, MaxZ),MinZ);
}
public static Vector3d Max(double MaxX, double MaxY, double MaxZ, Vector3d vectorIn){
return new Vector3d(Math.max(vectorIn.x, MaxX),Math.max(vectorIn.y, MaxY),Math.max(vectorIn.z, MaxZ));
}
public static Vector3i Max(int MaxX, int MaxY, int MaxZ, Vector3i vectorIn){
return new Vector3i(Math.max(vectorIn.getX(), MaxX),Math.max(vectorIn.getY(), MaxY),Math.max(vectorIn.getZ(), MaxZ));
}
public static Vector3f Max(float MaxX, float MaxY, float MaxZ, Vector3f vectorIn){
return new Vector3f(Math.max(vectorIn.getX(), MaxX),Math.max(vectorIn.getY(), MaxY),Math.max(vectorIn.getZ(), MaxZ));
}
public static Vector3 Max(double MaxX, double MaxY, double MaxZ, Vector3 vectorIn){
return new Vector3(Math.max(vectorIn.x, MaxX),Math.max(vectorIn.y, MaxY),Math.max(vectorIn.z, MaxZ));
}
public void Max(double MaxX, double MaxY, double MaxZ){
this.x = Math.max(this.x, MaxX);
this.y = Math.max(this.y, MaxY);
this.z = Math.max(this.z, MaxZ);
}
public static Vector3d Min(double MinX, double MinY, double MinZ, Vector3d vectorIn){
return new Vector3d(Math.min(vectorIn.x, MinX),Math.min(vectorIn.y, MinY),Math.min(vectorIn.z, MinZ));
}
public static Vector3i Min(int MinX, int MinY, int MinZ, Vector3i vectorIn){
return new Vector3i(Math.min(vectorIn.getX(), MinX),Math.min(vectorIn.getY(), MinY),Math.min(vectorIn.getZ(), MinZ));
}
public static Vector3f Min(float MinX, float MinY, float MinZ, Vector3f vectorIn){
return new Vector3f(Math.min(vectorIn.getX(), MinX),Math.min(vectorIn.getY(), MinY),Math.min(vectorIn.getZ(), MinZ));
}
public static Vector3 Min(double MinX, double MinY, double MinZ, Vector3 vectorIn){
return new Vector3(Math.min(vectorIn.x, MinX),Math.min(vectorIn.y, MinY),Math.min(vectorIn.z, MinZ));
}
public void Min(double MinX, double MinY, double MinZ){
this.x = Math.min(this.x, MinX);
this.y = Math.min(this.y, MinY);
this.z = Math.min(this.z, MinZ);
}
public Vector3 Set(Vector3 VectorIn){
this.x = VectorIn.x;
this.y = VectorIn.y;
this.z = VectorIn.z;
return this;
}
public Vector3 Set(Vector3d VectorIn){
this.x = VectorIn.x;
this.y = VectorIn.y;
this.z = VectorIn.z;
return this;
}
public Vector3 Set(Vector3f VectorIn){
this.x = VectorIn.getX();
this.y = VectorIn.getY();
this.z = VectorIn.getZ();
return this;
}
public Vector3 Set(Vector3i VectorIn){
this.x = VectorIn.getX();
this.y = VectorIn.getY();
this.z = VectorIn.getZ();
return this;
}
public Vector3f GetFloat(){
return new Vector3f((float)x,(float)y,(float)z);
}
public Vector3d GetDouble(){
return new Vector3d(x,y,z);
}
public Vector3i GetInt(){
return new Vector3i((int)x,(int)y,(int)z);
}
}
@@ -18,10 +18,6 @@ import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Arrays;
import static net.halbear.hvf.Registry.ModEntityTags.doesEntityHaveCameraPreset;
import static net.halbear.hvf.Util.Client.VehicleCameraSettings.GetCameraOffsets;
@Mixin(ActiveRenderInfo.class)
@@ -29,10 +25,9 @@ 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<EntityType<?>> myEntityTag = EntityTypeTags.getTagById(new ResourceLocation("forge", "hvf_camera_affected_vehicle").toString());
boolean entityHaveCameraPreset = entity.getRidingEntity() instanceof VehicleBaseEntity;//myEntityTag.contains(entity.getRidingEntity().getType());
boolean entityHaveCameraPreset = entity.getRidingEntity() instanceof VehicleBaseEntity;
if (entityHaveCameraPreset) {
Vector3f Position = GetCameraOffsets();
Vector3f Position = GetCameraOffsets() != null ? GetCameraOffsets() : new Vector3f(0,0,0);
this.movePosition(-this.calcCameraDistance(Position.getZ()), Position.getY(), Position.getX());
}
}
@@ -1,5 +1,7 @@
package net.halbear.hvf.Util.VehicleData;
import net.halbear.hvf.Entity.Renderer.PivotOrigin;
import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
@@ -23,19 +25,62 @@ public class VehicleBuildInfo {
private List<String> BuiltInVehicleInputActions = new ArrayList<>();
private List<Vector3d> PassengerSeats = new ArrayList<>();
private List<Float> FuelTanks = new ArrayList<>();
private Vector3d AtRestAngleOffsets;
private Vector3d AtSpeedOnGroundAngleOffsets;
private Vector3d AtRestAngleOffsets = new Vector3d(0,0,0);
private Vector3d AtSpeedOnGroundAngleOffsets = new Vector3d(0,0,0);
private double RotationVelocity = 1.2;
private float StepHeight = 1.0f;
private PivotOrigin OriginType = PivotOrigin.RelativeToEntityCenter;
private Vector3d OriginOffset = new Vector3d(0,0,0);
private PhysicsPreset physicsPreset = PhysicsPreset.AdvancedMinecraft;
public VehicleBuildInfo SetOrigin(PivotOrigin OriginType, Vector3d OriginOffset){
this.OriginType = OriginType;
this.OriginOffset = OriginOffset;
return this;
}
public VehicleBuildInfo SetOriginType(PivotOrigin OriginType){
this.OriginType = OriginType;
return this;
}
public PivotOrigin GetOriginType(){return OriginType;}
public Vector3d GetOriginOffset(){return OriginOffset;}
public VehicleBuildInfo SetOriginOffset(Vector3d OriginOffset){
this.OriginOffset = OriginOffset;
return this;
}
public VehicleBuildInfo SetPhysicsPreset(PhysicsPreset newPreset){
this.physicsPreset = newPreset;
return this;
}
public VehicleBuildInfo SetStepHeight(float StepHeight){
this.StepHeight = StepHeight;
return this;
}
public float GetStepHeight(){return StepHeight;}
public PhysicsPreset GetPhysicsPreset(){return physicsPreset;}
public VehicleBuildInfo SetRotateAngleOffsets(Vector3d AtSpeedOnGroundAngleOffsets){
this.AtSpeedOnGroundAngleOffsets = AtSpeedOnGroundAngleOffsets;
return this;
}
public Vector3d GetRotateAngleOffsets(){return AtSpeedOnGroundAngleOffsets;}
public VehicleBuildInfo SetAtRestAngleOffsets(Vector3d AtRestAngleOffsets){
this.AtRestAngleOffsets = AtRestAngleOffsets;
return this;
}
public Vector3d GetAtRestAngleOffsets(){return AtRestAngleOffsets;}
public VehicleBuildInfo SetRotateVelocity(double VelocityIn){
this.RotationVelocity = VelocityIn;
return this;
}
public double GetRotateVelocity(){return RotationVelocity;}
public VehicleBuildInfo RegisterInputAction(String ActionName){
BuiltInVehicleInputActions.add(ActionName);
@@ -1,8 +1,12 @@
package net.halbear.hvf.Util.VehicleData;
import net.halbear.hvf.Entity.Renderer.VehicleAnimationManager;
import net.halbear.hvf.Entity.Renderer.VehicleBaseRenderer;
import net.halbear.hvf.Entity.VehicleBaseEntity;
import net.halbear.hvf.Registry.Input.InputCategory;
import net.halbear.hvf.Registry.Input.InputManager;
import net.halbear.hvf.Util.Math.ExtendedVectors.Vector3;
import net.minecraft.util.math.vector.Vector3d;
import java.util.HashMap;
import java.util.Map;
@@ -12,7 +16,7 @@ import java.util.function.Supplier;
public class VehicleController<T extends VehicleBaseEntity> {
@FunctionalInterface
interface Action {
public interface Action {
void execute();
}
@@ -36,8 +40,56 @@ public class VehicleController<T extends VehicleBaseEntity> {
}
}
}
public VehicleController AddInputFunction(String Input, String VariableName, InputCategory functionType){
public VehicleController AddInputFunction(String Input, float ChangeAmount, Vector3d TerminalVelocity, InputCategory functionType){
switch(functionType){
case MoveForward:
AddInputFunction(Input,()-> Parent.setMotion(Vector3.Clamp(-TerminalVelocity.x,-TerminalVelocity.y,-TerminalVelocity.z,TerminalVelocity.x,TerminalVelocity.y,TerminalVelocity.z,Parent.getMotion().add(-ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())))));
break;
case MoveBackward:
AddInputFunction(Input,()-> Parent.setMotion(Vector3.Clamp(-TerminalVelocity.x,-TerminalVelocity.y,-TerminalVelocity.z,TerminalVelocity.x,TerminalVelocity.y,TerminalVelocity.z,Parent.getMotion().add(ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())))));
break;
case StrafeLeft:
AddInputFunction(Input,()-> Parent.setMotion(Vector3.Clamp(-TerminalVelocity.x,-TerminalVelocity.y,-TerminalVelocity.z,TerminalVelocity.x,TerminalVelocity.y,TerminalVelocity.z,Parent.getMotion().add(ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * -(float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())))));
break;
case StrafeRight:
AddInputFunction(Input,()-> Parent.setMotion(Vector3.Clamp(-TerminalVelocity.x,-TerminalVelocity.y,-TerminalVelocity.z,TerminalVelocity.x,TerminalVelocity.y,TerminalVelocity.z,Parent.getMotion().add(-ChangeAmount * (float)Math.cos(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw()),0,ChangeAmount * (float)Math.sin(VehicleAnimationManager.DegToRad * Parent.GetVehicleYaw())))));
break;
}
return this;
}
public VehicleController AddInputFunction(String Input, String VariableName, float ChangeAmount, InputCategory functionType){
switch(functionType){
case Accelerate:
break;
case Brake:
break;
case TurnLeft:
break;
case TurnRight:
break;
case PressClutch:
break;
case ShiftGearUp:
break;
case ShiftGearDown:
break;
case ThrottleUp:
break;
case ThrottleDown:
break;
case PitchUp:
break;
case PitchDown:
break;
case YawLeft:
break;
case YawRight:
break;
case RollLeft:
break;
case RollRight:
break;
}
return this;
}
}