PlayerBot : attribution des talents au re-level

PlayerBotSetting::LearnTalents() etait un corps vide alors que l etape 1 du
re-level appelle ResetTalents(true). Les bots repartaient donc au combat sans
un seul talent : sept rangs manquants a 110, soit une part importante de la
rotation de chaque classe. Constate en base avant correction, zero ligne de
character_talent pour huit classes sur neuf.

La fonction apprend desormais un talent par rang ouvert par le niveau, tire au
hasard parmi les colonnes que la specialisation du personnage autorise.

Deuxieme correction, dans ProcessSetting : le raccourci qui evite un re-level
inutile ne se declenche plus que si le bot possede reellement ses talents. Sans
ce controle, un bot deja au bon niveau sautait tout le reglage et restait a zero
talent, heritage de l epoque ou LearnTalents ne faisait rien.

Une premiere version de LearnTalents faisait aussi basculer la specialisation
en cours de re-level, par SetPrimarySpecialization et ecriture directe de
PLAYER_FIELD_CURRENT_SPEC_ID, hors du chemin officiel ActivateTalentGroup. Elle
provoquait un debordement de pile : cinq segfaults et quatre redemarrages du
worldserver en douze minutes. Ce volet est retire, la specialisation n est plus
touchee. La composition par roles qui en dependait est reportee.

Verifie apres deploiement : un bot seul puis cinquante, sept talents chacun sur
les neuf classes, aucun plantage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-15 22:00:04 +02:00
parent 03d5a97582
commit a5fb052b89
3 changed files with 65 additions and 3 deletions
+7 -1
View File
@@ -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;
}
}