From c393a77157b2e388e1820f9b2412b4827e3f0ddb Mon Sep 17 00:00:00 2001 From: rt Date: Tue, 13 Nov 2018 18:14:59 +0100 Subject: [PATCH] fix #6073 --- rts/Sim/MoveTypes/AAirMoveType.cpp | 2 ++ rts/Sim/MoveTypes/AAirMoveType.h | 1 + rts/Sim/MoveTypes/HoverAirMoveType.cpp | 3 --- rts/Sim/MoveTypes/HoverAirMoveType.h | 2 -- rts/Sim/MoveTypes/StrafeAirMoveType.cpp | 17 ++++++++++------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/rts/Sim/MoveTypes/AAirMoveType.cpp b/rts/Sim/MoveTypes/AAirMoveType.cpp index c1c5dc3cc4b..31b6689376c 100644 --- a/rts/Sim/MoveTypes/AAirMoveType.cpp +++ b/rts/Sim/MoveTypes/AAirMoveType.cpp @@ -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), @@ -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; diff --git a/rts/Sim/MoveTypes/AAirMoveType.h b/rts/Sim/MoveTypes/AAirMoveType.h index a3fa3364ba5..84737204d32 100644 --- a/rts/Sim/MoveTypes/AAirMoveType.h +++ b/rts/Sim/MoveTypes/AAirMoveType.h @@ -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; diff --git a/rts/Sim/MoveTypes/HoverAirMoveType.cpp b/rts/Sim/MoveTypes/HoverAirMoveType.cpp index d35827a262f..78397439305 100644 --- a/rts/Sim/MoveTypes/HoverAirMoveType.cpp +++ b/rts/Sim/MoveTypes/HoverAirMoveType.cpp @@ -42,7 +42,6 @@ CR_REG_METADATA(CHoverAirMoveType, ( CR_MEMBER(randomWind), CR_MEMBER(forceHeading), - CR_MEMBER(dontLand), CR_MEMBER(wantedHeading), CR_MEMBER(forcedHeading), @@ -101,7 +100,6 @@ CHoverAirMoveType::CHoverAirMoveType(CUnit* owner) : randomWind(ZeroVector), forceHeading(false), - dontLand(false), wantedHeading(owner != nullptr ? GetHeadingFromFacing(owner->buildFacing) : 0), forcedHeading(wantedHeading), @@ -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 diff --git a/rts/Sim/MoveTypes/HoverAirMoveType.h b/rts/Sim/MoveTypes/HoverAirMoveType.h index 697a2470832..ffe19b5b8f5 100644 --- a/rts/Sim/MoveTypes/HoverAirMoveType.h +++ b/rts/Sim/MoveTypes/HoverAirMoveType.h @@ -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; diff --git a/rts/Sim/MoveTypes/StrafeAirMoveType.cpp b/rts/Sim/MoveTypes/StrafeAirMoveType.cpp index 9e030879a6f..e9352feefce 100644 --- a/rts/Sim/MoveTypes/StrafeAirMoveType.cpp +++ b/rts/Sim/MoveTypes/StrafeAirMoveType.cpp @@ -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); } @@ -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); } @@ -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); @@ -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); }