diff --git a/src/server/game/PlayerBot/PlayerBotSetting.cpp b/src/server/game/PlayerBot/PlayerBotSetting.cpp index e6d71f8..59ece1a 100644 --- a/src/server/game/PlayerBot/PlayerBotSetting.cpp +++ b/src/server/game/PlayerBot/PlayerBotSetting.cpp @@ -26,6 +26,8 @@ #include "ItemTemplate.h" #include "Bag.h" #include +#include "DB2Stores.h" +#include "Random.h" uint32 PlayerBotSetting::classesTrainersGUID[MAX_CLASSES][2]; std::set PlayerBotSetting::classesTalents[MAX_CLASSES][3] = { std::set() }; @@ -1839,7 +1841,46 @@ void PlayerBotSetting::UpdateReset() void PlayerBotSetting::LearnTalents() { - + // SylvaniaCore : cette fonction etait un corps vide alors que l etape + // precedente du re-level appelle ResetTalents(true). Les bots repartaient + // donc au combat sans un seul talent, soit sept rangs manquants a 110. + // + // Version volontairement minimale : on apprend les talents de la + // specialisation deja portee par le personnage, rien d autre. Une premiere + // version basculait aussi la specialisation en cours de re-level et + // provoquait un debordement de pile. + if (!m_Player) + return; + + uint8 const playerClass = m_Player->getClass(); + uint32 const specId = m_Player->GetPrimarySpecialization(); + uint32 const tiers = m_Player->CalculateTalentsTiers(); + uint8 const talentGroup = m_Player->GetActiveTalentGroup(); + + for (uint32 tier = 0; tier < tiers; ++tier) + { + std::vector candidates; + for (uint32 column = 0; column < MAX_TALENT_COLUMNS; ++column) + { + for (TalentEntry const* talent : sDB2Manager.GetTalentsByPosition(playerClass, tier, column)) + { + if (!talent || !talent->SpellID) + continue; + if (talent->SpecID && specId && talent->SpecID != specId) + continue; + if (m_Player->HasTalent(talent->ID, talentGroup) || m_Player->HasSpell(talent->SpellID)) + continue; + candidates.push_back(talent); + } + } + + if (candidates.empty()) + continue; + + TalentEntry const* picked = candidates[urand(0, uint32(candidates.size()) - 1)]; + if (m_Player->AddTalent(picked, talentGroup, true)) + m_Player->LearnSpell(picked->SpellID, false); + } } void PlayerBotSetting::LearnCommonSpells() diff --git a/src/server/game/Server/PlayerBotSession.cpp b/src/server/game/Server/PlayerBotSession.cpp index 8156dc3..a00b27d 100644 --- a/src/server/game/Server/PlayerBotSession.cpp +++ b/src/server/game/Server/PlayerBotSession.cpp @@ -399,7 +399,13 @@ bool PlayerBotSession::ProcessSetting(BotGlobleSchedule& schedule) { if (player->IsSettingFinish() && player->getLevel() >= schedule.parameter1 && player->getLevel() <= schedule.parameter2) { - if (schedule.parameter3 >= 4 || (player->FindTalentType() + 1 == schedule.parameter3)) + // SylvaniaCore : le raccourci ne vaut que si le bot a reellement ses + // talents. Sans ce controle, un bot deja au bon niveau et a la bonne + // specialisation sautait tout le re-level et restait avec zero talent, + // heritage de l epoque ou LearnTalents() etait un corps vide. + PlayerTalentMap const* talents = player->GetTalentMap(player->GetActiveTalentGroup()); + bool const hasTalents = talents && talents->size() >= player->CalculateTalentsTiers(); + if (hasTalents && (schedule.parameter3 >= 4 || (player->FindTalentType() + 1 == schedule.parameter3))) return true; } } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 64a3007..3484a7b 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -4680,7 +4680,7 @@ siege_enable = 0 # Default: 18 / 24 # -siege_hour_min = 18 +siege_hour_min = 6 siege_hour_max = 24 # @@ -4728,6 +4728,21 @@ siege_spawn_rate = 5 siege_pvp = 1 +# +# siege_tank_pct / siege_healer_pct +# Description: Composition de la horde, en pourcent de l effectif. Le +# reste part aux degats. Les soigneurs et les tanks sont +# recrutes en premier : sans eux la horde fond avant le +# trone. Le role est impose par la specialisation demandee +# au re-level, et les IA de classe s y adaptent seules +# (BotPaladinAI soigne en Sacre, le pretre hors Ombre, etc). +# La somme des deux est plafonnee a 60 pour cent. +# Default: 10 / 20 +# + +siege_tank_pct = 10 +siege_healer_pct = 20 + # # siege_engage_range # Description: Portee d engagement des bots d invasion, en yards. Hors siege