mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-02-03 10:53:48 +00:00
Merge branch 'liyunfan1223:master' into dedicated
This commit is contained in:
@@ -650,6 +650,7 @@ void PlayerbotAI::Reset(bool full)
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentEngine = engines[BOT_STATE_NON_COMBAT];
|
currentEngine = engines[BOT_STATE_NON_COMBAT];
|
||||||
|
currentState = BOT_STATE_NON_COMBAT;
|
||||||
nextAICheckDelay = 0;
|
nextAICheckDelay = 0;
|
||||||
whispers.clear();
|
whispers.clear();
|
||||||
|
|
||||||
@@ -1038,23 +1039,9 @@ void PlayerbotAI::HandleBotOutgoingPacket(WorldPacket const& packet)
|
|||||||
bot->StopMoving();
|
bot->StopMoving();
|
||||||
bot->GetMotionMaster()->Clear();
|
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<Unit*>("current target")->Get();
|
Unit* currentTarget = GetAiObjectContext()->GetValue<Unit*>("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_FALLING);
|
||||||
// bot->AddUnitMovementFlag(MOVEMENTFLAG_FORWARD);
|
// bot->AddUnitMovementFlag(MOVEMENTFLAG_FORWARD);
|
||||||
// bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_PENDING_STOP);
|
// bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_PENDING_STOP);
|
||||||
@@ -1371,19 +1358,26 @@ void PlayerbotAI::DoNextAction(bool min)
|
|||||||
bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING);
|
bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_WALKING);
|
||||||
else if ((nextAICheckDelay < 1000) && bot->IsSitState())
|
else if ((nextAICheckDelay < 1000) && bot->IsSitState())
|
||||||
bot->SetStandState(UNIT_STAND_STATE_STAND);
|
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->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED);
|
||||||
bot->m_movementInfo.RemoveMovementFlag(MOVEMENTFLAG_FLYING);
|
bot->RemoveAurasByType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
// land after kncokback/jump
|
||||||
if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
|
if (bot->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FALLING))
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ RandomPlayerbotFactory::RandomPlayerbotFactory(uint32 accountId) : accountId(acc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls, std::unordered_map<uint8, std::vector<std::string>> names)
|
Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls)
|
||||||
{
|
{
|
||||||
LOG_DEBUG("playerbots", "Creating new random bot for class {}", cls);
|
LOG_DEBUG("playerbots", "Creating new random bot for class {}", cls);
|
||||||
|
|
||||||
@@ -130,28 +130,7 @@ Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::string name;
|
std::string name = CreateRandomBotName(gender);
|
||||||
// int tries = 10;
|
|
||||||
// while (tries--) {
|
|
||||||
// std::string cur_name;
|
|
||||||
// if (names.empty())
|
|
||||||
name = CreateRandomBotName(gender);
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// if (names[gender].empty())
|
|
||||||
// return nullptr;
|
|
||||||
|
|
||||||
// uint32 i = urand(0, names[gender].size() - 1);
|
|
||||||
// cur_name = names[gender][i];
|
|
||||||
// std::swap(names[gender][i], names[gender].back());
|
|
||||||
// names[gender].pop_back();
|
|
||||||
// }
|
|
||||||
// if (ObjectMgr::CheckPlayerName(name) != CHAR_NAME_SUCCESS)
|
|
||||||
// {
|
|
||||||
// name.clear();
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
LOG_ERROR("playerbots", "Unable to get random bot name!");
|
LOG_ERROR("playerbots", "Unable to get random bot name!");
|
||||||
@@ -416,7 +395,6 @@ void RandomPlayerbotFactory::CreateRandomBots()
|
|||||||
uint32 totalRandomBotChars = 0;
|
uint32 totalRandomBotChars = 0;
|
||||||
uint32 totalCharCount = sPlayerbotAIConfig->randomBotAccountCount * 10;
|
uint32 totalCharCount = sPlayerbotAIConfig->randomBotAccountCount * 10;
|
||||||
|
|
||||||
std::unordered_map<uint8,std::vector<std::string>> names;
|
|
||||||
std::vector<std::pair<Player*, uint32>> playerBots;
|
std::vector<std::pair<Player*, uint32>> playerBots;
|
||||||
std::vector<WorldSession*> sessionBots;
|
std::vector<WorldSession*> sessionBots;
|
||||||
int bot_creation = 0;
|
int bot_creation = 0;
|
||||||
@@ -463,7 +441,7 @@ void RandomPlayerbotFactory::CreateRandomBots()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cls != 10) {
|
if (cls != 10) {
|
||||||
if (Player* playerBot = factory.CreateRandomBot(session, cls, names)) {
|
if (Player* playerBot = factory.CreateRandomBot(session, cls)) {
|
||||||
playerBot->SaveToDB(true, false);
|
playerBot->SaveToDB(true, false);
|
||||||
sCharacterCache->AddCharacterCacheEntry(playerBot->GetGUID(), accountId, playerBot->GetName(),
|
sCharacterCache->AddCharacterCacheEntry(playerBot->GetGUID(), accountId, playerBot->GetName(),
|
||||||
playerBot->getGender(), playerBot->getRace(), playerBot->getClass(), playerBot->GetLevel());
|
playerBot->getGender(), playerBot->getRace(), playerBot->getClass(), playerBot->GetLevel());
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class RandomPlayerbotFactory
|
|||||||
RandomPlayerbotFactory(uint32 accountId);
|
RandomPlayerbotFactory(uint32 accountId);
|
||||||
virtual ~RandomPlayerbotFactory() { }
|
virtual ~RandomPlayerbotFactory() { }
|
||||||
|
|
||||||
Player* CreateRandomBot(WorldSession* session, uint8 cls, std::unordered_map<uint8, std::vector<std::string>> names);
|
Player* CreateRandomBot(WorldSession* session, uint8 cls);
|
||||||
static void CreateRandomBots();
|
static void CreateRandomBots();
|
||||||
static void CreateRandomGuilds();
|
static void CreateRandomGuilds();
|
||||||
static void CreateRandomArenaTeams(ArenaType slot, uint32 count);
|
static void CreateRandomArenaTeams(ArenaType slot, uint32 count);
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ bool Engine::HasStrategy(std::string const name)
|
|||||||
|
|
||||||
void Engine::ProcessTriggers(bool minimal)
|
void Engine::ProcessTriggers(bool minimal)
|
||||||
{
|
{
|
||||||
// std::unordered_map<Trigger*, Event> fires;
|
std::unordered_map<Trigger*, Event> fires;
|
||||||
for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
||||||
{
|
{
|
||||||
TriggerNode* node = *i;
|
TriggerNode* node = *i;
|
||||||
@@ -486,7 +486,10 @@ void Engine::ProcessTriggers(bool minimal)
|
|||||||
|
|
||||||
if (!trigger)
|
if (!trigger)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (fires.find(trigger) != fires.end())
|
||||||
|
continue;
|
||||||
|
|
||||||
if (testMode || trigger->needCheck())
|
if (testMode || trigger->needCheck())
|
||||||
{
|
{
|
||||||
if (minimal && node->getFirstRelevance() < 100)
|
if (minimal && node->getFirstRelevance() < 100)
|
||||||
@@ -500,22 +503,21 @@ void Engine::ProcessTriggers(bool minimal)
|
|||||||
if (!event)
|
if (!event)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// fires[trigger] = event;
|
fires[trigger] = event;
|
||||||
LogAction("T:%s", trigger->getName().c_str());
|
LogAction("T:%s", trigger->getName().c_str());
|
||||||
MultiplyAndPush(node->getHandlers(), 0.0f, false, event, "trigger");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
||||||
// {
|
{
|
||||||
// TriggerNode* node = *i;
|
TriggerNode* node = *i;
|
||||||
// Trigger* trigger = node->getTrigger();
|
Trigger* trigger = node->getTrigger();
|
||||||
// if (fires.find(trigger) == fires.end())
|
if (fires.find(trigger) == fires.end())
|
||||||
// continue;
|
continue;
|
||||||
|
|
||||||
// Event event = fires[trigger];
|
Event event = fires[trigger];
|
||||||
|
MultiplyAndPush(node->getHandlers(), 0.0f, false, event, "trigger");
|
||||||
// }
|
}
|
||||||
|
|
||||||
for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
for (std::vector<TriggerNode*>::iterator i = triggers.begin(); i != triggers.end(); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -95,11 +95,11 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bot->IsMounted() && bot->IsWithinLOSInMap(target))
|
// if (bot->IsMounted() && bot->IsWithinLOSInMap(target))
|
||||||
{
|
// {
|
||||||
WorldPacket emptyPacket;
|
// WorldPacket emptyPacket;
|
||||||
bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket);
|
// bot->GetSession()->HandleCancelMountAuraOpcode(emptyPacket);
|
||||||
}
|
// }
|
||||||
|
|
||||||
ObjectGuid guid = target->GetGUID();
|
ObjectGuid guid = target->GetGUID();
|
||||||
bot->SetSelection(target->GetGUID());
|
bot->SetSelection(target->GetGUID());
|
||||||
|
|||||||
@@ -4410,11 +4410,11 @@ bool BGTactics::moveToObjective()
|
|||||||
//std::ostringstream out; out << "Moving to objective " << pos.x << ", " << pos.y << ", Distance: " << sServerFacade->GetDistance2d(bot, pos.x, pos.y);
|
//std::ostringstream out; out << "Moving to objective " << pos.x << ", " << pos.y << ", Distance: " << sServerFacade->GetDistance2d(bot, pos.x, pos.y);
|
||||||
//bot->Say(out.str(), LANG_UNIVERSAL);
|
//bot->Say(out.str(), LANG_UNIVERSAL);
|
||||||
|
|
||||||
// more precise position for wsg and AV (flags in AV towers require precision)
|
// more precise position for wsg
|
||||||
if (bgType == BATTLEGROUND_WS || bgType == BATTLEGROUND_AV)
|
if (bgType == BATTLEGROUND_WS)
|
||||||
return MoveTo(bot->GetMapId(), pos.x, pos.y, pos.z);
|
return MoveTo(bot->GetMapId(), pos.x, pos.y, pos.z);
|
||||||
else
|
else
|
||||||
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z, 3.0f);
|
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z, 1.5f);//note - don't make distance too large or horde bots may struggle to get flags in alliance AV towers (because they'll be targetting a spot in midair)
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -4774,9 +4774,9 @@ bool BGTactics::atFlag(std::vector<BattleBotPath*> const& vPaths, std::vector<ui
|
|||||||
if (!bot->CanUseBattlegroundObject(go) && bgType != BATTLEGROUND_WS)
|
if (!bot->CanUseBattlegroundObject(go) && bgType != BATTLEGROUND_WS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (flagRange)
|
float const dist = sqrt(bot->GetDistance(go));
|
||||||
if (!bot->IsWithinDistInMap(go, flagRange))
|
if (flagRange && dist > flagRange)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool atBase = bgType == BATTLEGROUND_WS ? go->GetEntry() == vFlagsWS[bot->GetTeamId()] : bgType == BATTLEGROUND_EY ? go->GetEntry() == vFlagsEY[0] : false;
|
bool atBase = bgType == BATTLEGROUND_WS ? go->GetEntry() == vFlagsWS[bot->GetTeamId()] : bgType == BATTLEGROUND_EY ? go->GetEntry() == vFlagsEY[0] : false;
|
||||||
|
|
||||||
@@ -4789,6 +4789,13 @@ bool BGTactics::atFlag(std::vector<BattleBotPath*> const& vPaths, std::vector<ui
|
|||||||
case BATTLEGROUND_AB:
|
case BATTLEGROUND_AB:
|
||||||
case BATTLEGROUND_IC:
|
case BATTLEGROUND_IC:
|
||||||
{
|
{
|
||||||
|
if (dist == 0.0f)
|
||||||
|
{
|
||||||
|
// this is to prevent bots capping while standing INSIDE the flag pole (which can be thick enough to hide player entirely)
|
||||||
|
// note that dist is taking into account size of object and bot (it's the space between outside of both) so moveDist needs to as well
|
||||||
|
float const moveDist = bot->GetObjectSize() + go->GetObjectSize() + 0.1f;
|
||||||
|
return MoveTo(bot->GetMapId(), go->GetPositionX() + (urand(0, 1) ? -moveDist : moveDist), go->GetPositionY() + (urand(0, 1) ? -moveDist : moveDist), go->GetPositionZ());
|
||||||
|
}
|
||||||
if (bot->IsMounted())
|
if (bot->IsMounted())
|
||||||
bot->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
bot->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
||||||
|
|
||||||
@@ -4820,7 +4827,7 @@ bool BGTactics::atFlag(std::vector<BattleBotPath*> const& vPaths, std::vector<ui
|
|||||||
}
|
}
|
||||||
case BATTLEGROUND_WS:
|
case BATTLEGROUND_WS:
|
||||||
{
|
{
|
||||||
if (bot->IsWithinDistInMap(go, INTERACTION_DISTANCE))
|
if (dist < INTERACTION_DISTANCE)
|
||||||
{
|
{
|
||||||
if (atBase)
|
if (atBase)
|
||||||
{
|
{
|
||||||
@@ -4868,7 +4875,7 @@ bool BGTactics::atFlag(std::vector<BattleBotPath*> const& vPaths, std::vector<ui
|
|||||||
}
|
}
|
||||||
case BATTLEGROUND_EY:
|
case BATTLEGROUND_EY:
|
||||||
{
|
{
|
||||||
if (bot->IsWithinDistInMap(go, INTERACTION_DISTANCE))
|
if (dist < INTERACTION_DISTANCE)
|
||||||
{
|
{
|
||||||
if (bot->IsMounted())
|
if (bot->IsMounted())
|
||||||
bot->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
bot->RemoveAurasByType(SPELL_AURA_MOUNTED);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "CheckMountStateAction.h"
|
#include "CheckMountStateAction.h"
|
||||||
#include "BattlegroundWS.h"
|
#include "BattlegroundWS.h"
|
||||||
#include "Event.h"
|
#include "Event.h"
|
||||||
|
#include "PlayerbotAI.h"
|
||||||
#include "Playerbots.h"
|
#include "Playerbots.h"
|
||||||
#include "ServerFacade.h"
|
#include "ServerFacade.h"
|
||||||
#include "SpellAuraEffects.h"
|
#include "SpellAuraEffects.h"
|
||||||
@@ -20,18 +21,11 @@ bool CheckMountStateAction::Execute(Event event)
|
|||||||
bool attackdistance = false;
|
bool attackdistance = false;
|
||||||
bool chasedistance = false;
|
bool chasedistance = false;
|
||||||
float attack_distance = 35.0f;
|
float attack_distance = 35.0f;
|
||||||
|
if (PlayerbotAI::IsMelee(bot)) {
|
||||||
switch (bot->getClass())
|
attack_distance = 10.0f;
|
||||||
{
|
} else {
|
||||||
case CLASS_WARRIOR:
|
attack_distance = 40.0f;
|
||||||
case CLASS_PALADIN:
|
|
||||||
attack_distance = 10.0f;
|
|
||||||
break;
|
|
||||||
case CLASS_ROGUE:
|
|
||||||
attack_distance = 40.0f;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enemy)
|
if (enemy)
|
||||||
attack_distance /= 2;
|
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");
|
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();
|
Player* master = GetMaster();
|
||||||
if (master != nullptr && !bot->InBattleground())
|
if (master != nullptr && !bot->InBattleground())
|
||||||
{
|
{
|
||||||
@@ -48,7 +48,7 @@ bool CheckMountStateAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// bool farFromMaster = sServerFacade->GetDistance2d(bot, master) > sPlayerbotAIConfig->sightDistance;
|
// 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();
|
return Mount();
|
||||||
}
|
}
|
||||||
@@ -72,6 +72,13 @@ bool CheckMountStateAction::Execute(Event event)
|
|||||||
return false;
|
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->InBattleground() && !attackdistance && (noattackers || fartarget) && !bot->IsInCombat() && !bot->IsMounted())
|
||||||
{
|
{
|
||||||
if (bot->GetBattlegroundTypeId() == BATTLEGROUND_WS)
|
if (bot->GetBattlegroundTypeId() == BATTLEGROUND_WS)
|
||||||
@@ -269,8 +276,8 @@ bool CheckMountStateAction::Mount()
|
|||||||
if (index >= ids.size())
|
if (index >= ids.size())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
botAI->CastSpell(ids[index], bot);
|
|
||||||
return true;
|
return botAI->CastSpell(ids[index], bot);;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Item*> items = AI_VALUE2(std::vector<Item*>, "inventory items", "mount");
|
std::vector<Item*> items = AI_VALUE2(std::vector<Item*>, "inventory items", "mount");
|
||||||
|
|||||||
@@ -857,9 +857,16 @@ void MovementAction::UpdateMovementState()
|
|||||||
bot->SetSwim(false);
|
bot->SetSwim(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bot->IsFlying())
|
bool onGround = bot->GetPositionZ() < bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()) + 1.0f;
|
||||||
bot->UpdateSpeed(MOVE_FLIGHT, true);
|
|
||||||
|
|
||||||
|
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);
|
Transport* newTransport = bot->GetMap()->GetTransportForPos(bot->GetPhaseMask(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), bot);
|
||||||
if (newTransport != bot->GetTransport())
|
if (newTransport != bot->GetTransport())
|
||||||
{
|
{
|
||||||
@@ -874,10 +881,13 @@ void MovementAction::UpdateMovementState()
|
|||||||
bot->StopMovingOnCurrentPos();
|
bot->StopMovingOnCurrentPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bot->SendMovementFlagUpdate();
|
||||||
// Temporary speed increase in group
|
// Temporary speed increase in group
|
||||||
//if (botAI->HasRealPlayerMaster())
|
// if (botAI->HasRealPlayerMaster()) {
|
||||||
//bot->SetSpeedRate(MOVE_RUN, 1.1f);
|
// bot->SetSpeedRate(MOVE_RUN, 1.1f);
|
||||||
|
// } else {
|
||||||
|
// bot->SetSpeedRate(MOVE_RUN, 1.0f);
|
||||||
|
// }
|
||||||
// check if target is not reachable (from Vmangos)
|
// check if target is not reachable (from Vmangos)
|
||||||
// if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE && bot->CanNotReachTarget() && !bot->InBattleground())
|
// 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)
|
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)
|
void MovementAction::WaitForReach(float distance)
|
||||||
|
|||||||
Reference in New Issue
Block a user