From 01a6af7aa3d971e2a9f7934e0e2c4825d75b72ff Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Tue, 30 Jul 2024 16:44:58 +0800 Subject: [PATCH 1/5] [Movement] Improve knockback --- src/PlayerbotAI.cpp | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index fa59ff11..f3cd2996 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -834,9 +834,9 @@ void PlayerbotAI::HandleBotOutgoingPacket(WorldPacket const& packet) float vcos, vsin, horizontalSpeed, verticalSpeed = 0.f; p >> guid.ReadAsPacked() >> counter >> vcos >> vsin >> horizontalSpeed >> verticalSpeed; - if (horizontalSpeed <= 0.1f) { - horizontalSpeed = 0.11f; - } + // if (horizontalSpeed <= 0.1f) { + // horizontalSpeed = 0.11f; + // } verticalSpeed = -verticalSpeed; // stop casting @@ -846,23 +846,9 @@ void PlayerbotAI::HandleBotOutgoingPacket(WorldPacket const& packet) bot->StopMoving(); bot->GetMotionMaster()->Clear(); - - float moveTimeHalf = verticalSpeed / Movement::gravity; - float dist = 2 * moveTimeHalf * horizontalSpeed; - Position dest = bot->GetPosition(); - - bot->MovePositionToFirstCollision(dest, dist, bot->GetRelativeAngle(bot->GetPositionX() + vcos, bot->GetPositionY() + vsin)); - float x, y, z; - x = dest.GetPositionX(); - y = dest.GetPositionY(); - z = dest.GetPositionZ(); - // char speak[1024]; - // sprintf(speak, "SMSG_MOVE_KNOCK_BACK: %.2f %.2f, horizontalSpeed: %.2f, verticalSpeed: %.2f, tX: %.2f, tY: %.2f, tZ: %.2f, relativeAngle: %.2f, orientation: %.2f", - // vcos, vsin, horizontalSpeed, verticalSpeed, x, y, z, bot->GetRelativeAngle(vcos, vsin), bot->GetOrientation()); - // bot->Say(speak, LANG_UNIVERSAL); - // bot->GetClosePoint(x, y, z, bot->GetObjectSize(), dist, bot->GetAngle(vcos, vsin)); Unit* currentTarget = GetAiObjectContext()->GetValue("current target")->Get(); - bot->GetMotionMaster()->MoveJump(x, y, z, horizontalSpeed, verticalSpeed, 0, currentTarget); + bot->GetMotionMaster()->MoveKnockbackFromForPlayer(bot->GetPositionX() + vcos, bot->GetPositionY() + vsin, horizontalSpeed, verticalSpeed); + // bot->AddUnitMovementFlag(MOVEMENTFLAG_FALLING); // bot->AddUnitMovementFlag(MOVEMENTFLAG_FORWARD); // bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_PENDING_STOP); From 5f117eb9d1fe9e1191068e4b6401847ace220af7 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Wed, 31 Jul 2024 23:32:34 +0800 Subject: [PATCH 2/5] Fix knockback vertical speed --- src/PlayerbotAI.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index f3cd2996..8b5aa806 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -834,9 +834,9 @@ void PlayerbotAI::HandleBotOutgoingPacket(WorldPacket const& packet) float vcos, vsin, horizontalSpeed, verticalSpeed = 0.f; p >> guid.ReadAsPacked() >> counter >> vcos >> vsin >> horizontalSpeed >> verticalSpeed; - // if (horizontalSpeed <= 0.1f) { - // horizontalSpeed = 0.11f; - // } + if (horizontalSpeed <= 0.1f) { + horizontalSpeed = 0.11f; + } verticalSpeed = -verticalSpeed; // stop casting From 8df01e8fedd440113a1cd4a7cdcbe4113b321b24 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sat, 3 Aug 2024 00:01:40 +0800 Subject: [PATCH 3/5] Enable flight mount for bots --- src/strategy/actions/MovementActions.cpp | 33 +++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index e2288195..2ce77bf7 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -857,9 +857,16 @@ void MovementAction::UpdateMovementState() bot->SetSwim(false); } - if (bot->IsFlying()) - bot->UpdateSpeed(MOVE_FLIGHT, true); + bool onGround = bot->GetPositionZ() < bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()) + 1.0f; + if (!bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !onGround) + { + bot->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); + } + if (bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && (!bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || onGround)) + { + bot->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); + } Transport* newTransport = bot->GetMap()->GetTransportForPos(bot->GetPhaseMask(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), bot); if (newTransport != bot->GetTransport()) { @@ -874,10 +881,13 @@ void MovementAction::UpdateMovementState() bot->StopMovingOnCurrentPos(); } + bot->SendMovementFlagUpdate(); // Temporary speed increase in group - //if (botAI->HasRealPlayerMaster()) - //bot->SetSpeedRate(MOVE_RUN, 1.1f); - + // if (botAI->HasRealPlayerMaster()) { + // bot->SetSpeedRate(MOVE_RUN, 1.1f); + // } else { + // bot->SetSpeedRate(MOVE_RUN, 1.0f); + // } // check if target is not reachable (from Vmangos) // if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE && bot->CanNotReachTarget() && !bot->InBattleground()) // { @@ -1146,7 +1156,18 @@ bool MovementAction::ChaseTo(WorldObject* obj, float distance, float angle) float MovementAction::MoveDelay(float distance) { - return distance / bot->GetSpeed(MOVE_RUN); + float speed; + if (bot->isSwimming()) { + speed = bot->GetSpeed(MOVE_SWIM); + } else if (bot->IsFlying()) { + speed = bot->GetSpeed(MOVE_FLIGHT); + } else { + speed = bot->GetSpeed(MOVE_RUN); + } + float delay = distance / speed - sPlayerbotAIConfig->reactDistance; + if (delay < 0) + delay = 0; + return delay; } void MovementAction::WaitForReach(float distance) From b0ab63238c87fd78fe4a4e15ee1b562c6c748115 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sat, 3 Aug 2024 00:02:11 +0800 Subject: [PATCH 4/5] Fix mount bug after bot logout --- src/PlayerbotAI.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 8b5aa806..52dcbfbf 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -497,6 +497,7 @@ void PlayerbotAI::Reset(bool full) } currentEngine = engines[BOT_STATE_NON_COMBAT]; + currentState = BOT_STATE_NON_COMBAT; nextAICheckDelay = 0; whispers.clear(); @@ -1165,19 +1166,26 @@ void PlayerbotAI::DoNextAction(bool min) bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING); else if ((nextAICheckDelay < 1000) && bot->IsSitState()) bot->SetStandState(UNIT_STAND_STATE_STAND); - - if (bot->IsFlying() && !!bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !bot->HasAuraType(SPELL_AURA_FLY)) + + bool hasMountAura = bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED) || bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); + if (hasMountAura && !bot->IsMounted()) { - if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING)) - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING); - - if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)) - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_CAN_FLY); - - if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) - bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + bot->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED); + bot->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); } + // if (bot->IsFlying() && !bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !bot->HasAuraType(SPELL_AURA_FLY)) + // { + // if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING)) + // bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING); + + // if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY)) + // bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_CAN_FLY); + + // if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) + // bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + // } + /* // land after kncokback/jump if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING)) From 54c06887d5003c7f56f0831d8564f50a3f033bfc Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sat, 3 Aug 2024 00:02:34 +0800 Subject: [PATCH 5/5] Enable mount for random bots --- src/strategy/actions/AttackAction.cpp | 10 +++--- .../actions/CheckMountStateAction.cpp | 35 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index 1ba9f4b5..344138d6 100644 --- a/src/strategy/actions/AttackAction.cpp +++ b/src/strategy/actions/AttackAction.cpp @@ -95,11 +95,11 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/) return false; } - if (bot->IsMounted() && bot->IsWithinLOSInMap(target)) - { - WorldPacket emptyPacket; - bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); - } + // if (bot->IsMounted() && bot->IsWithinLOSInMap(target)) + // { + // WorldPacket emptyPacket; + // bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); + // } ObjectGuid guid = target->GetGUID(); bot->SetSelection(target->GetGUID()); diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 6e4e84d1..09a4e208 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -5,6 +5,7 @@ #include "CheckMountStateAction.h" #include "BattlegroundWS.h" #include "Event.h" +#include "PlayerbotAI.h" #include "Playerbots.h" #include "ServerFacade.h" #include "SpellAuraEffects.h" @@ -20,18 +21,11 @@ bool CheckMountStateAction::Execute(Event event) bool attackdistance = false; bool chasedistance = false; float attack_distance = 35.0f; - - switch (bot->getClass()) - { - case CLASS_WARRIOR: - case CLASS_PALADIN: - attack_distance = 10.0f; - break; - case CLASS_ROGUE: - attack_distance = 40.0f; - break; + if (PlayerbotAI::IsMelee(bot)) { + attack_distance = 10.0f; + } else { + attack_distance = 40.0f; } - if (enemy) attack_distance /= 2; @@ -41,6 +35,12 @@ bool CheckMountStateAction::Execute(Event event) chasedistance = enemy && sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "enemy player target"), 45.0f) && AI_VALUE2(bool, "moving", "enemy player target"); } + if (bot->IsMounted() && attackdistance) { + WorldPacket emptyPacket; + bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket); + return true; + } + Player* master = GetMaster(); if (master != nullptr && !bot->InBattleground()) { @@ -48,7 +48,7 @@ bool CheckMountStateAction::Execute(Event event) return false; // bool farFromMaster = sServerFacade->GetDistance2d(bot, master) > sPlayerbotAIConfig->sightDistance; - if (master->IsMounted() && !bot->IsMounted() && noattackers) + if (master->IsMounted() && !bot->IsMounted() && noattackers && !attackdistance && !bot->IsInCombat() && botAI->GetState() != BOT_STATE_COMBAT) { return Mount(); } @@ -72,6 +72,13 @@ bool CheckMountStateAction::Execute(Event event) return false; } + // For random bots + if (!bot->InBattleground() && !master) { + if (!bot->IsMounted() && noattackers && !attackdistance && !bot->IsInCombat()) { + return Mount(); + } + } + if (bot->InBattleground() && !attackdistance && (noattackers || fartarget) && !bot->IsInCombat() && !bot->IsMounted()) { if (bot->GetBattlegroundTypeId() == BATTLEGROUND_WS) @@ -269,8 +276,8 @@ bool CheckMountStateAction::Mount() if (index >= ids.size()) continue; - botAI->CastSpell(ids[index], bot); - return true; + + return botAI->CastSpell(ids[index], bot);; } std::vector items = AI_VALUE2(std::vector, "inventory items", "mount");