diff --git a/src/PlayerbotFactory.cpp b/src/PlayerbotFactory.cpp index c2fd50c8..e1d118e4 100644 --- a/src/PlayerbotFactory.cpp +++ b/src/PlayerbotFactory.cpp @@ -124,7 +124,7 @@ void PlayerbotFactory::Randomize(bool incremental) { ResetQuests(); } - ClearInventory(); + ClearAllItems(); bot->SaveToDB(false, false); bot->GiveLevel(level); @@ -337,10 +337,11 @@ void PlayerbotFactory::Refresh() InitAmmo(); InitFood(); InitReagents(); - InitPotions(); - InitTalents(true); + // InitPotions(); + InitTalentsTree(true); InitClassSpells(); InitAvailableSpells(); + InitSkills(); bot->DurabilityRepairAll(false, 1.0f, false); if (bot->isDead()) bot->ResurrectPlayer(1.0f, false); @@ -2144,6 +2145,9 @@ void PlayerbotFactory::InitAmmo() case ITEM_SUBCLASS_WEAPON_CROSSBOW: subClass = ITEM_SUBCLASS_ARROW; break; + case ITEM_SUBCLASS_WEAPON_THROWN: + subClass = ITEM_SUBCLASS_THROWN; + break; } if (!subClass) @@ -2292,6 +2296,9 @@ void PlayerbotFactory::InitPotions() void PlayerbotFactory::InitFood() { + if (sPlayerbotAIConfig->freeFood) { + return; + } std::map > items; ItemTemplateContainer const* itemTemplateContainer = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator i = itemTemplateContainer->begin(); i != itemTemplateContainer->end(); ++i) @@ -2961,6 +2968,7 @@ float PlayerbotFactory::CalculateItemScore(uint32 item_id, Player* bot) { score *= 0.8; } + // double hand if (proto->Class == ITEM_CLASS_WEAPON) { bool isDoubleHand = proto->Class == ITEM_CLASS_WEAPON && !(ITEM_SUBCLASS_MASK_SINGLE_HAND & (1 << proto->SubClass)) && @@ -2990,6 +2998,11 @@ float PlayerbotFactory::CalculateItemScore(uint32 item_id, Player* bot) score *= 10; } } + if (proto->Class == ITEM_CLASS_WEAPON) { + if (cls == CLASS_HUNTER && proto->SubClass == ITEM_SUBCLASS_WEAPON_THROWN) { + score *= 0.1; + } + } return (0.01 + score) * itemLevel * (quality + 1); // return score; } diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 2d54c099..89feb26c 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -533,7 +533,7 @@ std::string const PlayerbotHolder::ProcessBotCommand(std::string const cmd, Obje return "bot not found"; if (!isRandomAccount || isRandomBot) { - return "ERROR: You can not use this command on summoned random bot."; + return "ERROR: You can not use this command on non-summoned random bot."; } if (Player* master = GET_PLAYERBOT_AI(bot)->GetMaster()) diff --git a/src/RandomItemMgr.cpp b/src/RandomItemMgr.cpp index 7ca5ff4e..8269b845 100644 --- a/src/RandomItemMgr.cpp +++ b/src/RandomItemMgr.cpp @@ -2179,10 +2179,10 @@ void RandomItemMgr::BuildAmmoCache() uint32 counter = 0; for (uint32 level = 1; level <= maxLevel; level += 1) { - for (uint32 subClass = ITEM_SUBCLASS_ARROW; subClass <= ITEM_SUBCLASS_BULLET; subClass++) + for (uint32 subClass = ITEM_SUBCLASS_ARROW; subClass <= ITEM_SUBCLASS_THROWN; subClass++) { QueryResult results = WorldDatabase.Query("SELECT entry FROM item_template WHERE class = {} AND subclass = {} AND RequiredLevel <= {} " - "ORDER BY RequiredLevel DESC", ITEM_CLASS_PROJECTILE, subClass, level); + "ORDER BY RequiredLevel DESC, Quality DESC, ItemLevel DESC", ITEM_CLASS_PROJECTILE, subClass, level); if (!results) return; diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index bf941da0..db36c97a 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -239,8 +239,8 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) SetEventValue(0, "bot_count", maxAllowedBotCount, urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); } - std::list availableBots = GetBots(); - uint32 availableBotCount = availableBots.size(); + GetBots(); + uint32 availableBotCount = currentBots.size(); uint32 onlineBotCount = playerBots.size(); uint32 onlineBotFocus = 75; @@ -261,13 +261,7 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) if (time(nullptr) > (PlayersCheckTimer + 60)) activateCheckPlayersThread(); } - - if (sPlayerbotAIConfig->syncLevelWithPlayers && !players.empty()) - { - if (time(nullptr) > (PlayersCheckTimer + 60)) - activateCheckPlayersThread(); - } - + if (sPlayerbotAIConfig->randomBotJoinBG/* && !players.empty()*/) { if (time(nullptr) > (BgCheckTimer + 30)) @@ -278,10 +272,10 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) uint32 maxNewBots = onlineBotCount < maxAllowedBotCount ? maxAllowedBotCount - onlineBotCount : 0; uint32 loginBots = std::min(sPlayerbotAIConfig->randomBotsPerInterval - updateBots, maxNewBots); - if (!availableBots.empty()) + if (!currentBots.empty()) { // Update bots - for (auto bot : availableBots) + for (auto bot : currentBots) { if (!GetPlayerBot(bot)) continue; @@ -303,7 +297,7 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) LOG_INFO("playerbots", "{} new bots", loginBots); //Log in bots - for (auto bot : availableBots) + for (auto bot : currentBots) { if (GetPlayerBot(bot)) continue; @@ -833,8 +827,8 @@ bool RandomPlayerbotMgr::ProcessBot(uint32 bot) } } - if (botAI->HasPlayerNearby(sPlayerbotAIConfig->grindDistance)) - update = false; + // if (botAI->HasPlayerNearby(sPlayerbotAIConfig->grindDistance)) + // update = false; } if (update) @@ -1102,41 +1096,43 @@ void RandomPlayerbotMgr::PrepareTeleportCache() maxLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); LOG_INFO("playerbots", "Preparing random teleport caches for {} levels...", maxLevel); + QueryResult results = WorldDatabase.Query( - "WITH GroupedData AS ( " - "SELECT " - "MIN( c.guid ) guid, " - "(AVG( t.maxlevel ) + AVG( t.minlevel )) / 2 lvl " - "FROM " - "creature c " - "INNER JOIN creature_template t ON c.id1 = t.entry " - "WHERE " - "t.npcflag = 0 " - "AND t.lootid != 0 " - "AND t.unit_flags != 768 " - "AND map IN ({}) " - "AND c.id1 != 32820 " - "GROUP BY " - "map, " - "ROUND( position_x / 500 ), " - "ROUND( position_y / 500 ), " - "ROUND( position_z / 50 ) " - "HAVING " - "count(*) > 10 " - "AND MAX( t.maxlevel ) - MIN( t.minlevel ) < 5 " - "ORDER BY " - "lvl " - ") " - "SELECT " - "map, " - "position_x, " - "position_y, " - "position_z, " - "t.maxlevel " + "SELECT " + "g.map, " + "position_x, " + "position_y, " + "position_z, " + "t.minlevel " "FROM " - "GroupedData g " - "INNER JOIN creature c ON g.guid = c.guid " - "INNER JOIN creature_template t on c.id1 = t.entry;", sPlayerbotAIConfig->randomBotMapsAsString.c_str()); + "(SELECT " + "map, " + "MIN( c.guid ) guid, " + "t.entry " + "FROM " + "creature c " + "INNER JOIN creature_template t ON c.id1 = t.entry " + "WHERE " + "t.npcflag = 0 " + "AND t.lootid != 0 " + "AND t.unit_flags != 768 " + "AND t.maxlevel - t.minlevel < 3 " + "AND map IN ({}) " + "AND c.id1 != 32820 " + "AND c.spawntimesecs < 1000 " + "AND t.faction != 188 " + "GROUP BY " + "map, " + "ROUND( position_x / 500 ), " + "ROUND( position_y / 500 ), " + "ROUND( position_z / 50), " + "t.entry " + "HAVING " + "count(*) > 10) AS g " + "INNER JOIN creature c ON g.guid = c.guid " + "INNER JOIN creature_template t on c.id1 = t.entry " + "ORDER BY " + "t.minlevel;", sPlayerbotAIConfig->randomBotMapsAsString.c_str()); uint32 collected_locs = 0; if (results) { @@ -1147,14 +1143,14 @@ void RandomPlayerbotMgr::PrepareTeleportCache() float x = fields[1].Get(); float y = fields[2].Get(); float z = fields[3].Get(); - uint32 avg_level = fields[4].Get(); + uint32 level = fields[4].Get(); WorldLocation loc(mapId, x, y, z, 0); collected_locs++; - for (int32 level = (int32)avg_level - (int32)sPlayerbotAIConfig->randomBotTeleHigherLevel; level <= (int32)avg_level + (int32)sPlayerbotAIConfig->randomBotTeleLowerLevel; level++) { - if (level < 1 || level > maxLevel) { + for (int32 l = (int32)level - (int32)sPlayerbotAIConfig->randomBotTeleHigherLevel; l <= (int32)level + (int32)sPlayerbotAIConfig->randomBotTeleLowerLevel; l++) { + if (l < 1 || l > maxLevel) { continue; } - locsPerLevelCache[(uint8)level].push_back(loc); + locsPerLevelCache[(uint8)l].push_back(loc); } } while (results->NextRow()); } @@ -1428,8 +1424,8 @@ void RandomPlayerbotMgr::Refresh(Player* bot) botAI->ResetStrategies(false); } - if (sPlayerbotAIConfig->disableRandomLevels) - return; + // if (sPlayerbotAIConfig->disableRandomLevels) + // return; if (bot->InBattleground()) return; @@ -1472,9 +1468,6 @@ bool RandomPlayerbotMgr::IsRandomBot(Player* bot) } if (bot) { - if (sPlayerbotAIConfig->IsInRandomAccountList(bot->GetSession()->GetAccountId())) - return true; - return IsRandomBot(bot->GetGUID().GetCounter()); } @@ -1486,14 +1479,15 @@ bool RandomPlayerbotMgr::IsRandomBot(ObjectGuid::LowType bot) ObjectGuid guid = ObjectGuid::Create(bot); if (!sPlayerbotAIConfig->IsInRandomAccountList(sCharacterCache->GetCharacterAccountIdByGuid(guid))) return false; - - return GetEventValue(bot, "add"); + if (std::find(currentBots.begin(), currentBots.end(), bot) != currentBots.end()) + return true; + return false; } -std::list RandomPlayerbotMgr::GetBots() +void RandomPlayerbotMgr::GetBots() { if (!currentBots.empty()) - return currentBots; + return; PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_SEL_RANDOM_BOTS_BY_OWNER_AND_EVENT); stmt->SetData(0, 0); @@ -1504,12 +1498,11 @@ std::list RandomPlayerbotMgr::GetBots() { Field* fields = result->Fetch(); uint32 bot = fields[0].Get(); - currentBots.push_back(bot); + if (GetEventValue(bot, "add")) + currentBots.push_back(bot); } while (result->NextRow()); } - - return std::move(currentBots); } std::vector RandomPlayerbotMgr::GetBgBots(uint32 bracket) diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index 87640d72..03319d10 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -105,7 +105,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder uint32 GetEventValue(uint32 bot, std::string const event); std::string const GetEventData(uint32 bot, std::string const event); uint32 SetEventValue(uint32 bot, std::string const event, uint32 value, uint32 validIn, std::string const data = ""); - std::list GetBots(); + void GetBots(); std::vector GetBgBots(uint32 bracket); time_t BgCheckTimer; time_t LfgCheckTimer; diff --git a/src/strategy/actions/AutoTeleportForLevelAction.cpp b/src/strategy/actions/AutoTeleportForLevelAction.cpp index 3f1fa33a..396c522e 100644 --- a/src/strategy/actions/AutoTeleportForLevelAction.cpp +++ b/src/strategy/actions/AutoTeleportForLevelAction.cpp @@ -21,4 +21,5 @@ void AutoTeleportForLevelAction::AutoUpgradeEquip() { } PlayerbotFactory factory(bot, bot->GetLevel(), ITEM_QUALITY_RARE); factory.InitEquipment(true); + factory.InitSkills(); } \ No newline at end of file diff --git a/src/strategy/druid/HealDruidStrategy.cpp b/src/strategy/druid/HealDruidStrategy.cpp index cb386529..2bd8d46f 100644 --- a/src/strategy/druid/HealDruidStrategy.cpp +++ b/src/strategy/druid/HealDruidStrategy.cpp @@ -30,8 +30,9 @@ void HealDruidStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode( "party member critical health", NextAction::array(0, - new NextAction("swiftmend on party", ACTION_CRITICAL_HEAL + 3), - new NextAction("wild growth", ACTION_CRITICAL_HEAL + 2), + new NextAction("swiftmend on party", ACTION_CRITICAL_HEAL + 4), + new NextAction("wild growth", ACTION_CRITICAL_HEAL + 3), + new NextAction("regrowth on party", ACTION_CRITICAL_HEAL + 2), new NextAction("nourish on party", ACTION_CRITICAL_HEAL + 1), new NextAction("healing touch on party", ACTION_CRITICAL_HEAL + 0), NULL))); diff --git a/src/strategy/values/GrindTargetValue.cpp b/src/strategy/values/GrindTargetValue.cpp index 856184e4..d499d506 100644 --- a/src/strategy/values/GrindTargetValue.cpp +++ b/src/strategy/values/GrindTargetValue.cpp @@ -96,7 +96,11 @@ Unit* GrindTargetValue::FindTargetForGrinding(uint32 assistCount) if (CreatureTemplate const* CreatureTemplate = creature->GetCreatureTemplate()) if (CreatureTemplate->rank > CREATURE_ELITE_NORMAL && !AI_VALUE(bool, "can fight elite")) continue; - + + if (!bot->IsWithinLOSInMap(unit)) { + continue; + } + if (group) { Group::MemberSlotList const& groupSlot = group->GetMemberSlots();