From d3b10417199c7d05cbf5255c1fa26c1fd029a52d Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 12 Aug 2024 11:07:14 +0800 Subject: [PATCH] Fix movement on transport --- src/strategy/values/Arrow.cpp | 11 +++-- src/strategy/values/Formations.cpp | 71 ++++++++++++++++++++++-------- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/strategy/values/Arrow.cpp b/src/strategy/values/Arrow.cpp index 12926225..f52dc670 100644 --- a/src/strategy/values/Arrow.cpp +++ b/src/strategy/values/Arrow.cpp @@ -47,11 +47,14 @@ WorldLocation ArrowFormation::GetLocationInternal() float x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); float y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; - // master->UpdateGroundPositionZ(x, y, z); + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); + y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } diff --git a/src/strategy/values/Formations.cpp b/src/strategy/values/Formations.cpp index 8464141a..61ec1b3d 100644 --- a/src/strategy/values/Formations.cpp +++ b/src/strategy/values/Formations.cpp @@ -7,6 +7,7 @@ #include "Arrow.h" #include "Event.h" +#include "Map.h" #include "Playerbots.h" #include "ServerFacade.h" @@ -88,10 +89,14 @@ public: float x = master->GetPositionX() + cos(angle) * range; float y = master->GetPositionY() + sin(angle) * range; float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range; + y = master->GetPositionY() + sin(angle) * range; + z = master->GetPositionZ() + master->GetHoverHeight(); + master->UpdateAllowedPositionZ(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } @@ -134,9 +139,15 @@ public: float x = master->GetPositionX() + cos(angle) * range + dx; float y = master->GetPositionY() + sin(angle) * range + dy; float z = master->GetPositionZ(); - if (!master->GetMap()->CheckCollisionAndGetValidCoords( - master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; + z = bot->GetMapHeight(x, y, z + 5.0f); + if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + dx; + y = master->GetPositionY() + sin(angle) * range + dy; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } // bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), // bot->GetPositionZ(), x, y, z); return WorldLocation(master->GetMapId(), x, y, z); @@ -145,9 +156,15 @@ public: float x = master->GetPositionX() + cos(angle) * range + dx; float y = master->GetPositionY() + sin(angle) * range + dy; float z = master->GetPositionZ(); + z = bot->GetMapHeight(x, y, z + 5.0f); if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + dx; + y = master->GetPositionY() + sin(angle) * range + dy; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(master->GetMapId(), x, y, z); } @@ -200,9 +217,13 @@ public: float y = target->GetPositionY() + sin(angle) * range; float z = target->GetPositionZ(); if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; - + master->GetPositionZ(), x, y, z)) + { + x = target->GetPositionX() + cos(angle) * range; + y = target->GetPositionY() + sin(angle) * range; + z = target->GetPositionZ() + target->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), x, y, z); } }; @@ -362,9 +383,14 @@ public: if (minDist) { - if (!master->GetMap()->CheckCollisionAndGetValidCoords( - master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; + if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + cos(followAngle) * followRange; + y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), minX, minY, z); } @@ -372,8 +398,13 @@ public: } if (!master->GetMap()->CheckCollisionAndGetValidCoords(master, master->GetPositionX(), master->GetPositionY(), - master->GetPositionZ(), x, y, z, false)) - return Formation::NullLocation; + master->GetPositionZ(), x, y, z)) + { + x = master->GetPositionX() + cos(angle) * range + cos(followAngle) * followRange; + y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; + z = master->GetPositionZ() + master->GetHoverHeight(); + z = master->GetMapHeight(x, y, z); + } return WorldLocation(bot->GetMapId(), x, y, z); } }; @@ -635,8 +666,12 @@ WorldLocation MoveFormation::MoveSingleLine(std::vector line, float dif Player* master = botAI->GetMaster(); if (!master->GetMap()->CheckCollisionAndGetValidCoords( - master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), lx, ly, lz, false)) - return Formation::NullLocation; + master, master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), lx, ly, lz)) + { + lx = x + cos(angle) * radius; + ly = y + sin(angle) * radius; + lz = cz; + } return WorldLocation(bot->GetMapId(), lx, ly, lz); }