Skip to content

Commit

Permalink
Merge pull request liyunfan1223#279 from liyunfan1223/feat_teleport
Browse files Browse the repository at this point in the history
Feat teleport
  • Loading branch information
liyunfan1223 authored Jun 22, 2024
2 parents 9f325f9 + 87db546 commit 78aa255
Show file tree
Hide file tree
Showing 6 changed files with 86 additions and 54 deletions.
10 changes: 7 additions & 3 deletions conf/playerbots.conf.dist
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ AiPlayerbot.RandomBotMinLevel = 1
AiPlayerbot.RandomBotMaxLevel = 80

# Enable/Disable rotation of bots (randomly select a bot from the bots pool to go online and rotate them periodically)
# Need reset rndbot after changing the setting
# Need to reset rndbot after changing the setting (.playerbot rndbot reset)
# default: 0 (disable, the online bots are fixed)
AiPlayerbot.EnableRotation = 0

Expand Down Expand Up @@ -108,6 +108,10 @@ AiPlayerbot.RandombotStartingLevel = 5
# Server XP Rate * AiPlayerbot.KillXPRate
AiPlayerbot.KillXPRate = 1

# Disable death knight for bots login
# Need to reset rndbot after changing the setting (.playerbot rndbot reset)
AiPlayerbot.DisableDeathKnightLogin = 0

# Specify percent of active bots
# The default is 10. With 10% of all bots going active or inactive each minute.
AiPlayerbot.BotActiveAlone = 100
Expand Down Expand Up @@ -213,8 +217,8 @@ AiPlayerbot.SyncQuestForPlayer = 0
AiPlayerbot.SyncLevelWithPlayers = 0

# Give free food to random bots
# Default: 1 (enabled)
AiPlayerbot.FreeFood = 1
# Default: 0 (disabled)
AiPlayerbot.FreeFood = 0

# Bot automatically trains spells when talking to trainer (yes = train all available spells as long as the bot has the money, free = auto trains with no money cost, no = only list spells)
# Only for random bots
Expand Down
5 changes: 3 additions & 2 deletions src/PlayerbotAIConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -281,11 +281,12 @@ bool PlayerbotAIConfig::Initialize()
autoGearScoreLimit = sConfigMgr->GetOption<int32>("AiPlayerbot.AutoGearScoreLimit", 0);

playerbotsXPrate = sConfigMgr->GetOption<int32>("AiPlayerbot.KillXPRate", 1);
disableDeathKnightLogin = sConfigMgr->GetOption<bool>("AiPlayerbot.DisableDeathKnightLogin", 0);
botActiveAlone = sConfigMgr->GetOption<int32>("AiPlayerbot.BotActiveAlone", 10);

enablePrototypePerformanceDiff = sConfigMgr->GetOption<bool>("AiPlayerbot.EnablePrototypePerformanceDiff", false);
diffWithPlayer = sConfigMgr->GetOption("AiPlayerbot.DiffWithPlayer", 100);
diffEmpty = sConfigMgr->GetIntDefault("AiPlayerbot.DiffEmpty", 200);
diffWithPlayer = sConfigMgr->GetOption<int32>("AiPlayerbot.DiffWithPlayer", 100);
diffEmpty = sConfigMgr->GetOption<int32>("AiPlayerbot.DiffEmpty", 200);

randombotsWalkingRPG = sConfigMgr->GetOption<bool>("AiPlayerbot.RandombotsWalkingRPG", false);
randombotsWalkingRPGInDoors = sConfigMgr->GetOption<bool>("AiPlayerbot.RandombotsWalkingRPG.InDoors", false);
Expand Down
1 change: 1 addition & 0 deletions src/PlayerbotAIConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ class PlayerbotAIConfig
bool randomBotShowCloak;
bool disableRandomLevels;
uint32 playerbotsXPrate;
bool disableDeathKnightLogin;
uint32 botActiveAlone;

uint32 enablePrototypePerformanceDiff;
Expand Down
110 changes: 66 additions & 44 deletions src/RandomPlayerbotMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "Battleground.h"
#include "BattlegroundMgr.h"
#include "CellImpl.h"
#include "DatabaseEnv.h"
#include "Define.h"
#include "FleeManager.h"
#include "GameTime.h"
Expand All @@ -26,6 +27,7 @@
#include "Random.h"
#include "ServerFacade.h"
#include "ChannelMgr.h"
#include "SharedDefines.h"
#include "Unit.h"
#include "World.h"
#include "UpdateTime.h"
Expand Down Expand Up @@ -480,7 +482,6 @@ uint32 RandomPlayerbotMgr::AddRandomBots()
{
Field* fields = result->Fetch();
ObjectGuid::LowType guid = fields[0].Get<uint32>();

if (GetEventValue(guid, "add"))
continue;

Expand All @@ -492,6 +493,18 @@ uint32 RandomPlayerbotMgr::AddRandomBots()

if (std::find(currentBots.begin(), currentBots.end(), guid) != currentBots.end())
continue;

if (sPlayerbotAIConfig->disableDeathKnightLogin) {
QueryResult result = CharacterDatabase.Query("Select class from characters where guid = {}", guid);
if (!result) {
continue;
}
Field* fields = result->Fetch();
uint32 rClass = fields[0].Get<uint32>();
if (rClass == CLASS_DEATH_KNIGHT) {
continue;
}
}
guids.push_back(guid);
} while (result->NextRow());

Expand Down Expand Up @@ -1161,67 +1174,76 @@ void RandomPlayerbotMgr::RandomTeleport(Player* bot, std::vector<WorldLocation>&

PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomTeleportByLocations");

uint32 index = 0;
std::shuffle(std::begin(tlocs), std::end(tlocs), RandomEngine::Instance());
for (uint32 i = 0; i < tlocs.size(); i++)
{
for (uint8 attemtps = 0; attemtps < 3; ++attemtps)
{
WorldLocation loc = tlocs[urand(0, tlocs.size() - 1)];
WorldLocation loc = tlocs[i];

float x = loc.GetPositionX(); // + (attemtps > 0 ? urand(0, sPlayerbotAIConfig->grindDistance) - sPlayerbotAIConfig->grindDistance / 2 : 0);
float y = loc.GetPositionY(); // + (attemtps > 0 ? urand(0, sPlayerbotAIConfig->grindDistance) - sPlayerbotAIConfig->grindDistance / 2 : 0);
float z = loc.GetPositionZ();
float x = loc.GetPositionX(); // + (attemtps > 0 ? urand(0, sPlayerbotAIConfig->grindDistance) - sPlayerbotAIConfig->grindDistance / 2 : 0);
float y = loc.GetPositionY(); // + (attemtps > 0 ? urand(0, sPlayerbotAIConfig->grindDistance) - sPlayerbotAIConfig->grindDistance / 2 : 0);
float z = loc.GetPositionZ();

Map* map = sMapMgr->FindMap(loc.GetMapId(), 0);
if (!map)
continue;
AreaTableEntry const* zone = sAreaTableStore.LookupEntry(map->GetZoneId(bot->GetPhaseMask(), x, y, z));
if (!zone)
continue;
Map* map = sMapMgr->FindMap(loc.GetMapId(), 0);
if (!map)
continue;

AreaTableEntry const* zone = sAreaTableStore.LookupEntry(map->GetZoneId(bot->GetPhaseMask(), x, y, z));
if (!zone)
continue;

// Do not teleport to enemy zones if level is low
if (zone->team == 4 && bot->GetTeamId() == TEAM_ALLIANCE)
continue;
// Do not teleport to enemy zones if level is low
if (zone->team == 4 && bot->GetTeamId() == TEAM_ALLIANCE)
continue;

if (zone->team == 2 && bot->GetTeamId() == TEAM_HORDE)
continue;
if (zone->team == 2 && bot->GetTeamId() == TEAM_HORDE)
continue;

if (map->IsInWater(bot->GetPhaseMask(), x, y, z, bot->GetCollisionHeight()))
continue;
if (map->IsInWater(bot->GetPhaseMask(), x, y, z, bot->GetCollisionHeight()))
continue;

float ground = map->GetHeight(x, y, z + 0.5f);
if (ground <= INVALID_HEIGHT)
continue;
float ground = map->GetHeight(bot->GetPhaseMask(), x, y, z + 0.5f);
if (ground <= INVALID_HEIGHT)
continue;

z = 0.05f + ground;
z = 0.05f + ground;
PlayerInfo const* pInfo = sObjectMgr->GetPlayerInfo(bot->getRace(true), bot->getClass());
float dis = loc.GetExactDist(pInfo->positionX, pInfo->positionY, pInfo->positionZ);
// yunfan: distance check for low level
if (bot->GetLevel() <= 4 && (loc.GetMapId() != pInfo->mapId || dis > 500.0f)) {
continue;
}
if (bot->GetLevel() <= 10 && (loc.GetMapId() != pInfo->mapId || dis > 2500.0f)) {
continue;
}
if (bot->GetLevel() <= 18 && (loc.GetMapId() != pInfo->mapId || dis > 10000.0f)) {
continue;
}

LOG_INFO("playerbots", "Random teleporting bot {} (level {}) to {} {},{},{} ({}/{} locations)",
bot->GetName().c_str(), bot->GetLevel(), zone->area_name[0], x, y, z, attemtps, tlocs.size());
LOG_INFO("playerbots", "Random teleporting bot {} (level {}) to {} {},{},{} ({}/{} locations)",
bot->GetName().c_str(), bot->GetLevel(), zone->area_name[0], x, y, z, i + 1, tlocs.size());

if (hearth)
{
bot->SetHomebind(loc, zone->ID);
}
if (hearth)
{
bot->SetHomebind(loc, zone->ID);
}

bot->GetMotionMaster()->Clear();
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (botAI)
botAI->Reset(true);
bot->TeleportTo(loc.GetMapId(), x, y, z, 0);
bot->SendMovementFlagUpdate();
bot->GetMotionMaster()->Clear();
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (botAI)
botAI->Reset(true);
bot->TeleportTo(loc.GetMapId(), x, y, z, 0);
bot->SendMovementFlagUpdate();

if (pmo)
pmo->finish();
if (pmo)
pmo->finish();

return;
}
return;
}

if (pmo)
pmo->finish();

LOG_ERROR("playerbots", "Cannot teleport bot {} - no locations available", bot->GetName().c_str());
LOG_ERROR("playerbots", "Cannot teleport bot {} - no locations available ({} locations)", bot->GetName().c_str(), tlocs.size());
}

void RandomPlayerbotMgr::PrepareTeleportCache()
Expand Down Expand Up @@ -1388,7 +1410,7 @@ void RandomPlayerbotMgr::RandomTeleportForLevel(Player* bot)
uint32 level = bot->getLevel();
uint8 race = bot->getRace();
LOG_DEBUG("playerbots", "Random teleporting bot {} for level {} ({} locations available)", bot->GetName().c_str(), bot->GetLevel(), locsPerLevelCache[level].size());
if (urand(0, 100) < sPlayerbotAIConfig->probTeleToBankers * 100) {
if (level > 10 && urand(0, 100) < sPlayerbotAIConfig->probTeleToBankers * 100) {
RandomTeleport(bot, bankerLocsPerLevelCache[level], true);
} else {
RandomTeleport(bot, locsPerLevelCache[level]);
Expand Down
6 changes: 4 additions & 2 deletions src/strategy/priest/HealPriestStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ void HealPriestStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
NextAction::array(0,
new NextAction("circle of healing", ACTION_MEDIUM_HEAL + 8),
new NextAction("power word: shield on almost full health below", ACTION_MEDIUM_HEAL + 7),
new NextAction("prayer of healing on party", ACTION_MEDIUM_HEAL + 6),
NULL)));

triggers.push_back(new TriggerNode(
"medium group heal occasion",
NextAction::array(0, new NextAction("divine hymn", ACTION_CRITICAL_HEAL + 5), NULL)));
NextAction::array(0,
new NextAction("divine hymn", ACTION_CRITICAL_HEAL + 6),
new NextAction("prayer of healing on party", ACTION_CRITICAL_HEAL + 5),
nullptr)));

triggers.push_back(new TriggerNode(
"party member critical health",
Expand Down
8 changes: 5 additions & 3 deletions src/strategy/priest/HolyPriestStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,15 @@ void HolyHealPriestStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
triggers.push_back(new TriggerNode(
"group heal occasion",
NextAction::array(0,
new NextAction("circle of healing", ACTION_MEDIUM_HEAL + 8),
new NextAction("prayer of healing on party", ACTION_MEDIUM_HEAL + 6),
new NextAction("circle of healing", ACTION_MEDIUM_HEAL + 8),
NULL)));

triggers.push_back(new TriggerNode(
"medium group heal occasion",
NextAction::array(0, new NextAction("divine hymn", ACTION_CRITICAL_HEAL + 5), NULL)));
NextAction::array(0,
new NextAction("divine hymn", ACTION_CRITICAL_HEAL + 6),
new NextAction("prayer of healing on party", ACTION_CRITICAL_HEAL + 5),
nullptr)));

triggers.push_back(new TriggerNode(
"party member critical health",
Expand Down

0 comments on commit 78aa255

Please sign in to comment.