From 1aaa1f8507a1139383bc830b1d5b2900c058749b Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Tue, 5 Sep 2023 00:12:48 +0800 Subject: [PATCH] better movement --- src/strategy/actions/FollowActions.cpp | 1 + src/strategy/actions/MovementActions.cpp | 12 ++++--- src/strategy/values/Arrow.cpp | 4 +-- src/strategy/values/Formations.cpp | 42 ++++++++++++------------ 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/strategy/actions/FollowActions.cpp b/src/strategy/actions/FollowActions.cpp index fa2f5541..ee4dc11c 100644 --- a/src/strategy/actions/FollowActions.cpp +++ b/src/strategy/actions/FollowActions.cpp @@ -7,6 +7,7 @@ #include "Formations.h" #include "Playerbots.h" #include "ServerFacade.h" +#include "SharedDefines.h" #include bool FollowAction::Execute(Event event) diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index b258f67d..5216a2f0 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -149,7 +149,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // bot->Say("I'm falling", LANG_UNIVERSAL); // } float modified_z; - for (float delta = 2.0f; delta <= 15.0f; delta++) { + float delta; + for (delta = -5.0f; delta <= 10.0f; delta++) { modified_z = bot->GetMapWaterOrGroundLevel(x, y, z + delta); PathGenerator gen(bot); gen.CalculatePath(x, y, modified_z); @@ -157,6 +158,9 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, break; } } + if (delta > 10.0f) { + return false; + } // z += 0.5f; float distance = bot->GetDistance2d(x, y); if (distance > sPlayerbotAIConfig->contactDistance) @@ -173,12 +177,10 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, } bool generatePath = !bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !bot->IsFlying() && !bot->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !bot->IsInWater(); - // char speak[100]; - // sprintf(speak, "Move to : (%.2f, %.2f, %.2f), generatePath: %d", x, y, z, generatePath); - // bot->Say(speak, LANG_UNIVERSAL); MotionMaster &mm = *bot->GetMotionMaster(); + mm.Clear(); - mm.MovePoint(mapId, x, y, z, generatePath); + mm.MovePoint(mapId, x, y, modified_z, generatePath); AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation()); return true; } diff --git a/src/strategy/values/Arrow.cpp b/src/strategy/values/Arrow.cpp index e51752f9..ac65b7ff 100644 --- a/src/strategy/values/Arrow.cpp +++ b/src/strategy/values/Arrow.cpp @@ -44,8 +44,8 @@ WorldLocation ArrowFormation::GetLocationInternal() float x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); float y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); float z = master->GetPositionZ(); - - float ground = master->GetMap()->GetHeight(x, y, z + 0.5f); + + float ground = master->GetMap()->GetHeight(x, y, z + 30.0f); if (ground <= INVALID_HEIGHT) return Formation::NullLocation; // master->UpdateGroundPositionZ(x, y, z); diff --git a/src/strategy/values/Formations.cpp b/src/strategy/values/Formations.cpp index 829d2a31..ba320917 100644 --- a/src/strategy/values/Formations.cpp +++ b/src/strategy/values/Formations.cpp @@ -34,22 +34,22 @@ WorldLocation MoveAheadFormation::GetLocation() float y = loc.GetPositionY(); float z = loc.GetPositionZ(); - if (master->isMoving()) - { - float ori = master->GetOrientation(); - float x1 = x + sPlayerbotAIConfig->tooCloseDistance * cos(ori); - float y1 = y + sPlayerbotAIConfig->tooCloseDistance * sin(ori); - float ground = master->GetMap()->GetHeight(x1, y1, z); - if (ground > INVALID_HEIGHT) - { - x = x1; - y = y1; - } - } + // if (master->isMoving()) + // { + // float ori = master->GetOrientation(); + // float x1 = x + sPlayerbotAIConfig->tooCloseDistance * cos(ori); + // float y1 = y + sPlayerbotAIConfig->tooCloseDistance * sin(ori); + // float ground = master->GetMap()->GetHeight(x1, y1, z); + // if (ground > INVALID_HEIGHT) + // { + // x = x1; + // y = y1; + // } + // } - float ground = master->GetMap()->GetHeight(x, y, z); - if (ground <= INVALID_HEIGHT) - return Formation::NullLocation; + // float ground = master->GetMap()->GetHeight(x, y, z); + // if (ground <= INVALID_HEIGHT) + // return Formation::NullLocation; //z += CONTACT_DISTANCE; //bot->UpdateAllowedPositionZ(x, y, z); @@ -88,7 +88,7 @@ class NearFormation : public MoveAheadFormation float x = master->GetPositionX() + cos(angle) * range; float y = master->GetPositionY() + sin(angle) * range; float z = master->GetPositionZ(); - float ground = master->GetMap()->GetHeight(x, y, z); + float ground = master->GetMap()->GetHeight(x, y, z + 30.0f); if (ground <= INVALID_HEIGHT) return Formation::NullLocation; @@ -126,7 +126,7 @@ class ChaosFormation : public MoveAheadFormation float x = master->GetPositionX() + cos(angle) * range + dx; float y = master->GetPositionY() + sin(angle) * range + dy; float z = master->GetPositionZ(); - float ground = master->GetMap()->GetHeight(x, y, z); + float ground = master->GetMap()->GetHeight(x, y, z + 30.0f); if (ground <= INVALID_HEIGHT) return Formation::NullLocation; @@ -183,7 +183,7 @@ class CircleFormation : public MoveFormation float x = target->GetPositionX() + cos(angle) * range; float y = target->GetPositionY() + sin(angle) * range; float z = target->GetPositionZ(); - float ground = target->GetMap()->GetHeight(x, y, z); + float ground = target->GetMap()->GetHeight(x, y, z + 30.0f); if (ground <= INVALID_HEIGHT) return Formation::NullLocation; @@ -327,7 +327,7 @@ class FarFormation : public FollowFormation float y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; float z = master->GetPositionZ(); - float ground = master->GetMap()->GetHeight(x, y, z); + float ground = master->GetMap()->GetHeight(x, y, z + 30.0f); if (ground <= INVALID_HEIGHT) { float minDist = 0, minX = 0, minY = 0; @@ -336,7 +336,7 @@ class FarFormation : public FollowFormation x = master->GetPositionX() + cos(angle) * range + cos(followAngle) * followRange; y = master->GetPositionY() + sin(angle) * range + sin(followAngle) * followRange; float dist = sServerFacade->GetDistance2d(bot, x, y); - float ground = master->GetMap()->GetHeight(x, y, z); + float ground = master->GetMap()->GetHeight(x, y, z + 30.0f); if (ground > INVALID_HEIGHT && (!minDist || minDist > dist)) { minDist = dist; @@ -613,7 +613,7 @@ WorldLocation MoveFormation::MoveSingleLine(std::vector line, float dif float lx = x + cos(angle) * radius; float ly = y + sin(angle) * radius; float lz = cz; - float ground = bot->GetMap()->GetHeight(lx, ly, lz); + float ground = bot->GetMap()->GetHeight(lx, ly, lz + 30.0f); if (ground <= INVALID_HEIGHT) return Formation::NullLocation;