mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-31 01:13:48 +00:00
Improper singletons migration to clean Meyer's singletons (cherry-pick) (#2082)
# Pull Request
- Applies the clean and corrected singletons, Meyer pattern. (cherry
picked from @SmashingQuasar )
Testing by just playing the game in various ways. Been tested by myself
@Celandriel and @SmashingQuasar
---
## Complexity & Impact
- Does this change add new decision branches?
- [x] No
- [ ] Yes (**explain below**)
- Does this change increase per-bot or per-tick processing?
- [x] No
- [ ] Yes (**describe and justify impact**)
- Could this logic scale poorly under load?
- [x] No
- [ ] Yes (**explain why**)
---
## Defaults & Configuration
- Does this change modify default bot behavior?
- [x] No
- [ ] Yes (**explain why**)
---
## AI Assistance
- Was AI assistance (e.g. ChatGPT or similar tools) used while working
on this change?
- [x] No
- [ ] Yes (**explain below**)
---
## Final Checklist
- [x] Stability is not compromised
- [x] Performance impact is understood, tested, and acceptable
- [x] Added logic complexity is justified and explained
- [x] Documentation updated if needed
---
## Notes for Reviewers
Anything that significantly improves realism at the cost of stability or
performance should be carefully discussed
before merging.
---------
Co-authored-by: Nicolas Lebacq <nicolas.cordier@outlook.com>
Co-authored-by: Keleborn <22352763+Celandriel@users.noreply.github.com>
This commit is contained in:
@@ -46,10 +46,10 @@ bool AcceptInvitationAction::Execute(Event event)
|
|||||||
if (!bot->GetGroup() || !bot->GetGroup()->IsMember(inviter->GetGUID()))
|
if (!bot->GetGroup() || !bot->GetGroup()->IsMember(inviter->GetGUID()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
botAI->SetMaster(inviter);
|
botAI->SetMaster(inviter);
|
||||||
// else
|
// else
|
||||||
// sPlayerbotRepository->Save(botAI);
|
// PlayerbotRepository::instance().Save(botAI);
|
||||||
|
|
||||||
botAI->ResetStrategies();
|
botAI->ResetStrategies();
|
||||||
botAI->ChangeStrategy("+follow,-lfg,-bg", BOT_STATE_NON_COMBAT);
|
botAI->ChangeStrategy("+follow,-lfg,-bg", BOT_STATE_NON_COMBAT);
|
||||||
@@ -57,7 +57,7 @@ bool AcceptInvitationAction::Execute(Event event)
|
|||||||
|
|
||||||
botAI->TellMaster("Hello");
|
botAI->TellMaster("Hello");
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->summonWhenGroup && bot->GetDistance(inviter) > sPlayerbotAIConfig->sightDistance)
|
if (sPlayerbotAIConfig.summonWhenGroup && bot->GetDistance(inviter) > sPlayerbotAIConfig.sightDistance)
|
||||||
{
|
{
|
||||||
Teleport(inviter, bot, true);
|
Teleport(inviter, bot, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ bool ReachAreaTriggerAction::Execute(Event event)
|
|||||||
/*forceDestination*/ false);
|
/*forceDestination*/ false);
|
||||||
|
|
||||||
float distance = bot->GetDistance(at->x, at->y, at->z);
|
float distance = bot->GetDistance(at->x, at->y, at->z);
|
||||||
float delay = 1000.0f * distance / bot->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig->reactDelay;
|
float delay = 1000.0f * distance / bot->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig.reactDelay;
|
||||||
botAI->TellError("Wait for me");
|
botAI->TellError("Wait for me");
|
||||||
botAI->SetNextCheckDelay(delay);
|
botAI->SetNextCheckDelay(delay);
|
||||||
context->GetValue<LastMovement&>("last area trigger")->Get().lastAreaTrigger = triggerId;
|
context->GetValue<LastMovement&>("last area trigger")->Get().lastAreaTrigger = triggerId;
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
|||||||
// Check if bot OR target is in prohibited zone/area (skip for duels)
|
// Check if bot OR target is in prohibited zone/area (skip for duels)
|
||||||
if ((target->IsPlayer() || target->IsPet()) &&
|
if ((target->IsPlayer() || target->IsPet()) &&
|
||||||
(!bot->duel || bot->duel->Opponent != target) &&
|
(!bot->duel || bot->duel->Opponent != target) &&
|
||||||
(sPlayerbotAIConfig->IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId()) ||
|
(sPlayerbotAIConfig.IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId()) ||
|
||||||
sPlayerbotAIConfig->IsPvpProhibited(target->GetZoneId(), target->GetAreaId())))
|
sPlayerbotAIConfig.IsPvpProhibited(target->GetZoneId(), target->GetAreaId())))
|
||||||
{
|
{
|
||||||
if (verbose)
|
if (verbose)
|
||||||
botAI->TellError("I cannot attack other players in PvP prohibited areas.");
|
botAI->TellError("I cannot attack other players in PvP prohibited areas.");
|
||||||
@@ -160,7 +160,7 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (botAI->CanMove() && !bot->HasInArc(CAST_ANGLE_IN_FRONT, target))
|
if (botAI->CanMove() && !bot->HasInArc(CAST_ANGLE_IN_FRONT, target))
|
||||||
sServerFacade->SetFacingTo(bot, target);
|
ServerFacade::instance().SetFacingTo(bot, target);
|
||||||
|
|
||||||
botAI->ChangeEngine(BOT_STATE_COMBAT);
|
botAI->ChangeEngine(BOT_STATE_COMBAT);
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ bool AutoMaintenanceOnLevelupAction::Execute(Event event)
|
|||||||
|
|
||||||
void AutoMaintenanceOnLevelupAction::AutoTeleportForLevel()
|
void AutoMaintenanceOnLevelupAction::AutoTeleportForLevel()
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->autoTeleportForLevel || !sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sPlayerbotAIConfig.autoTeleportForLevel || !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -27,13 +27,13 @@ void AutoMaintenanceOnLevelupAction::AutoTeleportForLevel()
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sRandomPlayerbotMgr->RandomTeleportForLevel(bot);
|
sRandomPlayerbotMgr.RandomTeleportForLevel(bot);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AutoMaintenanceOnLevelupAction::AutoPickTalents()
|
void AutoMaintenanceOnLevelupAction::AutoPickTalents()
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->autoPickTalents || !sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sPlayerbotAIConfig.autoPickTalents || !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (bot->GetFreeTalentPoints() <= 0)
|
if (bot->GetFreeTalentPoints() <= 0)
|
||||||
@@ -65,10 +65,10 @@ void AutoMaintenanceOnLevelupAction::AutoLearnSpell()
|
|||||||
void AutoMaintenanceOnLevelupAction::LearnSpells(std::ostringstream* out)
|
void AutoMaintenanceOnLevelupAction::LearnSpells(std::ostringstream* out)
|
||||||
{
|
{
|
||||||
BroadcastHelper::BroadcastLevelup(botAI, bot);
|
BroadcastHelper::BroadcastLevelup(botAI, bot);
|
||||||
if (sPlayerbotAIConfig->autoLearnTrainerSpells && sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sPlayerbotAIConfig.autoLearnTrainerSpells && sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
LearnTrainerSpells(out);
|
LearnTrainerSpells(out);
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->autoLearnQuestSpells && sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sPlayerbotAIConfig.autoLearnQuestSpells && sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
LearnQuestSpells(out);
|
LearnQuestSpells(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,7 +166,7 @@ std::string const AutoMaintenanceOnLevelupAction::FormatSpell(SpellInfo const* s
|
|||||||
|
|
||||||
void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip()
|
void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip()
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->autoUpgradeEquip || !sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sPlayerbotAIConfig.autoUpgradeEquip || !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PlayerbotFactory factory(bot, bot->GetLevel());
|
PlayerbotFactory factory(bot, bot->GetLevel());
|
||||||
@@ -180,9 +180,9 @@ void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip()
|
|||||||
factory.InitConsumables();
|
factory.InitConsumables();
|
||||||
factory.InitPotions();
|
factory.InitPotions();
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->equipmentPersistence || bot->GetLevel() < sPlayerbotAIConfig->equipmentPersistenceLevel)
|
if (!sPlayerbotAIConfig.equipmentPersistence || bot->GetLevel() < sPlayerbotAIConfig.equipmentPersistenceLevel)
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->incrementalGearInit)
|
if (sPlayerbotAIConfig.incrementalGearInit)
|
||||||
factory.InitEquipment(true);
|
factory.InitEquipment(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ bool BGJoinAction::gatherArenaTeam(ArenaType type)
|
|||||||
// continue;
|
// continue;
|
||||||
|
|
||||||
if (offline)
|
if (offline)
|
||||||
sRandomPlayerbotMgr->AddPlayerBot(itr->Guid, 0);
|
sRandomPlayerbotMgr.AddPlayerBot(itr->Guid, 0);
|
||||||
|
|
||||||
if (member)
|
if (member)
|
||||||
{
|
{
|
||||||
@@ -100,7 +100,7 @@ bool BGJoinAction::gatherArenaTeam(ArenaType type)
|
|||||||
if (member->GetGroup() && memberBotAI->HasRealPlayerMaster())
|
if (member->GetGroup() && memberBotAI->HasRealPlayerMaster())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->IsInRandomAccountList(member->GetSession()->GetAccountId()))
|
if (!sPlayerbotAIConfig.IsInRandomAccountList(member->GetSession()->GetAccountId()))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (member->IsInCombat())
|
if (member->IsInCombat())
|
||||||
@@ -250,13 +250,13 @@ bool BGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battlegroun
|
|||||||
TeamSize = (uint32)type;
|
TeamSize = (uint32)type;
|
||||||
|
|
||||||
// Check if bots should join Rated Arena (Only captains can queue)
|
// Check if bots should join Rated Arena (Only captains can queue)
|
||||||
uint32 ratedArenaBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount;
|
uint32 ratedArenaBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount;
|
||||||
uint32 ratedArenaPlayerCount =
|
uint32 ratedArenaPlayerCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount;
|
||||||
uint32 ratedArenaInstanceCount =
|
uint32 ratedArenaInstanceCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaInstanceCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaInstanceCount;
|
||||||
uint32 activeRatedArenaQueue =
|
uint32 activeRatedArenaQueue =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeRatedArenaQueue;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeRatedArenaQueue;
|
||||||
|
|
||||||
bool isRated = (ratedArenaBotCount + ratedArenaPlayerCount) <
|
bool isRated = (ratedArenaBotCount + ratedArenaPlayerCount) <
|
||||||
(BracketSize * (activeRatedArenaQueue + ratedArenaInstanceCount));
|
(BracketSize * (activeRatedArenaQueue + ratedArenaInstanceCount));
|
||||||
@@ -265,7 +265,7 @@ bool BGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battlegroun
|
|||||||
{
|
{
|
||||||
if (sArenaTeamMgr->GetArenaTeamByCaptain(bot->GetGUID(), type))
|
if (sArenaTeamMgr->GetArenaTeamByCaptain(bot->GetGUID(), type))
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount += TeamSize;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount += TeamSize;
|
||||||
ratedList.push_back(queueTypeId);
|
ratedList.push_back(queueTypeId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -274,13 +274,13 @@ bool BGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battlegroun
|
|||||||
// Check if bots should join Skirmish Arena
|
// Check if bots should join Skirmish Arena
|
||||||
// We have extra bots queue because same faction can vs each other but can't be in the same group.
|
// We have extra bots queue because same faction can vs each other but can't be in the same group.
|
||||||
uint32 skirmishArenaBotCount =
|
uint32 skirmishArenaBotCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount;
|
||||||
uint32 skirmishArenaPlayerCount =
|
uint32 skirmishArenaPlayerCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount;
|
||||||
uint32 skirmishArenaInstanceCount =
|
uint32 skirmishArenaInstanceCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaInstanceCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaInstanceCount;
|
||||||
uint32 activeSkirmishArenaQueue =
|
uint32 activeSkirmishArenaQueue =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeSkirmishArenaQueue;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeSkirmishArenaQueue;
|
||||||
uint32 maxRequiredSkirmishBots = BracketSize * (activeSkirmishArenaQueue + skirmishArenaInstanceCount);
|
uint32 maxRequiredSkirmishBots = BracketSize * (activeSkirmishArenaQueue + skirmishArenaInstanceCount);
|
||||||
if (maxRequiredSkirmishBots != 0)
|
if (maxRequiredSkirmishBots != 0)
|
||||||
maxRequiredSkirmishBots = maxRequiredSkirmishBots + TeamSize;
|
maxRequiredSkirmishBots = maxRequiredSkirmishBots + TeamSize;
|
||||||
@@ -294,12 +294,12 @@ bool BGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battlegroun
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if bots should join Battleground
|
// Check if bots should join Battleground
|
||||||
uint32 bgAllianceBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount;
|
uint32 bgAllianceBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount;
|
||||||
uint32 bgAlliancePlayerCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAlliancePlayerCount;
|
uint32 bgAlliancePlayerCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAlliancePlayerCount;
|
||||||
uint32 bgHordeBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordeBotCount;
|
uint32 bgHordeBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordeBotCount;
|
||||||
uint32 bgHordePlayerCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordePlayerCount;
|
uint32 bgHordePlayerCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordePlayerCount;
|
||||||
uint32 activeBgQueue = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeBgQueue;
|
uint32 activeBgQueue = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeBgQueue;
|
||||||
uint32 bgInstanceCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgInstanceCount;
|
uint32 bgInstanceCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgInstanceCount;
|
||||||
|
|
||||||
if (teamId == TEAM_ALLIANCE)
|
if (teamId == TEAM_ALLIANCE)
|
||||||
{
|
{
|
||||||
@@ -318,7 +318,7 @@ bool BGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battlegroun
|
|||||||
bool BGJoinAction::isUseful()
|
bool BGJoinAction::isUseful()
|
||||||
{
|
{
|
||||||
// do not try if BG bots disabled
|
// do not try if BG bots disabled
|
||||||
if (!sPlayerbotAIConfig->randomBotJoinBG)
|
if (!sPlayerbotAIConfig.randomBotJoinBG)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// can't queue while in BG/Arena
|
// can't queue while in BG/Arena
|
||||||
@@ -440,7 +440,7 @@ bool BGJoinAction::JoinQueue(uint32 type)
|
|||||||
|
|
||||||
// get battlemaster
|
// get battlemaster
|
||||||
// Unit* unit = botAI->GetUnit(AI_VALUE2(CreatureData const*, "bg master", bgTypeId));
|
// Unit* unit = botAI->GetUnit(AI_VALUE2(CreatureData const*, "bg master", bgTypeId));
|
||||||
Unit* unit = botAI->GetUnit(sRandomPlayerbotMgr->GetBattleMasterGUID(bot, bgTypeId));
|
Unit* unit = botAI->GetUnit(sRandomPlayerbotMgr.GetBattleMasterGUID(bot, bgTypeId));
|
||||||
if (!unit && isArena)
|
if (!unit && isArena)
|
||||||
{
|
{
|
||||||
botAI->GetAiObjectContext()->GetValue<uint32>("bg type")->Set(0);
|
botAI->GetAiObjectContext()->GetValue<uint32>("bg type")->Set(0);
|
||||||
@@ -450,7 +450,7 @@ bool BGJoinAction::JoinQueue(uint32 type)
|
|||||||
|
|
||||||
// This breaks groups as refresh includes a remove from group function call.
|
// This breaks groups as refresh includes a remove from group function call.
|
||||||
// refresh food/regs
|
// refresh food/regs
|
||||||
// sRandomPlayerbotMgr->Refresh(bot);
|
// sRandomPlayerbotMgr.Refresh(bot);
|
||||||
|
|
||||||
bool joinAsGroup = bot->GetGroup() && bot->GetGroup()->GetLeaderGUID() == bot->GetGUID();
|
bool joinAsGroup = bot->GetGroup() && bot->GetGroup()->GetLeaderGUID() == bot->GetGUID();
|
||||||
|
|
||||||
@@ -523,23 +523,23 @@ bool BGJoinAction::JoinQueue(uint32 type)
|
|||||||
{
|
{
|
||||||
if (!isRated)
|
if (!isRated)
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount++;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!joinAsGroup)
|
else if (!joinAsGroup)
|
||||||
{
|
{
|
||||||
if (teamId == TEAM_ALLIANCE)
|
if (teamId == TEAM_ALLIANCE)
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount++;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount++;
|
||||||
else
|
else
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordeBotCount++;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordeBotCount++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (teamId == TEAM_ALLIANCE)
|
if (teamId == TEAM_ALLIANCE)
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount +=
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount +=
|
||||||
bot->GetGroup()->GetMembersCount();
|
bot->GetGroup()->GetMembersCount();
|
||||||
else
|
else
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordeBotCount +=
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordeBotCount +=
|
||||||
bot->GetGroup()->GetMembersCount();
|
bot->GetGroup()->GetMembersCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -588,13 +588,13 @@ bool FreeBGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battleg
|
|||||||
TeamSize = (uint32)type;
|
TeamSize = (uint32)type;
|
||||||
|
|
||||||
// Check if bots should join Rated Arena (Only captains can queue)
|
// Check if bots should join Rated Arena (Only captains can queue)
|
||||||
uint32 ratedArenaBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount;
|
uint32 ratedArenaBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount;
|
||||||
uint32 ratedArenaPlayerCount =
|
uint32 ratedArenaPlayerCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount;
|
||||||
uint32 ratedArenaInstanceCount =
|
uint32 ratedArenaInstanceCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaInstanceCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaInstanceCount;
|
||||||
uint32 activeRatedArenaQueue =
|
uint32 activeRatedArenaQueue =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeRatedArenaQueue;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeRatedArenaQueue;
|
||||||
|
|
||||||
bool isRated = (ratedArenaBotCount + ratedArenaPlayerCount) <
|
bool isRated = (ratedArenaBotCount + ratedArenaPlayerCount) <
|
||||||
(BracketSize * (activeRatedArenaQueue + ratedArenaInstanceCount));
|
(BracketSize * (activeRatedArenaQueue + ratedArenaInstanceCount));
|
||||||
@@ -603,7 +603,7 @@ bool FreeBGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battleg
|
|||||||
{
|
{
|
||||||
if (sArenaTeamMgr->GetArenaTeamByCaptain(bot->GetGUID(), type))
|
if (sArenaTeamMgr->GetArenaTeamByCaptain(bot->GetGUID(), type))
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount += TeamSize;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaBotCount += TeamSize;
|
||||||
ratedList.push_back(queueTypeId);
|
ratedList.push_back(queueTypeId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -612,13 +612,13 @@ bool FreeBGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battleg
|
|||||||
// Check if bots should join Skirmish Arena
|
// Check if bots should join Skirmish Arena
|
||||||
// We have extra bots queue because same faction can vs each other but can't be in the same group.
|
// We have extra bots queue because same faction can vs each other but can't be in the same group.
|
||||||
uint32 skirmishArenaBotCount =
|
uint32 skirmishArenaBotCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaBotCount;
|
||||||
uint32 skirmishArenaPlayerCount =
|
uint32 skirmishArenaPlayerCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount;
|
||||||
uint32 skirmishArenaInstanceCount =
|
uint32 skirmishArenaInstanceCount =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaInstanceCount;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaInstanceCount;
|
||||||
uint32 activeSkirmishArenaQueue =
|
uint32 activeSkirmishArenaQueue =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeSkirmishArenaQueue;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeSkirmishArenaQueue;
|
||||||
uint32 maxRequiredSkirmishBots = BracketSize * (activeSkirmishArenaQueue + skirmishArenaInstanceCount);
|
uint32 maxRequiredSkirmishBots = BracketSize * (activeSkirmishArenaQueue + skirmishArenaInstanceCount);
|
||||||
if (maxRequiredSkirmishBots != 0)
|
if (maxRequiredSkirmishBots != 0)
|
||||||
maxRequiredSkirmishBots = maxRequiredSkirmishBots + TeamSize;
|
maxRequiredSkirmishBots = maxRequiredSkirmishBots + TeamSize;
|
||||||
@@ -632,12 +632,12 @@ bool FreeBGJoinAction::shouldJoinBg(BattlegroundQueueTypeId queueTypeId, Battleg
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if bots should join Battleground
|
// Check if bots should join Battleground
|
||||||
uint32 bgAllianceBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount;
|
uint32 bgAllianceBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAllianceBotCount;
|
||||||
uint32 bgAlliancePlayerCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgAlliancePlayerCount;
|
uint32 bgAlliancePlayerCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgAlliancePlayerCount;
|
||||||
uint32 bgHordeBotCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordeBotCount;
|
uint32 bgHordeBotCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordeBotCount;
|
||||||
uint32 bgHordePlayerCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgHordePlayerCount;
|
uint32 bgHordePlayerCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgHordePlayerCount;
|
||||||
uint32 activeBgQueue = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].activeBgQueue;
|
uint32 activeBgQueue = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].activeBgQueue;
|
||||||
uint32 bgInstanceCount = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].bgInstanceCount;
|
uint32 bgInstanceCount = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].bgInstanceCount;
|
||||||
|
|
||||||
if (teamId == TEAM_ALLIANCE)
|
if (teamId == TEAM_ALLIANCE)
|
||||||
{
|
{
|
||||||
@@ -670,7 +670,7 @@ bool BGLeaveAction::Execute(Event event)
|
|||||||
uint16 unk = 0x1F90;
|
uint16 unk = 0x1F90;
|
||||||
uint8 unk2 = 0x0;
|
uint8 unk2 = 0x0;
|
||||||
bool isArena = false;
|
bool isArena = false;
|
||||||
bool IsRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot);
|
bool IsRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot);
|
||||||
|
|
||||||
ArenaType arenaType = ArenaType(BattlegroundMgr::BGArenaType(queueTypeId));
|
ArenaType arenaType = ArenaType(BattlegroundMgr::BGArenaType(queueTypeId));
|
||||||
if (arenaType)
|
if (arenaType)
|
||||||
@@ -709,7 +709,7 @@ bool BGStatusAction::LeaveBG(PlayerbotAI* botAI)
|
|||||||
if (!bg)
|
if (!bg)
|
||||||
return false;
|
return false;
|
||||||
bool isArena = bg->isArena();
|
bool isArena = bg->isArena();
|
||||||
bool isRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot);
|
bool isRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot);
|
||||||
|
|
||||||
if (isRandomBot)
|
if (isRandomBot)
|
||||||
botAI->SetMaster(nullptr);
|
botAI->SetMaster(nullptr);
|
||||||
@@ -805,7 +805,7 @@ bool BGStatusAction::Execute(Event event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot);
|
bool IsRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot);
|
||||||
BattlegroundQueueTypeId queueTypeId = bot->GetBattlegroundQueueTypeId(QueueSlot);
|
BattlegroundQueueTypeId queueTypeId = bot->GetBattlegroundQueueTypeId(QueueSlot);
|
||||||
BattlegroundTypeId _bgTypeId = BattlegroundMgr::BGTemplateId(queueTypeId);
|
BattlegroundTypeId _bgTypeId = BattlegroundMgr::BGTemplateId(queueTypeId);
|
||||||
if (!queueTypeId)
|
if (!queueTypeId)
|
||||||
@@ -958,10 +958,10 @@ bool BGStatusAction::Execute(Event event)
|
|||||||
//TeamId teamId = bot->GetTeamId(); //not used, line marked for removal.
|
//TeamId teamId = bot->GetTeamId(); //not used, line marked for removal.
|
||||||
bool realPlayers = false;
|
bool realPlayers = false;
|
||||||
if (isRated)
|
if (isRated)
|
||||||
realPlayers = sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount > 0;
|
realPlayers = sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].ratedArenaPlayerCount > 0;
|
||||||
else
|
else
|
||||||
realPlayers =
|
realPlayers =
|
||||||
sRandomPlayerbotMgr->BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount > 0;
|
sRandomPlayerbotMgr.BattlegroundData[queueTypeId][bracketId].skirmishArenaPlayerCount > 0;
|
||||||
|
|
||||||
if (realPlayers)
|
if (realPlayers)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -1276,7 +1276,7 @@ static std::pair<uint32, uint32> IC_AttackObjectives[] = {
|
|||||||
// useful commands for fixing BG bugs and checking waypoints/paths
|
// useful commands for fixing BG bugs and checking waypoints/paths
|
||||||
bool BGTactics::HandleConsoleCommand(ChatHandler* handler, char const* args)
|
bool BGTactics::HandleConsoleCommand(ChatHandler* handler, char const* args)
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->enabled)
|
if (!sPlayerbotAIConfig.enabled)
|
||||||
{
|
{
|
||||||
handler->PSendSysMessage("|cffff0000Playerbot system is currently disabled!");
|
handler->PSendSysMessage("|cffff0000Playerbot system is currently disabled!");
|
||||||
return true;
|
return true;
|
||||||
@@ -2219,7 +2219,7 @@ bool BGTactics::selectObjective(bool reset)
|
|||||||
if (urand(0, 99) < 20 && teamFC)
|
if (urand(0, 99) < 20 && teamFC)
|
||||||
{
|
{
|
||||||
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
||||||
if (sServerFacade->GetDistance2d(bot, teamFC) < 33.0f)
|
if (ServerFacade::instance().GetDistance2d(bot, teamFC) < 33.0f)
|
||||||
Follow(teamFC);
|
Follow(teamFC);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2263,7 +2263,7 @@ bool BGTactics::selectObjective(bool reset)
|
|||||||
if (urand(0, 99) < 70)
|
if (urand(0, 99) < 70)
|
||||||
{
|
{
|
||||||
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
||||||
if (sServerFacade->GetDistance2d(bot, teamFC) < 33.0f)
|
if (ServerFacade::instance().GetDistance2d(bot, teamFC) < 33.0f)
|
||||||
Follow(teamFC);
|
Follow(teamFC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2284,7 +2284,7 @@ bool BGTactics::selectObjective(bool reset)
|
|||||||
{
|
{
|
||||||
// Assist own FC if not pursuing enemy FC
|
// Assist own FC if not pursuing enemy FC
|
||||||
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
target.Relocate(teamFC->GetPositionX(), teamFC->GetPositionY(), teamFC->GetPositionZ());
|
||||||
if (sServerFacade->GetDistance2d(bot, teamFC) < 33.0f)
|
if (ServerFacade::instance().GetDistance2d(bot, teamFC) < 33.0f)
|
||||||
Follow(teamFC);
|
Follow(teamFC);
|
||||||
}
|
}
|
||||||
else if (urand(0, 99) < 5)
|
else if (urand(0, 99) < 5)
|
||||||
@@ -3197,11 +3197,11 @@ bool BGTactics::moveToObjective(bool ignoreDist)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ignoreDist && sServerFacade->IsDistanceGreaterThan(sServerFacade->GetDistance2d(bot, pos.x, pos.y), 100.0f))
|
if (!ignoreDist && ServerFacade::instance().IsDistanceGreaterThan(ServerFacade::instance().GetDistance2d(bot, pos.x, pos.y), 100.0f))
|
||||||
{
|
{
|
||||||
// std::ostringstream out;
|
// std::ostringstream out;
|
||||||
// out << "It is too far away! " << pos.x << ", " << pos.y << ", Distance: " <<
|
// out << "It is too far away! " << pos.x << ", " << pos.y << ", Distance: " <<
|
||||||
// sServerFacade->GetDistance2d(bot, pos.x, pos.y); bot->Say(out.str(), LANG_UNIVERSAL);
|
// ServerFacade::instance().GetDistance2d(bot, pos.x, pos.y); bot->Say(out.str(), LANG_UNIVERSAL);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3213,7 +3213,7 @@ bool BGTactics::moveToObjective(bool ignoreDist)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// std::ostringstream out; out << "Moving to objective " << pos.x << ", " << pos.y << ", Distance: " <<
|
// 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);
|
// ServerFacade::instance().GetDistance2d(bot, pos.x, pos.y); bot->Say(out.str(), LANG_UNIVERSAL);
|
||||||
|
|
||||||
// dont increase from 1.5 will cause bugs with horde capping AV towers
|
// dont increase from 1.5 will cause bugs with horde capping AV towers
|
||||||
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z, 1.5f);
|
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z, 1.5f);
|
||||||
@@ -3433,7 +3433,7 @@ bool BGTactics::moveToObjectiveWp(BattleBotPath* const& currentPath, uint32 curr
|
|||||||
// out << "WP: ";
|
// out << "WP: ";
|
||||||
// reverse ? out << currPoint << " <<< -> " << nPoint : out << currPoint << ">>> ->" << nPoint;
|
// reverse ? out << currPoint << " <<< -> " << nPoint : out << currPoint << ">>> ->" << nPoint;
|
||||||
// out << ", " << nextPoint.x << ", " << nextPoint.y << " Path Size: " << currentPath->size() << ", Dist: " <<
|
// out << ", " << nextPoint.x << ", " << nextPoint.y << " Path Size: " << currentPath->size() << ", Dist: " <<
|
||||||
// sServerFacade->GetDistance2d(bot, nextPoint.x, nextPoint.y); bot->Say(out.str(), LANG_UNIVERSAL);
|
// ServerFacade::instance().GetDistance2d(bot, nextPoint.x, nextPoint.y); bot->Say(out.str(), LANG_UNIVERSAL);
|
||||||
|
|
||||||
return MoveTo(bot->GetMapId(), nextPoint.x + frand(-2, 2), nextPoint.y + frand(-2, 2), nextPoint.z);
|
return MoveTo(bot->GetMapId(), nextPoint.x + frand(-2, 2), nextPoint.y + frand(-2, 2), nextPoint.z);
|
||||||
}
|
}
|
||||||
@@ -4039,9 +4039,9 @@ bool BGTactics::useBuff()
|
|||||||
if (closeObjects.empty())
|
if (closeObjects.empty())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool needRegen = bot->GetHealthPct() < sPlayerbotAIConfig->mediumHealth ||
|
bool needRegen = bot->GetHealthPct() < sPlayerbotAIConfig.mediumHealth ||
|
||||||
(AI_VALUE2(bool, "has mana", "self target") &&
|
(AI_VALUE2(bool, "has mana", "self target") &&
|
||||||
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig->mediumMana);
|
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig.mediumMana);
|
||||||
bool needSpeed = (bgType != BATTLEGROUND_WS || bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) ||
|
bool needSpeed = (bgType != BATTLEGROUND_WS || bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) ||
|
||||||
bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)) ||
|
bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)) ||
|
||||||
!(teamFlagTaken() || flagTaken());
|
!(teamFlagTaken() || flagTaken());
|
||||||
@@ -4057,7 +4057,7 @@ bool BGTactics::useBuff()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
// use speed buff only if close
|
// use speed buff only if close
|
||||||
if (sServerFacade->IsDistanceGreaterThan(sServerFacade->GetDistance2d(bot, go),
|
if (ServerFacade::instance().IsDistanceGreaterThan(ServerFacade::instance().GetDistance2d(bot, go),
|
||||||
go->GetEntry() == Buff_Entries[0] ? 20.0f : 50.0f))
|
go->GetEntry() == Buff_Entries[0] ? 20.0f : 50.0f))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -4107,7 +4107,7 @@ uint32 BGTactics::getPlayersInArea(TeamId teamId, Position point, float range, b
|
|||||||
if (!combat && player->IsInCombat())
|
if (!combat && player->IsInCombat())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sServerFacade->GetDistance2d(player, point.GetPositionX(), point.GetPositionY()) < range)
|
if (ServerFacade::instance().GetDistance2d(player, point.GetPositionX(), point.GetPositionY()) < range)
|
||||||
++defCount;
|
++defCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4191,9 +4191,9 @@ bool BGTactics::IsLockedInsideKeep()
|
|||||||
// get closest portal
|
// get closest portal
|
||||||
if (bot->GetTeamId() == TEAM_ALLIANCE && go->GetEntry() == GO_TELEPORTER_4)
|
if (bot->GetTeamId() == TEAM_ALLIANCE && go->GetEntry() == GO_TELEPORTER_4)
|
||||||
{
|
{
|
||||||
float tempDist = sServerFacade->GetDistance2d(bot, go->GetPositionX(), go->GetPositionY());
|
float tempDist = ServerFacade::instance().GetDistance2d(bot, go->GetPositionX(), go->GetPositionY());
|
||||||
|
|
||||||
if (sServerFacade->IsDistanceLessThan(tempDist, closestDistance))
|
if (ServerFacade::instance().IsDistanceLessThan(tempDist, closestDistance))
|
||||||
{
|
{
|
||||||
closestDistance = tempDist;
|
closestDistance = tempDist;
|
||||||
closestPortal = go;
|
closestPortal = go;
|
||||||
@@ -4204,9 +4204,9 @@ bool BGTactics::IsLockedInsideKeep()
|
|||||||
// get closest portal
|
// get closest portal
|
||||||
if (bot->GetTeamId() == TEAM_HORDE && go->GetEntry() == GO_TELEPORTER_2)
|
if (bot->GetTeamId() == TEAM_HORDE && go->GetEntry() == GO_TELEPORTER_2)
|
||||||
{
|
{
|
||||||
float tempDist = sServerFacade->GetDistance2d(bot, go->GetPositionX(), go->GetPositionY());
|
float tempDist = ServerFacade::instance().GetDistance2d(bot, go->GetPositionX(), go->GetPositionY());
|
||||||
|
|
||||||
if (sServerFacade->IsDistanceLessThan(tempDist, closestDistance))
|
if (ServerFacade::instance().IsDistanceLessThan(tempDist, closestDistance))
|
||||||
{
|
{
|
||||||
closestDistance = tempDist;
|
closestDistance = tempDist;
|
||||||
closestPortal = go;
|
closestPortal = go;
|
||||||
@@ -4253,7 +4253,7 @@ bool ArenaTactics::Execute(Event event)
|
|||||||
{
|
{
|
||||||
if (!bot->InBattleground())
|
if (!bot->InBattleground())
|
||||||
{
|
{
|
||||||
bool IsRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot->GetGUID().GetCounter());
|
bool IsRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot->GetGUID().GetCounter());
|
||||||
botAI->ChangeStrategy("-arena", BOT_STATE_COMBAT);
|
botAI->ChangeStrategy("-arena", BOT_STATE_COMBAT);
|
||||||
botAI->ChangeStrategy("-arena", BOT_STATE_NON_COMBAT);
|
botAI->ChangeStrategy("-arena", BOT_STATE_NON_COMBAT);
|
||||||
botAI->ResetStrategies(!IsRandomBot);
|
botAI->ResetStrategies(!IsRandomBot);
|
||||||
|
|||||||
@@ -130,10 +130,10 @@ bool CastCustomSpellAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target != bot && !bot->HasInArc(CAST_ANGLE_IN_FRONT, target, sPlayerbotAIConfig->sightDistance))
|
if (target != bot && !bot->HasInArc(CAST_ANGLE_IN_FRONT, target, sPlayerbotAIConfig.sightDistance))
|
||||||
{
|
{
|
||||||
sServerFacade->SetFacingTo(bot, target);
|
ServerFacade::instance().SetFacingTo(bot, target);
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->reactDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.reactDelay);
|
||||||
|
|
||||||
msg << "cast " << text;
|
msg << "cast " << text;
|
||||||
botAI->HandleCommand(CHAT_MSG_WHISPER, msg.str(), master);
|
botAI->HandleCommand(CHAT_MSG_WHISPER, msg.str(), master);
|
||||||
@@ -286,7 +286,7 @@ bool CastRandomSpellAction::Execute(Event event)
|
|||||||
|
|
||||||
if (isCast)
|
if (isCast)
|
||||||
{
|
{
|
||||||
if (MultiCast && ((wo && bot->HasInArc(CAST_ANGLE_IN_FRONT, wo, sPlayerbotAIConfig->sightDistance))))
|
if (MultiCast && ((wo && bot->HasInArc(CAST_ANGLE_IN_FRONT, wo, sPlayerbotAIConfig.sightDistance))))
|
||||||
{
|
{
|
||||||
std::ostringstream cmd;
|
std::ostringstream cmd;
|
||||||
cmd << "castnc " << chat->FormatWorldobject(wo) + " " << spellId << " " << 19;
|
cmd << "castnc " << chat->FormatWorldobject(wo) + " " << spellId << " " << 19;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ bool ChangeCombatStrategyAction::Execute(Event event)
|
|||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
case '~':
|
case '~':
|
||||||
sPlayerbotRepository->Save(botAI);
|
PlayerbotRepository::instance().Save(botAI);
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
break;
|
break;
|
||||||
@@ -40,7 +40,7 @@ bool ChangeNonCombatStrategyAction::Execute(Event event)
|
|||||||
std::string const text = event.getParam();
|
std::string const text = event.getParam();
|
||||||
|
|
||||||
uint32 account = bot->GetSession()->GetAccountId();
|
uint32 account = bot->GetSession()->GetAccountId();
|
||||||
if (sPlayerbotAIConfig->IsInRandomAccountList(account) && botAI->GetMaster() &&
|
if (sPlayerbotAIConfig.IsInRandomAccountList(account) && botAI->GetMaster() &&
|
||||||
botAI->GetMaster()->GetSession()->GetSecurity() < SEC_GAMEMASTER)
|
botAI->GetMaster()->GetSession()->GetSecurity() < SEC_GAMEMASTER)
|
||||||
{
|
{
|
||||||
if (text.find("loot") != std::string::npos || text.find("gather") != std::string::npos)
|
if (text.find("loot") != std::string::npos || text.find("gather") != std::string::npos)
|
||||||
@@ -62,7 +62,7 @@ bool ChangeNonCombatStrategyAction::Execute(Event event)
|
|||||||
case '+':
|
case '+':
|
||||||
case '-':
|
case '-':
|
||||||
case '~':
|
case '~':
|
||||||
sPlayerbotRepository->Save(botAI);
|
PlayerbotRepository::instance().Save(botAI);
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -110,20 +110,20 @@ std::string ChangeTalentsAction::SpecList()
|
|||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
for (int specNo = 0; specNo < MAX_SPECNO; ++specNo)
|
for (int specNo = 0; specNo < MAX_SPECNO; ++specNo)
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->premadeSpecName[cls][specNo].size() == 0)
|
if (sPlayerbotAIConfig.premadeSpecName[cls][specNo].size() == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
specFound++;
|
specFound++;
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
std::vector<std::vector<uint32>> parsed = sPlayerbotAIConfig->parsedSpecLinkOrder[cls][specNo][80];
|
std::vector<std::vector<uint32>> parsed = sPlayerbotAIConfig.parsedSpecLinkOrder[cls][specNo][80];
|
||||||
std::unordered_map<int, int> tabCount;
|
std::unordered_map<int, int> tabCount;
|
||||||
tabCount[0] = tabCount[1] = tabCount[2] = 0;
|
tabCount[0] = tabCount[1] = tabCount[2] = 0;
|
||||||
for (auto& item : parsed)
|
for (auto& item : parsed)
|
||||||
{
|
{
|
||||||
tabCount[item[0]] += item[3];
|
tabCount[item[0]] += item[3];
|
||||||
}
|
}
|
||||||
out << specFound << ". " << sPlayerbotAIConfig->premadeSpecName[cls][specNo] << " (";
|
out << specFound << ". " << sPlayerbotAIConfig.premadeSpecName[cls][specNo] << " (";
|
||||||
out << tabCount[0] << "-" << tabCount[1] << "-" << tabCount[2] << ")";
|
out << tabCount[0] << "-" << tabCount[1] << "-" << tabCount[2] << ")";
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
}
|
}
|
||||||
@@ -137,11 +137,11 @@ std::string ChangeTalentsAction::SpecPick(std::string param)
|
|||||||
// int specFound = 0; //not used, line marked for removal.
|
// int specFound = 0; //not used, line marked for removal.
|
||||||
for (int specNo = 0; specNo < MAX_SPECNO; ++specNo)
|
for (int specNo = 0; specNo < MAX_SPECNO; ++specNo)
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->premadeSpecName[cls][specNo].size() == 0)
|
if (sPlayerbotAIConfig.premadeSpecName[cls][specNo].size() == 0)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (sPlayerbotAIConfig->premadeSpecName[cls][specNo] == param)
|
if (sPlayerbotAIConfig.premadeSpecName[cls][specNo] == param)
|
||||||
{
|
{
|
||||||
PlayerbotFactory::InitTalentsBySpecNo(bot, specNo, true);
|
PlayerbotFactory::InitTalentsBySpecNo(bot, specNo, true);
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ std::string ChangeTalentsAction::SpecPick(std::string param)
|
|||||||
factory.InitGlyphs(false);
|
factory.InitGlyphs(false);
|
||||||
|
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << "Picking " << sPlayerbotAIConfig->premadeSpecName[cls][specNo];
|
out << "Picking " << sPlayerbotAIConfig.premadeSpecName[cls][specNo];
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -176,7 +176,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// std::vector<TalentPath*> ChangeTalentsAction::getPremadePaths(std::string const findName)
|
// std::vector<TalentPath*> ChangeTalentsAction::getPremadePaths(std::string const findName)
|
||||||
// {
|
// {
|
||||||
// std::vector<TalentPath*> ret;
|
// std::vector<TalentPath*> ret;
|
||||||
// // for (auto& path : sPlayerbotAIConfig->classSpecs[bot->getClass()].talentPath)
|
// // for (auto& path : sPlayerbotAIConfig.classSpecs[bot->getClass()].talentPath)
|
||||||
// // {
|
// // {
|
||||||
// // if (findName.empty() || path.name.find(findName) != std::string::npos)
|
// // if (findName.empty() || path.name.find(findName) != std::string::npos)
|
||||||
// // {
|
// // {
|
||||||
@@ -191,7 +191,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// {
|
// {
|
||||||
// std::vector<TalentPath*> ret;
|
// std::vector<TalentPath*> ret;
|
||||||
|
|
||||||
// // for (auto& path : sPlayerbotAIConfig->classSpecs[bot->getClass()].talentPath)
|
// // for (auto& path : sPlayerbotAIConfig.classSpecs[bot->getClass()].talentPath)
|
||||||
// // {
|
// // {
|
||||||
// // TalentSpec newSpec = *GetBestPremadeSpec(path.id);
|
// // TalentSpec newSpec = *GetBestPremadeSpec(path.id);
|
||||||
// // newSpec.CropTalents(bot->GetLevel());
|
// // newSpec.CropTalents(bot->GetLevel());
|
||||||
@@ -206,7 +206,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
|
|
||||||
// TalentPath* ChangeTalentsAction::getPremadePath(uint32 id)
|
// TalentPath* ChangeTalentsAction::getPremadePath(uint32 id)
|
||||||
// {
|
// {
|
||||||
// // for (auto& path : sPlayerbotAIConfig->classSpecs[bot->getClass()].talentPath)
|
// // for (auto& path : sPlayerbotAIConfig.classSpecs[bot->getClass()].talentPath)
|
||||||
// // {
|
// // {
|
||||||
// // if (id == path.id)
|
// // if (id == path.id)
|
||||||
// // {
|
// // {
|
||||||
@@ -214,7 +214,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// // }
|
// // }
|
||||||
// // }
|
// // }
|
||||||
|
|
||||||
// // return &sPlayerbotAIConfig->classSpecs[bot->getClass()].talentPath[0];
|
// // return &sPlayerbotAIConfig.classSpecs[bot->getClass()].talentPath[0];
|
||||||
// return nullptr;
|
// return nullptr;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -270,9 +270,9 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// uint32 specNo = sRandomPlayerbotMgr->GetValue(bot->GetGUID().GetCounter(), "specNo");
|
// uint32 specNo = sRandomPlayerbotMgr.GetValue(bot->GetGUID().GetCounter(), "specNo");
|
||||||
// uint32 specId = specNo - 1;
|
// uint32 specId = specNo - 1;
|
||||||
// std::string specLink = sRandomPlayerbotMgr->GetData(bot->GetGUID().GetCounter(), "specLink");
|
// std::string specLink = sRandomPlayerbotMgr.GetData(bot->GetGUID().GetCounter(), "specLink");
|
||||||
|
|
||||||
// //Continue the current spec
|
// //Continue the current spec
|
||||||
// if (specNo > 0)
|
// if (specNo > 0)
|
||||||
@@ -319,15 +319,15 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// specId = -1;
|
// specId = -1;
|
||||||
// // specLink = "";
|
// // specLink = "";
|
||||||
// }
|
// }
|
||||||
// else if (paths.size() > 1 && false/*!sPlayerbotAIConfig->autoPickTalents*/ &&
|
// else if (paths.size() > 1 && false/*!sPlayerbotAIConfig.autoPickTalents*/ &&
|
||||||
// !sRandomPlayerbotMgr->IsRandomBot(bot))
|
// !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
// {
|
// {
|
||||||
// *out << "Found multiple specs: ";
|
// *out << "Found multiple specs: ";
|
||||||
// listPremadePaths(paths, out);
|
// listPremadePaths(paths, out);
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
// specId = PickPremadePath(paths, sRandomPlayerbotMgr->IsRandomBot(bot))->id;
|
// specId = PickPremadePath(paths, sRandomPlayerbotMgr.IsRandomBot(bot))->id;
|
||||||
// TalentSpec newSpec = *GetBestPremadeSpec(specId);
|
// TalentSpec newSpec = *GetBestPremadeSpec(specId);
|
||||||
// specLink = newSpec.GetTalentLink();
|
// specLink = newSpec.GetTalentLink();
|
||||||
// newSpec.CropTalents(bot->GetLevel());
|
// newSpec.CropTalents(bot->GetLevel());
|
||||||
@@ -341,12 +341,12 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// sRandomPlayerbotMgr->SetValue(bot->GetGUID().GetCounter(), "specNo", specId + 1);
|
// sRandomPlayerbotMgr.SetValue(bot->GetGUID().GetCounter(), "specNo", specId + 1);
|
||||||
|
|
||||||
// if (!specLink.empty() && specId == -1)
|
// if (!specLink.empty() && specId == -1)
|
||||||
// sRandomPlayerbotMgr->SetValue(bot->GetGUID().GetCounter(), "specLink", 1, specLink);
|
// sRandomPlayerbotMgr.SetValue(bot->GetGUID().GetCounter(), "specLink", 1, specLink);
|
||||||
// else
|
// else
|
||||||
// sRandomPlayerbotMgr->SetValue(bot->GetGUID().GetCounter(), "specLink", 0);
|
// sRandomPlayerbotMgr.SetValue(bot->GetGUID().GetCounter(), "specLink", 0);
|
||||||
|
|
||||||
// return (specNo == 0) ? false : true;
|
// return (specNo == 0) ? false : true;
|
||||||
// }
|
// }
|
||||||
@@ -364,7 +364,7 @@ std::string ChangeTalentsAction::SpecApply(std::string param)
|
|||||||
// if (path->talentSpec.size())
|
// if (path->talentSpec.size())
|
||||||
// return &path->talentSpec.back();
|
// return &path->talentSpec.back();
|
||||||
|
|
||||||
// // return &sPlayerbotAIConfig->classSpecs[bot->getClassMask()].baseSpec;
|
// // return &sPlayerbotAIConfig.classSpecs[bot->getClassMask()].baseSpec;
|
||||||
// return nullptr;
|
// return nullptr;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -372,7 +372,7 @@ bool AutoSetTalentsAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->autoPickTalents || !sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sPlayerbotAIConfig.autoPickTalents || !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bot->GetFreeTalentPoints() <= 0)
|
if (bot->GetFreeTalentPoints() <= 0)
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ bool FollowChatShortcutAction::Execute(Event event)
|
|||||||
|
|
||||||
/* Default mechanics takes care of this now.
|
/* Default mechanics takes care of this now.
|
||||||
if (bot->GetMapId() != master->GetMapId() || (master && bot->GetDistance(master) >
|
if (bot->GetMapId() != master->GetMapId() || (master && bot->GetDistance(master) >
|
||||||
sPlayerbotAIConfig->sightDistance))
|
sPlayerbotAIConfig.sightDistance))
|
||||||
{
|
{
|
||||||
if (bot->isDead())
|
if (bot->isDead())
|
||||||
{
|
{
|
||||||
@@ -161,7 +161,7 @@ bool FleeChatShortcutAction::Execute(Event event)
|
|||||||
ResetReturnPosition();
|
ResetReturnPosition();
|
||||||
ResetStayPosition();
|
ResetStayPosition();
|
||||||
|
|
||||||
if (bot->GetMapId() != master->GetMapId() || bot->GetDistance(master) > sPlayerbotAIConfig->sightDistance)
|
if (bot->GetMapId() != master->GetMapId() || bot->GetDistance(master) > sPlayerbotAIConfig.sightDistance)
|
||||||
{
|
{
|
||||||
botAI->TellError("I will not flee with you - too far away");
|
botAI->TellError("I will not flee with you - too far away");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ void CheatAction::ListCheats()
|
|||||||
for (int i = 0; i < log2((uint32)BotCheatMask::maxMask); i++)
|
for (int i = 0; i < log2((uint32)BotCheatMask::maxMask); i++)
|
||||||
{
|
{
|
||||||
BotCheatMask cheatMask = BotCheatMask(1 << i);
|
BotCheatMask cheatMask = BotCheatMask(1 << i);
|
||||||
if ((uint32)cheatMask & (uint32)sPlayerbotAIConfig->botCheatMask)
|
if ((uint32)cheatMask & (uint32)sPlayerbotAIConfig.botCheatMask)
|
||||||
out << "[conf:" << GetCheatName(BotCheatMask(cheatMask)) << "]";
|
out << "[conf:" << GetCheatName(BotCheatMask(cheatMask)) << "]";
|
||||||
else if (botAI->HasCheat(cheatMask))
|
else if (botAI->HasCheat(cheatMask))
|
||||||
out << "[" << GetCheatName(BotCheatMask(cheatMask)) << "]";
|
out << "[" << GetCheatName(BotCheatMask(cheatMask)) << "]";
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ bool CheckMailAction::Execute(Event event)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
uint32 account = owner->GetSession()->GetAccountId();
|
uint32 account = owner->GetSession()->GetAccountId();
|
||||||
if (sPlayerbotAIConfig->IsInRandomAccountList(account))
|
if (sPlayerbotAIConfig.IsInRandomAccountList(account))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ProcessMail(mail, owner, trans);
|
ProcessMail(mail, owner, trans);
|
||||||
@@ -80,7 +80,7 @@ void CheckMailAction::ProcessMail(Mail* mail, Player* owner, CharacterDatabaseTr
|
|||||||
if (!item)
|
if (!item)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!sGuildTaskMgr->CheckItemTask(i->item_template, item->GetCount(), owner, bot, true))
|
if (!GuildTaskMgr::instance().CheckItemTask(i->item_template, item->GetCount(), owner, bot, true))
|
||||||
{
|
{
|
||||||
std::ostringstream body;
|
std::ostringstream body;
|
||||||
body << "Hello, " << owner->GetName() << ",\n";
|
body << "Hello, " << owner->GetName() << ",\n";
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ bool CheckMountStateAction::isUseful()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Not useful when level lower than minimum required
|
// Not useful when level lower than minimum required
|
||||||
if (bot->GetLevel() < sPlayerbotAIConfig->useGroundMountAtMinLevel)
|
if (bot->GetLevel() < sPlayerbotAIConfig.useGroundMountAtMinLevel)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Allow mounting while transformed only if the form allows it
|
// Allow mounting while transformed only if the form allows it
|
||||||
@@ -402,7 +402,7 @@ float CheckMountStateAction::CalculateDismountDistance() const
|
|||||||
// Warrior bots should dismount far enough to charge (because it's important for generating some initial rage),
|
// Warrior bots should dismount far enough to charge (because it's important for generating some initial rage),
|
||||||
// a real player would be riding toward enemy mashing the charge key but the bots won't cast charge while mounted.
|
// a real player would be riding toward enemy mashing the charge key but the bots won't cast charge while mounted.
|
||||||
bool isMelee = PlayerbotAI::IsMelee(bot);
|
bool isMelee = PlayerbotAI::IsMelee(bot);
|
||||||
float dismountDistance = isMelee ? sPlayerbotAIConfig->meleeDistance + 2.0f : sPlayerbotAIConfig->spellDistance + 2.0f;
|
float dismountDistance = isMelee ? sPlayerbotAIConfig.meleeDistance + 2.0f : sPlayerbotAIConfig.spellDistance + 2.0f;
|
||||||
return bot->getClass() == CLASS_WARRIOR ? std::max(18.0f, dismountDistance) : dismountDistance;
|
return bot->getClass() == CLASS_WARRIOR ? std::max(18.0f, dismountDistance) : dismountDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,7 +413,7 @@ float CheckMountStateAction::CalculateMountDistance() const
|
|||||||
// seconds:
|
// seconds:
|
||||||
// 21 / 7 = 21 / 14 + 1.5 = 3 (7 = dismounted speed 14 = epic-mount speed 1.5 = mount-spell cast time)
|
// 21 / 7 = 21 / 14 + 1.5 = 3 (7 = dismounted speed 14 = epic-mount speed 1.5 = mount-spell cast time)
|
||||||
bool isMelee = PlayerbotAI::IsMelee(bot);
|
bool isMelee = PlayerbotAI::IsMelee(bot);
|
||||||
float baseDistance = isMelee ? sPlayerbotAIConfig->meleeDistance + 10.0f : sPlayerbotAIConfig->spellDistance + 10.0f;
|
float baseDistance = isMelee ? sPlayerbotAIConfig.meleeDistance + 10.0f : sPlayerbotAIConfig.spellDistance + 10.0f;
|
||||||
return std::max(21.0f, baseDistance);
|
return std::max(21.0f, baseDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -440,7 +440,7 @@ int32 CheckMountStateAction::CalculateMasterMountSpeed(Player* master, const Mou
|
|||||||
int32 ridingSkill = bot->GetPureSkillValue(SKILL_RIDING);
|
int32 ridingSkill = bot->GetPureSkillValue(SKILL_RIDING);
|
||||||
int32 botLevel = bot->GetLevel();
|
int32 botLevel = bot->GetLevel();
|
||||||
|
|
||||||
if (ridingSkill <= 75 && botLevel < static_cast<int32>(sPlayerbotAIConfig->useFastGroundMountAtMinLevel))
|
if (ridingSkill <= 75 && botLevel < static_cast<int32>(sPlayerbotAIConfig.useFastGroundMountAtMinLevel))
|
||||||
return 59;
|
return 59;
|
||||||
|
|
||||||
// If there is a master and bot not in BG, use master's aura effects.
|
// If there is a master and bot not in BG, use master's aura effects.
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ bool CheckValuesAction::Execute(Event event)
|
|||||||
|
|
||||||
if (botAI->HasStrategy("map", BOT_STATE_NON_COMBAT) || botAI->HasStrategy("map full", BOT_STATE_NON_COMBAT))
|
if (botAI->HasStrategy("map", BOT_STATE_NON_COMBAT) || botAI->HasStrategy("map full", BOT_STATE_NON_COMBAT))
|
||||||
{
|
{
|
||||||
sTravelNodeMap->manageNodes(bot, botAI->HasStrategy("map full", BOT_STATE_NON_COMBAT));
|
TravelNodeMap::instance().manageNodes(bot, botAI->HasStrategy("map full", BOT_STATE_NON_COMBAT));
|
||||||
}
|
}
|
||||||
|
|
||||||
GuidVector possible_targets = *context->GetValue<GuidVector>("possible targets");
|
GuidVector possible_targets = *context->GetValue<GuidVector>("possible targets");
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ bool ChooseRpgTargetAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::mt19937 gen(time(0));
|
std::mt19937 gen(time(0));
|
||||||
sTravelMgr->weighted_shuffle(guidps.begin(), guidps.end(), relevances.begin(), relevances.end(), gen);
|
TravelMgr::instance().weighted_shuffle(guidps.begin(), guidps.end(), relevances.begin(), relevances.end(), gen);
|
||||||
|
|
||||||
GuidPosition guidP(guidps.front());
|
GuidPosition guidP(guidps.front());
|
||||||
if (!guidP)
|
if (!guidP)
|
||||||
@@ -279,7 +279,7 @@ bool ChooseRpgTargetAction::isUseful()
|
|||||||
|
|
||||||
GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target");
|
GuidPosition guidP = AI_VALUE(GuidPosition, "rpg target");
|
||||||
|
|
||||||
if (guidP && guidP.distance(bot) < sPlayerbotAIConfig->reactDistance * 2)
|
if (guidP && guidP.distance(bot) < sPlayerbotAIConfig.reactDistance * 2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// TravelTarget* travelTarget = AI_VALUE(TravelTarget*, "travel target"); //not used, line marked for removal.
|
// TravelTarget* travelTarget = AI_VALUE(TravelTarget*, "travel target"); //not used, line marked for removal.
|
||||||
@@ -330,7 +330,7 @@ bool ChooseRpgTargetAction::isFollowValid(Player* bot, WorldPosition pos)
|
|||||||
if (!botAI->HasStrategy("follow", BOT_STATE_NON_COMBAT))
|
if (!botAI->HasStrategy("follow", BOT_STATE_NON_COMBAT))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (bot->GetDistance(groupLeader) > sPlayerbotAIConfig->rpgDistance * 2)
|
if (bot->GetDistance(groupLeader) > sPlayerbotAIConfig.rpgDistance * 2)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Formation* formation = AI_VALUE(Formation*, "formation");
|
Formation* formation = AI_VALUE(Formation*, "formation");
|
||||||
@@ -340,7 +340,7 @@ bool ChooseRpgTargetAction::isFollowValid(Player* bot, WorldPosition pos)
|
|||||||
{
|
{
|
||||||
Player* player = groupLeader;
|
Player* player = groupLeader;
|
||||||
if (groupLeader && !groupLeader->isMoving() ||
|
if (groupLeader && !groupLeader->isMoving() ||
|
||||||
PAI_VALUE(WorldPosition, "last long move").distance(pos) < sPlayerbotAIConfig->reactDistance)
|
PAI_VALUE(WorldPosition, "last long move").distance(pos) < sPlayerbotAIConfig.reactDistance)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ bool AttackEnemyPlayerAction::isUseful()
|
|||||||
if (PlayerHasFlag::IsCapturingFlag(bot))
|
if (PlayerHasFlag::IsCapturingFlag(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return !sPlayerbotAIConfig->IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId());
|
return !sPlayerbotAIConfig.IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AttackEnemyFlagCarrierAction::isUseful()
|
bool AttackEnemyFlagCarrierAction::isUseful()
|
||||||
{
|
{
|
||||||
Unit* target = context->GetValue<Unit*>("enemy flag carrier")->Get();
|
Unit* target = context->GetValue<Unit*>("enemy flag carrier")->Get();
|
||||||
return target && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target), 100.0f) &&
|
return target && ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target), 100.0f) &&
|
||||||
PlayerHasFlag::IsCapturingFlag(bot);
|
PlayerHasFlag::IsCapturingFlag(bot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -366,7 +366,7 @@ bool ChooseTravelTargetAction::getBestDestination(std::vector<TravelDestination*
|
|||||||
|
|
||||||
WorldPosition botLocation(bot);
|
WorldPosition botLocation(bot);
|
||||||
std::vector<WorldPosition*> availablePoints =
|
std::vector<WorldPosition*> availablePoints =
|
||||||
sTravelMgr->getNextPoint(&botLocation, *activePoints); // Pick a good point.
|
TravelMgr::instance().getNextPoint(&botLocation, *activePoints); // Pick a good point.
|
||||||
|
|
||||||
if (availablePoints.empty()) // No points available.
|
if (availablePoints.empty()) // No points available.
|
||||||
return false;
|
return false;
|
||||||
@@ -488,7 +488,7 @@ bool ChooseTravelTargetAction::SetQuestTarget(TravelTarget* target, bool onlyCom
|
|||||||
if (newQuests)
|
if (newQuests)
|
||||||
{
|
{
|
||||||
// Prefer new quests near the player at lower levels.
|
// Prefer new quests near the player at lower levels.
|
||||||
activeDestinations = sTravelMgr->getQuestTravelDestinations(bot, -1, true, false, 400 + bot->GetLevel() * 10);
|
activeDestinations = TravelMgr::instance().getQuestTravelDestinations(bot, -1, true, false, 400 + bot->GetLevel() * 10);
|
||||||
}
|
}
|
||||||
if (activeQuests || completedQuests)
|
if (activeQuests || completedQuests)
|
||||||
{
|
{
|
||||||
@@ -510,7 +510,7 @@ bool ChooseTravelTargetAction::SetQuestTarget(TravelTarget* target, bool onlyCom
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
//Find quest takers or objectives
|
//Find quest takers or objectives
|
||||||
std::vector<TravelDestination*> questDestinations = sTravelMgr->getQuestTravelDestinations(bot, questId, true, false, 0);
|
std::vector<TravelDestination*> questDestinations = TravelMgr::instance().getQuestTravelDestinations(bot, questId, true, false, 0);
|
||||||
|
|
||||||
if (onlyClassQuest && activeDestinations.size() && questDestinations.size()) //Only do class quests if we have any.
|
if (onlyClassQuest && activeDestinations.size() && questDestinations.size()) //Only do class quests if we have any.
|
||||||
{
|
{
|
||||||
@@ -525,7 +525,7 @@ bool ChooseTravelTargetAction::SetQuestTarget(TravelTarget* target, bool onlyCom
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (newQuests && activeDestinations.empty())
|
if (newQuests && activeDestinations.empty())
|
||||||
activeDestinations = sTravelMgr->getQuestTravelDestinations(bot, -1, true, false); //If we really don't find any new quests look futher away.
|
activeDestinations = TravelMgr::instance().getQuestTravelDestinations(bot, -1, true, false); //If we really don't find any new quests look futher away.
|
||||||
|
|
||||||
if (botAI->HasStrategy("debug travel", BotState::BOT_STATE_NON_COMBAT))
|
if (botAI->HasStrategy("debug travel", BotState::BOT_STATE_NON_COMBAT))
|
||||||
botAI->TellMasterNoFacing(std::to_string(activeDestinations.size()) + " quest destinations found.");
|
botAI->TellMasterNoFacing(std::to_string(activeDestinations.size()) + " quest destinations found.");
|
||||||
@@ -547,7 +547,7 @@ bool ChooseTravelTargetAction::SetNewQuestTarget(TravelTarget* target)
|
|||||||
|
|
||||||
// Find quest givers.
|
// Find quest givers.
|
||||||
std::vector<TravelDestination*> TravelDestinations =
|
std::vector<TravelDestination*> TravelDestinations =
|
||||||
sTravelMgr->getQuestTravelDestinations(bot, -1, botAI->HasRealPlayerMaster());
|
TravelMgr::instance().getQuestTravelDestinations(bot, -1, botAI->HasRealPlayerMaster());
|
||||||
|
|
||||||
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
||||||
|
|
||||||
@@ -576,7 +576,7 @@ bool ChooseTravelTargetAction::SetRpgTarget(TravelTarget* target)
|
|||||||
|
|
||||||
// Find rpg npcs
|
// Find rpg npcs
|
||||||
std::vector<TravelDestination*> TravelDestinations =
|
std::vector<TravelDestination*> TravelDestinations =
|
||||||
sTravelMgr->getRpgTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
TravelMgr::instance().getRpgTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
||||||
|
|
||||||
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
||||||
|
|
||||||
@@ -605,7 +605,7 @@ bool ChooseTravelTargetAction::SetGrindTarget(TravelTarget* target)
|
|||||||
|
|
||||||
// Find grind mobs.
|
// Find grind mobs.
|
||||||
std::vector<TravelDestination*> TravelDestinations =
|
std::vector<TravelDestination*> TravelDestinations =
|
||||||
sTravelMgr->getGrindTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
TravelMgr::instance().getGrindTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
||||||
|
|
||||||
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
||||||
|
|
||||||
@@ -634,7 +634,7 @@ bool ChooseTravelTargetAction::SetBossTarget(TravelTarget* target)
|
|||||||
|
|
||||||
// Find boss mobs.
|
// Find boss mobs.
|
||||||
std::vector<TravelDestination*> TravelDestinations =
|
std::vector<TravelDestination*> TravelDestinations =
|
||||||
sTravelMgr->getBossTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
TravelMgr::instance().getBossTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
||||||
|
|
||||||
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
||||||
|
|
||||||
@@ -662,7 +662,7 @@ bool ChooseTravelTargetAction::SetExploreTarget(TravelTarget* target)
|
|||||||
WorldPosition botLocation(bot);
|
WorldPosition botLocation(bot);
|
||||||
|
|
||||||
// Find quest givers.
|
// Find quest givers.
|
||||||
std::vector<TravelDestination*> TravelDestinations = sTravelMgr->getExploreTravelDestinations(bot, true, true);
|
std::vector<TravelDestination*> TravelDestinations = TravelMgr::instance().getExploreTravelDestinations(bot, true, true);
|
||||||
|
|
||||||
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
activeDestinations.insert(activeDestinations.end(), TravelDestinations.begin(), TravelDestinations.end());
|
||||||
/*
|
/*
|
||||||
@@ -681,7 +681,7 @@ bool ChooseTravelTargetAction::SetExploreTarget(TravelTarget* target)
|
|||||||
|
|
||||||
if (activePoints.empty())
|
if (activePoints.empty())
|
||||||
{
|
{
|
||||||
TravelDestinations = sTravelMgr->getExploreTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
TravelDestinations = TravelMgr::instance().getExploreTravelDestinations(bot, botAI->HasRealPlayerMaster());
|
||||||
|
|
||||||
for (auto& activeTarget : activeDestinations)
|
for (auto& activeTarget : activeDestinations)
|
||||||
{
|
{
|
||||||
@@ -710,7 +710,7 @@ bool ChooseTravelTargetAction::SetNpcFlagTarget(TravelTarget* target, std::vecto
|
|||||||
|
|
||||||
std::vector<TravelDestination*> dests;
|
std::vector<TravelDestination*> dests;
|
||||||
|
|
||||||
for (auto& d : sTravelMgr->getRpgTravelDestinations(bot, true, true))
|
for (auto& d : TravelMgr::instance().getRpgTravelDestinations(bot, true, true))
|
||||||
{
|
{
|
||||||
if (!d->getEntry())
|
if (!d->getEntry())
|
||||||
continue;
|
continue;
|
||||||
@@ -813,7 +813,7 @@ std::vector<TravelDestination*> TravelMgr::getBossTravelDestinations(Player* bot
|
|||||||
|
|
||||||
bool ChooseTravelTargetAction::SetNullTarget(TravelTarget* target)
|
bool ChooseTravelTargetAction::SetNullTarget(TravelTarget* target)
|
||||||
{
|
{
|
||||||
target->setTarget(sTravelMgr->nullTravelDestination, sTravelMgr->nullWorldPosition, true);
|
target->setTarget(TravelMgr::instance().nullTravelDestination, TravelMgr::instance().nullWorldPosition, true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -832,7 +832,7 @@ TravelDestination* ChooseTravelTargetAction::FindDestination(Player* bot, std::s
|
|||||||
//Quests
|
//Quests
|
||||||
if (quests)
|
if (quests)
|
||||||
{
|
{
|
||||||
for (auto& d : sTravelMgr->getQuestTravelDestinations(bot, 0, true, true))
|
for (auto& d : TravelMgr::instance().getQuestTravelDestinations(bot, 0, true, true))
|
||||||
{
|
{
|
||||||
if (strstri(d->getTitle().c_str(), name.c_str()))
|
if (strstri(d->getTitle().c_str(), name.c_str()))
|
||||||
dests.push_back(d);
|
dests.push_back(d);
|
||||||
@@ -842,7 +842,7 @@ TravelDestination* ChooseTravelTargetAction::FindDestination(Player* bot, std::s
|
|||||||
//Zones
|
//Zones
|
||||||
if (zones)
|
if (zones)
|
||||||
{
|
{
|
||||||
for (auto& d : sTravelMgr->getExploreTravelDestinations(bot, true, true))
|
for (auto& d : TravelMgr::instance().getExploreTravelDestinations(bot, true, true))
|
||||||
{
|
{
|
||||||
if (strstri(d->getTitle().c_str(), name.c_str()))
|
if (strstri(d->getTitle().c_str(), name.c_str()))
|
||||||
dests.push_back(d);
|
dests.push_back(d);
|
||||||
@@ -852,7 +852,7 @@ TravelDestination* ChooseTravelTargetAction::FindDestination(Player* bot, std::s
|
|||||||
//Npcs
|
//Npcs
|
||||||
if (npcs)
|
if (npcs)
|
||||||
{
|
{
|
||||||
for (auto& d : sTravelMgr->getRpgTravelDestinations(bot, true, true))
|
for (auto& d : TravelMgr::instance().getRpgTravelDestinations(bot, true, true))
|
||||||
{
|
{
|
||||||
if (strstri(d->getTitle().c_str(), name.c_str()))
|
if (strstri(d->getTitle().c_str(), name.c_str()))
|
||||||
dests.push_back(d);
|
dests.push_back(d);
|
||||||
@@ -862,7 +862,7 @@ TravelDestination* ChooseTravelTargetAction::FindDestination(Player* bot, std::s
|
|||||||
//Mobs
|
//Mobs
|
||||||
if (mobs)
|
if (mobs)
|
||||||
{
|
{
|
||||||
for (auto& d : sTravelMgr->getGrindTravelDestinations(bot, true, true, 5000.0f))
|
for (auto& d : TravelMgr::instance().getGrindTravelDestinations(bot, true, true, 5000.0f))
|
||||||
{
|
{
|
||||||
if (strstri(d->getTitle().c_str(), name.c_str()))
|
if (strstri(d->getTitle().c_str(), name.c_str()))
|
||||||
dests.push_back(d);
|
dests.push_back(d);
|
||||||
@@ -872,7 +872,7 @@ TravelDestination* ChooseTravelTargetAction::FindDestination(Player* bot, std::s
|
|||||||
//Bosses
|
//Bosses
|
||||||
if (bosses)
|
if (bosses)
|
||||||
{
|
{
|
||||||
for (auto& d : sTravelMgr->getBossTravelDestinations(bot, true, true))
|
for (auto& d : TravelMgr::instance().getBossTravelDestinations(bot, true, true))
|
||||||
{
|
{
|
||||||
if (strstri(d->getTitle().c_str(), name.c_str()))
|
if (strstri(d->getTitle().c_str(), name.c_str()))
|
||||||
dests.push_back(d);
|
dests.push_back(d);
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ bool SwitchToMeleeAction::isUseful()
|
|||||||
return botAI->HasStrategy("ranged", BOT_STATE_COMBAT) &&
|
return botAI->HasStrategy("ranged", BOT_STATE_COMBAT) &&
|
||||||
((bot->IsInCombat() && target &&
|
((bot->IsInCombat() && target &&
|
||||||
(target->GetVictim() == bot && (!bot->GetGroup() || lastFlee) &&
|
(target->GetVictim() == bot && (!bot->GetGroup() || lastFlee) &&
|
||||||
sServerFacade->IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "current target"), 8.0f))) ||
|
ServerFacade::instance().IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "current target"), 8.0f))) ||
|
||||||
(!bot->IsInCombat()));
|
(!bot->IsInCombat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ bool SwitchToRangedAction::isUseful()
|
|||||||
return botAI->HasStrategy("close", BOT_STATE_COMBAT) && hasAmmo &&
|
return botAI->HasStrategy("close", BOT_STATE_COMBAT) && hasAmmo &&
|
||||||
((bot->IsInCombat() && target &&
|
((bot->IsInCombat() && target &&
|
||||||
((target->GetVictim() != bot || target->GetTarget() != bot->GetGUID()) ||
|
((target->GetVictim() != bot || target->GetTarget() != bot->GetGUID()) ||
|
||||||
sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "current target"), 8.0f))) ||
|
ServerFacade::instance().IsDistanceGreaterThan(AI_VALUE2(float, "distance", "current target"), 8.0f))) ||
|
||||||
(!bot->IsInCombat()));
|
(!bot->IsInCombat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
|
|
||||||
if (text == "scan")
|
if (text == "scan")
|
||||||
{
|
{
|
||||||
sPlayerbotAIConfig->openLog("scan.csv", "w");
|
sPlayerbotAIConfig.openLog("scan.csv", "w");
|
||||||
|
|
||||||
uint32 i = 0;
|
uint32 i = 0;
|
||||||
for (auto p : WorldPosition().getCreaturesNear())
|
for (auto p : WorldPosition().getCreaturesNear())
|
||||||
@@ -36,15 +36,15 @@ bool DebugAction::Execute(Event event)
|
|||||||
|
|
||||||
pos.printWKT(out);
|
pos.printWKT(out);
|
||||||
|
|
||||||
sPlayerbotAIConfig->log("scan.csv", out.str().c_str());
|
sPlayerbotAIConfig.log("scan.csv", out.str().c_str());
|
||||||
|
|
||||||
if (zoneId == 0 && areaId == 0)
|
if (zoneId == 0 && areaId == 0)
|
||||||
{
|
{
|
||||||
sPlayerbotAIConfig->log("x", out.str().c_str());
|
sPlayerbotAIConfig.log("x", out.str().c_str());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sPlayerbotAIConfig->log("y", out.str().c_str());
|
sPlayerbotAIConfig.log("y", out.str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
i = zoneId;
|
i = zoneId;
|
||||||
@@ -53,8 +53,8 @@ bool DebugAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
else if (text.find("printmap") != std::string::npos)
|
else if (text.find("printmap") != std::string::npos)
|
||||||
{
|
{
|
||||||
sTravelNodeMap->printMap();
|
TravelNodeMap::instance().printMap();
|
||||||
sTravelNodeMap->printNodeStore();
|
TravelNodeMap::instance().printNodeStore();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("travel ") != std::string::npos)
|
else if (text.find("travel ") != std::string::npos)
|
||||||
@@ -72,7 +72,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::vector<WorldPosition> beginPath, endPath;
|
std::vector<WorldPosition> beginPath, endPath;
|
||||||
TravelNodeRoute route = sTravelNodeMap->getRoute(botPos, *points.front(), beginPath, bot);
|
TravelNodeRoute route = TravelNodeMap::instance().getRoute(botPos, *points.front(), beginPath, bot);
|
||||||
|
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << "Traveling to " << dest->getTitle() << ": ";
|
out << "Traveling to " << dest->getTitle() << ": ";
|
||||||
@@ -108,7 +108,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
|
|
||||||
out << quest->GetTitle() << ": ";
|
out << quest->GetTitle() << ": ";
|
||||||
|
|
||||||
QuestContainer* cont = sTravelMgr->quests[questId];
|
QuestContainer* cont = TravelMgr::instance().quests[questId];
|
||||||
|
|
||||||
for (auto g : cont->questGivers)
|
for (auto g : cont->questGivers)
|
||||||
{
|
{
|
||||||
@@ -135,11 +135,11 @@ bool DebugAction::Execute(Event event)
|
|||||||
else if (text.find("quest") != std::string::npos)
|
else if (text.find("quest") != std::string::npos)
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << sTravelMgr->quests.size() << " quests ";
|
out << TravelMgr::instance().quests.size() << " quests ";
|
||||||
|
|
||||||
uint32 noT = 0, noG = 0, noO = 0;
|
uint32 noT = 0, noG = 0, noO = 0;
|
||||||
|
|
||||||
for (auto q : sTravelMgr->quests)
|
for (auto q : TravelMgr::instance().quests)
|
||||||
{
|
{
|
||||||
if (q.second->questGivers.empty())
|
if (q.second->questGivers.empty())
|
||||||
noG++;
|
noG++;
|
||||||
@@ -164,7 +164,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
|
|
||||||
// uint32 noT = 0, noG = 0, noO = 0; //not used, line marked for removal.
|
// uint32 noT = 0, noG = 0, noO = 0; //not used, line marked for removal.
|
||||||
|
|
||||||
for (auto q : sTravelMgr->quests)
|
for (auto q : TravelMgr::instance().quests)
|
||||||
{
|
{
|
||||||
Quest const* quest = sObjectMgr->GetQuestTemplate(q.first);
|
Quest const* quest = sObjectMgr->GetQuestTemplate(q.first);
|
||||||
|
|
||||||
@@ -194,16 +194,16 @@ bool DebugAction::Execute(Event event)
|
|||||||
|
|
||||||
std::string const name = "USER:" + text.substr(9);
|
std::string const name = "USER:" + text.substr(9);
|
||||||
|
|
||||||
/* TravelNode* startNode = */ sTravelNodeMap->addNode(pos, name, false, false); // startNode not used, but addNode as side effect, fragment marked for removal.
|
/* TravelNode* startNode = */ TravelNodeMap::instance().addNode(pos, name, false, false); // startNode not used, but addNode as side effect, fragment marked for removal.
|
||||||
|
|
||||||
for (auto& endNode : sTravelNodeMap->getNodes(pos, 2000))
|
for (auto& endNode : TravelNodeMap::instance().getNodes(pos, 2000))
|
||||||
{
|
{
|
||||||
endNode->setLinked(false);
|
endNode->setLinked(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
botAI->TellMasterNoFacing("Node " + name + " created.");
|
botAI->TellMasterNoFacing("Node " + name + " created.");
|
||||||
|
|
||||||
sTravelNodeMap->setHasToGen();
|
TravelNodeMap::instance().setHasToGen();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -211,7 +211,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
WorldPosition pos(bot);
|
WorldPosition pos(bot);
|
||||||
|
|
||||||
TravelNode* startNode = sTravelNodeMap->getNode(pos, nullptr, 50);
|
TravelNode* startNode = TravelNodeMap::instance().getNode(pos, nullptr, 50);
|
||||||
|
|
||||||
if (!startNode)
|
if (!startNode)
|
||||||
return false;
|
return false;
|
||||||
@@ -221,24 +221,24 @@ bool DebugAction::Execute(Event event)
|
|||||||
botAI->TellMasterNoFacing("Node can not be removed.");
|
botAI->TellMasterNoFacing("Node can not be removed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
sTravelNodeMap->m_nMapMtx.lock();
|
TravelNodeMap::instance().m_nMapMtx.lock();
|
||||||
sTravelNodeMap->removeNode(startNode);
|
TravelNodeMap::instance().removeNode(startNode);
|
||||||
botAI->TellMasterNoFacing("Node removed.");
|
botAI->TellMasterNoFacing("Node removed.");
|
||||||
sTravelNodeMap->m_nMapMtx.unlock();
|
TravelNodeMap::instance().m_nMapMtx.unlock();
|
||||||
|
|
||||||
sTravelNodeMap->setHasToGen();
|
TravelNodeMap::instance().setHasToGen();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("reset node") != std::string::npos)
|
else if (text.find("reset node") != std::string::npos)
|
||||||
{
|
{
|
||||||
for (auto& node : sTravelNodeMap->getNodes())
|
for (auto& node : TravelNodeMap::instance().getNodes())
|
||||||
node->setLinked(false);
|
node->setLinked(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("reset path") != std::string::npos)
|
else if (text.find("reset path") != std::string::npos)
|
||||||
{
|
{
|
||||||
for (auto& node : sTravelNodeMap->getNodes())
|
for (auto& node : TravelNodeMap::instance().getNodes())
|
||||||
for (auto& path : *node->getLinks())
|
for (auto& path : *node->getLinks())
|
||||||
node->removeLinkTo(path.first, true);
|
node->removeLinkTo(path.first, true);
|
||||||
return true;
|
return true;
|
||||||
@@ -246,23 +246,23 @@ bool DebugAction::Execute(Event event)
|
|||||||
else if (text.find("gen node") != std::string::npos)
|
else if (text.find("gen node") != std::string::npos)
|
||||||
{
|
{
|
||||||
// Pathfinder
|
// Pathfinder
|
||||||
sTravelNodeMap->generateNodes();
|
TravelNodeMap::instance().generateNodes();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("gen path") != std::string::npos)
|
else if (text.find("gen path") != std::string::npos)
|
||||||
{
|
{
|
||||||
sTravelNodeMap->generatePaths();
|
TravelNodeMap::instance().generatePaths();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("crop path") != std::string::npos)
|
else if (text.find("crop path") != std::string::npos)
|
||||||
{
|
{
|
||||||
sTravelNodeMap->removeUselessPaths();
|
TravelNodeMap::instance().removeUselessPaths();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("save node") != std::string::npos)
|
else if (text.find("save node") != std::string::npos)
|
||||||
{
|
{
|
||||||
sTravelNodeMap->printNodeStore();
|
TravelNodeMap::instance().printNodeStore();
|
||||||
sTravelNodeMap->saveNodeStore();
|
TravelNodeMap::instance().saveNodeStore();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (text.find("load node") != std::string::npos)
|
else if (text.find("load node") != std::string::npos)
|
||||||
@@ -270,8 +270,8 @@ bool DebugAction::Execute(Event event)
|
|||||||
std::thread t(
|
std::thread t(
|
||||||
[]
|
[]
|
||||||
{
|
{
|
||||||
sTravelNodeMap->removeNodes();
|
TravelNodeMap::instance().removeNodes();
|
||||||
sTravelNodeMap->loadNodeStore();
|
TravelNodeMap::instance().loadNodeStore();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.detach();
|
t.detach();
|
||||||
@@ -282,7 +282,7 @@ bool DebugAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
WorldPosition pos(bot);
|
WorldPosition pos(bot);
|
||||||
|
|
||||||
std::vector<TravelNode*> nodes = sTravelNodeMap->getNodes(pos, 500);
|
std::vector<TravelNode*> nodes = TravelNodeMap::instance().getNodes(pos, 500);
|
||||||
|
|
||||||
for (auto& node : nodes)
|
for (auto& node : nodes)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
bool DelayAction::Execute(Event event)
|
bool DelayAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
uint32 delay = sPlayerbotAIConfig->passiveDelay + sPlayerbotAIConfig->globalCoolDown;
|
uint32 delay = sPlayerbotAIConfig.passiveDelay + sPlayerbotAIConfig.globalCoolDown;
|
||||||
|
|
||||||
botAI->SetNextCheckDelay(delay);
|
botAI->SetNextCheckDelay(delay);
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ bool CleanQuestLogAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->dropObsoleteQuests)
|
if (!sPlayerbotAIConfig.dropObsoleteQuests)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ void EmoteActionBase::InitEmotes()
|
|||||||
|
|
||||||
bool EmoteActionBase::Emote(Unit* target, uint32 type, bool textEmote)
|
bool EmoteActionBase::Emote(Unit* target, uint32 type, bool textEmote)
|
||||||
{
|
{
|
||||||
if (target && !bot->HasInArc(static_cast<float>(M_PI), target, sPlayerbotAIConfig->sightDistance))
|
if (target && !bot->HasInArc(static_cast<float>(M_PI), target, sPlayerbotAIConfig.sightDistance))
|
||||||
bot->SetFacingToObject(target);
|
bot->SetFacingToObject(target);
|
||||||
|
|
||||||
ObjectGuid oldSelection = bot->GetTarget();
|
ObjectGuid oldSelection = bot->GetTarget();
|
||||||
@@ -100,7 +100,7 @@ bool EmoteActionBase::Emote(Unit* target, uint32 type, bool textEmote)
|
|||||||
if (player)
|
if (player)
|
||||||
{
|
{
|
||||||
PlayerbotAI* playerBotAI = GET_PLAYERBOT_AI(player);
|
PlayerbotAI* playerBotAI = GET_PLAYERBOT_AI(player);
|
||||||
if (playerBotAI && !player->HasInArc(static_cast<float>(M_PI), bot, sPlayerbotAIConfig->sightDistance))
|
if (playerBotAI && !player->HasInArc(static_cast<float>(M_PI), bot, sPlayerbotAIConfig.sightDistance))
|
||||||
{
|
{
|
||||||
player->SetFacingToObject(bot);
|
player->SetFacingToObject(bot);
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ Unit* EmoteActionBase::GetTarget()
|
|||||||
for (GuidVector::iterator i = nfp.begin(); i != nfp.end(); ++i)
|
for (GuidVector::iterator i = nfp.begin(); i != nfp.end(); ++i)
|
||||||
{
|
{
|
||||||
Unit* unit = botAI->GetUnit(*i);
|
Unit* unit = botAI->GetUnit(*i);
|
||||||
if (unit && sServerFacade->GetDistance2d(bot, unit) < sPlayerbotAIConfig->tooCloseDistance)
|
if (unit && ServerFacade::instance().GetDistance2d(bot, unit) < sPlayerbotAIConfig.tooCloseDistance)
|
||||||
targets.push_back(unit);
|
targets.push_back(unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -618,8 +618,8 @@ bool EmoteActionBase::ReceiveEmote(Player* source, uint32 emote, bool verbal)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source && !bot->isMoving() && !bot->HasInArc(static_cast<float>(M_PI), source, sPlayerbotAIConfig->farDistance))
|
if (source && !bot->isMoving() && !bot->HasInArc(static_cast<float>(M_PI), source, sPlayerbotAIConfig.farDistance))
|
||||||
sServerFacade->SetFacingTo(bot, source);
|
ServerFacade::instance().SetFacingTo(bot, source);
|
||||||
|
|
||||||
if (verbal)
|
if (verbal)
|
||||||
{
|
{
|
||||||
@@ -689,7 +689,7 @@ bool EmoteAction::Execute(Event event)
|
|||||||
p >> emoteId >> source;
|
p >> emoteId >> source;
|
||||||
|
|
||||||
pSource = ObjectAccessor::FindPlayer(source);
|
pSource = ObjectAccessor::FindPlayer(source);
|
||||||
if (pSource && pSource != bot && sServerFacade->GetDistance2d(bot, pSource) < sPlayerbotAIConfig->farDistance &&
|
if (pSource && pSource != bot && ServerFacade::instance().GetDistance2d(bot, pSource) < sPlayerbotAIConfig.farDistance &&
|
||||||
emoteId != EMOTE_ONESHOT_NONE)
|
emoteId != EMOTE_ONESHOT_NONE)
|
||||||
{
|
{
|
||||||
if ((pSource->GetGUID() != bot->GetGUID()) &&
|
if ((pSource->GetGUID() != bot->GetGUID()) &&
|
||||||
@@ -737,7 +737,7 @@ bool EmoteAction::Execute(Event event)
|
|||||||
// time_t lastEmote = AI_VALUE2(time_t, "last emote", qualifier); //not used, line marked for removal.
|
// time_t lastEmote = AI_VALUE2(time_t, "last emote", qualifier); //not used, line marked for removal.
|
||||||
botAI->GetAiObjectContext()
|
botAI->GetAiObjectContext()
|
||||||
->GetValue<time_t>("last emote", qualifier)
|
->GetValue<time_t>("last emote", qualifier)
|
||||||
->Set(time(nullptr) + urand(1000, sPlayerbotAIConfig->repeatDelay) / 1000);
|
->Set(time(nullptr) + urand(1000, sPlayerbotAIConfig.repeatDelay) / 1000);
|
||||||
param = qualifier;
|
param = qualifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ void EquipAction::EquipItem(Item* item)
|
|||||||
|
|
||||||
bool EquipUpgradesAction::Execute(Event event)
|
bool EquipUpgradesAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->autoEquipUpgradeLoot && !sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sPlayerbotAIConfig.autoEquipUpgradeLoot && !sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (event.GetSource() == "trade status")
|
if (event.GetSource() == "trade status")
|
||||||
|
|||||||
@@ -272,9 +272,9 @@ bool MoveNearWaterAction::isPossible()
|
|||||||
float fishingSearchWindow;
|
float fishingSearchWindow;
|
||||||
|
|
||||||
if (master)
|
if (master)
|
||||||
fishingSearchWindow = sPlayerbotAIConfig->fishingDistanceFromMaster;
|
fishingSearchWindow = sPlayerbotAIConfig.fishingDistanceFromMaster;
|
||||||
else
|
else
|
||||||
fishingSearchWindow = sPlayerbotAIConfig->fishingDistance;
|
fishingSearchWindow = sPlayerbotAIConfig.fishingDistance;
|
||||||
|
|
||||||
WorldPosition fishingHole = FindFishingHole(botAI);
|
WorldPosition fishingHole = FindFishingHole(botAI);
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@ bool EquipFishingPoleAction::isUseful()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
bot->StoreNewItemInBestSlots(FISHING_POLE, 1); // Try to get a fishing pole
|
bot->StoreNewItemInBestSlots(FISHING_POLE, 1); // Try to get a fishing pole
|
||||||
return true;
|
return true;
|
||||||
@@ -396,7 +396,7 @@ bool EquipFishingPoleAction::isUseful()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string masterName = master->GetName();
|
std::string masterName = master->GetName();
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"no_fishing_pole_error", "I don't have a Fishing Pole",{});
|
"no_fishing_pole_error", "I don't have a Fishing Pole",{});
|
||||||
botAI->Whisper(text, masterName);
|
botAI->Whisper(text, masterName);
|
||||||
|
|
||||||
@@ -499,7 +499,7 @@ bool EndMasterFishingAction::isUseful()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
WorldPosition nearWater = FindWaterRadial(bot, bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(),
|
WorldPosition nearWater = FindWaterRadial(bot, bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(),
|
||||||
bot->GetMap(), bot->GetPhaseMask(), MIN_DISTANCE_TO_WATER, sPlayerbotAIConfig->endFishingWithMaster, 10.0f);
|
bot->GetMap(), bot->GetPhaseMask(), MIN_DISTANCE_TO_WATER, sPlayerbotAIConfig.endFishingWithMaster, 10.0f);
|
||||||
return !nearWater.IsValid();
|
return !nearWater.IsValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ bool FollowAction::Execute(Event event)
|
|||||||
// botAI->PetFollow();
|
// botAI->PetFollow();
|
||||||
// }
|
// }
|
||||||
// if (moved)
|
// if (moved)
|
||||||
// botAI->SetNextCheckDelay(sPlayerbotAIConfig->reactDelay);
|
// botAI->SetNextCheckDelay(sPlayerbotAIConfig.reactDelay);
|
||||||
|
|
||||||
return moved;
|
return moved;
|
||||||
}
|
}
|
||||||
@@ -98,9 +98,9 @@ bool FollowAction::isUseful()
|
|||||||
distance = bot->GetDistance(loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ());
|
distance = bot->GetDistance(loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ());
|
||||||
}
|
}
|
||||||
if (botAI->HasStrategy("master fishing", BOT_STATE_NON_COMBAT))
|
if (botAI->HasStrategy("master fishing", BOT_STATE_NON_COMBAT))
|
||||||
return sServerFacade->IsDistanceGreaterThan(distance, sPlayerbotAIConfig->fishingDistanceFromMaster);
|
return ServerFacade::instance().IsDistanceGreaterThan(distance, sPlayerbotAIConfig.fishingDistanceFromMaster);
|
||||||
|
|
||||||
return sServerFacade->IsDistanceGreaterThan(distance, formation->GetMaxDistance());
|
return ServerFacade::instance().IsDistanceGreaterThan(distance, formation->GetMaxDistance());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FollowAction::CanDeadFollow(Unit* target)
|
bool FollowAction::CanDeadFollow(Unit* target)
|
||||||
@@ -130,7 +130,7 @@ bool FleeToGroupLeaderAction::Execute(Event event)
|
|||||||
WorldPosition bosPos(bot);
|
WorldPosition bosPos(bot);
|
||||||
float distance = bosPos.fDist(targetPos);
|
float distance = bosPos.fDist(targetPos);
|
||||||
|
|
||||||
if (distance < sPlayerbotAIConfig->reactDistance * 3)
|
if (distance < sPlayerbotAIConfig.reactDistance * 3)
|
||||||
{
|
{
|
||||||
if (!urand(0, 3))
|
if (!urand(0, 3))
|
||||||
botAI->TellMaster("I am close, wait for me!");
|
botAI->TellMaster("I am close, wait for me!");
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ bool TogglePetSpellAutoCastAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Debug message if pet spells have been toggled and debug is enabled
|
// Debug message if pet spells have been toggled and debug is enabled
|
||||||
if (toggled && sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (toggled && sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
botAI->TellMaster("Pet autocast spells have been toggled.");
|
botAI->TellMaster("Pet autocast spells have been toggled.");
|
||||||
|
|
||||||
return toggled;
|
return toggled;
|
||||||
@@ -185,7 +185,7 @@ bool SetPetStanceAction::Execute(Event /*event*/)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the default pet stance from the configuration
|
// Get the default pet stance from the configuration
|
||||||
int32 stance = sPlayerbotAIConfig->defaultPetStance;
|
int32 stance = sPlayerbotAIConfig.defaultPetStance;
|
||||||
ReactStates react = REACT_DEFENSIVE;
|
ReactStates react = REACT_DEFENSIVE;
|
||||||
std::string stanceText = "defensive (from config, fallback)";
|
std::string stanceText = "defensive (from config, fallback)";
|
||||||
|
|
||||||
@@ -221,7 +221,7 @@ bool SetPetStanceAction::Execute(Event /*event*/)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If debug is enabled in config, inform the master of the new stance
|
// If debug is enabled in config, inform the master of the new stance
|
||||||
if (sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
botAI->TellMaster("Pet stance set to " + stanceText + " (applied to all pets/guardians).");
|
botAI->TellMaster("Pet stance set to " + stanceText + " (applied to all pets/guardians).");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ namespace ai::buff
|
|||||||
{
|
{
|
||||||
std::string castName = baseName;
|
std::string castName = baseName;
|
||||||
Group* g = bot->GetGroup();
|
Group* g = bot->GetGroup();
|
||||||
if (!g || g->GetMembersCount() < static_cast<uint32>(sPlayerbotAIConfig->minBotsForGreaterBuff))
|
if (!g || g->GetMembersCount() < static_cast<uint32>(sPlayerbotAIConfig.minBotsForGreaterBuff))
|
||||||
return castName; // Group too small: stay in solo mode
|
return castName; // Group too small: stay in solo mode
|
||||||
|
|
||||||
if (std::string const groupName = GroupVariantFor(baseName); !groupName.empty())
|
if (std::string const groupName = GroupVariantFor(baseName); !groupName.empty())
|
||||||
@@ -114,7 +114,7 @@ namespace ai::buff
|
|||||||
time_t now = std::time(nullptr);
|
time_t now = std::time(nullptr);
|
||||||
uint32 botLow = static_cast<uint32>(bot->GetGUID().GetCounter());
|
uint32 botLow = static_cast<uint32>(bot->GetGUID().GetCounter());
|
||||||
time_t& last = s_lastWarn[ std::make_pair(botLow, groupName) ];
|
time_t& last = s_lastWarn[ std::make_pair(botLow, groupName) ];
|
||||||
if (!last || now - last >= sPlayerbotAIConfig->rpWarningCooldown) // Configurable anti-spam
|
if (!last || now - last >= sPlayerbotAIConfig.rpWarningCooldown) // Configurable anti-spam
|
||||||
{
|
{
|
||||||
// DB Key choice in regard of the buff
|
// DB Key choice in regard of the buff
|
||||||
std::string key;
|
std::string key;
|
||||||
@@ -132,7 +132,7 @@ namespace ai::buff
|
|||||||
placeholders["%group_spell"] = groupName;
|
placeholders["%group_spell"] = groupName;
|
||||||
placeholders["%base_spell"] = baseName;
|
placeholders["%base_spell"] = baseName;
|
||||||
|
|
||||||
std::string announceText = sPlayerbotTextMgr->GetBotTextOrDefault(key,
|
std::string announceText = PlayerbotTextMgr::instance().GetBotTextOrDefault(key,
|
||||||
"Out of components for %group_spell. Using %base_spell!", placeholders);
|
"Out of components for %group_spell. Using %base_spell!", placeholders);
|
||||||
|
|
||||||
announce(announceText);
|
announce(announceText);
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ bool CastSpellAction::isPossible()
|
|||||||
{
|
{
|
||||||
if (botAI->IsInVehicle() && !botAI->IsInVehicle(false, false, true))
|
if (botAI->IsInVehicle() && !botAI->IsInVehicle(false, false, true))
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster()))
|
if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster()))
|
||||||
{
|
{
|
||||||
LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", bot->GetName());
|
LOG_DEBUG("playerbots", "Can cast spell failed. Vehicle. - bot name: {}", bot->GetName());
|
||||||
}
|
}
|
||||||
@@ -94,7 +94,7 @@ bool CastSpellAction::isPossible()
|
|||||||
|
|
||||||
if (spell == "mount" && bot->IsInCombat())
|
if (spell == "mount" && bot->IsInCombat())
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster()))
|
if (!sPlayerbotAIConfig.logInGroupOnly || (bot->GetGroup() && botAI->HasRealPlayerMaster()))
|
||||||
{
|
{
|
||||||
LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", bot->GetName());
|
LOG_DEBUG("playerbots", "Can cast spell failed. Mount. - bot name: {}", bot->GetName());
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ bool CastSpellAction::isUseful()
|
|||||||
|
|
||||||
return spellTarget &&
|
return spellTarget &&
|
||||||
AI_VALUE2(bool, "spell cast useful",
|
AI_VALUE2(bool, "spell cast useful",
|
||||||
spell); // && sServerFacade->GetDistance2d(bot, spellTarget) <= (range + combatReach);
|
spell); // && ServerFacade::instance().GetDistance2d(bot, spellTarget) <= (range + combatReach);
|
||||||
}
|
}
|
||||||
|
|
||||||
CastMeleeSpellAction::CastMeleeSpellAction(PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell)
|
CastMeleeSpellAction::CastMeleeSpellAction(PlayerbotAI* botAI, std::string const spell) : CastSpellAction(botAI, spell)
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ Unit* GiveItemAction::GetTarget() { return AI_VALUE2(Unit*, "party member withou
|
|||||||
|
|
||||||
bool GiveItemAction::isUseful()
|
bool GiveItemAction::isUseful()
|
||||||
{
|
{
|
||||||
return GetTarget() && AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig->lowMana;
|
return GetTarget() && AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.lowMana;
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit* GiveFoodAction::GetTarget() { return AI_VALUE(Unit*, "party member without food"); }
|
Unit* GiveFoodAction::GetTarget() { return AI_VALUE(Unit*, "party member without food"); }
|
||||||
@@ -74,7 +74,7 @@ bool GiveFoodAction::isUseful()
|
|||||||
if (!GetTarget())
|
if (!GetTarget())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool isRandomBot = GetTarget()->IsPlayer() && sRandomPlayerbotMgr->IsRandomBot((Player*)GetTarget());
|
bool isRandomBot = GetTarget()->IsPlayer() && sRandomPlayerbotMgr.IsRandomBot((Player*)GetTarget());
|
||||||
|
|
||||||
return !isRandomBot || (isRandomBot && !botAI->HasCheat(BotCheatMask::food));
|
return !isRandomBot || (isRandomBot && !botAI->HasCheat(BotCheatMask::food));
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ bool GiveWaterAction::isUseful()
|
|||||||
if (!GetTarget())
|
if (!GetTarget())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool isRandomBot = GetTarget()->IsPlayer() && sRandomPlayerbotMgr->IsRandomBot((Player*)GetTarget());
|
bool isRandomBot = GetTarget()->IsPlayer() && sRandomPlayerbotMgr.IsRandomBot((Player*)GetTarget());
|
||||||
|
|
||||||
return !isRandomBot || (isRandomBot && !botAI->HasCheat(BotCheatMask::food));
|
return !isRandomBot || (isRandomBot && !botAI->HasCheat(BotCheatMask::food));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ bool GoAction::Execute(Event event)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
botAI->TellMasterNoFacing("Clearing travel target");
|
botAI->TellMasterNoFacing("Clearing travel target");
|
||||||
target->setTarget(sTravelMgr->nullTravelDestination, sTravelMgr->nullWorldPosition);
|
target->setTarget(TravelMgr::instance().nullTravelDestination, TravelMgr::instance().nullWorldPosition);
|
||||||
target->setForced(false);
|
target->setForced(false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -75,8 +75,8 @@ bool GoAction::Execute(Event event)
|
|||||||
if (GameObject* go = botAI->GetGameObject(guid))
|
if (GameObject* go = botAI->GetGameObject(guid))
|
||||||
if (go->isSpawned())
|
if (go->isSpawned())
|
||||||
{
|
{
|
||||||
if (sServerFacade->IsDistanceGreaterThan(sServerFacade->GetDistance2d(bot, go),
|
if (ServerFacade::instance().IsDistanceGreaterThan(ServerFacade::instance().GetDistance2d(bot, go),
|
||||||
sPlayerbotAIConfig->reactDistance))
|
sPlayerbotAIConfig.reactDistance))
|
||||||
{
|
{
|
||||||
botAI->TellError("It is too far away");
|
botAI->TellError("It is too far away");
|
||||||
return false;
|
return false;
|
||||||
@@ -86,7 +86,7 @@ bool GoAction::Execute(Event event)
|
|||||||
out << "Moving to " << ChatHelper::FormatGameobject(go);
|
out << "Moving to " << ChatHelper::FormatGameobject(go);
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
return MoveNear(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ() + 0.5f,
|
return MoveNear(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ() + 0.5f,
|
||||||
sPlayerbotAIConfig->followDistance);
|
sPlayerbotAIConfig.followDistance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -106,7 +106,7 @@ bool GoAction::Execute(Event event)
|
|||||||
out << "Moving to " << unit->GetName();
|
out << "Moving to " << unit->GetName();
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
return MoveNear(bot->GetMapId(), unit->GetPositionX(), unit->GetPositionY(),
|
return MoveNear(bot->GetMapId(), unit->GetPositionX(), unit->GetPositionY(),
|
||||||
unit->GetPositionZ() + 0.5f, sPlayerbotAIConfig->followDistance);
|
unit->GetPositionZ() + 0.5f, sPlayerbotAIConfig.followDistance);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,8 +176,8 @@ bool GoAction::Execute(Event event)
|
|||||||
float z = bot->GetPositionZ();
|
float z = bot->GetPositionZ();
|
||||||
bot->UpdateAllowedPositionZ(x, y, z);
|
bot->UpdateAllowedPositionZ(x, y, z);
|
||||||
|
|
||||||
if (sServerFacade->IsDistanceGreaterThan(sServerFacade->GetDistance2d(bot, x, y),
|
if (ServerFacade::instance().IsDistanceGreaterThan(ServerFacade::instance().GetDistance2d(bot, x, y),
|
||||||
sPlayerbotAIConfig->reactDistance))
|
sPlayerbotAIConfig.reactDistance))
|
||||||
{
|
{
|
||||||
botAI->TellMaster("It is too far away");
|
botAI->TellMaster("It is too far away");
|
||||||
return false;
|
return false;
|
||||||
@@ -203,14 +203,14 @@ bool GoAction::Execute(Event event)
|
|||||||
out << "Moving to " << x1 << "," << y1;
|
out << "Moving to " << x1 << "," << y1;
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
|
|
||||||
return MoveNear(bot->GetMapId(), x, y, z + 0.5f, sPlayerbotAIConfig->followDistance);
|
return MoveNear(bot->GetMapId(), x, y, z + 0.5f, sPlayerbotAIConfig.followDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[param];
|
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[param];
|
||||||
if (pos.isSet())
|
if (pos.isSet())
|
||||||
{
|
{
|
||||||
if (sServerFacade->IsDistanceGreaterThan(sServerFacade->GetDistance2d(bot, pos.x, pos.y),
|
if (ServerFacade::instance().IsDistanceGreaterThan(ServerFacade::instance().GetDistance2d(bot, pos.x, pos.y),
|
||||||
sPlayerbotAIConfig->reactDistance))
|
sPlayerbotAIConfig.reactDistance))
|
||||||
{
|
{
|
||||||
botAI->TellError("It is too far away");
|
botAI->TellError("It is too far away");
|
||||||
return false;
|
return false;
|
||||||
@@ -219,7 +219,7 @@ bool GoAction::Execute(Event event)
|
|||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << "Moving to position " << param;
|
out << "Moving to position " << param;
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z + 0.5f, sPlayerbotAIConfig->followDistance);
|
return MoveNear(bot->GetMapId(), pos.x, pos.y, pos.z + 0.5f, sPlayerbotAIConfig.followDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
botAI->TellMaster("Whisper 'go x,y', 'go [game object]', 'go unit' or 'go position' and I will go there");
|
botAI->TellMaster("Whisper 'go x,y', 'go [game object]', 'go unit' or 'go position' and I will go there");
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ bool GreetAction::Execute(Event event)
|
|||||||
if (!player)
|
if (!player)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, player, sPlayerbotAIConfig->sightDistance))
|
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, player, sPlayerbotAIConfig.sightDistance))
|
||||||
bot->SetFacingToObject(player);
|
bot->SetFacingToObject(player);
|
||||||
|
|
||||||
ObjectGuid oldSel = bot->GetTarget();
|
ObjectGuid oldSel = bot->GetTarget();
|
||||||
|
|||||||
@@ -184,11 +184,11 @@ bool PetitionOfferNearbyAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->randomBotGroupNearby)
|
if (!sPlayerbotAIConfig.randomBotGroupNearby)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->sightDistance)
|
if (ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.sightDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Parse rpg target to quest action.
|
// Parse rpg target to quest action.
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->randomBotGuildNearby)
|
if (!sPlayerbotAIConfig.randomBotGuildNearby)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (guild->GetMemberSize() > 1000)
|
if (guild->GetMemberSize() > 1000)
|
||||||
@@ -185,7 +185,7 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
|
|
||||||
PlayerbotAI* botAi = GET_PLAYERBOT_AI(player);
|
PlayerbotAI* botAi = GET_PLAYERBOT_AI(player);
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->randomBotInvitePlayer && botAi && botAi->IsRealPlayer())
|
if (!sPlayerbotAIConfig.randomBotInvitePlayer && botAi && botAi->IsRealPlayer())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (botAi)
|
if (botAi)
|
||||||
@@ -193,16 +193,16 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
if (botAi->GetGuilderType() == GuilderType::SOLO && !botAi->HasRealPlayerMaster()) //Do not invite solo players.
|
if (botAi->GetGuilderType() == GuilderType::SOLO && !botAi->HasRealPlayerMaster()) //Do not invite solo players.
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (botAi->HasActivePlayerMaster() && !sRandomPlayerbotMgr->IsRandomBot(player)) //Do not invite alts of active players.
|
if (botAi->HasActivePlayerMaster() && !sRandomPlayerbotMgr.IsRandomBot(player)) //Do not invite alts of active players.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sameGroup = bot->GetGroup() && bot->GetGroup()->IsMember(player->GetGUID());
|
bool sameGroup = bot->GetGroup() && bot->GetGroup()->IsMember(player->GetGUID());
|
||||||
|
|
||||||
if (!sameGroup && sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->spellDistance)
|
if (!sameGroup && ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.spellDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->inviteChat && (sRandomPlayerbotMgr->IsRandomBot(bot) || !botAI->HasActivePlayerMaster()))
|
if (sPlayerbotAIConfig.inviteChat && (sRandomPlayerbotMgr.IsRandomBot(bot) || !botAI->HasActivePlayerMaster()))
|
||||||
{
|
{
|
||||||
/* std::map<std::string, std::string> placeholders;
|
/* std::map<std::string, std::string> placeholders;
|
||||||
placeholders["%name"] = player->GetName();
|
placeholders["%name"] = player->GetName();
|
||||||
@@ -210,8 +210,8 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
placeholders["%guildname"] = guild->GetName();
|
placeholders["%guildname"] = guild->GetName();
|
||||||
AreaTableEntry const* current_area = botAI->GetCurrentArea();
|
AreaTableEntry const* current_area = botAI->GetCurrentArea();
|
||||||
AreaTableEntry const* current_zone = botAI->GetCurrentZone();
|
AreaTableEntry const* current_zone = botAI->GetCurrentZone();
|
||||||
placeholders["%area_name"] = current_area ? current_area->area_name[BroadcastHelper::GetLocale()] : BOT_TEXT1("string_unknown_area");
|
placeholders["%area_name"] = current_area ? current_area->area_name[BroadcastHelper::GetLocale()] : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%zone_name"] = current_zone ? current_zone->area_name[BroadcastHelper::GetLocale()] : BOT_TEXT1("string_unknown_area");
|
placeholders["%zone_name"] = current_zone ? current_zone->area_name[BroadcastHelper::GetLocale()] : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
|
|
||||||
std::vector<std::string> lines;
|
std::vector<std::string> lines;
|
||||||
|
|
||||||
@@ -219,45 +219,45 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
switch ((urand(0, 10) * urand(0, 10)) / 10)
|
switch ((urand(0, 10) * urand(0, 10)) / 10)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
lines.push_back(BOT_TEXT2("Hey %name do you want to join my guild?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Hey %name do you want to join my guild?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
lines.push_back(BOT_TEXT2("Hey man you wanna join my guild %name?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Hey man you wanna join my guild %name?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
lines.push_back(BOT_TEXT2("I think you would be a good contribution to %guildname. Would you like to join %name?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("I think you would be a good contribution to %guildname. Would you like to join %name?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
lines.push_back(BOT_TEXT2("My guild %guildname has %members quality members. Would you like to make it 1 more %name?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("My guild %guildname has %members quality members. Would you like to make it 1 more %name?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
lines.push_back(BOT_TEXT2("Hey %name do you want to join %guildname? We have %members members and looking to become number 1 of the server.", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Hey %name do you want to join %guildname? We have %members members and looking to become number 1 of the server.", placeholders));
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
lines.push_back(BOT_TEXT2("I'm not really good at smalltalk. Do you wanna join my guild %name/r?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("I'm not really good at smalltalk. Do you wanna join my guild %name/r?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
lines.push_back(BOT_TEXT2("Welcome to %zone_name.... do you want to join my guild %name?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Welcome to %zone_name.... do you want to join my guild %name?", placeholders));
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
lines.push_back(BOT_TEXT2("%name, you should join my guild!", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("%name, you should join my guild!", placeholders));
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
lines.push_back(BOT_TEXT2("%name, I got this guild....", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("%name, I got this guild....", placeholders));
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
lines.push_back(BOT_TEXT2("You are actually going to join my guild %name?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("You are actually going to join my guild %name?", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("Haha.. you are the man! We are going to raid Molten...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Haha.. you are the man! We are going to raid Molten...", placeholders));
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
lines.push_back(BOT_TEXT2("Hey Hey! do you guys wanna join my gild????", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("Hey Hey! do you guys wanna join my gild????", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("We've got a bunch of high levels and we are really super friendly..", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("We've got a bunch of high levels and we are really super friendly..", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("..and watch your dog and do your homework...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("..and watch your dog and do your homework...", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("..and we raid once a week and are working on MC raids...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("..and we raid once a week and are working on MC raids...", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("..and we have more members than just me...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("..and we have more members than just me...", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("..and please stop I'm lonenly and we can get a ride the whole time...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("..and please stop I'm lonenly and we can get a ride the whole time...", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("..and it's really beautifull and I feel like crying...", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("..and it's really beautifull and I feel like crying...", placeholders));
|
||||||
lines.push_back(BOT_TEXT2("So what do you guys say are you going to join are you going to join?", placeholders));
|
lines.push_back(PlayerbotTextMgr::instance().GetBotText("So what do you guys say are you going to join are you going to join?", placeholders));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -274,7 +274,7 @@ bool GuildManageNearbyAction::Execute(Event event)
|
|||||||
|
|
||||||
if (botAI->DoSpecificAction("guild invite", Event("guild management", guid), true))
|
if (botAI->DoSpecificAction("guild invite", Event("guild management", guid), true))
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->inviteChat)
|
if (sPlayerbotAIConfig.inviteChat)
|
||||||
return true;
|
return true;
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ bool HireAction::Execute(Event event)
|
|||||||
if (!master)
|
if (!master)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint32 account = master->GetSession()->GetAccountId();
|
uint32 account = master->GetSession()->GetAccountId();
|
||||||
@@ -39,7 +39,7 @@ bool HireAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 discount = sRandomPlayerbotMgr->GetTradeDiscount(bot, master);
|
uint32 discount = sRandomPlayerbotMgr.GetTradeDiscount(bot, master);
|
||||||
uint32 m = 1 + (bot->GetLevel() / 10);
|
uint32 m = 1 + (bot->GetLevel() / 10);
|
||||||
uint32 moneyReq = m * 5000 * bot->GetLevel();
|
uint32 moneyReq = m * 5000 * bot->GetLevel();
|
||||||
if (discount < moneyReq)
|
if (discount < moneyReq)
|
||||||
@@ -54,7 +54,7 @@ bool HireAction::Execute(Event event)
|
|||||||
botAI->TellMaster("I will join you at your next relogin");
|
botAI->TellMaster("I will join you at your next relogin");
|
||||||
|
|
||||||
bot->SetMoney(moneyReq);
|
bot->SetMoney(moneyReq);
|
||||||
sRandomPlayerbotMgr->Remove(bot);
|
sRandomPlayerbotMgr.Remove(bot);
|
||||||
CharacterDatabase.Execute("UPDATE characters SET account = {} WHERE guid = {}", account,
|
CharacterDatabase.Execute("UPDATE characters SET account = {} WHERE guid = {}", account,
|
||||||
bot->GetGUID().GetCounter());
|
bot->GetGUID().GetCounter());
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ bool InviteToGroupAction::Invite(Player* inviter, Player* player)
|
|||||||
if (!group->isRaidGroup() && group->GetMembersCount() > 4)
|
if (!group->isRaidGroup() && group->GetMembersCount() > 4)
|
||||||
{
|
{
|
||||||
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(inviter->GetGUID());
|
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(inviter->GetGUID());
|
||||||
sPlayerbotWorldProcessor->QueueOperation(std::move(convertOp));
|
PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ bool InviteNearbyToGroupAction::Execute(Event event)
|
|||||||
if (player->GetGroup())
|
if (player->GetGroup())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer())
|
if (!sPlayerbotAIConfig.randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Group* group = bot->GetGroup();
|
Group* group = bot->GetGroup();
|
||||||
@@ -88,7 +88,7 @@ bool InviteNearbyToGroupAction::Execute(Event event)
|
|||||||
if (abs(int32(player->GetLevel() - bot->GetLevel())) > 2)
|
if (abs(int32(player->GetLevel() - bot->GetLevel())) > 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->sightDistance)
|
if (ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.sightDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// When inviting the 5th member of the group convert to raid for future invites.
|
// When inviting the 5th member of the group convert to raid for future invites.
|
||||||
@@ -96,19 +96,19 @@ bool InviteNearbyToGroupAction::Execute(Event event)
|
|||||||
bot->GetGroup()->GetMembersCount() > 3)
|
bot->GetGroup()->GetMembersCount() > 3)
|
||||||
{
|
{
|
||||||
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(bot->GetGUID());
|
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(bot->GetGUID());
|
||||||
sPlayerbotWorldProcessor->QueueOperation(std::move(convertOp));
|
PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->inviteChat && sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sPlayerbotAIConfig.inviteChat && sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
std::map<std::string, std::string> placeholders;
|
std::map<std::string, std::string> placeholders;
|
||||||
placeholders["%player"] = player->GetName();
|
placeholders["%player"] = player->GetName();
|
||||||
|
|
||||||
if (group && group->isRaidGroup())
|
if (group && group->isRaidGroup())
|
||||||
bot->Say(BOT_TEXT2("join_raid", placeholders),
|
bot->Say(PlayerbotTextMgr::instance().GetBotText("join_raid", placeholders),
|
||||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||||
else
|
else
|
||||||
bot->Say(BOT_TEXT2("join_group", placeholders),
|
bot->Say(PlayerbotTextMgr::instance().GetBotText("join_group", placeholders),
|
||||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ bool InviteNearbyToGroupAction::Execute(Event event)
|
|||||||
|
|
||||||
bool InviteNearbyToGroupAction::isUseful()
|
bool InviteNearbyToGroupAction::isUseful()
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->randomBotGroupNearby)
|
if (!sPlayerbotAIConfig.randomBotGroupNearby)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bot->InBattleground())
|
if (bot->InBattleground())
|
||||||
@@ -186,7 +186,7 @@ bool InviteGuildToGroupAction::Execute(Event event)
|
|||||||
if (player->isDND())
|
if (player->isDND())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer())
|
if (!sPlayerbotAIConfig.randomBotInvitePlayer && GET_PLAYERBOT_AI(player)->IsRealPlayer())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (player->IsBeingTeleported())
|
if (player->IsBeingTeleported())
|
||||||
@@ -221,7 +221,7 @@ bool InviteGuildToGroupAction::Execute(Event event)
|
|||||||
player->GetLevel() + 5) // Do not invite members that too low level or risk dragging them to deadly places.
|
player->GetLevel() + 5) // Do not invite members that too low level or risk dragging them to deadly places.
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!playerAi && sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->sightDistance)
|
if (!playerAi && ServerFacade::instance().GetDistance2d(bot, player) > sPlayerbotAIConfig.sightDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Group* group = bot->GetGroup();
|
Group* group = bot->GetGroup();
|
||||||
@@ -230,11 +230,11 @@ bool InviteGuildToGroupAction::Execute(Event event)
|
|||||||
bot->GetGroup()->GetMembersCount() > 3)
|
bot->GetGroup()->GetMembersCount() > 3)
|
||||||
{
|
{
|
||||||
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(bot->GetGUID());
|
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(bot->GetGUID());
|
||||||
sPlayerbotWorldProcessor->QueueOperation(std::move(convertOp));
|
PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->inviteChat &&
|
if (sPlayerbotAIConfig.inviteChat &&
|
||||||
(sRandomPlayerbotMgr->IsRandomBot(bot) || !botAI->HasActivePlayerMaster()))
|
(sRandomPlayerbotMgr.IsRandomBot(bot) || !botAI->HasActivePlayerMaster()))
|
||||||
{
|
{
|
||||||
BroadcastHelper::BroadcastGuildGroupOrRaidInvite(botAI, bot, player, group);
|
BroadcastHelper::BroadcastGuildGroupOrRaidInvite(botAI, bot, player, group);
|
||||||
}
|
}
|
||||||
@@ -373,7 +373,7 @@ bool LfgAction::Execute(Event event)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(requester->GetGUID());
|
auto convertOp = std::make_unique<GroupConvertToRaidOperation>(requester->GetGUID());
|
||||||
sPlayerbotWorldProcessor->QueueOperation(std::move(convertOp));
|
PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(convertOp));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ bool PartyCommandAction::Execute(Event event)
|
|||||||
Player* master = GetMaster();
|
Player* master = GetMaster();
|
||||||
if (master && member == master->GetName())
|
if (master && member == master->GetName())
|
||||||
{
|
{
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
Player* newMaster = botAI->FindNewMaster();
|
Player* newMaster = botAI->FindNewMaster();
|
||||||
if (newMaster || bot->InBattleground())
|
if (newMaster || bot->InBattleground())
|
||||||
@@ -150,7 +150,7 @@ bool LeaveFarAwayAction::isUseful()
|
|||||||
if (abs(int32(groupLeader->GetLevel() - bot->GetLevel())) > 4)
|
if (abs(int32(groupLeader->GetLevel() - bot->GetLevel())) > 4)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (bot->GetMapId() != groupLeader->GetMapId() || bot->GetDistance2d(groupLeader) >= 2 * sPlayerbotAIConfig->rpgDistance)
|
if (bot->GetMapId() != groupLeader->GetMapId() || bot->GetDistance2d(groupLeader) >= 2 * sPlayerbotAIConfig.rpgDistance)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ bool LfgJoinAction::Execute(Event event) { return JoinLFG(); }
|
|||||||
|
|
||||||
uint32 LfgJoinAction::GetRoles()
|
uint32 LfgJoinAction::GetRoles()
|
||||||
{
|
{
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
if (botAI->IsTank(bot))
|
if (botAI->IsTank(bot))
|
||||||
return PLAYER_ROLE_TANK;
|
return PLAYER_ROLE_TANK;
|
||||||
@@ -101,7 +101,7 @@ bool LfgJoinAction::JoinLFG()
|
|||||||
LfgDungeonSet list;
|
LfgDungeonSet list;
|
||||||
std::vector<uint32> selected;
|
std::vector<uint32> selected;
|
||||||
|
|
||||||
std::vector<uint32> dungeons = sRandomPlayerbotMgr->LfgDungeons[bot->GetTeamId()];
|
std::vector<uint32> dungeons = sRandomPlayerbotMgr.LfgDungeons[bot->GetTeamId()];
|
||||||
if (!dungeons.size())
|
if (!dungeons.size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -216,9 +216,9 @@ bool LfgAcceptAction::Execute(Event event)
|
|||||||
*packet << id << true;
|
*packet << id << true;
|
||||||
bot->GetSession()->QueuePacket(packet);
|
bot->GetSession()->QueuePacket(packet);
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot) && !bot->GetGroup())
|
if (sRandomPlayerbotMgr.IsRandomBot(bot) && !bot->GetGroup())
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->Refresh(bot);
|
sRandomPlayerbotMgr.Refresh(bot);
|
||||||
botAI->ResetStrategies();
|
botAI->ResetStrategies();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,9 +251,9 @@ bool LfgAcceptAction::Execute(Event event)
|
|||||||
*packet << id << true;
|
*packet << id << true;
|
||||||
bot->GetSession()->QueuePacket(packet);
|
bot->GetSession()->QueuePacket(packet);
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot) && !bot->GetGroup())
|
if (sRandomPlayerbotMgr.IsRandomBot(bot) && !bot->GetGroup())
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->Refresh(bot);
|
sRandomPlayerbotMgr.Refresh(bot);
|
||||||
botAI->ResetStrategies();
|
botAI->ResetStrategies();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -306,7 +306,7 @@ bool LfgTeleportAction::Execute(Event event)
|
|||||||
|
|
||||||
bool LfgJoinAction::isUseful()
|
bool LfgJoinAction::isUseful()
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->randomBotJoinLfg)
|
if (!sPlayerbotAIConfig.randomBotJoinLfg)
|
||||||
{
|
{
|
||||||
// botAI->ChangeStrategy("-lfg", BOT_STATE_NON_COMBAT);
|
// botAI->ChangeStrategy("-lfg", BOT_STATE_NON_COMBAT);
|
||||||
return false;
|
return false;
|
||||||
@@ -337,7 +337,7 @@ bool LfgJoinAction::isUseful()
|
|||||||
if (bot->isDead())
|
if (bot->isDead())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Map* map = bot->GetMap();
|
Map* map = bot->GetMap();
|
||||||
|
|||||||
@@ -107,14 +107,14 @@ uint32 ListQuestsAction::ListQuests(bool completed, bool silent, QuestTravelDeta
|
|||||||
if (travelDetail == QUEST_TRAVEL_DETAIL_SUMMARY)
|
if (travelDetail == QUEST_TRAVEL_DETAIL_SUMMARY)
|
||||||
{
|
{
|
||||||
std::vector<TravelDestination*> allDestinations =
|
std::vector<TravelDestination*> allDestinations =
|
||||||
sTravelMgr->getQuestTravelDestinations(bot, questId, true, true, -1);
|
TravelMgr::instance().getQuestTravelDestinations(bot, questId, true, true, -1);
|
||||||
std::vector<TravelDestination*> availDestinations =
|
std::vector<TravelDestination*> availDestinations =
|
||||||
sTravelMgr->getQuestTravelDestinations(bot, questId, botAI->GetMaster(), false, -1);
|
TravelMgr::instance().getQuestTravelDestinations(bot, questId, botAI->GetMaster(), false, -1);
|
||||||
|
|
||||||
uint32 desTot = allDestinations.size();
|
uint32 desTot = allDestinations.size();
|
||||||
uint32 desAvail = availDestinations.size();
|
uint32 desAvail = availDestinations.size();
|
||||||
uint32 desFull = desAvail - sTravelMgr->getQuestTravelDestinations(bot, questId, false, false, -1).size();
|
uint32 desFull = desAvail - TravelMgr::instance().getQuestTravelDestinations(bot, questId, false, false, -1).size();
|
||||||
uint32 desRange = desAvail - sTravelMgr->getQuestTravelDestinations(bot, questId, false, false).size();
|
uint32 desRange = desAvail - TravelMgr::instance().getQuestTravelDestinations(bot, questId, false, false).size();
|
||||||
|
|
||||||
uint32 tpoints = 0;
|
uint32 tpoints = 0;
|
||||||
uint32 apoints = 0;
|
uint32 apoints = 0;
|
||||||
@@ -140,7 +140,7 @@ uint32 ListQuestsAction::ListQuests(bool completed, bool silent, QuestTravelDeta
|
|||||||
{
|
{
|
||||||
uint32 limit = 0;
|
uint32 limit = 0;
|
||||||
std::vector<TravelDestination*> allDestinations =
|
std::vector<TravelDestination*> allDestinations =
|
||||||
sTravelMgr->getQuestTravelDestinations(bot, questId, true, true, -1);
|
TravelMgr::instance().getQuestTravelDestinations(bot, questId, true, true, -1);
|
||||||
|
|
||||||
std::sort(allDestinations.begin(), allDestinations.end(),
|
std::sort(allDestinations.begin(), allDestinations.end(),
|
||||||
[botPos](TravelDestination* i, TravelDestination* j) {
|
[botPos](TravelDestination* i, TravelDestination* j) {
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ std::vector<std::pair<uint32, std::string>> ListSpellsAction::GetSpellList(std::
|
|||||||
if (spellInfo->IsPassive())
|
if (spellInfo->IsPassive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SkillLineAbilityEntry const* skillLine = sPlayerbotSpellRepository->GetSkillLine(itr->first);
|
SkillLineAbilityEntry const* skillLine = PlayerbotSpellRepository::Instance().GetSkillLine(itr->first);
|
||||||
if (skill != SKILL_NONE && (!skillLine || skillLine->SkillLine != skill))
|
if (skill != SKILL_NONE && (!skillLine || skillLine->SkillLine != skill))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -175,7 +175,7 @@ std::vector<std::pair<uint32, std::string>> ListSpellsAction::GetSpellList(std::
|
|||||||
|
|
||||||
FindItemByIdVisitor visitor(itemid);
|
FindItemByIdVisitor visitor(itemid);
|
||||||
uint32 reagentsInInventory = InventoryAction::GetItemCount(&visitor);
|
uint32 reagentsInInventory = InventoryAction::GetItemCount(&visitor);
|
||||||
bool buyable = sPlayerbotSpellRepository->IsItemBuyable(itemid);
|
bool buyable = PlayerbotSpellRepository::Instance().IsItemBuyable(itemid);
|
||||||
if (!buyable)
|
if (!buyable)
|
||||||
{
|
{
|
||||||
uint32 craftable = reagentsInInventory / reagentsRequired;
|
uint32 craftable = reagentsInInventory / reagentsRequired;
|
||||||
@@ -303,4 +303,4 @@ bool ListSpellsAction::Execute(Event event)
|
|||||||
botAI->TellMasterNoFacing(i->second);
|
botAI->TellMasterNoFacing(i->second);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ bool LootAction::Execute(Event /*event*/)
|
|||||||
|
|
||||||
LootObject prevLoot = AI_VALUE(LootObject, "loot target");
|
LootObject prevLoot = AI_VALUE(LootObject, "loot target");
|
||||||
LootObject const& lootObject =
|
LootObject const& lootObject =
|
||||||
AI_VALUE(LootObjectStack*, "available loot")->GetLoot(sPlayerbotAIConfig->lootDistance);
|
AI_VALUE(LootObjectStack*, "available loot")->GetLoot(sPlayerbotAIConfig.lootDistance);
|
||||||
|
|
||||||
if (!prevLoot.IsEmpty() && prevLoot.guid != lootObject.guid)
|
if (!prevLoot.IsEmpty() && prevLoot.guid != lootObject.guid)
|
||||||
{
|
{
|
||||||
@@ -37,7 +37,7 @@ bool LootAction::Execute(Event /*event*/)
|
|||||||
|
|
||||||
// Provide a system to check if the game object id is disallowed in the user configurable list or not.
|
// Provide a system to check if the game object id is disallowed in the user configurable list or not.
|
||||||
// Check if the game object id is disallowed in the user configurable list or not.
|
// Check if the game object id is disallowed in the user configurable list or not.
|
||||||
if (sPlayerbotAIConfig->disallowedGameObjects.find(lootObject.guid.GetEntry()) != sPlayerbotAIConfig->disallowedGameObjects.end())
|
if (sPlayerbotAIConfig.disallowedGameObjects.find(lootObject.guid.GetEntry()) != sPlayerbotAIConfig.disallowedGameObjects.end())
|
||||||
{
|
{
|
||||||
return false; // Game object ID is disallowed, so do not proceed
|
return false; // Game object ID is disallowed, so do not proceed
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ bool LootAction::Execute(Event /*event*/)
|
|||||||
|
|
||||||
bool LootAction::isUseful()
|
bool LootAction::isUseful()
|
||||||
{
|
{
|
||||||
return sPlayerbotAIConfig->freeMethodLoot || !bot->GetGroup() || bot->GetGroup()->GetLootMethod() != FREE_FOR_ALL;
|
return sPlayerbotAIConfig.freeMethodLoot || !bot->GetGroup() || bot->GetGroup()->GetLootMethod() != FREE_FOR_ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ProfessionSpells
|
enum ProfessionSpells
|
||||||
@@ -95,7 +95,7 @@ bool OpenLootAction::DoLoot(LootObject& lootObject)
|
|||||||
if (bot->IsMounted())
|
if (bot->IsMounted())
|
||||||
{
|
{
|
||||||
bot->Dismount();
|
bot->Dismount();
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->lootDelay); // Small delay to avoid animation issues
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.lootDelay); // Small delay to avoid animation issues
|
||||||
}
|
}
|
||||||
|
|
||||||
if (creature && creature->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE))
|
if (creature && creature->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE))
|
||||||
@@ -104,7 +104,7 @@ bool OpenLootAction::DoLoot(LootObject& lootObject)
|
|||||||
*packet << lootObject.guid;
|
*packet << lootObject.guid;
|
||||||
bot->GetSession()->QueuePacket(packet);
|
bot->GetSession()->QueuePacket(packet);
|
||||||
// bot->GetSession()->HandleLootOpcode(packet);
|
// bot->GetSession()->HandleLootOpcode(packet);
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->lootDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.lootDelay);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -202,7 +202,7 @@ uint32 OpenLootAction::GetOpeningSpell(LootObject& lootObject, GameObject* go)
|
|||||||
return spellId;
|
return spellId;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sPlayerbotAIConfig->openGoSpell;
|
return sPlayerbotAIConfig.openGoSpell;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenLootAction::CanOpenLock(LootObject& /*lootObject*/, SpellInfo const* spellInfo, GameObject* go)
|
bool OpenLootAction::CanOpenLock(LootObject& /*lootObject*/, SpellInfo const* spellInfo, GameObject* go)
|
||||||
@@ -294,7 +294,7 @@ bool StoreLootAction::AuctionItem(uint32 itemId)
|
|||||||
|
|
||||||
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(ahEntry);
|
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(ahEntry);
|
||||||
|
|
||||||
uint32 price = oldItem->GetCount() * proto->BuyPrice * sRandomPlayerbotMgr->GetBuyMultiplier(bot);
|
uint32 price = oldItem->GetCount() * proto->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot);
|
||||||
|
|
||||||
uint32 stackCount = urand(1, proto->GetMaxStackSize());
|
uint32 stackCount = urand(1, proto->GetMaxStackSize());
|
||||||
if (!price || !stackCount)
|
if (!price || !stackCount)
|
||||||
@@ -426,28 +426,28 @@ bool StoreLootAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player* master = botAI->GetMaster();
|
Player* master = botAI->GetMaster();
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot) && master)
|
if (sRandomPlayerbotMgr.IsRandomBot(bot) && master)
|
||||||
{
|
{
|
||||||
uint32 price = itemcount * proto->BuyPrice * sRandomPlayerbotMgr->GetBuyMultiplier(bot) + gold;
|
uint32 price = itemcount * proto->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot) + gold;
|
||||||
if (price)
|
if (price)
|
||||||
sRandomPlayerbotMgr->AddTradeDiscount(bot, master, price);
|
sRandomPlayerbotMgr.AddTradeDiscount(bot, master, price);
|
||||||
|
|
||||||
if (Group* group = bot->GetGroup())
|
if (Group* group = bot->GetGroup())
|
||||||
for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next())
|
for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next())
|
||||||
if (ref->GetSource() != bot)
|
if (ref->GetSource() != bot)
|
||||||
sGuildTaskMgr->CheckItemTask(itemid, itemcount, ref->GetSource(), bot);
|
GuildTaskMgr::instance().CheckItemTask(itemid, itemcount, ref->GetSource(), bot);
|
||||||
}
|
}
|
||||||
|
|
||||||
WorldPacket* packet = new WorldPacket(CMSG_AUTOSTORE_LOOT_ITEM, 1);
|
WorldPacket* packet = new WorldPacket(CMSG_AUTOSTORE_LOOT_ITEM, 1);
|
||||||
*packet << itemindex;
|
*packet << itemindex;
|
||||||
bot->GetSession()->QueuePacket(packet);
|
bot->GetSession()->QueuePacket(packet);
|
||||||
// bot->GetSession()->HandleAutostoreLootItemOpcode(packet);
|
// bot->GetSession()->HandleAutostoreLootItemOpcode(packet);
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->lootDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.lootDelay);
|
||||||
|
|
||||||
if (proto->Quality > ITEM_QUALITY_NORMAL && !urand(0, 50) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig->randomBotEmote)
|
if (proto->Quality > ITEM_QUALITY_NORMAL && !urand(0, 50) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig.randomBotEmote)
|
||||||
botAI->PlayEmote(TEXT_EMOTE_CHEER);
|
botAI->PlayEmote(TEXT_EMOTE_CHEER);
|
||||||
|
|
||||||
if (proto->Quality >= ITEM_QUALITY_RARE && !urand(0, 1) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig->randomBotEmote)
|
if (proto->Quality >= ITEM_QUALITY_RARE && !urand(0, 1) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig.randomBotEmote)
|
||||||
botAI->PlayEmote(TEXT_EMOTE_CHEER);
|
botAI->PlayEmote(TEXT_EMOTE_CHEER);
|
||||||
|
|
||||||
BroadcastHelper::BroadcastLootingItem(botAI, bot, proto);
|
BroadcastHelper::BroadcastLootingItem(botAI, bot, proto);
|
||||||
@@ -498,7 +498,7 @@ bool StoreLootAction::IsLootAllowed(uint32 itemid, PlayerbotAI* botAI)
|
|||||||
{
|
{
|
||||||
// if (AI_VALUE2(uint32, "item count", proto->Name1) < quest->RequiredItemCount[i])
|
// if (AI_VALUE2(uint32, "item count", proto->Name1) < quest->RequiredItemCount[i])
|
||||||
// {
|
// {
|
||||||
// if (botAI->GetMaster() && sPlayerbotAIConfig->syncQuestWithPlayer)
|
// if (botAI->GetMaster() && sPlayerbotAIConfig.syncQuestWithPlayer)
|
||||||
// return false; //Quest is autocomplete for the bot so no item needed.
|
// return false; //Quest is autocomplete for the bot so no item needed.
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -514,7 +514,7 @@ bool StoreLootAction::IsLootAllowed(uint32 itemid, PlayerbotAI* botAI)
|
|||||||
|
|
||||||
bool canLoot = lootStrategy->CanLoot(proto, context);
|
bool canLoot = lootStrategy->CanLoot(proto, context);
|
||||||
// if (canLoot && proto->Bonding == BIND_WHEN_PICKED_UP && botAI->HasActivePlayerMaster())
|
// if (canLoot && proto->Bonding == BIND_WHEN_PICKED_UP && botAI->HasActivePlayerMaster())
|
||||||
// canLoot = sPlayerbotAIConfig->IsInRandomAccountList(botAI->GetBot()->GetSession()->GetAccountId());
|
// canLoot = sPlayerbotAIConfig.IsInRandomAccountList(botAI->GetBot()->GetSession()->GetAccountId());
|
||||||
|
|
||||||
return canLoot;
|
return canLoot;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,11 +84,11 @@ bool LootRollAction::Execute(Event event)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sPlayerbotAIConfig->lootRollLevel == 0)
|
if (sPlayerbotAIConfig.lootRollLevel == 0)
|
||||||
{
|
{
|
||||||
vote = PASS;
|
vote = PASS;
|
||||||
}
|
}
|
||||||
else if (sPlayerbotAIConfig->lootRollLevel == 1)
|
else if (sPlayerbotAIConfig.lootRollLevel == 1)
|
||||||
{
|
{
|
||||||
if (vote == NEED)
|
if (vote == NEED)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ bool MoveToRpgTargetAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((unit && unit->isMoving() && !urand(0, 20)) || !ChooseRpgTargetAction::isFollowValid(bot, wo) ||
|
if ((unit && unit->isMoving() && !urand(0, 20)) || !ChooseRpgTargetAction::isFollowValid(bot, wo) ||
|
||||||
guidP.distance(bot) > sPlayerbotAIConfig->reactDistance * 2 || !urand(0, 50))
|
guidP.distance(bot) > sPlayerbotAIConfig.reactDistance * 2 || !urand(0, 50))
|
||||||
{
|
{
|
||||||
AI_VALUE(GuidSet&, "ignore rpg target").insert(AI_VALUE(GuidPosition, "rpg target"));
|
AI_VALUE(GuidSet&, "ignore rpg target").insert(AI_VALUE(GuidPosition, "rpg target"));
|
||||||
RESET_AI_VALUE(GuidPosition, "rpg target");
|
RESET_AI_VALUE(GuidPosition, "rpg target");
|
||||||
@@ -73,7 +73,7 @@ bool MoveToRpgTargetAction::Execute(Event event)
|
|||||||
float z = wo->GetPositionZ();
|
float z = wo->GetPositionZ();
|
||||||
float mapId = wo->GetMapId();
|
float mapId = wo->GetMapId();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->randombotsWalkingRPG)
|
if (sPlayerbotAIConfig.randombotsWalkingRPG)
|
||||||
if (!bot->IsOutdoors())
|
if (!bot->IsOutdoors())
|
||||||
bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_WALKING);
|
bot->m_movementInfo.AddMovementFlag(MOVEMENTFLAG_WALKING);
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ bool MoveToTravelTargetAction::Execute(Event event)
|
|||||||
|
|
||||||
if (memberDistance < 50.0f)
|
if (memberDistance < 50.0f)
|
||||||
continue;
|
continue;
|
||||||
if (memberDistance > sPlayerbotAIConfig->reactDistance * 20)
|
if (memberDistance > sPlayerbotAIConfig.reactDistance * 20)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// float memberAngle = botLocation.getAngleBetween(targetPos, memberPos);
|
// float memberAngle = botLocation.getAngleBetween(targetPos, memberPos);
|
||||||
@@ -65,9 +65,9 @@ bool MoveToTravelTargetAction::Execute(Event event)
|
|||||||
botAI->TellMasterNoFacing(out);
|
botAI->TellMasterNoFacing(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
target->setExpireIn(target->getTimeLeft() + sPlayerbotAIConfig->maxWaitForMove);
|
target->setExpireIn(target->getTimeLeft() + sPlayerbotAIConfig.maxWaitForMove);
|
||||||
|
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->maxWaitForMove);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.maxWaitForMove);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -80,7 +80,7 @@ bool MoveToTravelTargetAction::Execute(Event event)
|
|||||||
|
|
||||||
if (target->getMaxTravelTime() > target->getTimeLeft()) // The bot is late. Speed it up.
|
if (target->getMaxTravelTime() > target->getTimeLeft()) // The bot is late. Speed it up.
|
||||||
{
|
{
|
||||||
// distance = sPlayerbotAIConfig->fleeDistance;
|
// distance = sPlayerbotAIConfig.fleeDistance;
|
||||||
// angle = bot->GetAngle(location.GetPositionX(), location.GetPositionY());
|
// angle = bot->GetAngle(location.GetPositionX(), location.GetPositionY());
|
||||||
// location = botLocation.getLocation();
|
// location = botLocation.getLocation();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ MovementAction::MovementAction(PlayerbotAI* botAI, std::string const name) : Act
|
|||||||
void MovementAction::CreateWp(Player* wpOwner, float x, float y, float z, float o, uint32 entry, bool important)
|
void MovementAction::CreateWp(Player* wpOwner, float x, float y, float z, float o, uint32 entry, bool important)
|
||||||
{
|
{
|
||||||
float dist = wpOwner->GetDistance(x, y, z);
|
float dist = wpOwner->GetDistance(x, y, z);
|
||||||
float delay = 1000.0f * dist / wpOwner->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig->reactDelay;
|
float delay = 1000.0f * dist / wpOwner->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig.reactDelay;
|
||||||
|
|
||||||
// if (!important)
|
// if (!important)
|
||||||
// delay *= 0.25;
|
// delay *= 0.25;
|
||||||
@@ -195,8 +195,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
|
|
||||||
bool generatePath = !bot->IsFlying() && !bot->isSwimming();
|
bool generatePath = !bot->IsFlying() && !bot->isSwimming();
|
||||||
bool disableMoveSplinePath =
|
bool disableMoveSplinePath =
|
||||||
sPlayerbotAIConfig->disableMoveSplinePath >= 2 ||
|
sPlayerbotAIConfig.disableMoveSplinePath >= 2 ||
|
||||||
(sPlayerbotAIConfig->disableMoveSplinePath == 1 && bot->InBattleground());
|
(sPlayerbotAIConfig.disableMoveSplinePath == 1 && bot->InBattleground());
|
||||||
if (Vehicle* vehicle = bot->GetVehicle())
|
if (Vehicle* vehicle = bot->GetVehicle())
|
||||||
{
|
{
|
||||||
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot);
|
VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot);
|
||||||
@@ -216,7 +216,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
delay -= botAI->GetReactDelay();
|
delay -= botAI->GetReactDelay();
|
||||||
}
|
}
|
||||||
delay = std::max(.0f, delay);
|
delay = std::max(.0f, delay);
|
||||||
delay = std::min((float)sPlayerbotAIConfig->maxWaitForMove, delay);
|
delay = std::min((float)sPlayerbotAIConfig.maxWaitForMove, delay);
|
||||||
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -241,7 +241,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
delay -= botAI->GetReactDelay();
|
delay -= botAI->GetReactDelay();
|
||||||
}
|
}
|
||||||
delay = std::max(.0f, delay);
|
delay = std::max(.0f, delay);
|
||||||
delay = std::min((float)sPlayerbotAIConfig->maxWaitForMove, delay);
|
delay = std::min((float)sPlayerbotAIConfig.maxWaitForMove, delay);
|
||||||
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -250,7 +250,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
{
|
{
|
||||||
float modifiedZ;
|
float modifiedZ;
|
||||||
Movement::PointsArray path =
|
Movement::PointsArray path =
|
||||||
SearchForBestPath(x, y, z, modifiedZ, sPlayerbotAIConfig->maxMovementSearchTime, normal_only);
|
SearchForBestPath(x, y, z, modifiedZ, sPlayerbotAIConfig.maxMovementSearchTime, normal_only);
|
||||||
if (modifiedZ == INVALID_HEIGHT)
|
if (modifiedZ == INVALID_HEIGHT)
|
||||||
return false;
|
return false;
|
||||||
float distance = bot->GetExactDist(x, y, modifiedZ);
|
float distance = bot->GetExactDist(x, y, modifiedZ);
|
||||||
@@ -272,7 +272,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
delay -= botAI->GetReactDelay();
|
delay -= botAI->GetReactDelay();
|
||||||
}
|
}
|
||||||
delay = std::max(.0f, delay);
|
delay = std::max(.0f, delay);
|
||||||
delay = std::min((float)sPlayerbotAIConfig->maxWaitForMove, delay);
|
delay = std::min((float)sPlayerbotAIConfig.maxWaitForMove, delay);
|
||||||
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
AI_VALUE(LastMovement&, "last movement").Set(mapId, x, y, z, bot->GetOrientation(), delay, priority);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -308,8 +308,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// float minDist = sPlayerbotAIConfig->targetPosRecalcDistance; //Minium distance a bot should move.
|
// float minDist = sPlayerbotAIConfig.targetPosRecalcDistance; //Minium distance a bot should move.
|
||||||
// float maxDist = sPlayerbotAIConfig->reactDistance; //Maxium distance a bot can move in one single
|
// float maxDist = sPlayerbotAIConfig.reactDistance; //Maxium distance a bot can move in one single
|
||||||
// action. float originalZ = z; // save original destination height to check
|
// action. float originalZ = z; // save original destination height to check
|
||||||
// if bot needs to fly up
|
// if bot needs to fly up
|
||||||
|
|
||||||
@@ -372,9 +372,9 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
|
|
||||||
// if (startPosition.getMapId() != endPosition.getMapId() || totalDistance > maxDist)
|
// if (startPosition.getMapId() != endPosition.getMapId() || totalDistance > maxDist)
|
||||||
// {
|
// {
|
||||||
// if (!sTravelNodeMap->getNodes().empty() && !bot->InBattleground())
|
// if (!TravelNodeMap::instance().getNodes().empty() && !bot->InBattleground())
|
||||||
// {
|
// {
|
||||||
// if (sPlayerbotAIConfig->tweakValue)
|
// if (sPlayerbotAIConfig.tweakValue)
|
||||||
// {
|
// {
|
||||||
// if (lastMove.future.valid())
|
// if (lastMove.future.valid())
|
||||||
// {
|
// {
|
||||||
@@ -388,12 +388,12 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// else
|
// else
|
||||||
// movePath = sTravelNodeMap->getFullPath(startPosition, endPosition, bot);
|
// movePath = TravelNodeMap::instance().getFullPath(startPosition, endPosition, bot);
|
||||||
|
|
||||||
// if (movePath.empty())
|
// if (movePath.empty())
|
||||||
// {
|
// {
|
||||||
// //We have no path. Beyond 450yd the standard PathGenerator will probably move the wrong way.
|
// //We have no path. Beyond 450yd the standard PathGenerator will probably move the wrong way.
|
||||||
// if (sServerFacade->IsDistanceGreaterThan(totalDistance, maxDist * 3))
|
// if (ServerFacade::instance().IsDistanceGreaterThan(totalDistance, maxDist * 3))
|
||||||
// {
|
// {
|
||||||
// movePath.clear();
|
// movePath.clear();
|
||||||
// movePath.addPoint(endPosition);
|
// movePath.addPoint(endPosition);
|
||||||
@@ -402,7 +402,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// bot->StopMoving();
|
// bot->StopMoving();
|
||||||
// if (botAI->HasStrategy("debug move", BOT_STATE_NON_COMBAT))
|
// if (botAI->HasStrategy("debug move", BOT_STATE_NON_COMBAT))
|
||||||
// botAI->TellMasterNoFacing("I have no path");
|
// botAI->TellMasterNoFacing("I have no path");
|
||||||
// LOG_DEBUG("playerbots", "sServerFacade->IsDistanceGreaterThan(totalDistance, maxDist * 3)");
|
// LOG_DEBUG("playerbots", "ServerFacade::instance().IsDistanceGreaterThan(totalDistance, maxDist * 3)");
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -450,7 +450,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// if (pathType == TravelNodePathType::portal) // && !botAI->isRealPlayer())
|
// if (pathType == TravelNodePathType::portal) // && !botAI->isRealPlayer())
|
||||||
// {
|
// {
|
||||||
// //Log bot movement
|
// //Log bot movement
|
||||||
// if (sPlayerbotAIConfig->hasLog("bot_movement.csv"))
|
// if (sPlayerbotAIConfig.hasLog("bot_movement.csv"))
|
||||||
// {
|
// {
|
||||||
// WorldPosition telePos;
|
// WorldPosition telePos;
|
||||||
// if (entry)
|
// if (entry)
|
||||||
@@ -463,7 +463,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// telePos = movePosition;
|
// telePos = movePosition;
|
||||||
|
|
||||||
// std::ostringstream out;
|
// std::ostringstream out;
|
||||||
// out << sPlayerbotAIConfig->GetTimestampStr() << "+00,";
|
// out << sPlayerbotAIConfig.GetTimestampStr() << "+00,";
|
||||||
// out << bot->GetName() << ",";
|
// out << bot->GetName() << ",";
|
||||||
// if (telePos && telePos.GetExactDist(movePosition) > 0.001)
|
// if (telePos && telePos.GetExactDist(movePosition) > 0.001)
|
||||||
// startPosition.printWKT({ startPosition, movePosition, telePos }, out, 1);
|
// startPosition.printWKT({ startPosition, movePosition, telePos }, out, 1);
|
||||||
@@ -475,7 +475,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// out << bot->GetLevel() << ",";
|
// out << bot->GetLevel() << ",";
|
||||||
// out << (entry ? -1 : entry);
|
// out << (entry ? -1 : entry);
|
||||||
|
|
||||||
// sPlayerbotAIConfig->log("bot_movement.csv", out.str().c_str());
|
// sPlayerbotAIConfig.log("bot_movement.csv", out.str().c_str());
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (entry)
|
// if (entry)
|
||||||
@@ -621,10 +621,10 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
// //Log bot movement
|
// //Log bot movement
|
||||||
// if (sPlayerbotAIConfig->hasLog("bot_movement.csv") && lastMove.lastMoveShort.GetExactDist(movePosition) > 0.001)
|
// if (sPlayerbotAIConfig.hasLog("bot_movement.csv") && lastMove.lastMoveShort.GetExactDist(movePosition) > 0.001)
|
||||||
// {
|
// {
|
||||||
// std::ostringstream out;
|
// std::ostringstream out;
|
||||||
// out << sPlayerbotAIConfig->GetTimestampStr() << "+00,";
|
// out << sPlayerbotAIConfig.GetTimestampStr() << "+00,";
|
||||||
// out << bot->GetName() << ",";
|
// out << bot->GetName() << ",";
|
||||||
// startPosition.printWKT({ startPosition, movePosition }, out, 1);
|
// startPosition.printWKT({ startPosition, movePosition }, out, 1);
|
||||||
// out << std::to_string(bot->getRace()) << ",";
|
// out << std::to_string(bot->getRace()) << ",";
|
||||||
@@ -632,7 +632,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// out << bot->GetLevel();
|
// out << bot->GetLevel();
|
||||||
// out << 0;
|
// out << 0;
|
||||||
|
|
||||||
// sPlayerbotAIConfig->log("bot_movement.csv", out.str().c_str());
|
// sPlayerbotAIConfig.log("bot_movement.csv", out.str().c_str());
|
||||||
// }
|
// }
|
||||||
// // LOG_DEBUG("playerbots", "({}, {}) -> ({}, {})", startPosition.getX(), startPosition.getY(),
|
// // LOG_DEBUG("playerbots", "({}, {}) -> ({}, {})", startPosition.getX(), startPosition.getY(),
|
||||||
// movePosition.getX(), movePosition.getY()); if (!react)
|
// movePosition.getX(), movePosition.getY()); if (!react)
|
||||||
@@ -694,7 +694,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
|
|||||||
// if (botAI->GetMaster())
|
// if (botAI->GetMaster())
|
||||||
// {
|
// {
|
||||||
// if (botAI->GetMaster()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING) &&
|
// if (botAI->GetMaster()->m_movementInfo.HasMovementFlag(MOVEMENTFLAG_WALKING) &&
|
||||||
// sServerFacade->GetDistance2d(bot, botAI->GetMaster()) < 20.0f)
|
// ServerFacade::instance().GetDistance2d(bot, botAI->GetMaster()) < 20.0f)
|
||||||
// masterWalking = true;
|
// masterWalking = true;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@@ -787,7 +787,7 @@ bool MovementAction::MoveTo(WorldObject* target, float distance, MovementPriorit
|
|||||||
float angle = bot->GetAngle(target);
|
float angle = bot->GetAngle(target);
|
||||||
float needToGo = distanceToTarget - distance;
|
float needToGo = distanceToTarget - distance;
|
||||||
|
|
||||||
float maxDistance = sPlayerbotAIConfig->spellDistance;
|
float maxDistance = sPlayerbotAIConfig.spellDistance;
|
||||||
if (needToGo > 0 && needToGo > maxDistance)
|
if (needToGo > 0 && needToGo > maxDistance)
|
||||||
needToGo = maxDistance;
|
needToGo = maxDistance;
|
||||||
else if (needToGo < 0 && needToGo < -maxDistance)
|
else if (needToGo < 0 && needToGo < -maxDistance)
|
||||||
@@ -898,8 +898,8 @@ bool MovementAction::IsMovingAllowed(WorldObject* target)
|
|||||||
if (bot->GetMapId() != target->GetMapId())
|
if (bot->GetMapId() != target->GetMapId())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// float distance = sServerFacade->GetDistance2d(bot, target);
|
// float distance = ServerFacade::instance().GetDistance2d(bot, target);
|
||||||
// if (!bot->InBattleground() && distance > sPlayerbotAIConfig->reactDistance)
|
// if (!bot->InBattleground() && distance > sPlayerbotAIConfig.reactDistance)
|
||||||
// return false;
|
// return false;
|
||||||
|
|
||||||
return IsMovingAllowed();
|
return IsMovingAllowed();
|
||||||
@@ -923,7 +923,7 @@ bool MovementAction::IsDuplicateMove(uint32 mapId, float x, float y, float z)
|
|||||||
LastMovement& lastMove = *context->GetValue<LastMovement&>("last movement");
|
LastMovement& lastMove = *context->GetValue<LastMovement&>("last movement");
|
||||||
|
|
||||||
// heuristic 5s
|
// heuristic 5s
|
||||||
if (lastMove.msTime + sPlayerbotAIConfig->maxWaitForMove < getMSTime() ||
|
if (lastMove.msTime + sPlayerbotAIConfig.maxWaitForMove < getMSTime() ||
|
||||||
lastMove.lastMoveShort.GetExactDist(x, y, z) > 0.01f)
|
lastMove.lastMoveShort.GetExactDist(x, y, z) > 0.01f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -1046,7 +1046,7 @@ void MovementAction::UpdateMovementState()
|
|||||||
// if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE && bot->CanNotReachTarget() &&
|
// if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE && bot->CanNotReachTarget() &&
|
||||||
// !bot->InBattleground())
|
// !bot->InBattleground())
|
||||||
// {
|
// {
|
||||||
// if (Unit* pTarget = sServerFacade->GetChaseTarget(bot))
|
// if (Unit* pTarget = ServerFacade::instance().GetChaseTarget(bot))
|
||||||
// {
|
// {
|
||||||
// if (!bot->IsWithinMeleeRange(pTarget) && pTarget->IsCreature())
|
// if (!bot->IsWithinMeleeRange(pTarget) && pTarget->IsCreature())
|
||||||
// {
|
// {
|
||||||
@@ -1080,7 +1080,7 @@ void MovementAction::UpdateMovementState()
|
|||||||
// bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) && bot->CanNotReachTarget()
|
// bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == POINT_MOTION_TYPE) && bot->CanNotReachTarget()
|
||||||
// && !bot->InBattleground())
|
// && !bot->InBattleground())
|
||||||
// {
|
// {
|
||||||
// if (Unit* pTarget = sServerFacade->GetChaseTarget(bot))
|
// if (Unit* pTarget = ServerFacade::instance().GetChaseTarget(bot))
|
||||||
// {
|
// {
|
||||||
// if (pTarget != botAI->GetGroupLeader())
|
// if (pTarget != botAI->GetGroupLeader())
|
||||||
// return;
|
// return;
|
||||||
@@ -1117,8 +1117,8 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
if (!target)
|
if (!target)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!bot->InBattleground() && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target),
|
if (!bot->InBattleground() && ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target),
|
||||||
sPlayerbotAIConfig->followDistance))
|
sPlayerbotAIConfig.followDistance))
|
||||||
{
|
{
|
||||||
// botAI->TellError("No need to follow");
|
// botAI->TellError("No need to follow");
|
||||||
return false;
|
return false;
|
||||||
@@ -1126,9 +1126,9 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
if (!bot->InBattleground()
|
if (!bot->InBattleground()
|
||||||
&& sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target->GetPositionX(),
|
&& ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target->GetPositionX(),
|
||||||
target->GetPositionY()), sPlayerbotAIConfig->sightDistance)
|
target->GetPositionY()), sPlayerbotAIConfig.sightDistance)
|
||||||
&& abs(bot->GetPositionZ() - target->GetPositionZ()) >= sPlayerbotAIConfig->spellDistance &&
|
&& abs(bot->GetPositionZ() - target->GetPositionZ()) >= sPlayerbotAIConfig.spellDistance &&
|
||||||
botAI->HasRealPlayerMaster()
|
botAI->HasRealPlayerMaster()
|
||||||
&& (target->GetMapId() && bot->GetMapId() != target->GetMapId()))
|
&& (target->GetMapId() && bot->GetMapId() != target->GetMapId()))
|
||||||
{
|
{
|
||||||
@@ -1189,13 +1189,13 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
WorldPosition botPos(bot);
|
WorldPosition botPos(bot);
|
||||||
WorldPosition cPos(corpse);
|
WorldPosition cPos(corpse);
|
||||||
|
|
||||||
if (botPos.fDist(cPos) > sPlayerbotAIConfig->spellDistance)
|
if (botPos.fDist(cPos) > sPlayerbotAIConfig.spellDistance)
|
||||||
return MoveTo(cPos.getMapId(), cPos.getX(), cPos.getY(), cPos.getZ());
|
return MoveTo(cPos.getMapId(), cPos.getX(), cPos.getY(), cPos.getZ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sServerFacade->IsDistanceGreaterOrEqualThan(sServerFacade->GetDistance2d(bot, target),
|
if (ServerFacade::instance().IsDistanceGreaterOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target),
|
||||||
sPlayerbotAIConfig->sightDistance))
|
sPlayerbotAIConfig.sightDistance))
|
||||||
{
|
{
|
||||||
if (target->GetGUID().IsPlayer())
|
if (target->GetGUID().IsPlayer())
|
||||||
{
|
{
|
||||||
@@ -1238,11 +1238,11 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!target->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
if (!target->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
||||||
return MoveTo(target, sPlayerbotAIConfig->followDistance);
|
return MoveTo(target, sPlayerbotAIConfig.followDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target),
|
if (ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target),
|
||||||
sPlayerbotAIConfig->followDistance))
|
sPlayerbotAIConfig.followDistance))
|
||||||
{
|
{
|
||||||
// botAI->TellError("No need to follow");
|
// botAI->TellError("No need to follow");
|
||||||
return false;
|
return false;
|
||||||
@@ -1251,8 +1251,8 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
if (target->IsFriendlyTo(bot) && bot->IsMounted() && AI_VALUE(GuidVector, "all targets").empty())
|
if (target->IsFriendlyTo(bot) && bot->IsMounted() && AI_VALUE(GuidVector, "all targets").empty())
|
||||||
distance += angle;
|
distance += angle;
|
||||||
|
|
||||||
if (!bot->InBattleground() && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target),
|
if (!bot->InBattleground() && ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, target),
|
||||||
sPlayerbotAIConfig->followDistance))
|
sPlayerbotAIConfig.followDistance))
|
||||||
{
|
{
|
||||||
// botAI->TellError("No need to follow");
|
// botAI->TellError("No need to follow");
|
||||||
return false;
|
return false;
|
||||||
@@ -1274,7 +1274,7 @@ bool MovementAction::Follow(Unit* target, float distance, float angle)
|
|||||||
|
|
||||||
if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
|
if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
|
||||||
{
|
{
|
||||||
Unit* currentTarget = sServerFacade->GetChaseTarget(bot);
|
Unit* currentTarget = ServerFacade::instance().GetChaseTarget(bot);
|
||||||
if (currentTarget && currentTarget->GetGUID() == target->GetGUID())
|
if (currentTarget && currentTarget->GetGUID() == target->GetGUID())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1347,13 +1347,13 @@ void MovementAction::WaitForReach(float distance)
|
|||||||
{
|
{
|
||||||
float delay = 1000.0f * MoveDelay(distance);
|
float delay = 1000.0f * MoveDelay(distance);
|
||||||
|
|
||||||
if (delay > sPlayerbotAIConfig->maxWaitForMove)
|
if (delay > sPlayerbotAIConfig.maxWaitForMove)
|
||||||
delay = sPlayerbotAIConfig->maxWaitForMove;
|
delay = sPlayerbotAIConfig.maxWaitForMove;
|
||||||
|
|
||||||
Unit* target = *botAI->GetAiObjectContext()->GetValue<Unit*>("current target");
|
Unit* target = *botAI->GetAiObjectContext()->GetValue<Unit*>("current target");
|
||||||
Unit* player = *botAI->GetAiObjectContext()->GetValue<Unit*>("enemy player target");
|
Unit* player = *botAI->GetAiObjectContext()->GetValue<Unit*>("enemy player target");
|
||||||
if ((player || target) && delay > sPlayerbotAIConfig->globalCoolDown)
|
if ((player || target) && delay > sPlayerbotAIConfig.globalCoolDown)
|
||||||
delay = sPlayerbotAIConfig->globalCoolDown;
|
delay = sPlayerbotAIConfig.globalCoolDown;
|
||||||
|
|
||||||
if (delay < 0)
|
if (delay < 0)
|
||||||
delay = 0;
|
delay = 0;
|
||||||
@@ -1378,7 +1378,7 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
if (!target)
|
if (!target)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->fleeingEnabled)
|
if (!sPlayerbotAIConfig.fleeingEnabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!IsMovingAllowed())
|
if (!IsMovingAllowed())
|
||||||
@@ -1390,7 +1390,7 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
bool foundFlee = false;
|
bool foundFlee = false;
|
||||||
time_t lastFlee = AI_VALUE(LastMovement&, "last movement").lastFlee;
|
time_t lastFlee = AI_VALUE(LastMovement&, "last movement").lastFlee;
|
||||||
time_t now = time(0);
|
time_t now = time(0);
|
||||||
uint32 fleeDelay = urand(2, sPlayerbotAIConfig->returnDelay / 1000);
|
uint32 fleeDelay = urand(2, sPlayerbotAIConfig.returnDelay / 1000);
|
||||||
|
|
||||||
if (lastFlee)
|
if (lastFlee)
|
||||||
{
|
{
|
||||||
@@ -1406,7 +1406,7 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
if (Group* group = bot->GetGroup())
|
if (Group* group = bot->GetGroup())
|
||||||
{
|
{
|
||||||
Unit* fleeTarget = nullptr;
|
Unit* fleeTarget = nullptr;
|
||||||
float fleeDistance = sPlayerbotAIConfig->sightDistance;
|
float fleeDistance = sPlayerbotAIConfig.sightDistance;
|
||||||
|
|
||||||
for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next())
|
for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next())
|
||||||
{
|
{
|
||||||
@@ -1416,8 +1416,8 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
|
|
||||||
if (botAI->IsTank(player))
|
if (botAI->IsTank(player))
|
||||||
{
|
{
|
||||||
float distanceToTank = sServerFacade->GetDistance2d(bot, player);
|
float distanceToTank = ServerFacade::instance().GetDistance2d(bot, player);
|
||||||
float distanceToTarget = sServerFacade->GetDistance2d(bot, target);
|
float distanceToTarget = ServerFacade::instance().GetDistance2d(bot, target);
|
||||||
if (distanceToTank < fleeDistance)
|
if (distanceToTank < fleeDistance)
|
||||||
{
|
{
|
||||||
fleeTarget = player;
|
fleeTarget = player;
|
||||||
@@ -1460,10 +1460,10 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
|
|
||||||
if ((isHealer && botAI->IsHeal(player)) || needHealer)
|
if ((isHealer && botAI->IsHeal(player)) || needHealer)
|
||||||
{
|
{
|
||||||
float distanceToHealer = sServerFacade->GetDistance2d(bot, player);
|
float distanceToHealer = ServerFacade::instance().GetDistance2d(bot, player);
|
||||||
float distanceToTarget = sServerFacade->GetDistance2d(player, target);
|
float distanceToTarget = ServerFacade::instance().GetDistance2d(player, target);
|
||||||
if (distanceToHealer < fleeDistance &&
|
if (distanceToHealer < fleeDistance &&
|
||||||
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig->followDistance) &&
|
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig.followDistance) &&
|
||||||
(needHealer || player->IsWithinLOSInMap(target)))
|
(needHealer || player->IsWithinLOSInMap(target)))
|
||||||
{
|
{
|
||||||
fleeTarget = player;
|
fleeTarget = player;
|
||||||
@@ -1473,10 +1473,10 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
}
|
}
|
||||||
else if (isRanged && botAI->IsRanged(player))
|
else if (isRanged && botAI->IsRanged(player))
|
||||||
{
|
{
|
||||||
float distanceToRanged = sServerFacade->GetDistance2d(bot, player);
|
float distanceToRanged = ServerFacade::instance().GetDistance2d(bot, player);
|
||||||
float distanceToTarget = sServerFacade->GetDistance2d(player, target);
|
float distanceToTarget = ServerFacade::instance().GetDistance2d(player, target);
|
||||||
if (distanceToRanged < fleeDistance &&
|
if (distanceToRanged < fleeDistance &&
|
||||||
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig->followDistance) &&
|
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig.followDistance) &&
|
||||||
player->IsWithinLOSInMap(target))
|
player->IsWithinLOSInMap(target))
|
||||||
{
|
{
|
||||||
fleeTarget = player;
|
fleeTarget = player;
|
||||||
@@ -1485,10 +1485,10 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// remember any group member in case no one else found
|
// remember any group member in case no one else found
|
||||||
float distanceToFlee = sServerFacade->GetDistance2d(bot, player);
|
float distanceToFlee = ServerFacade::instance().GetDistance2d(bot, player);
|
||||||
float distanceToTarget = sServerFacade->GetDistance2d(player, target);
|
float distanceToTarget = ServerFacade::instance().GetDistance2d(player, target);
|
||||||
if (distanceToFlee < spareDistance &&
|
if (distanceToFlee < spareDistance &&
|
||||||
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig->followDistance) &&
|
distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig.followDistance) &&
|
||||||
player->IsWithinLOSInMap(target))
|
player->IsWithinLOSInMap(target))
|
||||||
{
|
{
|
||||||
spareTarget = player;
|
spareTarget = player;
|
||||||
@@ -1508,8 +1508,8 @@ bool MovementAction::Flee(Unit* target)
|
|||||||
|
|
||||||
if ((!fleeTarget || !foundFlee) && master && master->IsAlive() && master->IsWithinLOSInMap(target))
|
if ((!fleeTarget || !foundFlee) && master && master->IsAlive() && master->IsWithinLOSInMap(target))
|
||||||
{
|
{
|
||||||
float distanceToTarget = sServerFacade->GetDistance2d(master, target);
|
float distanceToTarget = ServerFacade::instance().GetDistance2d(master, target);
|
||||||
if (distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig->followDistance))
|
if (distanceToTarget > (botAI->GetRange("shoot") / 2 + sPlayerbotAIConfig.followDistance))
|
||||||
foundFlee = MoveNear(master);
|
foundFlee = MoveNear(master);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1846,7 +1846,7 @@ void MovementAction::DoMovePoint(Unit* unit, float x, float y, float z, bool gen
|
|||||||
|
|
||||||
bool FleeAction::Execute(Event event)
|
bool FleeAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
return MoveAway(AI_VALUE(Unit*, "current target"), sPlayerbotAIConfig->fleeDistance, true);
|
return MoveAway(AI_VALUE(Unit*, "current target"), sPlayerbotAIConfig.fleeDistance, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FleeAction::isUseful()
|
bool FleeAction::isUseful()
|
||||||
@@ -1924,8 +1924,8 @@ bool AvoidAoeAction::AvoidAuraWithDynamicObj()
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (sPlayerbotAIConfig->aoeAvoidSpellWhitelist.find(spellInfo->Id) !=
|
if (sPlayerbotAIConfig.aoeAvoidSpellWhitelist.find(spellInfo->Id) !=
|
||||||
sPlayerbotAIConfig->aoeAvoidSpellWhitelist.end())
|
sPlayerbotAIConfig.aoeAvoidSpellWhitelist.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DynamicObject* dynOwner = aura->GetDynobjOwner();
|
DynamicObject* dynOwner = aura->GetDynobjOwner();
|
||||||
@@ -1934,7 +1934,7 @@ bool AvoidAoeAction::AvoidAuraWithDynamicObj()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
float radius = dynOwner->GetRadius();
|
float radius = dynOwner->GetRadius();
|
||||||
if (!radius || radius > sPlayerbotAIConfig->maxAoeAvoidRadius)
|
if (!radius || radius > sPlayerbotAIConfig.maxAoeAvoidRadius)
|
||||||
return false;
|
return false;
|
||||||
if (bot->GetDistance(dynOwner) > radius)
|
if (bot->GetDistance(dynOwner) > radius)
|
||||||
{
|
{
|
||||||
@@ -1944,7 +1944,7 @@ bool AvoidAoeAction::AvoidAuraWithDynamicObj()
|
|||||||
name << spellInfo->SpellName[LOCALE_enUS]; // << "] (aura)";
|
name << spellInfo->SpellName[LOCALE_enUS]; // << "] (aura)";
|
||||||
if (FleePosition(dynOwner->GetPosition(), radius))
|
if (FleePosition(dynOwner->GetPosition(), radius))
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
if (sPlayerbotAIConfig.tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
||||||
{
|
{
|
||||||
lastTellTimer = time(NULL);
|
lastTellTimer = time(NULL);
|
||||||
lastMoveTimer = getMSTime();
|
lastMoveTimer = getMSTime();
|
||||||
@@ -1990,8 +1990,8 @@ bool AvoidAoeAction::AvoidGameObjectWithDamage()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->aoeAvoidSpellWhitelist.find(spellId) !=
|
if (sPlayerbotAIConfig.aoeAvoidSpellWhitelist.find(spellId) !=
|
||||||
sPlayerbotAIConfig->aoeAvoidSpellWhitelist.end())
|
sPlayerbotAIConfig.aoeAvoidSpellWhitelist.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
const SpellInfo* spellInfo = sSpellMgr->GetSpellInfo(spellId);
|
||||||
@@ -2001,7 +2001,7 @@ bool AvoidAoeAction::AvoidGameObjectWithDamage()
|
|||||||
}
|
}
|
||||||
|
|
||||||
float radius = (float)goInfo->trap.diameter / 2 + go->GetCombatReach();
|
float radius = (float)goInfo->trap.diameter / 2 + go->GetCombatReach();
|
||||||
if (!radius || radius > sPlayerbotAIConfig->maxAoeAvoidRadius)
|
if (!radius || radius > sPlayerbotAIConfig.maxAoeAvoidRadius)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (bot->GetDistance(go) > radius)
|
if (bot->GetDistance(go) > radius)
|
||||||
@@ -2012,7 +2012,7 @@ bool AvoidAoeAction::AvoidGameObjectWithDamage()
|
|||||||
name << spellInfo->SpellName[LOCALE_enUS]; // << "] (object)";
|
name << spellInfo->SpellName[LOCALE_enUS]; // << "] (object)";
|
||||||
if (FleePosition(go->GetPosition(), radius))
|
if (FleePosition(go->GetPosition(), radius))
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
if (sPlayerbotAIConfig.tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
||||||
{
|
{
|
||||||
lastTellTimer = time(NULL);
|
lastTellTimer = time(NULL);
|
||||||
lastMoveTimer = getMSTime();
|
lastMoveTimer = getMSTime();
|
||||||
@@ -2061,8 +2061,8 @@ bool AvoidAoeAction::AvoidUnitWithDamageAura()
|
|||||||
sSpellMgr->GetSpellInfo(spellInfo->Effects[aurEff->GetEffIndex()].TriggerSpell);
|
sSpellMgr->GetSpellInfo(spellInfo->Effects[aurEff->GetEffIndex()].TriggerSpell);
|
||||||
if (!triggerSpellInfo)
|
if (!triggerSpellInfo)
|
||||||
continue;
|
continue;
|
||||||
if (sPlayerbotAIConfig->aoeAvoidSpellWhitelist.find(triggerSpellInfo->Id) !=
|
if (sPlayerbotAIConfig.aoeAvoidSpellWhitelist.find(triggerSpellInfo->Id) !=
|
||||||
sPlayerbotAIConfig->aoeAvoidSpellWhitelist.end())
|
sPlayerbotAIConfig.aoeAvoidSpellWhitelist.end())
|
||||||
return false;
|
return false;
|
||||||
for (int j = 0; j < MAX_SPELL_EFFECTS; j++)
|
for (int j = 0; j < MAX_SPELL_EFFECTS; j++)
|
||||||
{
|
{
|
||||||
@@ -2073,13 +2073,13 @@ bool AvoidAoeAction::AvoidUnitWithDamageAura()
|
|||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!radius || radius > sPlayerbotAIConfig->maxAoeAvoidRadius)
|
if (!radius || radius > sPlayerbotAIConfig.maxAoeAvoidRadius)
|
||||||
continue;
|
continue;
|
||||||
std::ostringstream name;
|
std::ostringstream name;
|
||||||
name << triggerSpellInfo->SpellName[LOCALE_enUS]; //<< "] (unit)";
|
name << triggerSpellInfo->SpellName[LOCALE_enUS]; //<< "] (unit)";
|
||||||
if (FleePosition(unit->GetPosition(), radius))
|
if (FleePosition(unit->GetPosition(), radius))
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
if (sPlayerbotAIConfig.tellWhenAvoidAoe && lastTellTimer < time(NULL) - 10)
|
||||||
{
|
{
|
||||||
lastTellTimer = time(NULL);
|
lastTellTimer = time(NULL);
|
||||||
lastMoveTimer = getMSTime();
|
lastMoveTimer = getMSTime();
|
||||||
@@ -2134,7 +2134,7 @@ Position MovementAction::BestPositionForMeleeToFlee(Position pos, float radius)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
bool strict = checkAngle.strict;
|
bool strict = checkAngle.strict;
|
||||||
float fleeDis = std::min(radius + 1.0f, sPlayerbotAIConfig->fleeDistance);
|
float fleeDis = std::min(radius + 1.0f, sPlayerbotAIConfig.fleeDistance);
|
||||||
float dx = bot->GetPositionX() + cos(angle) * fleeDis;
|
float dx = bot->GetPositionX() + cos(angle) * fleeDis;
|
||||||
float dy = bot->GetPositionY() + sin(angle) * fleeDis;
|
float dy = bot->GetPositionY() + sin(angle) * fleeDis;
|
||||||
float dz = bot->GetPositionZ();
|
float dz = bot->GetPositionZ();
|
||||||
@@ -2146,7 +2146,7 @@ Position MovementAction::BestPositionForMeleeToFlee(Position pos, float radius)
|
|||||||
Position fleePos{dx, dy, dz};
|
Position fleePos{dx, dy, dz};
|
||||||
if (strict && currentTarget &&
|
if (strict && currentTarget &&
|
||||||
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() >
|
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() >
|
||||||
sPlayerbotAIConfig->tooCloseDistance &&
|
sPlayerbotAIConfig.tooCloseDistance &&
|
||||||
bot->IsWithinMeleeRange(currentTarget))
|
bot->IsWithinMeleeRange(currentTarget))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
@@ -2197,7 +2197,7 @@ Position MovementAction::BestPositionForRangedToFlee(Position pos, float radius)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
bool strict = checkAngle.strict;
|
bool strict = checkAngle.strict;
|
||||||
float fleeDis = std::min(radius + 1.0f, sPlayerbotAIConfig->fleeDistance);
|
float fleeDis = std::min(radius + 1.0f, sPlayerbotAIConfig.fleeDistance);
|
||||||
float dx = bot->GetPositionX() + cos(angle) * fleeDis;
|
float dx = bot->GetPositionX() + cos(angle) * fleeDis;
|
||||||
float dy = bot->GetPositionY() + sin(angle) * fleeDis;
|
float dy = bot->GetPositionY() + sin(angle) * fleeDis;
|
||||||
float dz = bot->GetPositionZ();
|
float dz = bot->GetPositionZ();
|
||||||
@@ -2208,13 +2208,13 @@ Position MovementAction::BestPositionForRangedToFlee(Position pos, float radius)
|
|||||||
}
|
}
|
||||||
Position fleePos{dx, dy, dz};
|
Position fleePos{dx, dy, dz};
|
||||||
if (strict && currentTarget &&
|
if (strict && currentTarget &&
|
||||||
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() > sPlayerbotAIConfig->spellDistance)
|
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() > sPlayerbotAIConfig.spellDistance)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (strict && currentTarget &&
|
if (strict && currentTarget &&
|
||||||
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() <
|
fleePos.GetExactDist(currentTarget) - currentTarget->GetCombatReach() <
|
||||||
(sPlayerbotAIConfig->tooCloseDistance))
|
(sPlayerbotAIConfig.tooCloseDistance))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -2357,7 +2357,7 @@ Position CombatFormationMoveAction::AverageGroupPos(float dis, bool ranged, bool
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!member->IsAlive() || member->GetMapId() != bot->GetMapId() || member->IsCharmed() ||
|
if (!member->IsAlive() || member->GetMapId() != bot->GetMapId() || member->IsCharmed() ||
|
||||||
sServerFacade->GetDistance2d(bot, member) > dis)
|
ServerFacade::instance().GetDistance2d(bot, member) > dis)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
averageX += member->GetPositionX();
|
averageX += member->GetPositionX();
|
||||||
@@ -2395,7 +2395,7 @@ float CombatFormationMoveAction::AverageGroupAngle(Unit* from, bool ranged, bool
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!member->IsAlive() || member->GetMapId() != bot->GetMapId() || member->IsCharmed() ||
|
if (!member->IsAlive() || member->GetMapId() != bot->GetMapId() || member->IsCharmed() ||
|
||||||
sServerFacade->GetDistance2d(bot, member) > sPlayerbotAIConfig->sightDistance)
|
ServerFacade::instance().GetDistance2d(bot, member) > sPlayerbotAIConfig.sightDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
@@ -2437,7 +2437,7 @@ Player* CombatFormationMoveAction::NearestGroupMember(float dis)
|
|||||||
{
|
{
|
||||||
Player* member = ObjectAccessor::FindPlayer(itr->guid);
|
Player* member = ObjectAccessor::FindPlayer(itr->guid);
|
||||||
if (!member || !member->IsAlive() || member == bot || member->GetMapId() != bot->GetMapId() ||
|
if (!member || !member->IsAlive() || member == bot || member->GetMapId() != bot->GetMapId() ||
|
||||||
member->IsCharmed() || sServerFacade->GetDistance2d(bot, member) > dis)
|
member->IsCharmed() || ServerFacade::instance().GetDistance2d(bot, member) > dis)
|
||||||
continue;
|
continue;
|
||||||
if (nearestDis > bot->GetExactDist(member))
|
if (nearestDis > bot->GetExactDist(member))
|
||||||
{
|
{
|
||||||
@@ -2651,7 +2651,7 @@ bool MoveToLootAction::Execute(Event event)
|
|||||||
if (!loot.IsLootPossible(bot))
|
if (!loot.IsLootPossible(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return MoveNear(loot.GetWorldObject(bot), sPlayerbotAIConfig->contactDistance);
|
return MoveNear(loot.GetWorldObject(bot), sPlayerbotAIConfig.contactDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MoveOutOfEnemyContactAction::Execute(Event event)
|
bool MoveOutOfEnemyContactAction::Execute(Event event)
|
||||||
@@ -2660,7 +2660,7 @@ bool MoveOutOfEnemyContactAction::Execute(Event event)
|
|||||||
if (!target)
|
if (!target)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return MoveTo(target, sPlayerbotAIConfig->contactDistance);
|
return MoveTo(target, sPlayerbotAIConfig.contactDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MoveOutOfEnemyContactAction::isUseful() { return AI_VALUE2(bool, "inside target", "current target"); }
|
bool MoveOutOfEnemyContactAction::isUseful() { return AI_VALUE2(bool, "inside target", "current target"); }
|
||||||
@@ -2674,8 +2674,8 @@ bool SetFacingTargetAction::Execute(Event event)
|
|||||||
if (bot->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
if (bot->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
sServerFacade->SetFacingTo(bot, target);
|
ServerFacade::instance().SetFacingTo(bot, target);
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->reactDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.reactDelay);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2754,7 +2754,7 @@ bool SetBehindTargetAction::Execute(Event event)
|
|||||||
bool MoveOutOfCollisionAction::Execute(Event event)
|
bool MoveOutOfCollisionAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
float angle = M_PI * 2000 / frand(1.f, 1000.f);
|
float angle = M_PI * 2000 / frand(1.f, 1000.f);
|
||||||
float distance = sPlayerbotAIConfig->followDistance;
|
float distance = sPlayerbotAIConfig.followDistance;
|
||||||
return MoveTo(bot->GetMapId(), bot->GetPositionX() + cos(angle) * distance,
|
return MoveTo(bot->GetMapId(), bot->GetPositionX() + cos(angle) * distance,
|
||||||
bot->GetPositionY() + sin(angle) * distance, bot->GetPositionZ());
|
bot->GetPositionY() + sin(angle) * distance, bot->GetPositionZ());
|
||||||
}
|
}
|
||||||
@@ -2771,7 +2771,7 @@ bool MoveOutOfCollisionAction::isUseful()
|
|||||||
|
|
||||||
bool MoveRandomAction::Execute(Event event)
|
bool MoveRandomAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
float distance = sPlayerbotAIConfig->tooCloseDistance + urand(10, 30);
|
float distance = sPlayerbotAIConfig.tooCloseDistance + urand(10, 30);
|
||||||
|
|
||||||
Map* map = bot->GetMap();
|
Map* map = bot->GetMap();
|
||||||
for (int i = 0; i < 3; ++i)
|
for (int i = 0; i < 3; ++i)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool JumpTo(uint32 mapId, float x, float y, float z, MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
bool JumpTo(uint32 mapId, float x, float y, float z, MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
||||||
bool MoveNear(uint32 mapId, float x, float y, float z, float distance = sPlayerbotAIConfig->contactDistance,
|
bool MoveNear(uint32 mapId, float x, float y, float z, float distance = sPlayerbotAIConfig.contactDistance,
|
||||||
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
||||||
bool MoveToLOS(WorldObject* target, bool ranged = false);
|
bool MoveToLOS(WorldObject* target, bool ranged = false);
|
||||||
bool MoveTo(uint32 mapId, float x, float y, float z, bool idle = false, bool react = false,
|
bool MoveTo(uint32 mapId, float x, float y, float z, bool idle = false, bool react = false,
|
||||||
@@ -38,10 +38,10 @@ protected:
|
|||||||
bool backwards = false);
|
bool backwards = false);
|
||||||
bool MoveTo(WorldObject* target, float distance = 0.0f,
|
bool MoveTo(WorldObject* target, float distance = 0.0f,
|
||||||
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
||||||
bool MoveNear(WorldObject* target, float distance = sPlayerbotAIConfig->contactDistance,
|
bool MoveNear(WorldObject* target, float distance = sPlayerbotAIConfig.contactDistance,
|
||||||
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
||||||
float GetFollowAngle();
|
float GetFollowAngle();
|
||||||
bool Follow(Unit* target, float distance = sPlayerbotAIConfig->followDistance);
|
bool Follow(Unit* target, float distance = sPlayerbotAIConfig.followDistance);
|
||||||
bool Follow(Unit* target, float distance, float angle);
|
bool Follow(Unit* target, float distance, float angle);
|
||||||
bool ChaseTo(WorldObject* obj, float distance = 0.0f, float angle = 0.0f);
|
bool ChaseTo(WorldObject* obj, float distance = 0.0f, float angle = 0.0f);
|
||||||
bool ReachCombatTo(Unit* target, float distance = 0.0f);
|
bool ReachCombatTo(Unit* target, float distance = 0.0f);
|
||||||
@@ -56,10 +56,10 @@ protected:
|
|||||||
bool Flee(Unit* target);
|
bool Flee(Unit* target);
|
||||||
void ClearIdleState();
|
void ClearIdleState();
|
||||||
void UpdateMovementState();
|
void UpdateMovementState();
|
||||||
bool MoveAway(Unit* target, float distance = sPlayerbotAIConfig->fleeDistance, bool backwards = false);
|
bool MoveAway(Unit* target, float distance = sPlayerbotAIConfig.fleeDistance, bool backwards = false);
|
||||||
bool MoveFromGroup(float distance);
|
bool MoveFromGroup(float distance);
|
||||||
bool Move(float angle, float distance);
|
bool Move(float angle, float distance);
|
||||||
bool MoveInside(uint32 mapId, float x, float y, float z, float distance = sPlayerbotAIConfig->followDistance,
|
bool MoveInside(uint32 mapId, float x, float y, float z, float distance = sPlayerbotAIConfig.followDistance,
|
||||||
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
MovementPriority priority = MovementPriority::MOVEMENT_NORMAL);
|
||||||
void CreateWp(Player* wpOwner, float x, float y, float z, float o, uint32 entry, bool important = false);
|
void CreateWp(Player* wpOwner, float x, float y, float z, float o, uint32 entry, bool important = false);
|
||||||
Position BestPositionForMeleeToFlee(Position pos, float radius);
|
Position BestPositionForMeleeToFlee(Position pos, float radius);
|
||||||
@@ -86,7 +86,7 @@ private:
|
|||||||
class FleeAction : public MovementAction
|
class FleeAction : public MovementAction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FleeAction(PlayerbotAI* botAI, float distance = sPlayerbotAIConfig->spellDistance)
|
FleeAction(PlayerbotAI* botAI, float distance = sPlayerbotAIConfig.spellDistance)
|
||||||
: MovementAction(botAI, "flee"), distance(distance)
|
: MovementAction(botAI, "flee"), distance(distance)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -138,8 +138,8 @@ public:
|
|||||||
bool Execute(Event event) override;
|
bool Execute(Event event) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Position AverageGroupPos(float dis = sPlayerbotAIConfig->sightDistance, bool ranged = false, bool self = false);
|
Position AverageGroupPos(float dis = sPlayerbotAIConfig.sightDistance, bool ranged = false, bool self = false);
|
||||||
Player* NearestGroupMember(float dis = sPlayerbotAIConfig->sightDistance);
|
Player* NearestGroupMember(float dis = sPlayerbotAIConfig.sightDistance);
|
||||||
float AverageGroupAngle(Unit* from, bool ranged = false, bool self = false);
|
float AverageGroupAngle(Unit* from, bool ranged = false, bool self = false);
|
||||||
Position GetNearestPosition(const std::vector<Position>& positions);
|
Position GetNearestPosition(const std::vector<Position>& positions);
|
||||||
int lastMoveTimer = 0;
|
int lastMoveTimer = 0;
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ bool EatAction::Execute(Event event)
|
|||||||
if (bot->isMoving())
|
if (bot->isMoving())
|
||||||
{
|
{
|
||||||
bot->StopMoving();
|
bot->StopMoving();
|
||||||
// botAI->SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown);
|
// botAI->SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
|
||||||
// return false;
|
// return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,12 +16,12 @@ bool PassLeadershipToMasterAction::Execute(Event event)
|
|||||||
if (master && master != bot && bot->GetGroup() && bot->GetGroup()->IsMember(master->GetGUID()))
|
if (master && master != bot && bot->GetGroup() && bot->GetGroup()->IsMember(master->GetGUID()))
|
||||||
{
|
{
|
||||||
auto setLeaderOp = std::make_unique<GroupSetLeaderOperation>(bot->GetGUID(), master->GetGUID());
|
auto setLeaderOp = std::make_unique<GroupSetLeaderOperation>(bot->GetGUID(), master->GetGUID());
|
||||||
sPlayerbotWorldProcessor->QueueOperation(std::move(setLeaderOp));
|
PlayerbotWorldThreadProcessor::instance().QueueOperation(std::move(setLeaderOp));
|
||||||
|
|
||||||
if (!message.empty())
|
if (!message.empty())
|
||||||
botAI->TellMasterNoFacing(message);
|
botAI->TellMasterNoFacing(message);
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
botAI->ResetStrategies();
|
botAI->ResetStrategies();
|
||||||
botAI->Reset();
|
botAI->Reset();
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ bool PetsAction::Execute(Event event)
|
|||||||
if (param.empty())
|
if (param.empty())
|
||||||
{
|
{
|
||||||
// If no parameter is provided, show usage instructions and return.
|
// If no parameter is provided, show usage instructions and return.
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_usage_error", "Usage: pet <aggressive|defensive|passive|stance|attack|follow|stay>", {});
|
"pet_usage_error", "Usage: pet <aggressive|defensive|passive|stance|attack|follow|stay>", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
@@ -52,7 +52,7 @@ bool PetsAction::Execute(Event event)
|
|||||||
// If no pets or guardians are found, notify and return.
|
// If no pets or guardians are found, notify and return.
|
||||||
if (targets.empty())
|
if (targets.empty())
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_no_pet_error", "You have no pet or guardian pet.", {});
|
"pet_no_pet_error", "You have no pet or guardian pet.", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
@@ -65,19 +65,19 @@ bool PetsAction::Execute(Event event)
|
|||||||
if (param == "aggressive")
|
if (param == "aggressive")
|
||||||
{
|
{
|
||||||
react = REACT_AGGRESSIVE;
|
react = REACT_AGGRESSIVE;
|
||||||
stanceText = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stanceText = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_aggressive", "aggressive", {});
|
"pet_stance_aggressive", "aggressive", {});
|
||||||
}
|
}
|
||||||
else if (param == "defensive")
|
else if (param == "defensive")
|
||||||
{
|
{
|
||||||
react = REACT_DEFENSIVE;
|
react = REACT_DEFENSIVE;
|
||||||
stanceText = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stanceText = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_defensive", "defensive", {});
|
"pet_stance_defensive", "defensive", {});
|
||||||
}
|
}
|
||||||
else if (param == "passive")
|
else if (param == "passive")
|
||||||
{
|
{
|
||||||
react = REACT_PASSIVE;
|
react = REACT_PASSIVE;
|
||||||
stanceText = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stanceText = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_passive", "passive", {});
|
"pet_stance_passive", "passive", {});
|
||||||
}
|
}
|
||||||
// The "stance" command simply reports the current stance of each pet/guardian.
|
// The "stance" command simply reports the current stance of each pet/guardian.
|
||||||
@@ -86,30 +86,30 @@ bool PetsAction::Execute(Event event)
|
|||||||
for (Creature* target : targets)
|
for (Creature* target : targets)
|
||||||
{
|
{
|
||||||
std::string type = target->IsPet() ?
|
std::string type = target->IsPet() ?
|
||||||
sPlayerbotTextMgr->GetBotTextOrDefault("pet_type_pet", "pet", {}) :
|
PlayerbotTextMgr::instance().GetBotTextOrDefault("pet_type_pet", "pet", {}) :
|
||||||
sPlayerbotTextMgr->GetBotTextOrDefault("pet_type_guardian", "guardian", {});
|
PlayerbotTextMgr::instance().GetBotTextOrDefault("pet_type_guardian", "guardian", {});
|
||||||
std::string name = target->GetName();
|
std::string name = target->GetName();
|
||||||
std::string stance;
|
std::string stance;
|
||||||
switch (target->GetReactState())
|
switch (target->GetReactState())
|
||||||
{
|
{
|
||||||
case REACT_AGGRESSIVE:
|
case REACT_AGGRESSIVE:
|
||||||
stance = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stance = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_aggressive", "aggressive", {});
|
"pet_stance_aggressive", "aggressive", {});
|
||||||
break;
|
break;
|
||||||
case REACT_DEFENSIVE:
|
case REACT_DEFENSIVE:
|
||||||
stance = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stance = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_defensive", "defensive", {});
|
"pet_stance_defensive", "defensive", {});
|
||||||
break;
|
break;
|
||||||
case REACT_PASSIVE:
|
case REACT_PASSIVE:
|
||||||
stance = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stance = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_passive", "passive", {});
|
"pet_stance_passive", "passive", {});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
stance = sPlayerbotTextMgr->GetBotTextOrDefault(
|
stance = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_unknown", "unknown", {});
|
"pet_stance_unknown", "unknown", {});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_report", "Current stance of %type \"%name\": %stance.",
|
"pet_stance_report", "Current stance of %type \"%name\": %stance.",
|
||||||
{{"type", type}, {"name", name}, {"stance", stance}});
|
{{"type", type}, {"name", name}, {"stance", stance}});
|
||||||
botAI->TellMaster(text);
|
botAI->TellMaster(text);
|
||||||
@@ -133,30 +133,30 @@ bool PetsAction::Execute(Event event)
|
|||||||
// If no valid target is selected, show an error and return.
|
// If no valid target is selected, show an error and return.
|
||||||
if (!targetUnit)
|
if (!targetUnit)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_no_target_error", "No valid target selected by master.", {});
|
"pet_no_target_error", "No valid target selected by master.", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!targetUnit->IsAlive())
|
if (!targetUnit->IsAlive())
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_target_dead_error", "Target is not alive.", {});
|
"pet_target_dead_error", "Target is not alive.", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!bot->IsValidAttackTarget(targetUnit))
|
if (!bot->IsValidAttackTarget(targetUnit))
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_invalid_target_error", "Target is not a valid attack target for the bot.", {});
|
"pet_invalid_target_error", "Target is not a valid attack target for the bot.", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (sPlayerbotAIConfig->IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId()) &&
|
if (sPlayerbotAIConfig.IsPvpProhibited(bot->GetZoneId(), bot->GetAreaId()) &&
|
||||||
(targetUnit->IsPlayer() || targetUnit->IsPet()) &&
|
(targetUnit->IsPlayer() || targetUnit->IsPet()) &&
|
||||||
(!bot->duel || bot->duel->Opponent != targetUnit))
|
(!bot->duel || bot->duel->Opponent != targetUnit))
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_pvp_prohibited_error", "I cannot command my pet to attack players in PvP prohibited areas.", {});
|
"pet_pvp_prohibited_error", "I cannot command my pet to attack players in PvP prohibited areas.", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
return false;
|
return false;
|
||||||
@@ -208,15 +208,15 @@ bool PetsAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Inform the master if the command succeeded or failed.
|
// Inform the master if the command succeeded or failed.
|
||||||
if (didAttack && sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (didAttack && sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_attack_success", "Pet commanded to attack your target.", {});
|
"pet_attack_success", "Pet commanded to attack your target.", {});
|
||||||
botAI->TellMaster(text);
|
botAI->TellMaster(text);
|
||||||
}
|
}
|
||||||
else if (!didAttack)
|
else if (!didAttack)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_attack_failed", "Pet did not attack. (Already attacking or unable to attack target)", {});
|
"pet_attack_failed", "Pet did not attack. (Already attacking or unable to attack target)", {});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
}
|
}
|
||||||
@@ -226,9 +226,9 @@ bool PetsAction::Execute(Event event)
|
|||||||
else if (param == "follow")
|
else if (param == "follow")
|
||||||
{
|
{
|
||||||
botAI->PetFollow();
|
botAI->PetFollow();
|
||||||
if (sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_follow_success", "Pet commanded to follow.", {});
|
"pet_follow_success", "Pet commanded to follow.", {});
|
||||||
botAI->TellMaster(text);
|
botAI->TellMaster(text);
|
||||||
}
|
}
|
||||||
@@ -267,9 +267,9 @@ bool PetsAction::Execute(Event event)
|
|||||||
charmInfo->SetForcedTargetGUID();
|
charmInfo->SetForcedTargetGUID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stay_success", "Pet commanded to stay.", {});
|
"pet_stay_success", "Pet commanded to stay.", {});
|
||||||
botAI->TellMaster(text);
|
botAI->TellMaster(text);
|
||||||
}
|
}
|
||||||
@@ -278,7 +278,7 @@ bool PetsAction::Execute(Event event)
|
|||||||
// Unknown command: show usage instructions and return.
|
// Unknown command: show usage instructions and return.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_unknown_command_error", "Unknown pet command: %param. Use: pet <aggressive|defensive|passive|stance|attack|follow|stay>",
|
"pet_unknown_command_error", "Unknown pet command: %param. Use: pet <aggressive|defensive|passive|stance|attack|follow|stay>",
|
||||||
{{"param", param}});
|
{{"param", param}});
|
||||||
botAI->TellError(text);
|
botAI->TellError(text);
|
||||||
@@ -295,13 +295,13 @@ bool PetsAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Inform the master of the new stance if debug is enabled.
|
// Inform the master of the new stance if debug is enabled.
|
||||||
if (sPlayerbotAIConfig->petChatCommandDebug == 1)
|
if (sPlayerbotAIConfig.petChatCommandDebug == 1)
|
||||||
{
|
{
|
||||||
std::string text = sPlayerbotTextMgr->GetBotTextOrDefault(
|
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||||
"pet_stance_set_success", "Pet stance set to %stance.",
|
"pet_stance_set_success", "Pet stance set to %stance.",
|
||||||
{{"stance", stanceText}});
|
{{"stance", stanceText}});
|
||||||
botAI->TellMaster(text);
|
botAI->TellMaster(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ bool MoveToPositionAction::isUseful()
|
|||||||
{
|
{
|
||||||
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[qualifier];
|
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[qualifier];
|
||||||
float distance = AI_VALUE2(float, "distance", std::string("position_") + qualifier);
|
float distance = AI_VALUE2(float, "distance", std::string("position_") + qualifier);
|
||||||
return pos.isSet() && distance > sPlayerbotAIConfig->followDistance && distance < sPlayerbotAIConfig->reactDistance;
|
return pos.isSet() && distance > sPlayerbotAIConfig.followDistance && distance < sPlayerbotAIConfig.reactDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SetReturnPositionAction::Execute(Event event)
|
bool SetReturnPositionAction::Execute(Event event)
|
||||||
@@ -131,7 +131,7 @@ bool SetReturnPositionAction::Execute(Event event)
|
|||||||
if (returnPos.isSet() && !randomPos.isSet())
|
if (returnPos.isSet() && !randomPos.isSet())
|
||||||
{
|
{
|
||||||
float angle = 2 * M_PI * urand(0, 1000) / 100.0f;
|
float angle = 2 * M_PI * urand(0, 1000) / 100.0f;
|
||||||
float dist = sPlayerbotAIConfig->followDistance * urand(0, 1000) / 1000.0f;
|
float dist = sPlayerbotAIConfig.followDistance * urand(0, 1000) / 1000.0f;
|
||||||
float x = returnPos.x + cos(angle) * dist;
|
float x = returnPos.x + cos(angle) * dist;
|
||||||
float y = returnPos.y + sin(angle) * dist;
|
float y = returnPos.y + sin(angle) * dist;
|
||||||
float z = bot->GetPositionZ();
|
float z = bot->GetPositionZ();
|
||||||
@@ -157,7 +157,7 @@ bool SetReturnPositionAction::isUseful()
|
|||||||
bool ReturnAction::isUseful()
|
bool ReturnAction::isUseful()
|
||||||
{
|
{
|
||||||
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[qualifier];
|
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()[qualifier];
|
||||||
return pos.isSet() && AI_VALUE2(float, "distance", "position_random") > sPlayerbotAIConfig->followDistance;
|
return pos.isSet() && AI_VALUE2(float, "distance", "position_random") > sPlayerbotAIConfig.followDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReturnToStayPositionAction::isPossible()
|
bool ReturnToStayPositionAction::isPossible()
|
||||||
@@ -167,7 +167,7 @@ bool ReturnToStayPositionAction::isPossible()
|
|||||||
if (stayPosition.isSet())
|
if (stayPosition.isSet())
|
||||||
{
|
{
|
||||||
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
||||||
if (distance > sPlayerbotAIConfig->reactDistance)
|
if (distance > sPlayerbotAIConfig.reactDistance)
|
||||||
{
|
{
|
||||||
botAI->TellMaster("The stay position is too far to return. I am going to stay where I am now");
|
botAI->TellMaster("The stay position is too far to return. I am going to stay where I am now");
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ std::string const QueryItemUsageAction::QueryItemUsage(ItemTemplate const* item)
|
|||||||
|
|
||||||
std::string const QueryItemUsageAction::QueryItemPrice(ItemTemplate const* item)
|
std::string const QueryItemUsageAction::QueryItemPrice(ItemTemplate const* item)
|
||||||
{
|
{
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
if (item->Bonding == BIND_WHEN_PICKED_UP)
|
if (item->Bonding == BIND_WHEN_PICKED_UP)
|
||||||
@@ -133,7 +133,7 @@ std::string const QueryItemUsageAction::QueryItemPrice(ItemTemplate const* item)
|
|||||||
{
|
{
|
||||||
Item* sell = *i;
|
Item* sell = *i;
|
||||||
int32 price =
|
int32 price =
|
||||||
sell->GetCount() * sell->GetTemplate()->SellPrice * sRandomPlayerbotMgr->GetSellMultiplier(bot);
|
sell->GetCount() * sell->GetTemplate()->SellPrice * sRandomPlayerbotMgr.GetSellMultiplier(bot);
|
||||||
if (!sellPrice || sellPrice > price)
|
if (!sellPrice || sellPrice > price)
|
||||||
sellPrice = price;
|
sellPrice = price;
|
||||||
}
|
}
|
||||||
@@ -147,7 +147,7 @@ std::string const QueryItemUsageAction::QueryItemPrice(ItemTemplate const* item)
|
|||||||
if (usage == ITEM_USAGE_NONE)
|
if (usage == ITEM_USAGE_NONE)
|
||||||
return msg.str();
|
return msg.str();
|
||||||
|
|
||||||
int32 buyPrice = item->BuyPrice * sRandomPlayerbotMgr->GetBuyMultiplier(bot);
|
int32 buyPrice = item->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot);
|
||||||
if (buyPrice)
|
if (buyPrice)
|
||||||
{
|
{
|
||||||
if (sellPrice)
|
if (sellPrice)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ bool QueryQuestAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
uint32 limit = 0;
|
uint32 limit = 0;
|
||||||
std::vector<TravelDestination*> allDestinations =
|
std::vector<TravelDestination*> allDestinations =
|
||||||
sTravelMgr->getQuestTravelDestinations(bot, questId, true, true, -1);
|
TravelMgr::instance().getQuestTravelDestinations(bot, questId, true, true, -1);
|
||||||
|
|
||||||
std::sort(allDestinations.begin(), allDestinations.end(), [ptr_botpos](TravelDestination* i, TravelDestination* j) {return i->distanceTo(ptr_botpos) < j->distanceTo(ptr_botpos); });
|
std::sort(allDestinations.begin(), allDestinations.end(), [ptr_botpos](TravelDestination* i, TravelDestination* j) {return i->distanceTo(ptr_botpos) < j->distanceTo(ptr_botpos); });
|
||||||
for (auto dest : allDestinations)
|
for (auto dest : allDestinations)
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ bool QuestAction::ProcessQuests(WorldObject* questGiver)
|
|||||||
{
|
{
|
||||||
ObjectGuid guid = questGiver->GetGUID();
|
ObjectGuid guid = questGiver->GetGUID();
|
||||||
|
|
||||||
if (bot->GetDistance(questGiver) > INTERACTION_DISTANCE && !sPlayerbotAIConfig->syncQuestWithPlayer)
|
if (bot->GetDistance(questGiver) > INTERACTION_DISTANCE && !sPlayerbotAIConfig.syncQuestWithPlayer)
|
||||||
{
|
{
|
||||||
//if (botAI->HasStrategy("debug", BotState::BOT_STATE_COMBAT) || botAI->HasStrategy("debug", BotState::BOT_STATE_NON_COMBAT))
|
//if (botAI->HasStrategy("debug", BotState::BOT_STATE_COMBAT) || botAI->HasStrategy("debug", BotState::BOT_STATE_NON_COMBAT))
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@ bool QuestAction::ProcessQuests(WorldObject* questGiver)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, questGiver, sPlayerbotAIConfig->sightDistance))
|
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, questGiver, sPlayerbotAIConfig.sightDistance))
|
||||||
bot->SetFacingToObject(questGiver);
|
bot->SetFacingToObject(questGiver);
|
||||||
|
|
||||||
bot->SetTarget(guid);
|
bot->SetTarget(guid);
|
||||||
@@ -238,7 +238,7 @@ bool QuestAction::AcceptQuest(Quest const* quest, ObjectGuid questGiver)
|
|||||||
p.rpos(0);
|
p.rpos(0);
|
||||||
bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p);
|
bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(p);
|
||||||
|
|
||||||
if (bot->GetQuestStatus(questId) == QUEST_STATUS_NONE && sPlayerbotAIConfig->syncQuestWithPlayer)
|
if (bot->GetQuestStatus(questId) == QUEST_STATUS_NONE && sPlayerbotAIConfig.syncQuestWithPlayer)
|
||||||
{
|
{
|
||||||
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*bot, questGiver,
|
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*bot, questGiver,
|
||||||
TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM);
|
TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM);
|
||||||
@@ -366,7 +366,7 @@ bool QuestUpdateAddItemAction::Execute(Event event)
|
|||||||
placeholders["%quest_obj_required"] = std::to_string(requiredItemsCount);
|
placeholders["%quest_obj_required"] = std::to_string(requiredItemsCount);
|
||||||
if (botAI->HasStrategy("debug quest", BotState::BOT_STATE_COMBAT) || botAI->HasStrategy("debug quest", BotState::BOT_STATE_NON_COMBAT))
|
if (botAI->HasStrategy("debug quest", BotState::BOT_STATE_COMBAT) || botAI->HasStrategy("debug quest", BotState::BOT_STATE_NON_COMBAT))
|
||||||
{
|
{
|
||||||
const auto text = BOT_TEXT2("%quest_link - %item_link %quest_obj_available/%quest_obj_required", placeholders);
|
const auto text = PlayerbotTextMgr::instance().GetBotText("%quest_link - %item_link %quest_obj_available/%quest_obj_required", placeholders);
|
||||||
botAI->Say(text);
|
botAI->Say(text);
|
||||||
LOG_INFO("playerbots", "{} => {}", bot->GetName(), text);
|
LOG_INFO("playerbots", "{} => {}", bot->GetName(), text);
|
||||||
}
|
}
|
||||||
@@ -454,7 +454,7 @@ bool QuestUpdateFailedTimerAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
std::map<std::string, std::string> placeholders;
|
std::map<std::string, std::string> placeholders;
|
||||||
placeholders["%quest_link"] = botAI->GetChatHelper()->FormatQuest(qInfo);
|
placeholders["%quest_link"] = botAI->GetChatHelper()->FormatQuest(qInfo);
|
||||||
botAI->TellMaster(BOT_TEXT2("Failed timer for %quest_link, abandoning", placeholders));
|
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotText("Failed timer for %quest_link, abandoning", placeholders));
|
||||||
BroadcastHelper::BroadcastQuestUpdateFailedTimer(botAI, bot, qInfo);
|
BroadcastHelper::BroadcastQuestUpdateFailedTimer(botAI, bot, qInfo);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -20,4 +20,4 @@ bool QuestConfirmAcceptAction::Execute(Event event)
|
|||||||
botAI->TellMaster(out);
|
botAI->TellMaster(out);
|
||||||
bot->GetSession()->HandleQuestConfirmAccept(sendPacket);
|
bot->GetSession()->HandleQuestConfirmAccept(sendPacket);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,4 +24,4 @@ public:
|
|||||||
bool Execute(Event event) override;
|
bool Execute(Event event) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
bool RandomBotUpdateAction::Execute(Event event)
|
bool RandomBotUpdateAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bot->GetGroup() && botAI->GetGroupLeader())
|
if (bot->GetGroup() && botAI->GetGroupLeader())
|
||||||
@@ -20,10 +20,10 @@ bool RandomBotUpdateAction::Execute(Event event)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (botAI->HasPlayerNearby(sPlayerbotAIConfig->grindDistance))
|
if (botAI->HasPlayerNearby(sPlayerbotAIConfig.grindDistance))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return sRandomPlayerbotMgr->ProcessBot(bot);
|
return sRandomPlayerbotMgr.ProcessBot(bot);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RandomBotUpdateAction::isUseful() { return AI_VALUE(bool, "random bot update"); }
|
bool RandomBotUpdateAction::isUseful() { return AI_VALUE(bool, "random bot update"); }
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ bool ReachTargetAction::isUseful()
|
|||||||
Unit* target = GetTarget();
|
Unit* target = GetTarget();
|
||||||
// float dis = distance + CONTACT_DISTANCE;
|
// float dis = distance + CONTACT_DISTANCE;
|
||||||
return target &&
|
return target &&
|
||||||
!bot->IsWithinCombatRange(target, distance); // sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float,
|
!bot->IsWithinCombatRange(target, distance); // ServerFacade::instance().IsDistanceGreaterThan(AI_VALUE2(float,
|
||||||
// "distance", GetTargetName()), distance);
|
// "distance", GetTargetName()), distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,8 +42,8 @@ bool CastReachTargetSpellAction::isUseful()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "current target"),
|
return ServerFacade::instance().IsDistanceGreaterThan(AI_VALUE2(float, "distance", "current target"),
|
||||||
(distance + sPlayerbotAIConfig->contactDistance));
|
(distance + sPlayerbotAIConfig.contactDistance));
|
||||||
}
|
}
|
||||||
|
|
||||||
ReachSpellAction::ReachSpellAction(PlayerbotAI* botAI)
|
ReachSpellAction::ReachSpellAction(PlayerbotAI* botAI)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ protected:
|
|||||||
class ReachMeleeAction : public ReachTargetAction
|
class ReachMeleeAction : public ReachTargetAction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ReachMeleeAction(PlayerbotAI* botAI) : ReachTargetAction(botAI, "reach melee", sPlayerbotAIConfig->meleeDistance) {}
|
ReachMeleeAction(PlayerbotAI* botAI) : ReachTargetAction(botAI, "reach melee", sPlayerbotAIConfig.meleeDistance) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ReachSpellAction : public ReachTargetAction
|
class ReachSpellAction : public ReachTargetAction
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class HealthChecker : public ReadyChecker
|
|||||||
public:
|
public:
|
||||||
bool Check(PlayerbotAI* botAI, AiObjectContext* context) override
|
bool Check(PlayerbotAI* botAI, AiObjectContext* context) override
|
||||||
{
|
{
|
||||||
return AI_VALUE2(uint8, "health", "self target") > sPlayerbotAIConfig->almostFullHealth;
|
return AI_VALUE2(uint8, "health", "self target") > sPlayerbotAIConfig.almostFullHealth;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string const getName() override { return "HP"; }
|
std::string const getName() override { return "HP"; }
|
||||||
@@ -59,7 +59,7 @@ public:
|
|||||||
bool Check(PlayerbotAI* botAI, AiObjectContext* context) override
|
bool Check(PlayerbotAI* botAI, AiObjectContext* context) override
|
||||||
{
|
{
|
||||||
return !AI_VALUE2(bool, "has mana", "self target") ||
|
return !AI_VALUE2(bool, "has mana", "self target") ||
|
||||||
AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig->mediumHealth;
|
AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.mediumHealth;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string const getName() override { return "MP"; }
|
std::string const getName() override { return "MP"; }
|
||||||
@@ -73,7 +73,7 @@ public:
|
|||||||
Player* bot = botAI->GetBot();
|
Player* bot = botAI->GetBot();
|
||||||
if (Player* master = botAI->GetMaster())
|
if (Player* master = botAI->GetMaster())
|
||||||
{
|
{
|
||||||
bool distance = bot->GetDistance(master) <= sPlayerbotAIConfig->sightDistance;
|
bool distance = bot->GetDistance(master) <= sPlayerbotAIConfig.sightDistance;
|
||||||
if (!distance)
|
if (!distance)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -183,9 +183,9 @@ bool AutoReleaseSpiritAction::ShouldAutoRelease() const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sServerFacade->IsDistanceGreaterThan(
|
return ServerFacade::instance().IsDistanceGreaterThan(
|
||||||
AI_VALUE2(float, "distance", "group leader"),
|
AI_VALUE2(float, "distance", "group leader"),
|
||||||
sPlayerbotAIConfig->sightDistance);
|
sPlayerbotAIConfig.sightDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AutoReleaseSpiritAction::ShouldDelayBattlegroundRelease() const
|
bool AutoReleaseSpiritAction::ShouldDelayBattlegroundRelease() const
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ bool ResetAiAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sPlayerbotRepository->Reset(botAI);
|
PlayerbotRepository::instance().Reset(botAI);
|
||||||
botAI->ResetStrategies(false);
|
botAI->ResetStrategies(false);
|
||||||
botAI->TellMaster("AI was reset to defaults");
|
botAI->TellMaster("AI was reset to defaults");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -20,16 +20,16 @@ bool RevealGatheringItemAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::list<GameObject*> targets;
|
std::list<GameObject*> targets;
|
||||||
AnyGameObjectInObjectRangeCheck u_check(bot, sPlayerbotAIConfig->grindDistance);
|
AnyGameObjectInObjectRangeCheck u_check(bot, sPlayerbotAIConfig.grindDistance);
|
||||||
Acore::GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(bot, targets, u_check);
|
Acore::GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(bot, targets, u_check);
|
||||||
Cell::VisitObjects(bot, searcher, sPlayerbotAIConfig->reactDistance);
|
Cell::VisitObjects(bot, searcher, sPlayerbotAIConfig.reactDistance);
|
||||||
|
|
||||||
std::vector<GameObject*> result;
|
std::vector<GameObject*> result;
|
||||||
for (GameObject* go : targets)
|
for (GameObject* go : targets)
|
||||||
{
|
{
|
||||||
if (!go || !go->isSpawned() ||
|
if (!go || !go->isSpawned() ||
|
||||||
sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, go),
|
ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, go),
|
||||||
sPlayerbotAIConfig->lootDistance))
|
sPlayerbotAIConfig.lootDistance))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (LockEntry const* lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))
|
if (LockEntry const* lockInfo = sLockStore.LookupEntry(go->GetGOInfo()->GetLockId()))
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ bool ReviveFromCorpseAction::Execute(Event event)
|
|||||||
WorldPacket& p = event.getPacket();
|
WorldPacket& p = event.getPacket();
|
||||||
if (!p.empty() && p.GetOpcode() == CMSG_RECLAIM_CORPSE && groupLeader && !corpse && bot->IsAlive())
|
if (!p.empty() && p.GetOpcode() == CMSG_RECLAIM_CORPSE && groupLeader && !corpse && bot->IsAlive())
|
||||||
{
|
{
|
||||||
if (sServerFacade->IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
if (ServerFacade::instance().IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
||||||
sPlayerbotAIConfig->farDistance))
|
sPlayerbotAIConfig.farDistance))
|
||||||
{
|
{
|
||||||
if (!botAI->HasStrategy("follow", BOT_STATE_NON_COMBAT))
|
if (!botAI->HasStrategy("follow", BOT_STATE_NON_COMBAT))
|
||||||
{
|
{
|
||||||
@@ -46,8 +46,8 @@ bool ReviveFromCorpseAction::Execute(Event event)
|
|||||||
if (groupLeader)
|
if (groupLeader)
|
||||||
{
|
{
|
||||||
if (!GET_PLAYERBOT_AI(groupLeader) && groupLeader->isDead() && groupLeader->GetCorpse() &&
|
if (!GET_PLAYERBOT_AI(groupLeader) && groupLeader->isDead() && groupLeader->GetCorpse() &&
|
||||||
sServerFacade->IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
ServerFacade::instance().IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
||||||
sPlayerbotAIConfig->farDistance))
|
sPlayerbotAIConfig.farDistance))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,8 +87,8 @@ bool FindCorpseAction::Execute(Event event)
|
|||||||
// if (groupLeader)
|
// if (groupLeader)
|
||||||
// {
|
// {
|
||||||
// if (!GET_PLAYERBOT_AI(groupLeader) &&
|
// if (!GET_PLAYERBOT_AI(groupLeader) &&
|
||||||
// sServerFacade->IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
// ServerFacade::instance().IsDistanceLessThan(AI_VALUE2(float, "distance", "group leader"),
|
||||||
// sPlayerbotAIConfig->farDistance)) return false;
|
// sPlayerbotAIConfig.farDistance)) return false;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
uint32 dCount = AI_VALUE(uint32, "death count");
|
uint32 dCount = AI_VALUE(uint32, "death count");
|
||||||
@@ -101,8 +101,8 @@ bool FindCorpseAction::Execute(Event event)
|
|||||||
// bot->GetGUID().ToString().c_str(), bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(),
|
// bot->GetGUID().ToString().c_str(), bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(),
|
||||||
// bot->GetName().c_str());
|
// bot->GetName().c_str());
|
||||||
context->GetValue<uint32>("death count")->Set(0);
|
context->GetValue<uint32>("death count")->Set(0);
|
||||||
// sRandomPlayerbotMgr->RandomTeleportForLevel(bot);
|
// sRandomPlayerbotMgr.RandomTeleportForLevel(bot);
|
||||||
sRandomPlayerbotMgr->Revive(bot);
|
sRandomPlayerbotMgr.Revive(bot);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ bool FindCorpseAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
if (moveToLeader) // We are near group leader.
|
if (moveToLeader) // We are near group leader.
|
||||||
{
|
{
|
||||||
if (botPos.fDist(leaderPos) < sPlayerbotAIConfig->spellDistance)
|
if (botPos.fDist(leaderPos) < sPlayerbotAIConfig.spellDistance)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (deadTime > 8 * MINUTE) // We have walked too long already.
|
else if (deadTime > 8 * MINUTE) // We have walked too long already.
|
||||||
@@ -138,7 +138,7 @@ bool FindCorpseAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If we are getting close move to a save ressurrection spot instead of just the corpse.
|
// If we are getting close move to a save ressurrection spot instead of just the corpse.
|
||||||
if (corpseDist < sPlayerbotAIConfig->reactDistance)
|
if (corpseDist < sPlayerbotAIConfig.reactDistance)
|
||||||
{
|
{
|
||||||
if (moveToLeader)
|
if (moveToLeader)
|
||||||
moveToPos = leaderPos;
|
moveToPos = leaderPos;
|
||||||
@@ -162,7 +162,7 @@ bool FindCorpseAction::Execute(Event event)
|
|||||||
|
|
||||||
if (!botAI->AllowActivity(ALL_ACTIVITY))
|
if (!botAI->AllowActivity(ALL_ACTIVITY))
|
||||||
{
|
{
|
||||||
uint32 delay = sServerFacade->GetDistance2d(bot, corpse) /
|
uint32 delay = ServerFacade::instance().GetDistance2d(bot, corpse) /
|
||||||
bot->GetSpeed(MOVE_RUN); // Time a bot would take to travel to it's corpse.
|
bot->GetSpeed(MOVE_RUN); // Time a bot would take to travel to it's corpse.
|
||||||
delay = std::min(delay, uint32(10 * MINUTE)); // Cap time to get to corpse at 10 minutes.
|
delay = std::min(delay, uint32(10 * MINUTE)); // Cap time to get to corpse at 10 minutes.
|
||||||
|
|
||||||
@@ -308,7 +308,7 @@ bool SpiritHealerAction::Execute(Event event)
|
|||||||
GraveyardStruct const* ClosestGrave =
|
GraveyardStruct const* ClosestGrave =
|
||||||
GetGrave(dCount > 10 || deadTime > 15 * MINUTE || AI_VALUE(uint8, "durability") < 10);
|
GetGrave(dCount > 10 || deadTime > 15 * MINUTE || AI_VALUE(uint8, "durability") < 10);
|
||||||
|
|
||||||
if (bot->GetDistance2d(ClosestGrave->x, ClosestGrave->y) < sPlayerbotAIConfig->sightDistance)
|
if (bot->GetDistance2d(ClosestGrave->x, ClosestGrave->y) < sPlayerbotAIConfig.sightDistance)
|
||||||
{
|
{
|
||||||
GuidVector npcs = AI_VALUE(GuidVector, "nearest npcs");
|
GuidVector npcs = AI_VALUE(GuidVector, "nearest npcs");
|
||||||
for (GuidVector::iterator i = npcs.begin(); i != npcs.end(); i++)
|
for (GuidVector::iterator i = npcs.begin(); i != npcs.end(); i++)
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ bool RpgAction::SetNextRpgAction()
|
|||||||
|
|
||||||
std::mt19937 gen(time(0));
|
std::mt19937 gen(time(0));
|
||||||
|
|
||||||
sTravelMgr->weighted_shuffle(actions.begin(), actions.end(), relevances.begin(), relevances.end(), gen);
|
TravelMgr::instance().weighted_shuffle(actions.begin(), actions.end(), relevances.begin(), relevances.end(), gen);
|
||||||
|
|
||||||
Action* action = actions.front();
|
Action* action = actions.front();
|
||||||
|
|
||||||
|
|||||||
@@ -77,9 +77,9 @@ void RpgHelper::setFacing(GuidPosition guidPosition)
|
|||||||
void RpgHelper::setDelay(bool waitForGroup)
|
void RpgHelper::setDelay(bool waitForGroup)
|
||||||
{
|
{
|
||||||
if (!botAI->HasRealPlayerMaster() || (waitForGroup && botAI->GetGroupLeader() == bot && bot->GetGroup()))
|
if (!botAI->HasRealPlayerMaster() || (waitForGroup && botAI->GetGroupLeader() == bot && bot->GetGroup()))
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->rpgDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.rpgDelay);
|
||||||
else
|
else
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->rpgDelay / 5);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.rpgDelay / 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RpgSubAction::isPossible() { return rpg->guidP() && rpg->guidP().GetWorldObject(); }
|
bool RpgSubAction::isPossible() { return rpg->guidP() && rpg->guidP().GetWorldObject(); }
|
||||||
@@ -392,7 +392,7 @@ bool RpgTradeUsefulAction::Execute(Event event)
|
|||||||
bot->Say("Start trade with" + chat->FormatWorldobject(player),
|
bot->Say("Start trade with" + chat->FormatWorldobject(player),
|
||||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||||
|
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->rpgDelay);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.rpgDelay);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,7 +402,7 @@ bool RpgTradeUsefulAction::Execute(Event event)
|
|||||||
bool RpgDuelAction::isUseful()
|
bool RpgDuelAction::isUseful()
|
||||||
{
|
{
|
||||||
// do not offer duel in non pvp areas
|
// do not offer duel in non pvp areas
|
||||||
if (sPlayerbotAIConfig->IsInPvpProhibitedZone(bot->GetZoneId()))
|
if (sPlayerbotAIConfig.IsInPvpProhibitedZone(bot->GetZoneId()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Players can only fight a duel with each other outside (=not inside dungeons and not in capital cities)
|
// Players can only fight a duel with each other outside (=not inside dungeons and not in capital cities)
|
||||||
@@ -440,4 +440,4 @@ bool RpgMountAnimAction::Execute(Event event)
|
|||||||
bot->GetSession()->HandleMountSpecialAnimOpcode(p);
|
bot->GetSession()->HandleMountSpecialAnimOpcode(p);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ bool SayAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// load text based on chance
|
// load text based on chance
|
||||||
if (!sPlayerbotTextMgr->GetBotText(qualifier, text, placeholders))
|
if (!PlayerbotTextMgr::instance().GetBotText(qualifier, text, placeholders))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (text.find("/y ") == 0)
|
if (text.find("/y ") == 0)
|
||||||
@@ -206,7 +206,7 @@ void ChatReplyAction::ChatReplyDo(Player* bot, uint32& type, uint32& guid1, uint
|
|||||||
}
|
}
|
||||||
|
|
||||||
//toxic links
|
//toxic links
|
||||||
if (msg.starts_with(sPlayerbotAIConfig->toxicLinksPrefix)
|
if (msg.starts_with(sPlayerbotAIConfig.toxicLinksPrefix)
|
||||||
&& (GET_PLAYERBOT_AI(bot)->GetChatHelper()->ExtractAllItemIds(msg).size() > 0 || GET_PLAYERBOT_AI(bot)->GetChatHelper()->ExtractAllQuestIds(msg).size() > 0))
|
&& (GET_PLAYERBOT_AI(bot)->GetChatHelper()->ExtractAllItemIds(msg).size() > 0 || GET_PLAYERBOT_AI(bot)->GetChatHelper()->ExtractAllQuestIds(msg).size() > 0))
|
||||||
{
|
{
|
||||||
HandleToxicLinksReply(bot, chatChannelSource, msg, name);
|
HandleToxicLinksReply(bot, chatChannelSource, msg, name);
|
||||||
@@ -230,7 +230,7 @@ bool ChatReplyAction::HandleThunderfuryReply(Player* bot, ChatChannelSource chat
|
|||||||
const auto thunderfury = sObjectMgr->GetItemTemplate(19019);
|
const auto thunderfury = sObjectMgr->GetItemTemplate(19019);
|
||||||
placeholders["%thunderfury_link"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatItem(thunderfury);
|
placeholders["%thunderfury_link"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatItem(thunderfury);
|
||||||
|
|
||||||
std::string responseMessage = BOT_TEXT2("thunderfury_spam", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("thunderfury_spam", placeholders);
|
||||||
|
|
||||||
switch (chatChannelSource)
|
switch (chatChannelSource)
|
||||||
{
|
{
|
||||||
@@ -271,8 +271,8 @@ bool ChatReplyAction::HandleToxicLinksReply(Player* bot, ChatChannelSource chatC
|
|||||||
std::vector<Item*> botItems = GET_PLAYERBOT_AI(bot)->GetInventoryAndEquippedItems();
|
std::vector<Item*> botItems = GET_PLAYERBOT_AI(bot)->GetInventoryAndEquippedItems();
|
||||||
|
|
||||||
std::map<std::string, std::string> placeholders;
|
std::map<std::string, std::string> placeholders;
|
||||||
placeholders["%random_inventory_item_link"] = botItems.size() > 0 ? GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatItem(botItems[rand() % botItems.size()]->GetTemplate()) : BOT_TEXT1("string_empty_link");
|
placeholders["%random_inventory_item_link"] = botItems.size() > 0 ? GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatItem(botItems[rand() % botItems.size()]->GetTemplate()) : PlayerbotTextMgr::instance().GetBotText("string_empty_link");
|
||||||
placeholders["%prefix"] = sPlayerbotAIConfig->toxicLinksPrefix;
|
placeholders["%prefix"] = sPlayerbotAIConfig.toxicLinksPrefix;
|
||||||
|
|
||||||
if (incompleteQuests.size() > 0)
|
if (incompleteQuests.size() > 0)
|
||||||
{
|
{
|
||||||
@@ -287,8 +287,8 @@ bool ChatReplyAction::HandleToxicLinksReply(Player* bot, ChatChannelSource chatC
|
|||||||
placeholders["%my_role"] = ChatHelper::FormatClass(bot, AiFactory::GetPlayerSpecTab(bot));
|
placeholders["%my_role"] = ChatHelper::FormatClass(bot, AiFactory::GetPlayerSpecTab(bot));
|
||||||
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
||||||
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
||||||
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : BOT_TEXT1("string_unknown_area");
|
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : BOT_TEXT1("string_unknown_area");
|
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
||||||
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
||||||
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
||||||
@@ -297,17 +297,17 @@ bool ChatReplyAction::HandleToxicLinksReply(Player* bot, ChatChannelSource chatC
|
|||||||
{
|
{
|
||||||
case ChatChannelSource::SRC_WORLD:
|
case ChatChannelSource::SRC_WORLD:
|
||||||
{
|
{
|
||||||
GET_PLAYERBOT_AI(bot)->SayToWorld(BOT_TEXT2("suggest_toxic_links", placeholders));
|
GET_PLAYERBOT_AI(bot)->SayToWorld(PlayerbotTextMgr::instance().GetBotText("suggest_toxic_links", placeholders));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatChannelSource::SRC_GENERAL:
|
case ChatChannelSource::SRC_GENERAL:
|
||||||
{
|
{
|
||||||
GET_PLAYERBOT_AI(bot)->SayToChannel(BOT_TEXT2("suggest_toxic_links", placeholders), ChatChannelId::GENERAL);
|
GET_PLAYERBOT_AI(bot)->SayToChannel(PlayerbotTextMgr::instance().GetBotText("suggest_toxic_links", placeholders), ChatChannelId::GENERAL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ChatChannelSource::SRC_GUILD:
|
case ChatChannelSource::SRC_GUILD:
|
||||||
{
|
{
|
||||||
GET_PLAYERBOT_AI(bot)->SayToGuild(BOT_TEXT2("suggest_toxic_links", placeholders));
|
GET_PLAYERBOT_AI(bot)->SayToGuild(PlayerbotTextMgr::instance().GetBotText("suggest_toxic_links", placeholders));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -343,8 +343,8 @@ bool ChatReplyAction::HandleWTBItemsReply(Player* bot, ChatChannelSource chatCha
|
|||||||
placeholders["%other_name"] = name;
|
placeholders["%other_name"] = name;
|
||||||
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
||||||
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
||||||
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : BOT_TEXT1("string_unknown_area");
|
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : BOT_TEXT1("string_unknown_area");
|
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
||||||
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
||||||
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
||||||
@@ -365,12 +365,12 @@ bool ChatReplyAction::HandleWTBItemsReply(Player* bot, ChatChannelSource chatCha
|
|||||||
//may reply to the same channel or whisper
|
//may reply to the same channel or whisper
|
||||||
if (urand(0, 1))
|
if (urand(0, 1))
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_channel", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_channel", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->SayToWorld(responseMessage);
|
GET_PLAYERBOT_AI(bot)->SayToWorld(responseMessage);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -380,12 +380,12 @@ bool ChatReplyAction::HandleWTBItemsReply(Player* bot, ChatChannelSource chatCha
|
|||||||
//may reply to the same channel or whisper
|
//may reply to the same channel or whisper
|
||||||
if (urand(0, 1))
|
if (urand(0, 1))
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_channel", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_channel", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::GENERAL);
|
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::GENERAL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -395,12 +395,12 @@ bool ChatReplyAction::HandleWTBItemsReply(Player* bot, ChatChannelSource chatCha
|
|||||||
//may reply to the same channel or whisper
|
//may reply to the same channel or whisper
|
||||||
if (urand(0, 1))
|
if (urand(0, 1))
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_channel", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_channel", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::TRADE);
|
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::TRADE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_wtb_items_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_wtb_items_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -438,8 +438,8 @@ bool ChatReplyAction::HandleLFGQuestsReply(Player* bot, ChatChannelSource chatCh
|
|||||||
placeholders["%other_name"] = name;
|
placeholders["%other_name"] = name;
|
||||||
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
AreaTableEntry const* current_area = GET_PLAYERBOT_AI(bot)->GetCurrentArea();
|
||||||
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
AreaTableEntry const* current_zone = GET_PLAYERBOT_AI(bot)->GetCurrentZone();
|
||||||
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : BOT_TEXT1("string_unknown_area");
|
placeholders["%area_name"] = current_area ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_area) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : BOT_TEXT1("string_unknown_area");
|
placeholders["%zone_name"] = current_zone ? GET_PLAYERBOT_AI(bot)->GetLocalizedAreaName(current_zone) : PlayerbotTextMgr::instance().GetBotText("string_unknown_area");
|
||||||
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
placeholders["%my_class"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatClass(bot->getClass());
|
||||||
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
placeholders["%my_race"] = GET_PLAYERBOT_AI(bot)->GetChatHelper()->FormatRace(bot->getRace());
|
||||||
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
placeholders["%my_level"] = std::to_string(bot->GetLevel());
|
||||||
@@ -458,12 +458,12 @@ bool ChatReplyAction::HandleLFGQuestsReply(Player* bot, ChatChannelSource chatCh
|
|||||||
//may reply to the same channel or whisper
|
//may reply to the same channel or whisper
|
||||||
if (urand(0, 1))
|
if (urand(0, 1))
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_lfg_quests_channel", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_lfg_quests_channel", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->SayToWorld(responseMessage);
|
GET_PLAYERBOT_AI(bot)->SayToWorld(responseMessage);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_lfg_quests_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_lfg_quests_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -473,12 +473,12 @@ bool ChatReplyAction::HandleLFGQuestsReply(Player* bot, ChatChannelSource chatCh
|
|||||||
//may reply to the same channel or whisper
|
//may reply to the same channel or whisper
|
||||||
if (urand(0, 1))
|
if (urand(0, 1))
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_lfg_quests_channel", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_lfg_quests_channel", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::GENERAL);
|
GET_PLAYERBOT_AI(bot)->SayToChannel(responseMessage, ChatChannelId::GENERAL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string responseMessage = BOT_TEXT2("response_lfg_quests_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_lfg_quests_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -487,7 +487,7 @@ bool ChatReplyAction::HandleLFGQuestsReply(Player* bot, ChatChannelSource chatCh
|
|||||||
{
|
{
|
||||||
//do not reply to the chat
|
//do not reply to the chat
|
||||||
//may whisper
|
//may whisper
|
||||||
std::string responseMessage = BOT_TEXT2("response_lfg_quests_whisper", placeholders);
|
std::string responseMessage = PlayerbotTextMgr::instance().GetBotText("response_lfg_quests_whisper", placeholders);
|
||||||
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
GET_PLAYERBOT_AI(bot)->Whisper(responseMessage, name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1042,7 +1042,7 @@ std::string ChatReplyAction::GenerateReplyMessage(Player* bot, std::string& inco
|
|||||||
// load text if needed
|
// load text if needed
|
||||||
if (respondsText.empty())
|
if (respondsText.empty())
|
||||||
{
|
{
|
||||||
respondsText = BOT_TEXT2(replyType, name);
|
respondsText = PlayerbotTextMgr::instance().GetBotText(replyType, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (respondsText.size() > 255)
|
if (respondsText.size() > 255)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
bool SecurityCheckAction::isUseful()
|
bool SecurityCheckAction::isUseful()
|
||||||
{
|
{
|
||||||
return sRandomPlayerbotMgr->IsRandomBot(bot) && botAI->GetMaster() &&
|
return sRandomPlayerbotMgr.IsRandomBot(bot) && botAI->GetMaster() &&
|
||||||
botAI->GetMaster()->GetSession()->GetSecurity() < SEC_GAMEMASTER && !GET_PLAYERBOT_AI(botAI->GetMaster());
|
botAI->GetMaster()->GetSession()->GetSecurity() < SEC_GAMEMASTER && !GET_PLAYERBOT_AI(botAI->GetMaster());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ Creature* SeeSpellAction::CreateWps(Player* wpOwner, float x, float y, float z,
|
|||||||
bool important)
|
bool important)
|
||||||
{
|
{
|
||||||
float dist = wpOwner->GetDistance(x, y, z);
|
float dist = wpOwner->GetDistance(x, y, z);
|
||||||
float delay = 1000.0f * dist / wpOwner->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig->reactDelay;
|
float delay = 1000.0f * dist / wpOwner->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig.reactDelay;
|
||||||
|
|
||||||
if (!important)
|
if (!important)
|
||||||
delay *= 0.25;
|
delay *= 0.25;
|
||||||
@@ -61,7 +61,7 @@ bool SeeSpellAction::Execute(Event event)
|
|||||||
|
|
||||||
if (FISHING_SPELLS.find(spellId) != FISHING_SPELLS.end())
|
if (FISHING_SPELLS.find(spellId) != FISHING_SPELLS.end())
|
||||||
{
|
{
|
||||||
if (AI_VALUE(bool, "can fish") && sPlayerbotAIConfig->enableFishingWithMaster)
|
if (AI_VALUE(bool, "can fish") && sPlayerbotAIConfig.enableFishingWithMaster)
|
||||||
{
|
{
|
||||||
botAI->ChangeStrategy("+master fishing", BOT_STATE_NON_COMBAT);
|
botAI->ChangeStrategy("+master fishing", BOT_STATE_NON_COMBAT);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
bool SendMailAction::Execute(Event event)
|
bool SendMailAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
uint32 account = bot->GetSession()->GetAccountId();
|
uint32 account = bot->GetSession()->GetAccountId();
|
||||||
bool randomBot = sPlayerbotAIConfig->IsInRandomAccountList(account);
|
bool randomBot = sPlayerbotAIConfig.IsInRandomAccountList(account);
|
||||||
|
|
||||||
GuidVector gos = *context->GetValue<GuidVector>("nearest game objects");
|
GuidVector gos = *context->GetValue<GuidVector>("nearest game objects");
|
||||||
bool mailboxFound = false;
|
bool mailboxFound = false;
|
||||||
|
|||||||
@@ -109,4 +109,4 @@ bool AutoShareQuestAction::Execute(Event event)
|
|||||||
bool AutoShareQuestAction::isUseful()
|
bool AutoShareQuestAction::isUseful()
|
||||||
{
|
{
|
||||||
return bot->GetGroup() && !botAI->HasActivePlayerMaster();
|
return bot->GetGroup() && !botAI->HasActivePlayerMaster();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ bool StayActionBase::Stay()
|
|||||||
if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE)
|
if (bot->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint32 sitDelay = sPlayerbotAIConfig->sitDelay / 1000;
|
uint32 sitDelay = sPlayerbotAIConfig.sitDelay / 1000;
|
||||||
time_t stayTime = AI_VALUE(time_t, "stay time");
|
time_t stayTime = AI_VALUE(time_t, "stay time");
|
||||||
time_t now = time(nullptr);
|
time_t now = time(nullptr);
|
||||||
if (!stayTime)
|
if (!stayTime)
|
||||||
@@ -48,7 +48,7 @@ bool StayAction::isUseful()
|
|||||||
if (stayPosition.isSet())
|
if (stayPosition.isSet())
|
||||||
{
|
{
|
||||||
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
||||||
if (sPlayerbotAIConfig->followDistance)
|
if (sPlayerbotAIConfig.followDistance)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ SuggestWhatToDoAction::SuggestWhatToDoAction(PlayerbotAI* botAI, std::string con
|
|||||||
|
|
||||||
bool SuggestWhatToDoAction::isUseful()
|
bool SuggestWhatToDoAction::isUseful()
|
||||||
{
|
{
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot) || bot->GetGroup() || bot->GetInstanceId() || bot->GetBattleground())
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot) || bot->GetGroup() || bot->GetInstanceId() || bot->GetBattleground())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string qualifier = "suggest what to do";
|
std::string qualifier = "suggest what to do";
|
||||||
@@ -140,7 +140,7 @@ void SuggestWhatToDoAction::grindMaterials()
|
|||||||
placeholders["%role"] = chat->formatClass(bot, AiFactory::GetPlayerSpecTab(bot));
|
placeholders["%role"] = chat->formatClass(bot, AiFactory::GetPlayerSpecTab(bot));
|
||||||
placeholders["%category"] = item;
|
placeholders["%category"] = item;
|
||||||
|
|
||||||
spam(BOT_TEXT2("suggest_trade", placeholders), urand(0, 1) ? 0x3C : 0x18, !urand(0, 2), !urand(0,
|
spam(PlayerbotTextMgr::instance().GetBotText("suggest_trade", placeholders), urand(0, 1) ? 0x3C : 0x18, !urand(0, 2), !urand(0,
|
||||||
3)); return;
|
3)); return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -260,9 +260,9 @@ SuggestDungeonAction::SuggestDungeonAction(PlayerbotAI* botAI) : SuggestWhatToDo
|
|||||||
|
|
||||||
bool SuggestDungeonAction::Execute(Event event)
|
bool SuggestDungeonAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
// TODO: use sPlayerbotDungeonRepository
|
// TODO: use PlayerbotDungeonRepository::instance()
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->randomBotSuggestDungeons || bot->GetGroup())
|
if (!sPlayerbotAIConfig.randomBotSuggestDungeons || bot->GetGroup())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (instances.empty())
|
if (instances.empty())
|
||||||
@@ -373,7 +373,7 @@ bool SuggestTradeAction::Execute(Event event)
|
|||||||
if (!proto)
|
if (!proto)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint32 price = proto->SellPrice * sRandomPlayerbotMgr->GetSellMultiplier(bot) * count;
|
uint32 price = proto->SellPrice * sRandomPlayerbotMgr.GetSellMultiplier(bot) * count;
|
||||||
if (!price)
|
if (!price)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ bool TalkToQuestGiverAction::ProcessQuest(Quest const* quest, Object* questGiver
|
|||||||
QuestStatus status = bot->GetQuestStatus(quest->GetQuestId());
|
QuestStatus status = bot->GetQuestStatus(quest->GetQuestId());
|
||||||
Player* master = GetMaster();
|
Player* master = GetMaster();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->syncQuestForPlayer && master)
|
if (sPlayerbotAIConfig.syncQuestForPlayer && master)
|
||||||
{
|
{
|
||||||
PlayerbotAI* masterBotAI = GET_PLAYERBOT_AI(master);
|
PlayerbotAI* masterBotAI = GET_PLAYERBOT_AI(master);
|
||||||
if (!masterBotAI || masterBotAI->IsRealPlayer())
|
if (!masterBotAI || masterBotAI->IsRealPlayer())
|
||||||
@@ -35,7 +35,7 @@ bool TalkToQuestGiverAction::ProcessQuest(Quest const* quest, Object* questGiver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->syncQuestWithPlayer)
|
if (sPlayerbotAIConfig.syncQuestWithPlayer)
|
||||||
{
|
{
|
||||||
if (master && master->GetQuestStatus(quest->GetQuestId()) == QUEST_STATUS_COMPLETE &&
|
if (master && master->GetQuestStatus(quest->GetQuestId()) == QUEST_STATUS_COMPLETE &&
|
||||||
(status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_FAILED))
|
(status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_FAILED))
|
||||||
@@ -105,14 +105,14 @@ void TalkToQuestGiverAction::RewardNoItem(Quest const* quest, Object* questGiver
|
|||||||
|
|
||||||
if (bot->CanRewardQuest(quest, false))
|
if (bot->CanRewardQuest(quest, false))
|
||||||
{
|
{
|
||||||
out << BOT_TEXT2("quest_status_completed", args);
|
out << PlayerbotTextMgr::instance().GetBotText("quest_status_completed", args);
|
||||||
BroadcastHelper::BroadcastQuestTurnedIn(botAI, bot, quest);
|
BroadcastHelper::BroadcastQuestTurnedIn(botAI, bot, quest);
|
||||||
|
|
||||||
bot->RewardQuest(quest, 0, questGiver, false);
|
bot->RewardQuest(quest, 0, questGiver, false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out << BOT_TEXT2("quest_status_unable_to_complete", args);
|
out << PlayerbotTextMgr::instance().GetBotText("quest_status_unable_to_complete", args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,13 +126,13 @@ void TalkToQuestGiverAction::RewardSingleItem(Quest const* quest, Object* questG
|
|||||||
|
|
||||||
if (bot->CanRewardQuest(quest, index, false))
|
if (bot->CanRewardQuest(quest, index, false))
|
||||||
{
|
{
|
||||||
out << BOT_TEXT2("quest_status_complete_single_reward", args);
|
out << PlayerbotTextMgr::instance().GetBotText("quest_status_complete_single_reward", args);
|
||||||
BroadcastHelper::BroadcastQuestTurnedIn(botAI, bot, quest);
|
BroadcastHelper::BroadcastQuestTurnedIn(botAI, bot, quest);
|
||||||
bot->RewardQuest(quest, index, questGiver, true);
|
bot->RewardQuest(quest, index, questGiver, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out << BOT_TEXT2("quest_status_unable_to_complete", args);
|
out << PlayerbotTextMgr::instance().GetBotText("quest_status_unable_to_complete", args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ void TalkToQuestGiverAction::RewardMultipleItem(Quest const* quest, Object* ques
|
|||||||
std::set<uint32> bestIds;
|
std::set<uint32> bestIds;
|
||||||
|
|
||||||
std::ostringstream outid;
|
std::ostringstream outid;
|
||||||
if (!botAI->IsAlt() || sPlayerbotAIConfig->autoPickReward == "yes")
|
if (!botAI->IsAlt() || sPlayerbotAIConfig.autoPickReward == "yes")
|
||||||
{
|
{
|
||||||
bestIds = BestRewards(quest);
|
bestIds = BestRewards(quest);
|
||||||
if (!bestIds.empty())
|
if (!bestIds.empty())
|
||||||
@@ -198,7 +198,7 @@ void TalkToQuestGiverAction::RewardMultipleItem(Quest const* quest, Object* ques
|
|||||||
AskToSelectReward(quest, out, true);
|
AskToSelectReward(quest, out, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sPlayerbotAIConfig->autoPickReward == "no")
|
else if (sPlayerbotAIConfig.autoPickReward == "no")
|
||||||
{
|
{
|
||||||
// Old functionality, list rewards.
|
// Old functionality, list rewards.
|
||||||
AskToSelectReward(quest, out, false);
|
AskToSelectReward(quest, out, false);
|
||||||
@@ -260,7 +260,7 @@ bool TurnInQueryQuestAction::Execute(Event event)
|
|||||||
QuestStatus status = bot->GetQuestStatus(quest->GetQuestId());
|
QuestStatus status = bot->GetQuestStatus(quest->GetQuestId());
|
||||||
Player* master = GetMaster();
|
Player* master = GetMaster();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->syncQuestForPlayer && master)
|
if (sPlayerbotAIConfig.syncQuestForPlayer && master)
|
||||||
{
|
{
|
||||||
PlayerbotAI* masterBotAI = GET_PLAYERBOT_AI(master);
|
PlayerbotAI* masterBotAI = GET_PLAYERBOT_AI(master);
|
||||||
if (!masterBotAI || masterBotAI->IsRealPlayer())
|
if (!masterBotAI || masterBotAI->IsRealPlayer())
|
||||||
@@ -271,7 +271,7 @@ bool TurnInQueryQuestAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->syncQuestWithPlayer)
|
if (sPlayerbotAIConfig.syncQuestWithPlayer)
|
||||||
{
|
{
|
||||||
if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_FAILED)
|
if (status == QUEST_STATUS_INCOMPLETE || status == QUEST_STATUS_FAILED)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -152,4 +152,4 @@ bool TellCalculateItemAction::Execute(Event event)
|
|||||||
out << "Calculated score of " << chat->FormatItem(proto) << " : " << score;
|
out << "Calculated score of " << chat->FormatItem(proto) << " : " << score;
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ bool TradeAction::Execute(Event event)
|
|||||||
std::string const text = event.getParam();
|
std::string const text = event.getParam();
|
||||||
|
|
||||||
// If text starts with any excluded prefix, don't process it further.
|
// If text starts with any excluded prefix, don't process it further.
|
||||||
for (auto const& prefix : sPlayerbotAIConfig->tradeActionExcludedPrefixes)
|
for (auto const& prefix : sPlayerbotAIConfig.tradeActionExcludedPrefixes)
|
||||||
{
|
{
|
||||||
if (text.find(prefix) == 0)
|
if (text.find(prefix) == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ bool TradeStatusAction::Execute(Event event)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->enableRandomBotTrading == 0 && (sRandomPlayerbotMgr->IsRandomBot(bot)|| sRandomPlayerbotMgr->IsAddclassBot(bot)))
|
if (sPlayerbotAIConfig.enableRandomBotTrading == 0 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||||
{
|
{
|
||||||
bot->Whisper("Trading is disabled", LANG_UNIVERSAL, trader);
|
bot->Whisper("Trading is disabled", LANG_UNIVERSAL, trader);
|
||||||
return false;
|
return false;
|
||||||
@@ -61,7 +61,7 @@ bool TradeStatusAction::Execute(Event event)
|
|||||||
uint32 status = 0;
|
uint32 status = 0;
|
||||||
p << status;
|
p << status;
|
||||||
|
|
||||||
uint32 discount = sRandomPlayerbotMgr->GetTradeDiscount(bot, trader);
|
uint32 discount = sRandomPlayerbotMgr.GetTradeDiscount(bot, trader);
|
||||||
if (CheckTrade())
|
if (CheckTrade())
|
||||||
{
|
{
|
||||||
int32 botMoney = CalculateCost(bot, true);
|
int32 botMoney = CalculateCost(bot, true);
|
||||||
@@ -81,7 +81,7 @@ bool TradeStatusAction::Execute(Event event)
|
|||||||
bot->GetSession()->HandleAcceptTradeOpcode(p);
|
bot->GetSession()->HandleAcceptTradeOpcode(p);
|
||||||
if (bot->GetTradeData())
|
if (bot->GetTradeData())
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->SetTradeDiscount(bot, trader, discount);
|
sRandomPlayerbotMgr.SetTradeDiscount(bot, trader, discount);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ bool TradeStatusAction::Execute(Event event)
|
|||||||
craftData.AddObtained(itemId, count);
|
craftData.AddObtained(itemId, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
sGuildTaskMgr->CheckItemTask(itemId, count, trader, bot);
|
GuildTaskMgr::instance().CheckItemTask(itemId, count, trader, bot);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::map<uint32, uint32>::iterator i = takenItemIds.begin(); i != takenItemIds.end(); ++i)
|
for (std::map<uint32, uint32>::iterator i = takenItemIds.begin(); i != takenItemIds.end(); ++i)
|
||||||
@@ -116,7 +116,7 @@ bool TradeStatusAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
else if (status == TRADE_STATUS_BEGIN_TRADE)
|
else if (status == TRADE_STATUS_BEGIN_TRADE)
|
||||||
{
|
{
|
||||||
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, trader, sPlayerbotAIConfig->sightDistance))
|
if (!bot->HasInArc(CAST_ANGLE_IN_FRONT, trader, sPlayerbotAIConfig.sightDistance))
|
||||||
bot->SetFacingToObject(trader);
|
bot->SetFacingToObject(trader);
|
||||||
|
|
||||||
BeginTrade();
|
BeginTrade();
|
||||||
@@ -141,9 +141,9 @@ void TradeStatusAction::BeginTrade()
|
|||||||
botAI->TellMaster("=== Inventory ===");
|
botAI->TellMaster("=== Inventory ===");
|
||||||
TellItems(visitor.items, visitor.soulbound);
|
TellItems(visitor.items, visitor.soulbound);
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
{
|
{
|
||||||
uint32 discount = sRandomPlayerbotMgr->GetTradeDiscount(bot, botAI->GetMaster());
|
uint32 discount = sRandomPlayerbotMgr.GetTradeDiscount(bot, botAI->GetMaster());
|
||||||
if (discount)
|
if (discount)
|
||||||
{
|
{
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
@@ -198,7 +198,7 @@ bool TradeStatusAction::CheckTrade()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
uint32 accountId = bot->GetSession()->GetAccountId();
|
uint32 accountId = bot->GetSession()->GetAccountId();
|
||||||
if (!sPlayerbotAIConfig->IsInRandomAccountList(accountId))
|
if (!sPlayerbotAIConfig.IsInRandomAccountList(accountId))
|
||||||
{
|
{
|
||||||
int32 botItemsMoney = CalculateCost(bot, true);
|
int32 botItemsMoney = CalculateCost(bot, true);
|
||||||
int32 botMoney = bot->GetTradeData()->GetMoney() + botItemsMoney;
|
int32 botMoney = bot->GetTradeData()->GetMoney() + botItemsMoney;
|
||||||
@@ -214,12 +214,12 @@ bool TradeStatusAction::CheckTrade()
|
|||||||
int32 botMoney = bot->GetTradeData()->GetMoney() + botItemsMoney;
|
int32 botMoney = bot->GetTradeData()->GetMoney() + botItemsMoney;
|
||||||
int32 playerItemsMoney = CalculateCost(trader, false);
|
int32 playerItemsMoney = CalculateCost(trader, false);
|
||||||
int32 playerMoney = trader->GetTradeData()->GetMoney() + playerItemsMoney;
|
int32 playerMoney = trader->GetTradeData()->GetMoney() + playerItemsMoney;
|
||||||
if (botItemsMoney > 0 && sPlayerbotAIConfig->enableRandomBotTrading == 2 && (sRandomPlayerbotMgr->IsRandomBot(bot)|| sRandomPlayerbotMgr->IsAddclassBot(bot)))
|
if (botItemsMoney > 0 && sPlayerbotAIConfig.enableRandomBotTrading == 2 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||||
{
|
{
|
||||||
bot->Whisper("Selling is disabled.", LANG_UNIVERSAL, trader);
|
bot->Whisper("Selling is disabled.", LANG_UNIVERSAL, trader);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (playerItemsMoney && sPlayerbotAIConfig->enableRandomBotTrading == 3 && (sRandomPlayerbotMgr->IsRandomBot(bot)|| sRandomPlayerbotMgr->IsAddclassBot(bot)))
|
if (playerItemsMoney && sPlayerbotAIConfig.enableRandomBotTrading == 3 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||||
{
|
{
|
||||||
bot->Whisper("Buying is disabled.", LANG_UNIVERSAL, trader);
|
bot->Whisper("Buying is disabled.", LANG_UNIVERSAL, trader);
|
||||||
return false;
|
return false;
|
||||||
@@ -262,7 +262,7 @@ bool TradeStatusAction::CheckTrade()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32 discount = (int32)sRandomPlayerbotMgr->GetTradeDiscount(bot, trader);
|
int32 discount = (int32)sRandomPlayerbotMgr.GetTradeDiscount(bot, trader);
|
||||||
int32 delta = playerMoney - botMoney;
|
int32 delta = playerMoney - botMoney;
|
||||||
int32 moneyDelta = (int32)trader->GetTradeData()->GetMoney() - (int32)bot->GetTradeData()->GetMoney();
|
int32 moneyDelta = (int32)trader->GetTradeData()->GetMoney() - (int32)bot->GetTradeData()->GetMoney();
|
||||||
bool success = false;
|
bool success = false;
|
||||||
@@ -287,7 +287,7 @@ bool TradeStatusAction::CheckTrade()
|
|||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
sRandomPlayerbotMgr->AddTradeDiscount(bot, trader, delta);
|
sRandomPlayerbotMgr.AddTradeDiscount(bot, trader, delta);
|
||||||
switch (urand(0, 4))
|
switch (urand(0, 4))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@@ -353,11 +353,11 @@ int32 TradeStatusAction::CalculateCost(Player* player, bool sell)
|
|||||||
|
|
||||||
if (sell)
|
if (sell)
|
||||||
{
|
{
|
||||||
sum += item->GetCount() * proto->SellPrice * sRandomPlayerbotMgr->GetSellMultiplier(bot);
|
sum += item->GetCount() * proto->SellPrice * sRandomPlayerbotMgr.GetSellMultiplier(bot);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sum += item->GetCount() * proto->BuyPrice * sRandomPlayerbotMgr->GetBuyMultiplier(bot);
|
sum += item->GetCount() * proto->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
void TrainerAction::Learn(uint32 cost, const Trainer::Spell tSpell, std::ostringstream& msg)
|
void TrainerAction::Learn(uint32 cost, const Trainer::Spell tSpell, std::ostringstream& msg)
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->autoTrainSpells != "free" && !botAI->HasCheat(BotCheatMask::gold))
|
if (sPlayerbotAIConfig.autoTrainSpells != "free" && !botAI->HasCheat(BotCheatMask::gold))
|
||||||
{
|
{
|
||||||
if (AI_VALUE2(uint32, "free money for", (uint32)NeedMoneyFor::spells) < cost)
|
if (AI_VALUE2(uint32, "free money for", (uint32)NeedMoneyFor::spells) < cost)
|
||||||
{
|
{
|
||||||
@@ -126,8 +126,8 @@ bool TrainerAction::Execute(Event event)
|
|||||||
if (spell)
|
if (spell)
|
||||||
spells.insert(spell);
|
spells.insert(spell);
|
||||||
|
|
||||||
if (text.find("learn") != std::string::npos || sRandomPlayerbotMgr->IsRandomBot(bot) ||
|
if (text.find("learn") != std::string::npos || sRandomPlayerbotMgr.IsRandomBot(bot) ||
|
||||||
(sPlayerbotAIConfig->autoTrainSpells != "no" &&
|
(sPlayerbotAIConfig.autoTrainSpells != "no" &&
|
||||||
(trainer->GetTrainerType() != Trainer::Type::Tradeskill ||
|
(trainer->GetTrainerType() != Trainer::Type::Tradeskill ||
|
||||||
!botAI->HasActivePlayerMaster()))) // Todo rewrite to only exclude start primary profession skills and make
|
!botAI->HasActivePlayerMaster()))) // Todo rewrite to only exclude start primary profession skills and make
|
||||||
// config dependent.
|
// config dependent.
|
||||||
@@ -157,7 +157,7 @@ void TrainerAction::TellFooter(uint32 totalCost)
|
|||||||
|
|
||||||
bool MaintenanceAction::Execute(Event event)
|
bool MaintenanceAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->maintenanceCommand)
|
if (!sPlayerbotAIConfig.maintenanceCommand)
|
||||||
{
|
{
|
||||||
botAI->TellError("maintenance command is not allowed, please check the configuration.");
|
botAI->TellError("maintenance command is not allowed, please check the configuration.");
|
||||||
return false;
|
return false;
|
||||||
@@ -186,66 +186,66 @@ bool MaintenanceAction::Execute(Event event)
|
|||||||
factory.InitMounts();
|
factory.InitMounts();
|
||||||
factory.InitGlyphs(false);
|
factory.InitGlyphs(false);
|
||||||
factory.InitKeyring();
|
factory.InitKeyring();
|
||||||
if (bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel)
|
if (bot->GetLevel() >= sPlayerbotAIConfig.minEnchantingBotLevel)
|
||||||
factory.ApplyEnchantAndGemsNew();
|
factory.ApplyEnchantAndGemsNew();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->altMaintenanceAttunementQs)
|
if (sPlayerbotAIConfig.altMaintenanceAttunementQs)
|
||||||
factory.InitAttunementQuests();
|
factory.InitAttunementQuests();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceBags)
|
if (sPlayerbotAIConfig.altMaintenanceBags)
|
||||||
factory.InitBags(false);
|
factory.InitBags(false);
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceAmmo)
|
if (sPlayerbotAIConfig.altMaintenanceAmmo)
|
||||||
factory.InitAmmo();
|
factory.InitAmmo();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceFood)
|
if (sPlayerbotAIConfig.altMaintenanceFood)
|
||||||
factory.InitFood();
|
factory.InitFood();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceReagents)
|
if (sPlayerbotAIConfig.altMaintenanceReagents)
|
||||||
factory.InitReagents();
|
factory.InitReagents();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceConsumables)
|
if (sPlayerbotAIConfig.altMaintenanceConsumables)
|
||||||
factory.InitConsumables();
|
factory.InitConsumables();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenancePotions)
|
if (sPlayerbotAIConfig.altMaintenancePotions)
|
||||||
factory.InitPotions();
|
factory.InitPotions();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceTalentTree)
|
if (sPlayerbotAIConfig.altMaintenanceTalentTree)
|
||||||
factory.InitTalentsTree(true);
|
factory.InitTalentsTree(true);
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenancePet)
|
if (sPlayerbotAIConfig.altMaintenancePet)
|
||||||
factory.InitPet();
|
factory.InitPet();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenancePetTalents)
|
if (sPlayerbotAIConfig.altMaintenancePetTalents)
|
||||||
factory.InitPetTalents();
|
factory.InitPetTalents();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceSkills)
|
if (sPlayerbotAIConfig.altMaintenanceSkills)
|
||||||
factory.InitSkills();
|
factory.InitSkills();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceClassSpells)
|
if (sPlayerbotAIConfig.altMaintenanceClassSpells)
|
||||||
factory.InitClassSpells();
|
factory.InitClassSpells();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceAvailableSpells)
|
if (sPlayerbotAIConfig.altMaintenanceAvailableSpells)
|
||||||
factory.InitAvailableSpells();
|
factory.InitAvailableSpells();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceReputation)
|
if (sPlayerbotAIConfig.altMaintenanceReputation)
|
||||||
factory.InitReputation();
|
factory.InitReputation();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceSpecialSpells)
|
if (sPlayerbotAIConfig.altMaintenanceSpecialSpells)
|
||||||
factory.InitSpecialSpells();
|
factory.InitSpecialSpells();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceMounts)
|
if (sPlayerbotAIConfig.altMaintenanceMounts)
|
||||||
factory.InitMounts();
|
factory.InitMounts();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceGlyphs)
|
if (sPlayerbotAIConfig.altMaintenanceGlyphs)
|
||||||
factory.InitGlyphs(false);
|
factory.InitGlyphs(false);
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceKeyring)
|
if (sPlayerbotAIConfig.altMaintenanceKeyring)
|
||||||
factory.InitKeyring();
|
factory.InitKeyring();
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->altMaintenanceGemsEnchants && bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel)
|
if (sPlayerbotAIConfig.altMaintenanceGemsEnchants && bot->GetLevel() >= sPlayerbotAIConfig.minEnchantingBotLevel)
|
||||||
factory.ApplyEnchantAndGemsNew();
|
factory.ApplyEnchantAndGemsNew();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -267,28 +267,28 @@ bool RemoveGlyphAction::Execute(Event event)
|
|||||||
|
|
||||||
bool AutoGearAction::Execute(Event event)
|
bool AutoGearAction::Execute(Event event)
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->autoGearCommand)
|
if (!sPlayerbotAIConfig.autoGearCommand)
|
||||||
{
|
{
|
||||||
botAI->TellError("autogear command is not allowed, please check the configuration.");
|
botAI->TellError("autogear command is not allowed, please check the configuration.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sPlayerbotAIConfig->autoGearCommandAltBots &&
|
if (!sPlayerbotAIConfig.autoGearCommandAltBots &&
|
||||||
!sPlayerbotAIConfig->IsInRandomAccountList(bot->GetSession()->GetAccountId()))
|
!sPlayerbotAIConfig.IsInRandomAccountList(bot->GetSession()->GetAccountId()))
|
||||||
{
|
{
|
||||||
botAI->TellError("You cannot use autogear on alt bots.");
|
botAI->TellError("You cannot use autogear on alt bots.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
botAI->TellMaster("I'm auto gearing");
|
botAI->TellMaster("I'm auto gearing");
|
||||||
uint32 gs = sPlayerbotAIConfig->autoGearScoreLimit == 0
|
uint32 gs = sPlayerbotAIConfig.autoGearScoreLimit == 0
|
||||||
? 0
|
? 0
|
||||||
: PlayerbotFactory::CalcMixedGearScore(sPlayerbotAIConfig->autoGearScoreLimit,
|
: PlayerbotFactory::CalcMixedGearScore(sPlayerbotAIConfig.autoGearScoreLimit,
|
||||||
sPlayerbotAIConfig->autoGearQualityLimit);
|
sPlayerbotAIConfig.autoGearQualityLimit);
|
||||||
PlayerbotFactory factory(bot, bot->GetLevel(), sPlayerbotAIConfig->autoGearQualityLimit, gs);
|
PlayerbotFactory factory(bot, bot->GetLevel(), sPlayerbotAIConfig.autoGearQualityLimit, gs);
|
||||||
factory.InitEquipment(true);
|
factory.InitEquipment(true);
|
||||||
factory.InitAmmo();
|
factory.InitAmmo();
|
||||||
if (bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel)
|
if (bot->GetLevel() >= sPlayerbotAIConfig.minEnchantingBotLevel)
|
||||||
{
|
{
|
||||||
factory.ApplyEnchantAndGemsNew();
|
factory.ApplyEnchantAndGemsNew();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ bool TravelAction::Execute(Event event)
|
|||||||
|
|
||||||
Unit* newTarget = nullptr;
|
Unit* newTarget = nullptr;
|
||||||
std::list<Unit*> targets;
|
std::list<Unit*> targets;
|
||||||
Acore::AnyUnitInObjectRangeCheck u_check(bot, sPlayerbotAIConfig->sightDistance * 2);
|
Acore::AnyUnitInObjectRangeCheck u_check(bot, sPlayerbotAIConfig.sightDistance * 2);
|
||||||
Acore::UnitListSearcher<Acore::AnyUnitInObjectRangeCheck> searcher(bot, targets, u_check);
|
Acore::UnitListSearcher<Acore::AnyUnitInObjectRangeCheck> searcher(bot, targets, u_check);
|
||||||
Cell::VisitObjects(bot, searcher, sPlayerbotAIConfig->sightDistance);
|
Cell::VisitObjects(bot, searcher, sPlayerbotAIConfig.sightDistance);
|
||||||
|
|
||||||
for (Unit* unit : targets)
|
for (Unit* unit : targets)
|
||||||
{
|
{
|
||||||
@@ -77,7 +77,7 @@ bool MoveToDarkPortalAction::Execute(Event event)
|
|||||||
if (bot->GetTeamId() == TEAM_ALLIANCE)
|
if (bot->GetTeamId() == TEAM_ALLIANCE)
|
||||||
{
|
{
|
||||||
Quest const* quest = sObjectMgr->GetQuestTemplate(10119);
|
Quest const* quest = sObjectMgr->GetQuestTemplate(10119);
|
||||||
CreatureData const* creatureData = sRandomPlayerbotMgr->GetCreatureDataByEntry(16841);
|
CreatureData const* creatureData = sRandomPlayerbotMgr.GetCreatureDataByEntry(16841);
|
||||||
if (quest && creatureData)
|
if (quest && creatureData)
|
||||||
{
|
{
|
||||||
auto creatureBounds =
|
auto creatureBounds =
|
||||||
@@ -89,7 +89,7 @@ bool MoveToDarkPortalAction::Execute(Event event)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
Quest const* quest = sObjectMgr->GetQuestTemplate(9407);
|
Quest const* quest = sObjectMgr->GetQuestTemplate(9407);
|
||||||
CreatureData const* creatureData = sRandomPlayerbotMgr->GetCreatureDataByEntry(19254);
|
CreatureData const* creatureData = sRandomPlayerbotMgr.GetCreatureDataByEntry(19254);
|
||||||
if (quest && creatureData)
|
if (quest && creatureData)
|
||||||
{
|
{
|
||||||
auto creatureBounds =
|
auto creatureBounds =
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
|||||||
if (bot->isMoving())
|
if (bot->isMoving())
|
||||||
{
|
{
|
||||||
bot->StopMoving();
|
bot->StopMoving();
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -229,7 +229,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
|||||||
out << " on " << chat->FormatItem(itemForSpell->GetTemplate());
|
out << " on " << chat->FormatItem(itemForSpell->GetTemplate());
|
||||||
}
|
}
|
||||||
uint32 castTime = spellInfo->CalcCastTime();
|
uint32 castTime = spellInfo->CalcCastTime();
|
||||||
botAI->SetNextCheckDelay(castTime + sPlayerbotAIConfig->reactDelay);
|
botAI->SetNextCheckDelay(castTime + sPlayerbotAIConfig.reactDelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -307,7 +307,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
|||||||
if (!spellId)
|
if (!spellId)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// botAI->SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown);
|
// botAI->SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
|
||||||
botAI->TellMasterNoFacing(out.str());
|
botAI->TellMasterNoFacing(out.str());
|
||||||
bot->GetSession()->HandleUseItemOpcode(packet);
|
bot->GetSession()->HandleUseItemOpcode(packet);
|
||||||
return true;
|
return true;
|
||||||
@@ -486,7 +486,7 @@ bool UseRandomQuestItem::Execute(Event event)
|
|||||||
|
|
||||||
bool used = UseItem(item, goTarget, nullptr, unitTarget);
|
bool used = UseItem(item, goTarget, nullptr, unitTarget);
|
||||||
if (used)
|
if (used)
|
||||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig->globalCoolDown);
|
botAI->SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
|
||||||
|
|
||||||
return used;
|
return used;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,9 +91,9 @@ bool SummonAction::Execute(Event event)
|
|||||||
bool SummonAction::SummonUsingGos(Player* summoner, Player* player, bool preserveAuras)
|
bool SummonAction::SummonUsingGos(Player* summoner, Player* player, bool preserveAuras)
|
||||||
{
|
{
|
||||||
std::list<GameObject*> targets;
|
std::list<GameObject*> targets;
|
||||||
AnyGameObjectInObjectRangeCheck u_check(summoner, sPlayerbotAIConfig->sightDistance);
|
AnyGameObjectInObjectRangeCheck u_check(summoner, sPlayerbotAIConfig.sightDistance);
|
||||||
Acore::GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(summoner, targets, u_check);
|
Acore::GameObjectListSearcher<AnyGameObjectInObjectRangeCheck> searcher(summoner, targets, u_check);
|
||||||
Cell::VisitObjects(summoner, searcher, sPlayerbotAIConfig->sightDistance);
|
Cell::VisitObjects(summoner, searcher, sPlayerbotAIConfig.sightDistance);
|
||||||
|
|
||||||
for (GameObject* go : targets)
|
for (GameObject* go : targets)
|
||||||
{
|
{
|
||||||
@@ -107,13 +107,13 @@ bool SummonAction::SummonUsingGos(Player* summoner, Player* player, bool preserv
|
|||||||
|
|
||||||
bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player, bool preserveAuras)
|
bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player, bool preserveAuras)
|
||||||
{
|
{
|
||||||
if (!sPlayerbotAIConfig->summonAtInnkeepersEnabled)
|
if (!sPlayerbotAIConfig.summonAtInnkeepersEnabled)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::list<Unit*> targets;
|
std::list<Unit*> targets;
|
||||||
Acore::AnyUnitInObjectRangeCheck u_check(summoner, sPlayerbotAIConfig->sightDistance);
|
Acore::AnyUnitInObjectRangeCheck u_check(summoner, sPlayerbotAIConfig.sightDistance);
|
||||||
Acore::UnitListSearcher<Acore::AnyUnitInObjectRangeCheck> searcher(summoner, targets, u_check);
|
Acore::UnitListSearcher<Acore::AnyUnitInObjectRangeCheck> searcher(summoner, targets, u_check);
|
||||||
Cell::VisitObjects(summoner, searcher, sPlayerbotAIConfig->sightDistance);
|
Cell::VisitObjects(summoner, searcher, sPlayerbotAIConfig.sightDistance);
|
||||||
|
|
||||||
for (Unit* unit : targets)
|
for (Unit* unit : targets)
|
||||||
{
|
{
|
||||||
@@ -165,38 +165,37 @@ bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras
|
|||||||
for (float angle = followAngle - M_PI; angle <= followAngle + M_PI; angle += M_PI / 4)
|
for (float angle = followAngle - M_PI; angle <= followAngle + M_PI; angle += M_PI / 4)
|
||||||
{
|
{
|
||||||
uint32 mapId = summoner->GetMapId();
|
uint32 mapId = summoner->GetMapId();
|
||||||
float x = summoner->GetPositionX() + cos(angle) * sPlayerbotAIConfig->followDistance;
|
float x = summoner->GetPositionX() + cos(angle) * sPlayerbotAIConfig.followDistance;
|
||||||
float y = summoner->GetPositionY() + sin(angle) * sPlayerbotAIConfig->followDistance;
|
float y = summoner->GetPositionY() + sin(angle) * sPlayerbotAIConfig.followDistance;
|
||||||
float z = summoner->GetPositionZ();
|
float z = summoner->GetPositionZ();
|
||||||
|
|
||||||
if (summoner->IsWithinLOS(x, y, z))
|
if (summoner->IsWithinLOS(x, y, z))
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig
|
if (sPlayerbotAIConfig.botRepairWhenSummon) // .conf option to repair bot gear when summoned 0 = off, 1 = on
|
||||||
->botRepairWhenSummon) // .conf option to repair bot gear when summoned 0 = off, 1 = on
|
|
||||||
bot->DurabilityRepairAll(false, 1.0f, false);
|
bot->DurabilityRepairAll(false, 1.0f, false);
|
||||||
|
|
||||||
if (summoner->IsInCombat() && !sPlayerbotAIConfig->allowSummonInCombat)
|
if (summoner->IsInCombat() && !sPlayerbotAIConfig.allowSummonInCombat)
|
||||||
{
|
{
|
||||||
botAI->TellError("You cannot summon me while you're in combat");
|
botAI->TellError("You cannot summon me while you're in combat");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!summoner->IsAlive() && !sPlayerbotAIConfig->allowSummonWhenMasterIsDead)
|
if (!summoner->IsAlive() && !sPlayerbotAIConfig.allowSummonWhenMasterIsDead)
|
||||||
{
|
{
|
||||||
botAI->TellError("You cannot summon me while you're dead");
|
botAI->TellError("You cannot summon me while you're dead");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bot->isDead() && !bot->HasPlayerFlag(PLAYER_FLAGS_GHOST) &&
|
if (bot->isDead() && !bot->HasPlayerFlag(PLAYER_FLAGS_GHOST) &&
|
||||||
!sPlayerbotAIConfig->allowSummonWhenBotIsDead)
|
!sPlayerbotAIConfig.allowSummonWhenBotIsDead)
|
||||||
{
|
{
|
||||||
botAI->TellError("You cannot summon me while I'm dead, you need to release my spirit first");
|
botAI->TellError("You cannot summon me while I'm dead, you need to release my spirit first");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool revive =
|
bool revive =
|
||||||
sPlayerbotAIConfig->reviveBotWhenSummoned == 2 ||
|
sPlayerbotAIConfig.reviveBotWhenSummoned == 2 ||
|
||||||
(sPlayerbotAIConfig->reviveBotWhenSummoned == 1 && !summoner->IsInCombat() && summoner->IsAlive());
|
(sPlayerbotAIConfig.reviveBotWhenSummoned == 1 && !summoner->IsInCombat() && summoner->IsAlive());
|
||||||
|
|
||||||
if (bot->isDead() && revive)
|
if (bot->isDead() && revive)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ bool EnterVehicleAction::Execute(Event event)
|
|||||||
|
|
||||||
bool EnterVehicleAction::EnterVehicle(Unit* vehicleBase, bool moveIfFar)
|
bool EnterVehicleAction::EnterVehicle(Unit* vehicleBase, bool moveIfFar)
|
||||||
{
|
{
|
||||||
float dist = sServerFacade->GetDistance2d(bot, vehicleBase);
|
float dist = ServerFacade::instance().GetDistance2d(bot, vehicleBase);
|
||||||
if (dist > 40.0f)
|
if (dist > 40.0f)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ bool WhoAction::Execute(Event event)
|
|||||||
{
|
{
|
||||||
out << QuerySkill(text);
|
out << QuerySkill(text);
|
||||||
|
|
||||||
if (sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
out << QueryTrade(text);
|
out << QueryTrade(text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -74,7 +74,7 @@ std::string const WhoAction::QueryTrade(std::string const text)
|
|||||||
for (Item* sell : items)
|
for (Item* sell : items)
|
||||||
{
|
{
|
||||||
int32 sellPrice =
|
int32 sellPrice =
|
||||||
sell->GetTemplate()->SellPrice * sRandomPlayerbotMgr->GetSellMultiplier(bot) * sell->GetCount();
|
sell->GetTemplate()->SellPrice * sRandomPlayerbotMgr.GetSellMultiplier(bot) * sell->GetCount();
|
||||||
if (!sellPrice)
|
if (!sellPrice)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ std::vector<uint32> WorldBuffAction::NeedWorldBuffs(Unit* unit)
|
|||||||
{
|
{
|
||||||
std::vector<uint32> retVec;
|
std::vector<uint32> retVec;
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->worldBuffs.empty())
|
if (sPlayerbotAIConfig.worldBuffs.empty())
|
||||||
return retVec;
|
return retVec;
|
||||||
|
|
||||||
FactionTemplateEntry const* humanFaction = sFactionTemplateStore.LookupEntry(1);
|
FactionTemplateEntry const* humanFaction = sFactionTemplateStore.LookupEntry(1);
|
||||||
@@ -70,7 +70,7 @@ std::vector<uint32> WorldBuffAction::NeedWorldBuffs(Unit* unit)
|
|||||||
// If tank, effectiveSpec remains unchanged
|
// If tank, effectiveSpec remains unchanged
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto const& wb : sPlayerbotAIConfig->worldBuffs)
|
for (auto const& wb : sPlayerbotAIConfig.worldBuffs)
|
||||||
{
|
{
|
||||||
// Faction check
|
// Faction check
|
||||||
if (wb.factionId != 0 && wb.factionId != factionId)
|
if (wb.factionId != 0 && wb.factionId != factionId)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ bool WtsAction::Execute(Event event)
|
|||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
std::string const text = event.getParam();
|
std::string const text = event.getParam();
|
||||||
|
|
||||||
if (!sRandomPlayerbotMgr->IsRandomBot(bot))
|
if (!sRandomPlayerbotMgr.IsRandomBot(bot))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string const link = event.getParam();
|
std::string const link = event.getParam();
|
||||||
@@ -42,7 +42,7 @@ bool WtsAction::Execute(Event event)
|
|||||||
if (usage == ITEM_USAGE_NONE)
|
if (usage == ITEM_USAGE_NONE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int32 buyPrice = proto->BuyPrice * sRandomPlayerbotMgr->GetBuyMultiplier(bot);
|
int32 buyPrice = proto->BuyPrice * sRandomPlayerbotMgr.GetBuyMultiplier(bot);
|
||||||
if (!buyPrice)
|
if (!buyPrice)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -40,14 +40,14 @@ bool XpGainAction::Execute(Event event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// randomBotXPRate is now implemented in OnPlayerGiveXP script
|
// randomBotXPRate is now implemented in OnPlayerGiveXP script
|
||||||
// if (!sRandomPlayerbotMgr->IsRandomBot(bot) || sPlayerbotAIConfig->randomBotXPRate == 1)
|
// if (!sRandomPlayerbotMgr.IsRandomBot(bot) || sPlayerbotAIConfig.randomBotXPRate == 1)
|
||||||
// return true;
|
// return true;
|
||||||
|
|
||||||
// Unit* victim = nullptr;
|
// Unit* victim = nullptr;
|
||||||
// if (guid)
|
// if (guid)
|
||||||
// victim = botAI->GetUnit(guid);
|
// victim = botAI->GetUnit(guid);
|
||||||
|
|
||||||
// xpgain = xpgain * (sPlayerbotAIConfig->randomBotXPRate - 1);
|
// xpgain = xpgain * (sPlayerbotAIConfig.randomBotXPRate - 1);
|
||||||
// GiveXP(xpgain, victim);
|
// GiveXP(xpgain, victim);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -12,39 +12,14 @@
|
|||||||
#include "PvpValues.h"
|
#include "PvpValues.h"
|
||||||
#include "QuestValues.h"
|
#include "QuestValues.h"
|
||||||
|
|
||||||
class PlayerbotAI;
|
|
||||||
|
|
||||||
class SharedValueContext : public NamedObjectContext<UntypedValue>
|
class SharedValueContext : public NamedObjectContext<UntypedValue>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SharedValueContext() : NamedObjectContext(true)
|
static SharedValueContext& instance()
|
||||||
{
|
|
||||||
creators["bg masters"] = &SharedValueContext::bg_masters;
|
|
||||||
creators["drop map"] = &SharedValueContext::drop_map;
|
|
||||||
creators["item drop list"] = &SharedValueContext::item_drop_list;
|
|
||||||
creators["entry loot list"] = &SharedValueContext::entry_loot_list;
|
|
||||||
|
|
||||||
creators["entry quest relation"] = &SharedValueContext::entry_quest_relation;
|
|
||||||
creators["quest guidp map"] = &SharedValueContext::quest_guidp_map;
|
|
||||||
creators["quest givers"] = &SharedValueContext::quest_givers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
static UntypedValue* bg_masters(PlayerbotAI* botAI) { return new BgMastersValue(botAI); }
|
|
||||||
static UntypedValue* drop_map(PlayerbotAI* botAI) { return new DropMapValue(botAI); }
|
|
||||||
static UntypedValue* item_drop_list(PlayerbotAI* botAI) { return new ItemDropListValue(botAI); }
|
|
||||||
static UntypedValue* entry_loot_list(PlayerbotAI* botAI) { return new EntryLootListValue(botAI); }
|
|
||||||
|
|
||||||
static UntypedValue* entry_quest_relation(PlayerbotAI* botAI) { return new EntryQuestRelationMapValue(botAI); }
|
|
||||||
static UntypedValue* quest_guidp_map(PlayerbotAI* botAI) { return new QuestGuidpMapValue(botAI); }
|
|
||||||
static UntypedValue* quest_givers(PlayerbotAI* botAI) { return new QuestGiversValue(botAI); }
|
|
||||||
|
|
||||||
// Global acess functions
|
|
||||||
public:
|
|
||||||
static SharedValueContext* instance()
|
|
||||||
{
|
{
|
||||||
static SharedValueContext instance;
|
static SharedValueContext instance;
|
||||||
return &instance;
|
|
||||||
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
@@ -74,6 +49,36 @@ public:
|
|||||||
out << param;
|
out << param;
|
||||||
return getGlobalValue<T>(name, out.str());
|
return getGlobalValue<T>(name, out.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
SharedValueContext() : NamedObjectContext(true)
|
||||||
|
{
|
||||||
|
creators["bg masters"] = &SharedValueContext::bg_masters;
|
||||||
|
creators["drop map"] = &SharedValueContext::drop_map;
|
||||||
|
creators["item drop list"] = &SharedValueContext::item_drop_list;
|
||||||
|
creators["entry loot list"] = &SharedValueContext::entry_loot_list;
|
||||||
|
|
||||||
|
creators["entry quest relation"] = &SharedValueContext::entry_quest_relation;
|
||||||
|
creators["quest guidp map"] = &SharedValueContext::quest_guidp_map;
|
||||||
|
creators["quest givers"] = &SharedValueContext::quest_givers;
|
||||||
|
}
|
||||||
|
~SharedValueContext() = default;
|
||||||
|
|
||||||
|
SharedValueContext(const SharedValueContext&) = delete;
|
||||||
|
SharedValueContext& operator=(const SharedValueContext&) = delete;
|
||||||
|
|
||||||
|
SharedValueContext(SharedValueContext&&) = delete;
|
||||||
|
SharedValueContext& operator=(SharedValueContext&&) = delete;
|
||||||
|
|
||||||
|
static UntypedValue* bg_masters(PlayerbotAI* botAI) { return new BgMastersValue(botAI); }
|
||||||
|
static UntypedValue* drop_map(PlayerbotAI* botAI) { return new DropMapValue(botAI); }
|
||||||
|
static UntypedValue* item_drop_list(PlayerbotAI* botAI) { return new ItemDropListValue(botAI); }
|
||||||
|
static UntypedValue* entry_loot_list(PlayerbotAI* botAI) { return new EntryLootListValue(botAI); }
|
||||||
|
|
||||||
|
static UntypedValue* entry_quest_relation(PlayerbotAI* botAI) { return new EntryQuestRelationMapValue(botAI); }
|
||||||
|
static UntypedValue* quest_guidp_map(PlayerbotAI* botAI) { return new QuestGuidpMapValue(botAI); }
|
||||||
|
static UntypedValue* quest_givers(PlayerbotAI* botAI) { return new QuestGiversValue(botAI); }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define sSharedValueContext SharedValueContext::instance()
|
#define sSharedValueContext SharedValueContext::instance()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ float CastTimeMultiplier::GetValue(Action* action)
|
|||||||
if (!action->GetTarget() || action->GetTarget() != AI_VALUE(Unit*, "current target"))
|
if (!action->GetTarget() || action->GetTarget() != AI_VALUE(Unit*, "current target"))
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
|
|
||||||
if (/*targetHealth < sPlayerbotAIConfig->criticalHealth && */ dynamic_cast<CastSpellAction*>(action))
|
if (/*targetHealth < sPlayerbotAIConfig.criticalHealth && */ dynamic_cast<CastSpellAction*>(action))
|
||||||
{
|
{
|
||||||
CastSpellAction* spellAction = dynamic_cast<CastSpellAction*>(action);
|
CastSpellAction* spellAction = dynamic_cast<CastSpellAction*>(action);
|
||||||
uint32 spellId = AI_VALUE2(uint32, "spell id", spellAction->getSpell());
|
uint32 spellId = AI_VALUE2(uint32, "spell id", spellAction->getSpell());
|
||||||
|
|||||||
@@ -19,9 +19,9 @@
|
|||||||
// uint8 targetHealth = AI_VALUE2(uint8, "health", "current target");
|
// uint8 targetHealth = AI_VALUE2(uint8, "health", "current target");
|
||||||
// uint8 mana = AI_VALUE2(uint8, "mana", "self target");
|
// uint8 mana = AI_VALUE2(uint8, "mana", "self target");
|
||||||
// bool hasMana = AI_VALUE2(bool, "has mana", "self target");
|
// bool hasMana = AI_VALUE2(bool, "has mana", "self target");
|
||||||
// bool mediumMana = hasMana && mana < sPlayerbotAIConfig->mediumMana;
|
// bool mediumMana = hasMana && mana < sPlayerbotAIConfig.mediumMana;
|
||||||
|
|
||||||
// if (health < sPlayerbotAIConfig->lowHealth)
|
// if (health < sPlayerbotAIConfig.lowHealth)
|
||||||
// return 1.0f;
|
// return 1.0f;
|
||||||
|
|
||||||
// Unit* target = AI_VALUE(Unit*, "current target");
|
// Unit* target = AI_VALUE(Unit*, "current target");
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
float HealerAutoSaveManaMultiplier::GetValue(Action* action)
|
float HealerAutoSaveManaMultiplier::GetValue(Action* action)
|
||||||
{
|
{
|
||||||
uint8 mana = bot->GetPowerPct(Powers::POWER_MANA);
|
uint8 mana = bot->GetPowerPct(Powers::POWER_MANA);
|
||||||
if (mana > sPlayerbotAIConfig->saveManaThreshold)
|
if (mana > sPlayerbotAIConfig.saveManaThreshold)
|
||||||
return 1.0f;
|
return 1.0f;
|
||||||
CastHealingSpellAction* healingAction = dynamic_cast<CastHealingSpellAction*>(action);
|
CastHealingSpellAction* healingAction = dynamic_cast<CastHealingSpellAction*>(action);
|
||||||
|
|
||||||
@@ -110,16 +110,16 @@ float HealerAutoSaveManaMultiplier::GetValue(Action* action)
|
|||||||
if (isTank)
|
if (isTank)
|
||||||
{
|
{
|
||||||
estAmount /= 1.5; // tanks have more health
|
estAmount /= 1.5; // tanks have more health
|
||||||
if (health >= sPlayerbotAIConfig->mediumHealth &&
|
if (health >= sPlayerbotAIConfig.mediumHealth &&
|
||||||
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::MEDIUM))
|
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::MEDIUM))
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
if (health >= sPlayerbotAIConfig->lowHealth &&
|
if (health >= sPlayerbotAIConfig.lowHealth &&
|
||||||
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::LOW))
|
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::LOW))
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (health >= sPlayerbotAIConfig->mediumHealth &&
|
if (health >= sPlayerbotAIConfig.mediumHealth &&
|
||||||
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::MEDIUM))
|
(lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::MEDIUM))
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
if (lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::LOW)
|
if (lossAmount < estAmount || manaEfficiency <= HealingManaEfficiency::LOW)
|
||||||
@@ -131,4 +131,4 @@ float HealerAutoSaveManaMultiplier::GetValue(Action* action)
|
|||||||
void HealerAutoSaveManaStrategy::InitMultipliers(std::vector<Multiplier*>& multipliers)
|
void HealerAutoSaveManaStrategy::InitMultipliers(std::vector<Multiplier*>& multipliers)
|
||||||
{
|
{
|
||||||
multipliers.push_back(new HealerAutoSaveManaMultiplier(botAI));
|
multipliers.push_back(new HealerAutoSaveManaMultiplier(botAI));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
|
void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
|
||||||
{
|
{
|
||||||
if (sPlayerbotAIConfig->randomBotEmote)
|
if (sPlayerbotAIConfig.randomBotEmote)
|
||||||
{
|
{
|
||||||
triggers.push_back(new TriggerNode("often", { NextAction("talk", 1.0f) }));
|
triggers.push_back(new TriggerNode("often", { NextAction("talk", 1.0f) }));
|
||||||
triggers.push_back(new TriggerNode("seldom", { NextAction("emote", 1.0f) }));
|
triggers.push_back(new TriggerNode("seldom", { NextAction("emote", 1.0f) }));
|
||||||
@@ -19,7 +19,7 @@ void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
|
|||||||
new TriggerNode("receive emote", { NextAction("emote", 10.0f) }));
|
new TriggerNode("receive emote", { NextAction("emote", 10.0f) }));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->randomBotTalk)
|
if (sPlayerbotAIConfig.randomBotTalk)
|
||||||
{
|
{
|
||||||
triggers.push_back(new TriggerNode(
|
triggers.push_back(new TriggerNode(
|
||||||
"often",
|
"often",
|
||||||
@@ -27,7 +27,7 @@ void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
|
|||||||
NextAction("suggest trade", 3.0f) }));
|
NextAction("suggest trade", 3.0f) }));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sPlayerbotAIConfig->enableGreet)
|
if (sPlayerbotAIConfig.enableGreet)
|
||||||
triggers.push_back(
|
triggers.push_back(
|
||||||
new TriggerNode("new player nearby", { NextAction("greet", 1.0f) }));
|
new TriggerNode("new player nearby", { NextAction("greet", 1.0f) }));
|
||||||
|
|
||||||
|
|||||||
@@ -22,17 +22,18 @@
|
|||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "PlayerbotAI.h"
|
#include "PlayerbotAI.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
#include "Corpse.h"
|
||||||
|
|
||||||
bool LowManaTrigger::IsActive()
|
bool LowManaTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return AI_VALUE2(bool, "has mana", "self target") &&
|
return AI_VALUE2(bool, "has mana", "self target") &&
|
||||||
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig->lowMana;
|
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig.lowMana;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MediumManaTrigger::IsActive()
|
bool MediumManaTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return AI_VALUE2(bool, "has mana", "self target") &&
|
return AI_VALUE2(bool, "has mana", "self target") &&
|
||||||
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig->mediumMana;
|
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig.mediumMana;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NoPetTrigger::IsActive()
|
bool NoPetTrigger::IsActive()
|
||||||
@@ -72,7 +73,7 @@ bool PetAttackTrigger::IsActive()
|
|||||||
|
|
||||||
bool HighManaTrigger::IsActive()
|
bool HighManaTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig->highMana;
|
return AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig.highMana;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AlmostFullManaTrigger::IsActive()
|
bool AlmostFullManaTrigger::IsActive()
|
||||||
@@ -82,7 +83,7 @@ bool AlmostFullManaTrigger::IsActive()
|
|||||||
|
|
||||||
bool EnoughManaTrigger::IsActive()
|
bool EnoughManaTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig->highMana;
|
return AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") > sPlayerbotAIConfig.highMana;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RageAvailable::IsActive() { return AI_VALUE2(uint8, "rage", "self target") >= amount; }
|
bool RageAvailable::IsActive() { return AI_VALUE2(uint8, "rage", "self target") >= amount; }
|
||||||
@@ -110,9 +111,9 @@ bool HasAggroTrigger::IsActive() { return AI_VALUE2(bool, "has aggro", "current
|
|||||||
|
|
||||||
bool PanicTrigger::IsActive()
|
bool PanicTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return AI_VALUE2(uint8, "health", "self target") < sPlayerbotAIConfig->criticalHealth &&
|
return AI_VALUE2(uint8, "health", "self target") < sPlayerbotAIConfig.criticalHealth &&
|
||||||
(!AI_VALUE2(bool, "has mana", "self target") ||
|
(!AI_VALUE2(bool, "has mana", "self target") ||
|
||||||
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig->lowMana);
|
AI_VALUE2(uint8, "mana", "self target") < sPlayerbotAIConfig.lowMana);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OutNumberedTrigger::IsActive()
|
bool OutNumberedTrigger::IsActive()
|
||||||
@@ -248,7 +249,7 @@ bool AoeTrigger::IsActive()
|
|||||||
|
|
||||||
bool NoFoodTrigger::IsActive()
|
bool NoFoodTrigger::IsActive()
|
||||||
{
|
{
|
||||||
bool isRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot);
|
bool isRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot);
|
||||||
if (isRandomBot && botAI->HasCheat(BotCheatMask::food))
|
if (isRandomBot && botAI->HasCheat(BotCheatMask::food))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -257,7 +258,7 @@ bool NoFoodTrigger::IsActive()
|
|||||||
|
|
||||||
bool NoDrinkTrigger::IsActive()
|
bool NoDrinkTrigger::IsActive()
|
||||||
{
|
{
|
||||||
bool isRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot);
|
bool isRandomBot = sRandomPlayerbotMgr.IsRandomBot(bot);
|
||||||
if (isRandomBot && botAI->HasCheat(BotCheatMask::food))
|
if (isRandomBot && botAI->HasCheat(BotCheatMask::food))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -319,11 +320,11 @@ RandomTrigger::RandomTrigger(PlayerbotAI* botAI, std::string const name, int32 p
|
|||||||
|
|
||||||
bool RandomTrigger::IsActive()
|
bool RandomTrigger::IsActive()
|
||||||
{
|
{
|
||||||
if (getMSTime() - lastCheck < sPlayerbotAIConfig->repeatDelay)
|
if (getMSTime() - lastCheck < sPlayerbotAIConfig.repeatDelay)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lastCheck = getMSTime();
|
lastCheck = getMSTime();
|
||||||
int32 k = (int32)(probability / sPlayerbotAIConfig->randomChangeMultiplier);
|
int32 k = (int32)(probability / sPlayerbotAIConfig.randomChangeMultiplier);
|
||||||
if (k < 1)
|
if (k < 1)
|
||||||
k = 1;
|
k = 1;
|
||||||
return (rand() % k) == 0;
|
return (rand() % k) == 0;
|
||||||
@@ -381,10 +382,10 @@ bool GenericBoostTrigger::IsActive()
|
|||||||
bool HealerShouldAttackTrigger::IsActive()
|
bool HealerShouldAttackTrigger::IsActive()
|
||||||
{
|
{
|
||||||
// nobody can help me
|
// nobody can help me
|
||||||
if (botAI->GetNearGroupMemberCount(sPlayerbotAIConfig->sightDistance) <= 1)
|
if (botAI->GetNearGroupMemberCount(sPlayerbotAIConfig.sightDistance) <= 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (AI_VALUE2(uint8, "health", "party member to heal") < sPlayerbotAIConfig->almostFullHealth)
|
if (AI_VALUE2(uint8, "health", "party member to heal") < sPlayerbotAIConfig.almostFullHealth)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// special check for resto druid (dont remove tree of life frequently)
|
// special check for resto druid (dont remove tree of life frequently)
|
||||||
@@ -401,9 +402,9 @@ bool HealerShouldAttackTrigger::IsActive()
|
|||||||
if (balance <= 50)
|
if (balance <= 50)
|
||||||
manaThreshold = 85;
|
manaThreshold = 85;
|
||||||
else if (balance <= 100)
|
else if (balance <= 100)
|
||||||
manaThreshold = sPlayerbotAIConfig->highMana;
|
manaThreshold = sPlayerbotAIConfig.highMana;
|
||||||
else
|
else
|
||||||
manaThreshold = sPlayerbotAIConfig->mediumMana;
|
manaThreshold = sPlayerbotAIConfig.mediumMana;
|
||||||
|
|
||||||
if (AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") < manaThreshold)
|
if (AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") < manaThreshold)
|
||||||
return false;
|
return false;
|
||||||
@@ -632,7 +633,7 @@ bool ReturnToStayPositionTrigger::IsActive()
|
|||||||
if (stayPosition.isSet())
|
if (stayPosition.isSet())
|
||||||
{
|
{
|
||||||
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
const float distance = bot->GetDistance(stayPosition.x, stayPosition.y, stayPosition.z);
|
||||||
return distance > sPlayerbotAIConfig->followDistance;
|
return distance > sPlayerbotAIConfig.followDistance;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ public:
|
|||||||
class AttackerCountTrigger : public Trigger
|
class AttackerCountTrigger : public Trigger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AttackerCountTrigger(PlayerbotAI* botAI, int32 amount, float distance = sPlayerbotAIConfig->sightDistance)
|
AttackerCountTrigger(PlayerbotAI* botAI, int32 amount, float distance = sPlayerbotAIConfig.sightDistance)
|
||||||
: Trigger(botAI), amount(amount), distance(distance)
|
: Trigger(botAI), amount(amount), distance(distance)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -836,7 +836,7 @@ private:
|
|||||||
class SitTrigger : public StayTimeTrigger
|
class SitTrigger : public StayTimeTrigger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SitTrigger(PlayerbotAI* botAI) : StayTimeTrigger(botAI, sPlayerbotAIConfig->sitDelay, "sit") {}
|
SitTrigger(PlayerbotAI* botAI) : StayTimeTrigger(botAI, sPlayerbotAIConfig.sitDelay, "sit") {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class ReturnToStayPositionTrigger : public Trigger
|
class ReturnToStayPositionTrigger : public Trigger
|
||||||
@@ -850,7 +850,7 @@ public:
|
|||||||
class ReturnTrigger : public StayTimeTrigger
|
class ReturnTrigger : public StayTimeTrigger
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ReturnTrigger(PlayerbotAI* botAI) : StayTimeTrigger(botAI, sPlayerbotAIConfig->returnDelay, "return") {}
|
ReturnTrigger(PlayerbotAI* botAI) : StayTimeTrigger(botAI, sPlayerbotAIConfig.returnDelay, "return") {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class GiveItemTrigger : public Trigger
|
class GiveItemTrigger : public Trigger
|
||||||
|
|||||||
@@ -38,4 +38,4 @@ bool AoeInGroupTrigger::IsActive()
|
|||||||
threshold = std::min(threshold, 15);
|
threshold = std::min(threshold, 15);
|
||||||
|
|
||||||
return AI_VALUE2(uint8, "aoe heal", type) >= threshold;
|
return AI_VALUE2(uint8, "aoe heal", type) >= threshold;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class LowHealthTrigger : public HealthInRangeTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LowHealthTrigger(PlayerbotAI* botAI, std::string const name = "low health",
|
LowHealthTrigger(PlayerbotAI* botAI, std::string const name = "low health",
|
||||||
float value = sPlayerbotAIConfig->lowHealth, float minValue = 0)
|
float value = sPlayerbotAIConfig.lowHealth, float minValue = 0)
|
||||||
: HealthInRangeTrigger(botAI, name, value, minValue)
|
: HealthInRangeTrigger(botAI, name, value, minValue)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -60,7 +60,7 @@ class CriticalHealthTrigger : public LowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CriticalHealthTrigger(PlayerbotAI* botAI)
|
CriticalHealthTrigger(PlayerbotAI* botAI)
|
||||||
: LowHealthTrigger(botAI, "critical health", sPlayerbotAIConfig->criticalHealth, 0)
|
: LowHealthTrigger(botAI, "critical health", sPlayerbotAIConfig.criticalHealth, 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -69,7 +69,7 @@ class MediumHealthTrigger : public LowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
MediumHealthTrigger(PlayerbotAI* botAI)
|
MediumHealthTrigger(PlayerbotAI* botAI)
|
||||||
: LowHealthTrigger(botAI, "medium health", sPlayerbotAIConfig->mediumHealth, 0)
|
: LowHealthTrigger(botAI, "medium health", sPlayerbotAIConfig.mediumHealth, 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -78,8 +78,8 @@ class AlmostFullHealthTrigger : public LowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AlmostFullHealthTrigger(PlayerbotAI* botAI)
|
AlmostFullHealthTrigger(PlayerbotAI* botAI)
|
||||||
: LowHealthTrigger(botAI, "almost full health", sPlayerbotAIConfig->almostFullHealth,
|
: LowHealthTrigger(botAI, "almost full health", sPlayerbotAIConfig.almostFullHealth,
|
||||||
sPlayerbotAIConfig->mediumHealth)
|
sPlayerbotAIConfig.mediumHealth)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -88,7 +88,7 @@ class PartyMemberLowHealthTrigger : public HealthInRangeTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PartyMemberLowHealthTrigger(PlayerbotAI* botAI, std::string const name = "party member low health",
|
PartyMemberLowHealthTrigger(PlayerbotAI* botAI, std::string const name = "party member low health",
|
||||||
float value = sPlayerbotAIConfig->lowHealth,
|
float value = sPlayerbotAIConfig.lowHealth,
|
||||||
float minValue = 0)
|
float minValue = 0)
|
||||||
: HealthInRangeTrigger(botAI, name, value, minValue)
|
: HealthInRangeTrigger(botAI, name, value, minValue)
|
||||||
{
|
{
|
||||||
@@ -101,7 +101,7 @@ class PartyMemberCriticalHealthTrigger : public PartyMemberLowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PartyMemberCriticalHealthTrigger(PlayerbotAI* botAI)
|
PartyMemberCriticalHealthTrigger(PlayerbotAI* botAI)
|
||||||
: PartyMemberLowHealthTrigger(botAI, "party member critical health", sPlayerbotAIConfig->criticalHealth, 0)
|
: PartyMemberLowHealthTrigger(botAI, "party member critical health", sPlayerbotAIConfig.criticalHealth, 0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -110,7 +110,7 @@ class PartyMemberMediumHealthTrigger : public PartyMemberLowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PartyMemberMediumHealthTrigger(PlayerbotAI* botAI)
|
PartyMemberMediumHealthTrigger(PlayerbotAI* botAI)
|
||||||
: PartyMemberLowHealthTrigger(botAI, "party member medium health", sPlayerbotAIConfig->mediumHealth,
|
: PartyMemberLowHealthTrigger(botAI, "party member medium health", sPlayerbotAIConfig.mediumHealth,
|
||||||
0)
|
0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ class PartyMemberAlmostFullHealthTrigger : public PartyMemberLowHealthTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PartyMemberAlmostFullHealthTrigger(PlayerbotAI* botAI)
|
PartyMemberAlmostFullHealthTrigger(PlayerbotAI* botAI)
|
||||||
: PartyMemberLowHealthTrigger(botAI, "party member almost full health", sPlayerbotAIConfig->almostFullHealth,
|
: PartyMemberLowHealthTrigger(botAI, "party member almost full health", sPlayerbotAIConfig.almostFullHealth,
|
||||||
0)
|
0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ bool LootAvailableTrigger::IsActive()
|
|||||||
if (botAI->HasStrategy("stay", BOT_STATE_NON_COMBAT))
|
if (botAI->HasStrategy("stay", BOT_STATE_NON_COMBAT))
|
||||||
{
|
{
|
||||||
distanceCheck =
|
distanceCheck =
|
||||||
sServerFacade->IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "loot target"), CONTACT_DISTANCE);
|
ServerFacade::instance().IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "loot target"), CONTACT_DISTANCE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
distanceCheck = sServerFacade->IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "loot target"),
|
distanceCheck = ServerFacade::instance().IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "loot target"),
|
||||||
INTERACTION_DISTANCE - 2.0f);
|
INTERACTION_DISTANCE - 2.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -247,7 +247,7 @@ bool EnemyFlagCarrierNear::IsActive()
|
|||||||
{
|
{
|
||||||
Unit* carrier = AI_VALUE(Unit*, "enemy flag carrier");
|
Unit* carrier = AI_VALUE(Unit*, "enemy flag carrier");
|
||||||
|
|
||||||
if (!carrier || !sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, carrier), 100.f))
|
if (!carrier || !ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, carrier), 100.f))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Check if there is another enemy player target closer than the FC
|
// Check if there is another enemy player target closer than the FC
|
||||||
@@ -255,8 +255,8 @@ bool EnemyFlagCarrierNear::IsActive()
|
|||||||
|
|
||||||
if (nearbyEnemy)
|
if (nearbyEnemy)
|
||||||
{
|
{
|
||||||
float distToFC = sServerFacade->GetDistance2d(bot, carrier);
|
float distToFC = ServerFacade::instance().GetDistance2d(bot, carrier);
|
||||||
float distToEnemy = sServerFacade->GetDistance2d(bot, nearbyEnemy);
|
float distToEnemy = ServerFacade::instance().GetDistance2d(bot, nearbyEnemy);
|
||||||
|
|
||||||
// If the other enemy is significantly closer, don't pursue FC
|
// If the other enemy is significantly closer, don't pursue FC
|
||||||
if (distToEnemy + 15.0f < distToFC) // Add small buffer
|
if (distToEnemy + 15.0f < distToFC) // Add small buffer
|
||||||
@@ -283,7 +283,7 @@ bool TeamFlagCarrierNear::IsActive()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Unit* carrier = AI_VALUE(Unit*, "team flag carrier");
|
Unit* carrier = AI_VALUE(Unit*, "team flag carrier");
|
||||||
return carrier && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, carrier), 200.f);
|
return carrier && ServerFacade::instance().IsDistanceLessOrEqualThan(ServerFacade::instance().GetDistance2d(bot, carrier), 200.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PlayerWantsInBattlegroundTrigger::IsActive()
|
bool PlayerWantsInBattlegroundTrigger::IsActive()
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ bool EnemyTooCloseForSpellTrigger::IsActive()
|
|||||||
// bool isBoss = false;
|
// bool isBoss = false;
|
||||||
// bool isRaid = false;
|
// bool isRaid = false;
|
||||||
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
||||||
// float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach;
|
// float targetDistance = ServerFacade::instance().GetDistance2d(bot, target) + combatReach;
|
||||||
// if (target->IsCreature())
|
// if (target->IsCreature())
|
||||||
// {
|
// {
|
||||||
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
||||||
@@ -48,10 +48,10 @@ bool EnemyTooCloseForSpellTrigger::IsActive()
|
|||||||
// isRaid = true;
|
// isRaid = true;
|
||||||
|
|
||||||
// // if (isBoss || isRaid)
|
// // if (isBoss || isRaid)
|
||||||
// // return sServerFacade->IsDistanceLessThan(targetDistance, (sPlayerbotAIConfig->tooCloseDistance +
|
// // return ServerFacade::instance().IsDistanceLessThan(targetDistance, (sPlayerbotAIConfig.tooCloseDistance +
|
||||||
// combatReach) / 2);
|
// combatReach) / 2);
|
||||||
|
|
||||||
// return sServerFacade->IsDistanceLessOrEqualThan(targetDistance, (sPlayerbotAIConfig->tooCloseDistance +
|
// return ServerFacade::instance().IsDistanceLessOrEqualThan(targetDistance, (sPlayerbotAIConfig.tooCloseDistance +
|
||||||
// combatReach / 2));
|
// combatReach / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ bool EnemyTooCloseForAutoShotTrigger::IsActive()
|
|||||||
// bool isBoss = false;
|
// bool isBoss = false;
|
||||||
// bool isRaid = false;
|
// bool isRaid = false;
|
||||||
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
||||||
// float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach;
|
// float targetDistance = ServerFacade::instance().GetDistance2d(bot, target) + combatReach;
|
||||||
// if (target->IsCreature())
|
// if (target->IsCreature())
|
||||||
// {
|
// {
|
||||||
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
||||||
@@ -93,7 +93,7 @@ bool EnemyTooCloseForAutoShotTrigger::IsActive()
|
|||||||
// if (bot->GetMap() && bot->GetMap()->IsRaid())
|
// if (bot->GetMap() && bot->GetMap()->IsRaid())
|
||||||
// isRaid = true;
|
// isRaid = true;
|
||||||
|
|
||||||
// return sServerFacade->IsDistanceLessOrEqualThan(targetDistance, 5.0f);
|
// return ServerFacade::instance().IsDistanceLessOrEqualThan(targetDistance, 5.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnemyTooCloseForShootTrigger::IsActive()
|
bool EnemyTooCloseForShootTrigger::IsActive()
|
||||||
@@ -115,7 +115,7 @@ bool EnemyTooCloseForShootTrigger::IsActive()
|
|||||||
// bool isBoss = false;
|
// bool isBoss = false;
|
||||||
// bool isRaid = false;
|
// bool isRaid = false;
|
||||||
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
||||||
// float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach;
|
// float targetDistance = ServerFacade::instance().GetDistance2d(bot, target) + combatReach;
|
||||||
// if (target->IsCreature())
|
// if (target->IsCreature())
|
||||||
// {
|
// {
|
||||||
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
// Creature* creature = botAI->GetCreature(target->GetGUID());
|
||||||
@@ -129,9 +129,9 @@ bool EnemyTooCloseForShootTrigger::IsActive()
|
|||||||
// isRaid = true;
|
// isRaid = true;
|
||||||
|
|
||||||
// // if (isBoss || isRaid)
|
// // if (isBoss || isRaid)
|
||||||
// // return sServerFacade->IsDistanceLessThan(targetDistance, botAI->GetRange("shoot") + combatReach);
|
// // return ServerFacade::instance().IsDistanceLessThan(targetDistance, botAI->GetRange("shoot") + combatReach);
|
||||||
|
|
||||||
// return sServerFacade->IsDistanceLessOrEqualThan(targetDistance, (botAI->GetRange("shoot") + combatReach /
|
// return ServerFacade::instance().IsDistanceLessOrEqualThan(targetDistance, (botAI->GetRange("shoot") + combatReach /
|
||||||
// 2));
|
// 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,8 +147,8 @@ bool EnemyTooCloseForMeleeTrigger::IsActive()
|
|||||||
bool EnemyIsCloseTrigger::IsActive()
|
bool EnemyIsCloseTrigger::IsActive()
|
||||||
{
|
{
|
||||||
Unit* target = AI_VALUE(Unit*, "current target");
|
Unit* target = AI_VALUE(Unit*, "current target");
|
||||||
return target && sServerFacade->IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "current target"),
|
return target && ServerFacade::instance().IsDistanceLessOrEqualThan(AI_VALUE2(float, "distance", "current target"),
|
||||||
sPlayerbotAIConfig->tooCloseDistance);
|
sPlayerbotAIConfig.tooCloseDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnemyWithinMeleeTrigger::IsActive()
|
bool EnemyWithinMeleeTrigger::IsActive()
|
||||||
@@ -165,7 +165,7 @@ bool OutOfRangeTrigger::IsActive()
|
|||||||
return target &&
|
return target &&
|
||||||
!bot->IsWithinCombatRange(
|
!bot->IsWithinCombatRange(
|
||||||
target,
|
target,
|
||||||
dis); // sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", GetTargetName()), distance);
|
dis); // ServerFacade::instance().IsDistanceGreaterThan(AI_VALUE2(float, "distance", GetTargetName()), distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
EnemyOutOfSpellRangeTrigger::EnemyOutOfSpellRangeTrigger(PlayerbotAI* botAI)
|
EnemyOutOfSpellRangeTrigger::EnemyOutOfSpellRangeTrigger(PlayerbotAI* botAI)
|
||||||
@@ -180,8 +180,8 @@ EnemyOutOfSpellRangeTrigger::EnemyOutOfSpellRangeTrigger(PlayerbotAI* botAI)
|
|||||||
// return false;
|
// return false;
|
||||||
|
|
||||||
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
// float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
||||||
// return target && (sServerFacade->GetDistance2d(bot, target) > (distance + combatReach +
|
// return target && (ServerFacade::instance().GetDistance2d(bot, target) > (distance + combatReach +
|
||||||
// sPlayerbotAIConfig->contactDistance) || !bot->IsWithinLOSInMap(target));
|
// sPlayerbotAIConfig.contactDistance) || !bot->IsWithinLOSInMap(target));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// bool EnemyOutOfMeleeTrigger::IsActive()
|
// bool EnemyOutOfMeleeTrigger::IsActive()
|
||||||
@@ -190,7 +190,7 @@ EnemyOutOfSpellRangeTrigger::EnemyOutOfSpellRangeTrigger(PlayerbotAI* botAI)
|
|||||||
// if (!target)
|
// if (!target)
|
||||||
// return false;
|
// return false;
|
||||||
|
|
||||||
// float targetDistance = sServerFacade->GetDistance2d(bot, target);
|
// float targetDistance = ServerFacade::instance().GetDistance2d(bot, target);
|
||||||
// return target && (targetDistance > std::max(5.0f, bot->GetCombatReach() + target->GetCombatReach()) ||
|
// return target && (targetDistance > std::max(5.0f, bot->GetCombatReach() + target->GetCombatReach()) ||
|
||||||
// (!bot->IsWithinLOSInMap(target) && targetDistance > 5.0f));
|
// (!bot->IsWithinLOSInMap(target) && targetDistance > 5.0f));
|
||||||
// }
|
// }
|
||||||
@@ -202,7 +202,7 @@ bool PartyMemberToHealOutOfSpellRangeTrigger::IsActive()
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
float combatReach = bot->GetCombatReach() + target->GetCombatReach();
|
||||||
return target && (sServerFacade->GetDistance2d(bot, target) > (distance + sPlayerbotAIConfig->contactDistance) ||
|
return target && (ServerFacade::instance().GetDistance2d(bot, target) > (distance + sPlayerbotAIConfig.contactDistance) ||
|
||||||
!bot->IsWithinLOSInMap(target));
|
!bot->IsWithinLOSInMap(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +213,7 @@ PartyMemberToHealOutOfSpellRangeTrigger::PartyMemberToHealOutOfSpellRangeTrigger
|
|||||||
|
|
||||||
bool FarFromMasterTrigger::IsActive()
|
bool FarFromMasterTrigger::IsActive()
|
||||||
{
|
{
|
||||||
return sServerFacade->IsDistanceGreaterThan(AI_VALUE2(float, "distance", "group leader"), distance);
|
return ServerFacade::instance().IsDistanceGreaterThan(AI_VALUE2(float, "distance", "group leader"), distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TooCloseToCreatureTrigger::TooCloseToCreature(uint32 creatureId, float range, bool alive)
|
bool TooCloseToCreatureTrigger::TooCloseToCreature(uint32 creatureId, float range, bool alive)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ class EnemyOutOfMeleeTrigger : public OutOfRangeTrigger
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EnemyOutOfMeleeTrigger(PlayerbotAI* botAI)
|
EnemyOutOfMeleeTrigger(PlayerbotAI* botAI)
|
||||||
: OutOfRangeTrigger(botAI, "enemy out of melee range", sPlayerbotAIConfig->meleeDistance)
|
: OutOfRangeTrigger(botAI, "enemy out of melee range", sPlayerbotAIConfig.meleeDistance)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ bool AtDarkPortalAzerothTrigger::IsActive()
|
|||||||
{
|
{
|
||||||
if (bot->GetAreaId() == 72)
|
if (bot->GetAreaId() == 72)
|
||||||
{
|
{
|
||||||
if (sServerFacade->GetDistance2d(bot, -11906.9f, -3208.53f) < 20.0f)
|
if (ServerFacade::instance().GetDistance2d(bot, -11906.9f, -3208.53f) < 20.0f)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -34,7 +34,7 @@ bool AtDarkPortalOutlandTrigger::IsActive()
|
|||||||
{
|
{
|
||||||
if (bot->GetAreaId() == 3539)
|
if (bot->GetAreaId() == 3539)
|
||||||
{
|
{
|
||||||
if (sServerFacade->GetDistance2d(bot, -248.1939f, 921.919f) < 10.0f)
|
if (ServerFacade::instance().GetDistance2d(bot, -248.1939f, 921.919f) < 10.0f)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ uint8 AoeHealValue::Calculate()
|
|||||||
|
|
||||||
float range = 0;
|
float range = 0;
|
||||||
if (qualifier == "low")
|
if (qualifier == "low")
|
||||||
range = sPlayerbotAIConfig->lowHealth;
|
range = sPlayerbotAIConfig.lowHealth;
|
||||||
else if (qualifier == "medium")
|
else if (qualifier == "medium")
|
||||||
range = sPlayerbotAIConfig->mediumHealth;
|
range = sPlayerbotAIConfig.mediumHealth;
|
||||||
else if (qualifier == "critical")
|
else if (qualifier == "critical")
|
||||||
range = sPlayerbotAIConfig->criticalHealth;
|
range = sPlayerbotAIConfig.criticalHealth;
|
||||||
else if (qualifier == "almost full")
|
else if (qualifier == "almost full")
|
||||||
range = sPlayerbotAIConfig->almostFullHealth;
|
range = sPlayerbotAIConfig.almostFullHealth;
|
||||||
|
|
||||||
uint8 count = 0;
|
uint8 count = 0;
|
||||||
Group::MemberSlotList const& groupSlot = group->GetMemberSlots();
|
Group::MemberSlotList const& groupSlot = group->GetMemberSlots();
|
||||||
@@ -32,7 +32,7 @@ uint8 AoeHealValue::Calculate()
|
|||||||
if (!player || !player->IsAlive())
|
if (!player || !player->IsAlive())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (player->GetDistance(bot) >= sPlayerbotAIConfig->sightDistance)
|
if (player->GetDistance(bot) >= sPlayerbotAIConfig.sightDistance)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
float percent = (static_cast<float>(player->GetHealth()) / player->GetMaxHealth()) * 100;
|
float percent = (static_cast<float>(player->GetHealth()) / player->GetMaxHealth()) * 100;
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ GuidVector FindMaxDensity(Player* bot)
|
|||||||
if (!other)
|
if (!other)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
float d = sServerFacade->GetDistance2d(unit, other);
|
float d = ServerFacade::instance().GetDistance2d(unit, other);
|
||||||
if (sServerFacade->IsDistanceLessOrEqualThan(d, sPlayerbotAIConfig->aoeRadius * 2))
|
if (ServerFacade::instance().IsDistanceLessOrEqualThan(d, sPlayerbotAIConfig.aoeRadius * 2))
|
||||||
groups[*i].push_back(*j);
|
groups[*i].push_back(*j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,4 +157,4 @@ Aura* AreaDebuffValue::Calculate()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,15 @@ WorldLocation ArrowFormation::GetLocationInternal()
|
|||||||
tanks.PlaceUnits(&placer);
|
tanks.PlaceUnits(&placer);
|
||||||
tanks.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
tanks.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
||||||
|
|
||||||
offset += tankLines * sPlayerbotAIConfig->followDistance + sPlayerbotAIConfig->tooCloseDistance / 2;
|
offset += tankLines * sPlayerbotAIConfig.followDistance + sPlayerbotAIConfig.tooCloseDistance / 2;
|
||||||
melee.PlaceUnits(&placer);
|
melee.PlaceUnits(&placer);
|
||||||
melee.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
melee.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
||||||
|
|
||||||
offset += meleeLines * sPlayerbotAIConfig->followDistance + sPlayerbotAIConfig->tooCloseDistance / 2;
|
offset += meleeLines * sPlayerbotAIConfig.followDistance + sPlayerbotAIConfig.tooCloseDistance / 2;
|
||||||
ranged.PlaceUnits(&placer);
|
ranged.PlaceUnits(&placer);
|
||||||
ranged.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
ranged.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
||||||
|
|
||||||
offset += rangedLines * sPlayerbotAIConfig->followDistance;
|
offset += rangedLines * sPlayerbotAIConfig.followDistance;
|
||||||
healers.PlaceUnits(&placer);
|
healers.PlaceUnits(&placer);
|
||||||
healers.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
healers.Move(-cos(orientation) * offset, -sin(orientation) * offset);
|
||||||
|
|
||||||
@@ -143,16 +143,16 @@ UnitPosition MultiLineUnitPlacer::Place(FormationUnit* unit, uint32 index, uint3
|
|||||||
uint32 lineNo = index / 6;
|
uint32 lineNo = index / 6;
|
||||||
uint32 indexInLine = index % 6;
|
uint32 indexInLine = index % 6;
|
||||||
uint32 lineSize = std::max(count - lineNo * 6, uint32(6));
|
uint32 lineSize = std::max(count - lineNo * 6, uint32(6));
|
||||||
float x = cos(orientation) * sPlayerbotAIConfig->followDistance * lineNo;
|
float x = cos(orientation) * sPlayerbotAIConfig.followDistance * lineNo;
|
||||||
float y = sin(orientation) * sPlayerbotAIConfig->followDistance * lineNo;
|
float y = sin(orientation) * sPlayerbotAIConfig.followDistance * lineNo;
|
||||||
return placer.Place(unit, indexInLine, lineSize);
|
return placer.Place(unit, indexInLine, lineSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
UnitPosition SingleLineUnitPlacer::Place(FormationUnit* unit, uint32 index, uint32 count)
|
UnitPosition SingleLineUnitPlacer::Place(FormationUnit* unit, uint32 index, uint32 count)
|
||||||
{
|
{
|
||||||
float angle = orientation - M_PI / 2.0f;
|
float angle = orientation - M_PI / 2.0f;
|
||||||
float x = cos(angle) * sPlayerbotAIConfig->followDistance * ((float)index - (float)count / 2);
|
float x = cos(angle) * sPlayerbotAIConfig.followDistance * ((float)index - (float)count / 2);
|
||||||
float y = sin(angle) * sPlayerbotAIConfig->followDistance * ((float)index - (float)count / 2);
|
float y = sin(angle) * sPlayerbotAIConfig.followDistance * ((float)index - (float)count / 2);
|
||||||
return UnitPosition(x, y);
|
return UnitPosition(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user