Skip to content

Commit

Permalink
fix #6073
Browse files Browse the repository at this point in the history
  • Loading branch information
rt committed Nov 13, 2018
1 parent 0871f35 commit c393a77
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 12 deletions.
2 changes: 2 additions & 0 deletions rts/Sim/MoveTypes/AAirMoveType.cpp
Expand Up @@ -34,6 +34,7 @@ CR_REG_METADATA(AAirMoveType, (

CR_MEMBER(collide),
CR_MEMBER(autoLand),
CR_MEMBER(dontLand),
CR_MEMBER(useSmoothMesh),
CR_MEMBER(canSubmerge),
CR_MEMBER(floatOnWater),
Expand Down Expand Up @@ -93,6 +94,7 @@ AAirMoveType::AAirMoveType(CUnit* unit): AMoveType(unit)
landRadiusSq = Square(BrakingDistance(maxSpeed, decRate));

collide = ud->collide;
dontLand = ud->DontLand();
useSmoothMesh = ud->useSmoothMesh;
canSubmerge = ud->canSubmerge;
floatOnWater = ud->floatOnWater;
Expand Down
1 change: 1 addition & 0 deletions rts/Sim/MoveTypes/AAirMoveType.h
Expand Up @@ -83,6 +83,7 @@ class AAirMoveType : public AMoveType
/// mods can use this to disable plane collisions
bool collide = true;
bool autoLand = true;
bool dontLand = false;
/// controls use of smoothGround for determining altitude
bool useSmoothMesh = false;
bool canSubmerge = false;
Expand Down
3 changes: 0 additions & 3 deletions rts/Sim/MoveTypes/HoverAirMoveType.cpp
Expand Up @@ -42,7 +42,6 @@ CR_REG_METADATA(CHoverAirMoveType, (
CR_MEMBER(randomWind),

CR_MEMBER(forceHeading),
CR_MEMBER(dontLand),

CR_MEMBER(wantedHeading),
CR_MEMBER(forcedHeading),
Expand Down Expand Up @@ -101,7 +100,6 @@ CHoverAirMoveType::CHoverAirMoveType(CUnit* owner) :
randomWind(ZeroVector),

forceHeading(false),
dontLand(false),

wantedHeading(owner != nullptr ? GetHeadingFromFacing(owner->buildFacing) : 0),
forcedHeading(wantedHeading),
Expand All @@ -120,7 +118,6 @@ CHoverAirMoveType::CHoverAirMoveType(CUnit* owner) :
wantedHeight = owner->unitDef->wantedHeight + gsRNG.NextFloat() * 5.0f;
orgWantedHeight = wantedHeight;

dontLand = owner->unitDef->DontLand();
bankingAllowed = owner->unitDef->bankingAllowed;

// prevent weapons from being updated and firing while on the ground
Expand Down
2 changes: 0 additions & 2 deletions rts/Sim/MoveTypes/HoverAirMoveType.h
Expand Up @@ -97,8 +97,6 @@ class CHoverAirMoveType: public AAirMoveType

/// force the aircraft to turn toward specific heading (for transports)
bool forceHeading;
/// Set to true when transporting stuff
bool dontLand;

/// TODO: Seems odd to use heading in unit, since we have toggled useHeading to false..
short wantedHeading;
Expand Down
17 changes: 10 additions & 7 deletions rts/Sim/MoveTypes/StrafeAirMoveType.cpp
Expand Up @@ -331,7 +331,7 @@ static float3 GetControlSurfaceAngles(
ctrlAngles.z = (yprInputLocks.z != 0.0f)? GetAileronDeflection (owner, collidee, pos, spd, rightdir, updir, frontdir, goalDir, groundHeight, wantedHeight, maxCtrlAngles.z, maxBodyAngles.z, goalDotRight, goalDotFront, avoidCollision, isAttacking): 0.0f;

// let the previous control angles have some authority
return (ctrlAngles * 0.7f + prvCtrlAngles[0] * 0.2f + prvCtrlAngles[1] * 0.1f);
return (ctrlAngles * 0.6f + prvCtrlAngles[0] * 0.3f + prvCtrlAngles[1] * 0.1f);
}


Expand Down Expand Up @@ -867,7 +867,7 @@ bool CStrafeAirMoveType::UpdateFlying(float wantedHeight, float wantedThrottle)
const float3 prvCtrlAngles[2] = {{lastRudderPos[0], lastElevatorPos[0], lastAileronPos[0]}, {lastRudderPos[1], lastElevatorPos[1], lastAileronPos[1]}};
const float3& curCtrlAngles = GetControlSurfaceAngles(owner, lastCollidee, pos, spd, rightdir, updir, frontdir, goalDir2D, yprInputLocks, maxBodyAngles, maxCtrlAngles, prvCtrlAngles, groundHeight, wantedHeight, goalDotRight, goalDotFront, false && collisionState == COLLISION_DIRECT, false);

UpdateAirPhysics({curCtrlAngles * yprInputLocks, wantedThrottle}, owner->frontdir);
UpdateAirPhysics({curCtrlAngles, wantedThrottle}, owner->frontdir);

return (allowUnlockYawRoll || forceUnlockYawRoll);
}
Expand Down Expand Up @@ -898,18 +898,20 @@ void CStrafeAirMoveType::UpdateTakeOff()
// this tends to alternate between -1 and +1 when goalDir and rightdir are ~orthogonal
// const float yawSign = Sign(goalDir.dot(rightdir));
const float currentHeight = pos.y - amtGetGroundHeightFuncs[canSubmerge](pos.x, pos.z);
const float minAccHeight = wantedHeight * 0.4f;

frontdir += (rightdir * dirWeight * yawWeight);
frontdir.Normalize();
rightdir = frontdir.cross(updir);

owner->SetVelocity(spd + (UpVector * accRate * GetVTOLAccelerationSign(currentHeight, wantedHeight, spd.y)));
owner->SetVelocity(spd + (owner->frontdir * accRate * (currentHeight > minAccHeight)));

// initiate forward motion before reaching wantedHeight
if (currentHeight > wantedHeight * 0.4f)
owner->SetVelocity(spd + (owner->frontdir * accRate));

if (currentHeight > wantedHeight)
// normally aircraft start taking off from the ground below wantedHeight,
// but state can also change to LANDING via StopMoving and then again to
// TAKEOFF (via StartMoving) while still in mid-air
if (currentHeight > wantedHeight || spd.SqLength2D() >= Square(maxWantedSpeed * 0.8f))
SetState(AIRCRAFT_FLYING);

owner->SetVelocityAndSpeed(spd * invDrag);
Expand Down Expand Up @@ -1319,10 +1321,11 @@ void CStrafeAirMoveType::StopMoving(bool callScript, bool hardStop, bool)
if (aircraftState != AAirMoveType::AIRCRAFT_FLYING && aircraftState != AAirMoveType::AIRCRAFT_LANDING)
return;

if (owner->unitDef->DontLand() || !autoLand) {
if (dontLand || !autoLand) {
SetState(AIRCRAFT_FLYING);
return;
}

SetState(AIRCRAFT_LANDING);
}

Expand Down

0 comments on commit c393a77

Please sign in to comment.