pet attack and bot target selection

This commit is contained in:
Yunfan Li
2023-05-28 10:55:56 +08:00
parent 1d276732e2
commit dc21fa9d41
8 changed files with 33 additions and 31 deletions

View File

@@ -1718,7 +1718,6 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell,
} }
ObjectGuid oldSel = bot->GetTarget(); ObjectGuid oldSel = bot->GetTarget();
bot->SetTarget(target->GetGUID());
Spell* spell = new Spell(bot, spellInfo, TRIGGERED_NONE); Spell* spell = new Spell(bot, spellInfo, TRIGGERED_NONE);
spell->m_targets.SetUnitTarget(target); spell->m_targets.SetUnitTarget(target);
@@ -1933,7 +1932,7 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget)
} }
ObjectGuid oldSel = bot->GetTarget(); ObjectGuid oldSel = bot->GetTarget();
bot->SetTarget(target->GetGUID()); bot->SetSelection(target->GetGUID());
WorldObject* faceTo = target; WorldObject* faceTo = target;
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, faceTo)) if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, faceTo))

View File

@@ -8,6 +8,7 @@
#include "Playerbots.h" #include "Playerbots.h"
#include "ServerFacade.h" #include "ServerFacade.h"
#include "CreatureAI.h" #include "CreatureAI.h"
#include "Unit.h"
bool AttackAction::Execute(Event event) bool AttackAction::Execute(Event event)
{ {
@@ -40,7 +41,7 @@ bool AttackMyTargetAction::Execute(Event event)
return result; return result;
} }
bool AttackAction::Attack(Unit* target) bool AttackAction::Attack(Unit* target, bool with_pet /*true*/)
{ {
if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE || bot->HasUnitState(UNIT_STATE_IN_FLIGHT)) if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE || bot->HasUnitState(UNIT_STATE_IN_FLIGHT))
{ {
@@ -93,7 +94,7 @@ bool AttackAction::Attack(Unit* target)
} }
ObjectGuid guid = target->GetGUID(); ObjectGuid guid = target->GetGUID();
bot->SetTarget(target->GetGUID()); bot->SetSelection(target->GetGUID());
Unit* oldTarget = context->GetValue<Unit*>("current target")->Get(); Unit* oldTarget = context->GetValue<Unit*>("current target")->Get();
context->GetValue<Unit*>("old target")->Set(oldTarget); context->GetValue<Unit*>("old target")->Set(oldTarget);
@@ -103,11 +104,15 @@ bool AttackAction::Attack(Unit* target)
if (Pet* pet = bot->GetPet()) if (Pet* pet = bot->GetPet())
{ {
if (CreatureAI* creatureAI = ((Creature*)pet)->AI()) pet->SetReactState(REACT_PASSIVE);
{ if (with_pet) {
pet->SetReactState(REACT_PASSIVE); pet->SetTarget(target->GetGUID());
pet->GetCharmInfo()->SetCommandState(COMMAND_ATTACK); pet->GetCharmInfo()->SetCommandState(COMMAND_ATTACK);
creatureAI->AttackStart(target); pet->GetCharmInfo()->SetIsCommandAttack(true);
pet->AI()->AttackStart(target);
} else {
pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
pet->GetCharmInfo()->SetIsCommandFollow(true);
} }
} }

View File

@@ -17,7 +17,7 @@ class AttackAction : public MovementAction
bool Execute(Event event) override; bool Execute(Event event) override;
protected: protected:
bool Attack(Unit* target); bool Attack(Unit* target, bool with_pet = true);
}; };
class AttackMyTargetAction : public AttackAction class AttackMyTargetAction : public AttackAction

View File

@@ -82,6 +82,7 @@ bool DropTargetAction::Execute(Event event)
{ {
pet->SetReactState(REACT_PASSIVE); pet->SetReactState(REACT_PASSIVE);
pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW); pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
pet->GetCharmInfo()->SetIsCommandFollow(true);
pet->AttackStop(); pet->AttackStop();
} }
} }

View File

@@ -94,7 +94,7 @@ bool EmoteActionBase::Emote(Unit* target, uint32 type, bool textEmote)
ObjectGuid oldSelection = bot->GetTarget(); ObjectGuid oldSelection = bot->GetTarget();
if (target) if (target)
{ {
bot->SetTarget(target->GetGUID()); bot->SetSelection(target->GetGUID());
Player* player = dynamic_cast<Player*>(target); Player* player = dynamic_cast<Player*>(target);
if (player) if (player)

View File

@@ -636,7 +636,6 @@ bool MovementAction::MoveTo(Unit* target, float distance)
float distanceToTarget = sServerFacade->GetDistance2d(bot, tx, ty); float distanceToTarget = sServerFacade->GetDistance2d(bot, tx, ty);
if (sServerFacade->IsDistanceGreaterThan(distanceToTarget, sPlayerbotAIConfig->targetPosRecalcDistance)) if (sServerFacade->IsDistanceGreaterThan(distanceToTarget, sPlayerbotAIConfig->targetPosRecalcDistance))
{ {
/*
float angle = bot->GetAngle(tx, ty); float angle = bot->GetAngle(tx, ty);
float needToGo = distanceToTarget - distance; float needToGo = distanceToTarget - distance;
@@ -649,15 +648,10 @@ bool MovementAction::MoveTo(Unit* target, float distance)
float dx = cos(angle) * needToGo + bx; float dx = cos(angle) * needToGo + bx;
float dy = sin(angle) * needToGo + by; float dy = sin(angle) * needToGo + by;
float dz = bz + (tz - bz) * needToGo / distanceToTarget; float dz = bz + (tz - bz) * needToGo / distanceToTarget;
*/
float dx = tx;
float dy = ty;
float dz = tz;
return MoveTo(target->GetMapId(), dx, dy, dz); return MoveTo(target->GetMapId(), dx, dy, dz);
} }
return true; return false;
} }
float MovementAction::GetFollowAngle() float MovementAction::GetFollowAngle()
@@ -991,7 +985,7 @@ bool MovementAction::ChaseTo(WorldObject* obj, float distance, float angle)
return false; return false;
//vehicle->GetMotionMaster()->Clear(); //vehicle->GetMotionMaster()->Clear();
vehicle->GetBase()->GetMotionMaster()->MoveChase((Unit*)obj, 30.0f, angle); vehicle->GetBase()->GetMotionMaster()->MoveChase((Unit*)obj, 30.0f);
return true; return true;
} }
@@ -1007,7 +1001,7 @@ bool MovementAction::ChaseTo(WorldObject* obj, float distance, float angle)
} }
// bot->GetMotionMaster()->Clear(); // bot->GetMotionMaster()->Clear();
bot->GetMotionMaster()->MoveChase((Unit*) obj, distance, angle); bot->GetMotionMaster()->MoveChase((Unit*) obj, distance);
WaitForReach(bot->GetExactDist2d(obj) - distance); WaitForReach(bot->GetExactDist2d(obj) - distance);
return true; return true;
} }
@@ -1224,15 +1218,15 @@ bool FleeAction::Execute(Event event)
bool FleeWithPetAction::Execute(Event event) bool FleeWithPetAction::Execute(Event event)
{ {
if (Pet* pet = bot->GetPet()) // if (Pet* pet = bot->GetPet())
{ // {
if (CreatureAI* creatureAI = ((Creature*)pet)->AI()) // if (CreatureAI* creatureAI = ((Creature*)pet)->AI())
{ // {
pet->SetReactState(REACT_PASSIVE); // pet->SetReactState(REACT_PASSIVE);
pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW); // pet->GetCharmInfo()->SetCommandState(COMMAND_FOLLOW);
pet->AttackStop(); // pet->AttackStop();
} // }
} // }
return Flee(AI_VALUE(Unit*, "current target")); return Flee(AI_VALUE(Unit*, "current target"));
} }

View File

@@ -4,6 +4,7 @@
#include "ReachTargetActions.h" #include "ReachTargetActions.h"
#include "Event.h" #include "Event.h"
#include "PlayerbotAIConfig.h"
#include "Playerbots.h" #include "Playerbots.h"
#include "ServerFacade.h" #include "ServerFacade.h"
@@ -18,7 +19,8 @@ bool ReachTargetAction::Execute(Event event)
float combatReach = bot->GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f; float combatReach = bot->GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
if (distance < std::max(5.0f, combatReach)) if (distance < std::max(5.0f, combatReach))
{ {
return ChaseTo(target, 0.0f, GetFollowAngle()); // return MoveTo(target, 0.0f);
return ChaseTo(target, 0.0f, bot->GetAngle(target));
} }
else else
{ {
@@ -27,6 +29,7 @@ bool ReachTargetAction::Execute(Event event)
bool isFriend = bot->IsFriendlyTo(target); bool isFriend = bot->IsFriendlyTo(target);
float chaseDist = inLos ? distance : isFriend ? distance / 2 : distance; float chaseDist = inLos ? distance : isFriend ? distance / 2 : distance;
return ChaseTo(target, chaseDist - sPlayerbotAIConfig->contactDistance, bot->GetAngle(target)); return ChaseTo(target, chaseDist - sPlayerbotAIConfig->contactDistance, bot->GetAngle(target));
// return MoveTo(target, chaseDist - sPlayerbotAIConfig->contactDistance);
} }
} }

View File

@@ -100,7 +100,7 @@ class GenericPaladinStrategyActionNodeFactory : public NamedObjectFactory<Action
{ {
return new ActionNode ("lay on hands on party", return new ActionNode ("lay on hands on party",
/*P*/ nullptr, /*P*/ nullptr,
/*A*/ NextAction::array(0, new NextAction("flash of light"), nullptr), /*A*/ NextAction::array(0, new NextAction("flash of light on party"), nullptr),
/*C*/ nullptr); /*C*/ nullptr);
} }