fixed defenders sitting in burning building lamenting their failures, some attackers now advance to next objective without waiting for full capture, added new path for alliance to bypass mid on the way to galv, made objective selection logic same for both teams

This commit is contained in:
Fuzz
2024-07-15 20:44:36 +10:00
parent cabc09fd8d
commit f854726934

View File

@@ -1622,6 +1622,27 @@ BattleBotPath vPath_AV_Frostdagger_Pass_Lower_to_Iceblood_Garrison =
{ -492.17f, -187.077f, 57.1342f, nullptr }, { -492.17f, -187.077f, 57.1342f, nullptr },
}; };
BattleBotPath vPath_AV_Icewing_Bunker_Crossroad_to_Frostdagger_Pass_Lower =
{
{ 119.693f, -351.311f, 42.728f, nullptr },
{ 107.710f, -321.162f, 37.168f, nullptr },
{ 84.953f, -273.434f, 23.944f, nullptr },
{ 47.073f, -245.696f, 15.417f, nullptr },
{ 2.455f, -240.346f, 11.867f, nullptr },
{ -38.451f, -231.493f, 10.284f, nullptr },
{ -70.606f, -230.758f, 9.919f, nullptr },
{ -83.955f, -214.666f, 12.873f, nullptr },
{ -111.412f, -175.575f, 13.515f, nullptr },
{ -129.634f, -141.359f, 20.921f, nullptr },
{ -140.904f, -105.104f, 28.097f, nullptr },
{ -167.552f, -74.891f, 31.524f, nullptr },
{ -210.442f, -54.664f, 37.525f, nullptr },
{ -247.372f, -38.489f, 36.438f, nullptr },
{ -280.423f, -48.095f, 32.709f, nullptr },
{ -309.757f, -58.032f, 28.778f, nullptr },
{ -345.274f, -71.566f, 28.005f, nullptr },
};
BattleBotPath vPath_EY_Horde_Spawn_to_Crossroad1Horde = BattleBotPath vPath_EY_Horde_Spawn_to_Crossroad1Horde =
{ {
{ 1809.102f, 1540.854f, 1267.142f, nullptr }, { 1809.102f, 1540.854f, 1267.142f, nullptr },
@@ -2189,6 +2210,7 @@ std::vector<BattleBotPath*> const vPaths_AV =
&vPath_AV_Coldtooth_Mine_Entrance_to_Coldtooth_Mine_Boss, &vPath_AV_Coldtooth_Mine_Entrance_to_Coldtooth_Mine_Boss,
&vPath_AV_Stormpike_Crossroad_to_Irontooth_Mine_Entrance, &vPath_AV_Stormpike_Crossroad_to_Irontooth_Mine_Entrance,
&vPath_AV_Irontooth_Mine_Entrance_to_Irontooth_Mine_Boss, &vPath_AV_Irontooth_Mine_Entrance_to_Irontooth_Mine_Boss,
&vPath_AV_Icewing_Bunker_Crossroad_to_Frostdagger_Pass_Lower,
}; };
std::vector<BattleBotPath*> const vPaths_EY = std::vector<BattleBotPath*> const vPaths_EY =
@@ -2934,52 +2956,84 @@ bool BGTactics::selectObjective(bool reset)
{ {
case BATTLEGROUND_AV: case BATTLEGROUND_AV:
{ {
// Alliance and Horde code is intentionally different.
// Horde bots are more united and always go together.
// Alliance bots can pick random objective.
BattlegroundAV* alterValleyBG = (BattlegroundAV*)bg; BattlegroundAV* alterValleyBG = (BattlegroundAV*)bg;
uint32 role = context->GetValue<uint32>("bg role")->Get();
bool supportDefense = role < 3;
bool advancedAttack = role < 7;
if (bot->GetTeamId() == TEAM_HORDE) if (bot->GetTeamId() == TEAM_HORDE)
{ {
bool endBoss = false;
// End Boss // End Boss
if (alterValleyBG->GetAVNodeInfo(BG_AV_NODES_DUNBALDAR_SOUTH).TotalOwnerId != TEAM_ALLIANCE && if (alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FIRSTAID_STATION).TotalOwnerId != TEAM_ALLIANCE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_DUNBALDAR_NORTH).TotalOwnerId != TEAM_ALLIANCE && alterValleyBG->GetAVNodeInfo(BG_AV_NODES_DUNBALDAR_NORTH).TotalOwnerId != TEAM_ALLIANCE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_DUNBALDAR_SOUTH).TotalOwnerId != TEAM_ALLIANCE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_ICEWING_BUNKER).TotalOwnerId != TEAM_ALLIANCE && alterValleyBG->GetAVNodeInfo(BG_AV_NODES_ICEWING_BUNKER).TotalOwnerId != TEAM_ALLIANCE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_STONEHEART_BUNKER).TotalOwnerId != TEAM_ALLIANCE && alterValleyBG->GetAVNodeInfo(BG_AV_NODES_STONEHEART_BUNKER).TotalOwnerId != TEAM_ALLIANCE)
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FIRSTAID_STATION).TotalOwnerId != TEAM_ALLIANCE)
{ {
if (Creature* pVanndar = bg->GetBGCreature(AV_CPLACE_TRIGGER17)) if (Creature* pVanndar = bg->GetBGCreature(AV_CPLACE_TRIGGER17))
{ {
BgObjective = pVanndar; BgObjective = pVanndar;
endBoss = true; //std::ostringstream out;
std::ostringstream out; //out << "Attacking Vanndar!";
out << "Attacking Vanndar!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
uint32 role = context->GetValue<uint32>("bg role")->Get();
bool supporter = role < 3; // first bunker strike team
// Only go to Snowfall Graveyard if already close to it. // Only go to Snowfall Graveyard if already close to it.
// Need to fix AV script if (!BgObjective && supportDefense &&
if (!BgObjective && supporter &&
(alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_ALLIANCE || (alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_ALLIANCE ||
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_OTHER)) alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_NEUTRAL))
{ {
if (GameObject* pGO = bg->GetBGObject(BG_AV_NODES_SNOWFALL_GRAVE)) if (GameObject* pGO = bg->GetBGObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE))
if (bot->IsWithinDist(pGO, 200.f)) if (bot->IsWithinDist(pGO, 100.f))
{ {
BgObjective = pGO; BgObjective = pGO;
std::ostringstream out; //std::ostringstream out;
out << "Attacking Snowfall GY!"; //out << "Attacking Snowfall GY!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
if (!BgObjective && alterValleyBG->IsCaptainAlive(0)) // defend
if (!BgObjective && supportDefense)
{
for (const auto& objective : AV_HordeDefendObjectives)
{
if (!BgObjective &&
alterValleyBG->GetAVNodeInfo(objective.first).State != POINT_DESTROYED &&
alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_ALLIANCE)
{
if (GameObject* pGO = bg->GetBGObject(objective.second))
{
BgObjective = pGO;
//std::ostringstream out;
//out << "Defending Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
}
// defend captain or boss if close
if (!BgObjective && alterValleyBG->IsCaptainAlive(TEAM_HORDE))
{
if (Creature* myNpc = bg->GetBGCreature(AV_CPLACE_TRIGGER18))//galvangar
{
if (myNpc->getDeathState() != DeathState::Dead && bot->IsWithinDist(myNpc, 100.f))
BgObjective = myNpc;
}
}
if (!BgObjective)
{
if (Creature* myNpc = bg->GetBGCreature(AV_CPLACE_TRIGGER19))//drek
{
if (myNpc->getDeathState() != DeathState::Dead && bot->IsWithinDist(myNpc, 300.f))
BgObjective = myNpc;
}
}
}
if (!BgObjective && alterValleyBG->IsCaptainAlive(TEAM_ALLIANCE))
{ {
if (Creature* pBalinda = bg->GetBGCreature(AV_CPLACE_TRIGGER16)) if (Creature* pBalinda = bg->GetBGCreature(AV_CPLACE_TRIGGER16))
{ {
@@ -2995,9 +3049,8 @@ bool BGTactics::selectObjective(bool reset)
AV_STONEHEARTH_WAITING_HORDE.GetPositionY(), AV_STONEHEARTH_WAITING_HORDE.GetPositionY(),
AV_STONEHEARTH_WAITING_HORDE.GetPositionZ(), AV_STONEHEARTH_WAITING_HORDE.GetPositionZ(),
bg->GetMapId()); bg->GetMapId());
//std::ostringstream out;
std::ostringstream out; //out << "Taking position at Stonehearth!";
out << "Taking position at Stonehearth!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
else else
@@ -3007,51 +3060,26 @@ bool BGTactics::selectObjective(bool reset)
AV_STONEHEARTH_ATTACKING_HORDE.GetPositionY(), AV_STONEHEARTH_ATTACKING_HORDE.GetPositionY(),
AV_STONEHEARTH_ATTACKING_HORDE.GetPositionZ(), AV_STONEHEARTH_ATTACKING_HORDE.GetPositionZ(),
bg->GetMapId()); bg->GetMapId());
//std::ostringstream out;
std::ostringstream out; //out << "Attacking Balinda!";
out << "Attacking Balinda!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
BgObjective = pBalinda; BgObjective = pBalinda;
// set skull on captain
//if (bot->IsWithinDistInMap(pBalinda, 50.0f))
//{
// bot->GetGroup()->SetTargetIcon(7, pBalinda->GetGUID());
//}
} }
} }
} }
if (!BgObjective) // Mine capture (disabled for now)
{ if (false && !BgObjective && supportDefense &&
for (const auto& objective : AV_HordeDefendObjectives) (alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_ALLIANCE || alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_NEUTRAL) &&
{
if (!BgObjective && alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_ALLIANCE)
{
if (GameObject* pGO = bg->GetBGObject(objective.second))
if (bot->IsWithinDist(pGO, 400.0f))
{
BgObjective = pGO;
//std::ostringstream out;
// out << "Defending Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
}
}
// Mine capture (need paths & script fix)
if (!BgObjective && supporter && !endBoss &&
(alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_ALLIANCE || alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_OTHER) &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_STORMPIKE_GRAVE).OwnerId != TEAM_ALLIANCE) alterValleyBG->GetAVNodeInfo(BG_AV_NODES_STORMPIKE_GRAVE).OwnerId != TEAM_ALLIANCE)
{ {
if (Creature* mBossNeutral = bg->GetBGCreature(AV_CPLACE_MINE_N_3)) if (Creature* mBossNeutral = bg->GetBGCreature(AV_CPLACE_MINE_N_3))
{ {
if (bot->IsWithinDist(mBossNeutral, 400.0f) && mBossNeutral->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_OTHER) if (bot->IsWithinDist(mBossNeutral, 400.0f) && mBossNeutral->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_NEUTRAL)
{ {
BgObjective = mBossNeutral; BgObjective = mBossNeutral;
LOG_INFO("playerbots", "HORDE bot={} Attacking Neutral Mine Boss!", bot->GetName());
//std::ostringstream out; //std::ostringstream out;
//out << "Attacking Neutral Mine Boss!"; //out << "Attacking Neutral Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
@@ -3060,9 +3088,10 @@ bool BGTactics::selectObjective(bool reset)
if (Creature* mBossAlly = bg->GetBGCreature(AV_CPLACE_MINE_N_3)) if (Creature* mBossAlly = bg->GetBGCreature(AV_CPLACE_MINE_N_3))
{ {
if (!BgObjective && bot->IsWithinDist(mBossAlly, 400.0f) && mBossAlly->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_ALLIANCE) if (!BgObjective && bot->IsWithinDist(mBossAlly, 400.0f) && mBossAlly->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_NORTH_MINE) == TEAM_NEUTRAL)
{ {
BgObjective = mBossAlly; BgObjective = mBossAlly;
LOG_INFO("playerbots", "HORDE bot={} Attacking Ally Mine Boss!", bot->GetName());
//std::ostringstream out; //std::ostringstream out;
//out << "Attacking Ally Mine Boss!"; //out << "Attacking Ally Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
@@ -3070,118 +3099,111 @@ bool BGTactics::selectObjective(bool reset)
} }
} }
//bool strifeTime = bg->GetStartTime() < (uint32)(5 * MINUTE * IN_MILLISECONDS); if (!BgObjective)
// small strike team to first bunker
if (!BgObjective/* || (!endBoss && supporter)*/)
{ {
// Attack closest objective
WorldObject* pAttackObjectiveObject = nullptr;
float attackObjectiveDistance = FLT_MAX;
for (const auto& objective : AV_HordeAttackObjectives) for (const auto& objective : AV_HordeAttackObjectives)
{ {
if ((!BgObjective/* || (supporter && objective.first == BG_AV_NODES_STONEHEART_BUNKER && !bg->IsActiveEvent(BG_AV_NODE_CAPTAIN_DEAD_A, 0))*/) && if ((!advancedAttack && alterValleyBG->GetAVNodeInfo(objective.first).TotalOwnerId == TEAM_ALLIANCE) ||
alterValleyBG->GetAVNodeInfo(objective.first).TotalOwnerId == TEAM_ALLIANCE)//need to check TotalOwnerId for attack objectives (alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_ALLIANCE))//TotalOwnerId only changes when its fully captured/destroyed, OwnerId changes when it's assaulted (meaning advancedAttack bots move on to next point)
{
if (GameObject* pGO = bg->GetBGObject(objective.second))
{
float const distance = sqrt(bot->GetDistance(pGO));
if (attackObjectiveDistance > distance)
{
pAttackObjectiveObject = pGO;
attackObjectiveDistance = distance;
//std::ostringstream out;
//out << "Attacking Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
}
}
if (pAttackObjectiveObject)
BgObjective = pAttackObjectiveObject;
}
}
else //TEAM_ALLIANCE
{
// End Boss
if (alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_HUT).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_WTOWER).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_ETOWER).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_TOWER_POINT).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_ICEBLOOD_TOWER).TotalOwnerId != TEAM_HORDE)
{
if (Creature* pDrek = bg->GetBGCreature(AV_CPLACE_TRIGGER19))
{
BgObjective = pDrek;
//std::ostringstream out;
//out << "Attacking DrekThar!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
// Only go to Snowfall Graveyard if already close to it.
if (!BgObjective && supportDefense &&
(alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_HORDE ||
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_NEUTRAL))
{
if (GameObject* pGO = bg->GetBGObject(BG_AV_OBJECT_FLAG_N_SNOWFALL_GRAVE))
if (bot->IsWithinDist(pGO, 100.f))
{
BgObjective = pGO;
//std::ostringstream out;
//out << "Attacking Snowfall GY!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
// defend
if (!BgObjective && supportDefense)
{
for (const auto& objective : AV_AllianceDefendObjectives)
{
if (!BgObjective &&
alterValleyBG->GetAVNodeInfo(objective.first).State != POINT_DESTROYED &&
alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_HORDE)
{ {
if (GameObject* pGO = bg->GetBGObject(objective.second)) if (GameObject* pGO = bg->GetBGObject(objective.second))
{ {
BgObjective = pGO; BgObjective = pGO;
//std::ostringstream out; //std::ostringstream out;
//out << "Attacking Node #" << objective.first; //out << "Defending Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
} }
} // defend captain or boss if close
} if (!BgObjective && alterValleyBG->IsCaptainAlive(TEAM_ALLIANCE))
else // ALLIANCE
{
bool endBoss = false;
// End boss
if (alterValleyBG->GetAVNodeInfo(BG_AV_NODES_ICEBLOOD_TOWER).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_TOWER_POINT).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_ETOWER).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_WTOWER).TotalOwnerId != TEAM_HORDE &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_HUT).TotalOwnerId != TEAM_HORDE)
{
if (Creature* pDrek = bg->GetBGCreature(AV_CPLACE_TRIGGER19))
{ {
BgObjective = pDrek; if (Creature* myNpc = bg->GetBGCreature(AV_CPLACE_TRIGGER16))//balinda
endBoss = true;
std::ostringstream out;
out << "Attacking DrekThar!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
uint32 role = context->GetValue<uint32>("bg role")->Get();
bool supporter = role < 3;
// Only go to Snowfall Graveyard if already close to it.
if (!BgObjective && supporter &&
(alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_HORDE ||
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_SNOWFALL_GRAVE).OwnerId == TEAM_OTHER))
{
if (GameObject* pGO = bg->GetBGObject(BG_AV_NODES_SNOWFALL_GRAVE))
if (bot->IsWithinDist(pGO, 200.f))
{ {
BgObjective = pGO; if (myNpc->getDeathState() != DeathState::Dead && bot->IsWithinDist(myNpc, 100.f))
std::ostringstream out; BgObjective = myNpc;
out << "Attacking Snowfall GY!";
//bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
if (!BgObjective)
// Chance to defend.
if (!BgObjective && (!endBoss && supporter))
{
for (const auto& objective : AV_AllianceDefendObjectives)
{ {
if (!BgObjective && alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_HORDE) if (Creature* myNpc = bg->GetBGCreature(AV_CPLACE_TRIGGER16))//vanndar
{ {
if (GameObject* pGO = bg->GetBGObject(objective.second)) if (myNpc->getDeathState() != DeathState::Dead && bot->IsWithinDist(myNpc, 300.f))
{ BgObjective = myNpc;
BgObjective = pGO;
//std::ostringstream out; out << "Defending Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL);
}
} }
} }
} }
// Mine capture (need paths & script fix) if (!BgObjective && alterValleyBG->IsCaptainAlive(TEAM_HORDE))
if (!BgObjective && supporter && !endBoss &&
(alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_HORDE || alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_OTHER) &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_GRAVE).TotalOwnerId != TEAM_HORDE)
{ {
if (Creature* mBossNeutral = bg->GetBGCreature(AV_CPLACE_MINE_S_3)) if (Creature* pGalvangar = bg->GetBGCreature(AV_CPLACE_TRIGGER18))
{ {
if (bot->IsWithinDist(mBossNeutral, 400.0f) && mBossNeutral->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_OTHER) if (pGalvangar->getDeathState() != DeathState::Dead)
{
BgObjective = mBossNeutral;
//std::ostringstream out;
//out << "Attacking Neutral Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
if (Creature* mBossHorde = bg->GetBGCreature(AV_CPLACE_MINE_S_3))
{
if (!BgObjective && bot->IsWithinDist(mBossHorde, 400.0f) && mBossHorde->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_HORDE)
{
BgObjective = mBossHorde;
//std::ostringstream out;
//out << "Attacking Horde Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
}
if (!BgObjective)
{
// Attack closest objective.
WorldObject* pAttackObjectiveObject = nullptr;
float attackObjectiveDistance = FLT_MAX;
if (alterValleyBG->IsCaptainAlive(1))
{
if (Creature* pGalvangar = bg->GetBGCreature(AV_CPLACE_TRIGGER18))
{ {
uint32 attackCount = getDefendersCount(AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE, 10.0f, false) + getDefendersCount(AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE, 10.0f, false); uint32 attackCount = getDefendersCount(AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE, 10.0f, false) + getDefendersCount(AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE, 10.0f, false);
@@ -3193,9 +3215,8 @@ bool BGTactics::selectObjective(bool reset)
AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE.GetPositionY(), AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE.GetPositionY(),
AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE.GetPositionZ(), AV_ICEBLOOD_GARRISON_WAITING_ALLIANCE.GetPositionZ(),
bg->GetMapId()); bg->GetMapId());
//std::ostringstream out; //std::ostringstream out;
//out << "Taking position at Iceblood Outpost!"; //out << "Taking position at Stonehearth!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
else else
@@ -3205,19 +3226,54 @@ bool BGTactics::selectObjective(bool reset)
AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE.GetPositionY(), AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE.GetPositionY(),
AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE.GetPositionZ(), AV_ICEBLOOD_GARRISON_ATTACKING_ALLIANCE.GetPositionZ(),
bg->GetMapId()); bg->GetMapId());
//std::ostringstream out; //std::ostringstream out;
// out << "Attacking Galvangar!"; //out << "Attacking Galvangar!";
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
pAttackObjectiveObject = pGalvangar; BgObjective = pGalvangar;
attackObjectiveDistance = sqrt(bot->GetDistance(pGalvangar)); }
}
}
// Mine capture (disabled for now)
if (false && !BgObjective && supportDefense &&
(alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_HORDE || alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_NEUTRAL) &&
alterValleyBG->GetAVNodeInfo(BG_AV_NODES_FROSTWOLF_GRAVE).TotalOwnerId != TEAM_HORDE)
{
if (Creature* mBossNeutral = bg->GetBGCreature(AV_CPLACE_MINE_S_3))
{
if (bot->IsWithinDist(mBossNeutral, 400.0f) && mBossNeutral->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_NEUTRAL)
{
BgObjective = mBossNeutral;
LOG_INFO("playerbots", "ALLIANCE bot={} Attacking Neutral Mine Boss!", bot->GetName());
//std::ostringstream out;
//out << "Attacking Neutral Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
if (Creature* mBossHorde = bg->GetBGCreature(AV_CPLACE_MINE_S_3))
{
if (!BgObjective && bot->IsWithinDist(mBossHorde, 400.0f) && mBossHorde->getDeathState() != DeathState::Dead && alterValleyBG->GetMineOwner(AV_SOUTH_MINE) == TEAM_HORDE)
{
BgObjective = mBossHorde;
LOG_INFO("playerbots", "ALLIANCE bot={} Attacking Horde Mine Boss!", bot->GetName());
//std::ostringstream out;
//out << "Attacking Horde Mine Boss!";
//bot->Say(out.str(), LANG_UNIVERSAL);
}
}
}
if (!BgObjective)
{
// Attack closest objective
WorldObject* pAttackObjectiveObject = nullptr;
float attackObjectiveDistance = FLT_MAX;
for (const auto& objective : AV_AllianceAttackObjectives) for (const auto& objective : AV_AllianceAttackObjectives)
{ {
if (alterValleyBG->GetAVNodeInfo(objective.first).TotalOwnerId == TEAM_HORDE)//need to check TotalOwnerId for attack objectives if ((!advancedAttack && alterValleyBG->GetAVNodeInfo(objective.first).TotalOwnerId == TEAM_HORDE) ||
(alterValleyBG->GetAVNodeInfo(objective.first).OwnerId == TEAM_HORDE))//TotalOwnerId only changes when its fully captured/destroyed, OwnerId changes when it's assaulted (meaning advancedAttack bots move on to next point)
{ {
if (GameObject* pGO = bg->GetBGObject(objective.second)) if (GameObject* pGO = bg->GetBGObject(objective.second))
{ {
@@ -3227,17 +3283,14 @@ bool BGTactics::selectObjective(bool reset)
pAttackObjectiveObject = pGO; pAttackObjectiveObject = pGO;
attackObjectiveDistance = distance; attackObjectiveDistance = distance;
//std::ostringstream out; //std::ostringstream out;
// out << "Attacking Node #" << objective.first; //out << "Attacking Node #" << objective.first;
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
} }
} }
} }
} }
if (pAttackObjectiveObject) if (pAttackObjectiveObject)
{
BgObjective = pAttackObjectiveObject; BgObjective = pAttackObjectiveObject;
}
} }
} }
if (BgObjective) if (BgObjective)
@@ -3246,7 +3299,6 @@ bool BGTactics::selectObjective(bool reset)
pos.Set(BgObjective->GetPositionX(), BgObjective->GetPositionY(), BgObjective->GetPositionZ(), BgObjective->GetMapId()); pos.Set(BgObjective->GetPositionX(), BgObjective->GetPositionY(), BgObjective->GetPositionZ(), BgObjective->GetMapId());
posMap["bg objective"] = pos; posMap["bg objective"] = pos;
//std::ostringstream out; //std::ostringstream out;
//out << "BG objective set to " << BgObjective->GetName() << " " << pos.x << " " << pos.y; //out << "BG objective set to " << BgObjective->GetName() << " " << pos.x << " " << pos.y;
//bot->Say(out.str(), LANG_UNIVERSAL); //bot->Say(out.str(), LANG_UNIVERSAL);
@@ -4249,7 +4301,7 @@ bool BGTactics::selectObjectiveWp(std::vector<BattleBotPath*> const& vPaths)
// creates a score based on dist-to-bot and dist-to-destination, where lower is better, and dist-to-bot is more important (when its beyond a certain distance) // creates a score based on dist-to-bot and dist-to-destination, where lower is better, and dist-to-bot is more important (when its beyond a certain distance)
// dist-to-bot is more important because otherwise they cant reach it at all (or will fly through air with MM::MovePoint()), also bot may need to use multiple // dist-to-bot is more important because otherwise they cant reach it at all (or will fly through air with MM::MovePoint()), also bot may need to use multiple
// paths (one after another) anyway // paths (one after another) anyway
float distToDestination = reverse ? startPointDistToDestination : endPointDistToDestination; float distToDestination = reverse ? startPointDistToDestination : endPointDistToDestination;
float pathScore = (closestPointDistToBot < botDistanceScoreSubtract ? 0.0f : ((closestPointDistToBot - botDistanceScoreSubtract) * botDistanceScoreMultiply)) + distToDestination; float pathScore = (closestPointDistToBot < botDistanceScoreSubtract ? 0.0f : ((closestPointDistToBot - botDistanceScoreSubtract) * botDistanceScoreMultiply)) + distToDestination;
@@ -4280,7 +4332,8 @@ bool BGTactics::resetObjective()
return false; return false;
// sometimes change role // sometimes change role
if (!urand(0, 5) && !(bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL))) uint32 rollChangeOdds = BATTLEGROUND_AV == bg->GetBgTypeID() ? 31 : 5;
if (!urand(0, rollChangeOdds) && !(bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)))
context->GetValue<uint32>("bg role")->Set(urand(0, 9)); context->GetValue<uint32>("bg role")->Set(urand(0, 9));
PositionMap& posMap = context->GetValue<PositionMap&>("position")->Get(); PositionMap& posMap = context->GetValue<PositionMap&>("position")->Get();