diff --git a/rts/Lua/LuaSyncedCtrl.cpp b/rts/Lua/LuaSyncedCtrl.cpp index 6e2a2f716f8..35b6b4e2b2d 100644 --- a/rts/Lua/LuaSyncedCtrl.cpp +++ b/rts/Lua/LuaSyncedCtrl.cpp @@ -2371,20 +2371,18 @@ int LuaSyncedCtrl::SetUnitLandGoal(lua_State* L) { CUnit* unit = ParseUnit(L, __FUNCTION__, 1); - if (unit == NULL) { + if (unit == nullptr) return 0; - } AAirMoveType* amt = dynamic_cast(unit->moveType); - if (!amt) { + + if (amt == nullptr) luaL_error(L, "Not a flying unit"); - } const float3 landPos(luaL_checkfloat(L, 2), luaL_checkfloat(L, 3), luaL_checkfloat(L, 4)); - const float radius = luaL_optfloat(L, 5, 0.0f); - - amt->LandAt(landPos, radius); + const float radiusSq = lua_isnumber(L, 5)? Square(lua_tonumber(L, 5)): amt->landRadiusSq; + amt->LandAt(landPos, radiusSq); return 0; } diff --git a/rts/Sim/MoveTypes/AAirMoveType.cpp b/rts/Sim/MoveTypes/AAirMoveType.cpp index 647e8a1cc59..d66f5c99fcd 100644 --- a/rts/Sim/MoveTypes/AAirMoveType.cpp +++ b/rts/Sim/MoveTypes/AAirMoveType.cpp @@ -66,6 +66,7 @@ AAirMoveType::AAirMoveType(CUnit* unit): accRate = std::max(0.01f, unit->unitDef->maxAcc); decRate = std::max(0.01f, unit->unitDef->maxDec); altitudeRate = std::max(0.01f, unit->unitDef->verticalSpeed); + landRadiusSq = Square(BrakingDistance(maxSpeed, decRate)); useHeading = false; } @@ -138,13 +139,12 @@ void AAirMoveType::UpdateLanded() owner->UpdateMidAndAimPos(); } -void AAirMoveType::LandAt(float3 pos, float distance) +void AAirMoveType::LandAt(float3 pos, float distanceSq) { - if (aircraftState != AIRCRAFT_LANDING) { + if (aircraftState != AIRCRAFT_LANDING) SetState(AIRCRAFT_LANDING); - } - const float landRadius = std::max(distance, std::max(owner->radius, 10.0f)); - landRadiusSq = landRadius * landRadius; + + landRadiusSq = std::max(distanceSq, Square(std::max(owner->radius, 10.0f))); reservedLandingPos = pos; const float3 originalPos = owner->pos; owner->Move(reservedLandingPos, false); diff --git a/rts/Sim/MoveTypes/AAirMoveType.h b/rts/Sim/MoveTypes/AAirMoveType.h index 89b5f6ea513..b982bd72519 100644 --- a/rts/Sim/MoveTypes/AAirMoveType.h +++ b/rts/Sim/MoveTypes/AAirMoveType.h @@ -38,7 +38,7 @@ class AAirMoveType : public AMoveType void SetWantedAltitude(float altitude); void SetDefaultAltitude(float altitude); - void LandAt(float3 pos, float distance); + void LandAt(float3 pos, float distanceSq); void UpdateLandingHeight(); void UpdateLanding(); diff --git a/rts/Sim/MoveTypes/GroundMoveType.cpp b/rts/Sim/MoveTypes/GroundMoveType.cpp index cb48ff4c89d..aab85a1139e 100644 --- a/rts/Sim/MoveTypes/GroundMoveType.cpp +++ b/rts/Sim/MoveTypes/GroundMoveType.cpp @@ -1415,18 +1415,6 @@ void CGroundMoveType::GetNextWayPoint() -/* -The distance the unit will move before stopping, -starting from given speed and applying maximum -brake rate. -*/ -float CGroundMoveType::BrakingDistance(float speed, float rate) const -{ - const float time = speed / std::max(rate, 0.001f); - const float dist = 0.5f * rate * time * time; - return dist; -} - /* Gives the position this unit will end up at with full braking from current velocity. diff --git a/rts/Sim/MoveTypes/GroundMoveType.h b/rts/Sim/MoveTypes/GroundMoveType.h index 9cefdb724f6..8945ffab075 100644 --- a/rts/Sim/MoveTypes/GroundMoveType.h +++ b/rts/Sim/MoveTypes/GroundMoveType.h @@ -83,7 +83,6 @@ class CGroundMoveType : public AMoveType bool CanGetNextWayPoint(); void ReRequestPath(bool forceRequest); - float BrakingDistance(float speed, float rate) const; float3 Here(); void StartEngine(bool callScript); diff --git a/rts/Sim/MoveTypes/HoverAirMoveType.cpp b/rts/Sim/MoveTypes/HoverAirMoveType.cpp index fd74e3b178d..d78766967a2 100644 --- a/rts/Sim/MoveTypes/HoverAirMoveType.cpp +++ b/rts/Sim/MoveTypes/HoverAirMoveType.cpp @@ -612,7 +612,7 @@ void CHoverAirMoveType::UpdateLanding() const float distSq2D = reservedLandingPos.SqDistance2D(pos); if (distSq2D > landRadiusSq) { - float tmpWantedHeight = wantedHeight; + const float tmpWantedHeight = wantedHeight; SetGoal(reservedLandingPos); wantedHeight = std::min((orgWantedHeight - wantedHeight) * distSq2D / altitude + wantedHeight, orgWantedHeight); flyState = FLY_LANDING; diff --git a/rts/Sim/MoveTypes/MoveType.h b/rts/Sim/MoveTypes/MoveType.h index 5465c8bd384..350eda3ad58 100644 --- a/rts/Sim/MoveTypes/MoveType.h +++ b/rts/Sim/MoveTypes/MoveType.h @@ -55,6 +55,14 @@ class AMoveType : public CObject float GetMaxWantedSpeed() const { return maxWantedSpeed; } float GetManeuverLeash() const { return maneuverLeash; } + // The distance the unit will move before stopping, + // starting from given speed and applying maximum + // brake rate. + float BrakingDistance(float speed, float rate) const { + const float time = speed / std::max(rate, 0.001f); + const float dist = 0.5f * rate * time * time; + return dist; + } float CalcStaticTurnRadius() const; public: