Skip to content

Module PlayerBots

SylvaniaCore deploy edited this page Aug 31, 2026 · 1 revision

Module PlayerBots

État : actif en production (pbotbg = 1, pbotall = 0, pbot = 0)


Ce que le core embarque déjà

DestinyCore hérite d'un système PlayerBot complet, d'origine chinoise, que l'amont livre activé et que le royaume a coupé au profit d'un pilotage à la demande.

Composant Rôle
PlayerBot/PlayerBotMgr Comptes et sessions de bots, remplissage BG / arène / LFG
Server/PlayerBotSession File de schedules par bot : OnlineSetttingInBGQueueEnterBGLeaveBG
Battlegrounds/CommandBG/ IA d'objectifs par champ de bataille — WS, AB, EY, AV, IC (~2 650 lignes)
AI/PlayerAI/Bot* IA de classe (12 classes), mouvement BG, arène, duel, groupe
dc_world.aiwaypoints 61 points clés couvrant les 5 BG et les arènes
Comptes PLAYERBOT1..180 181 personnages, toutes classes, niveaux 1 à 110

Le re-level d'un bot passe par Player::ResetPlayerToLevel (schedule Settting).

World.cpp initialise le gestionnaire de bots dès que pbotbg OU pbotall vaut 1. C'est ce qui permet aux modules maison de tourner avec le peuplement amont désactivé.


BG BotFill — remplissage des champs de bataille

Objectif. Dès qu'un joueur réel lance une recherche de champ de bataille, le serveur calcule les places manquantes par équipe, connecte le nombre de bots nécessaire, les ajuste au bracket PvP du joueur, les inscrit dans la même file et les fait jouer les objectifs. Quand les joueurs quittent ou que le BG se termine, les bots ressortent et se déconnectent.

Ce qu'il a fallu corriger dans l'amont

Le remplissage amont était inutilisable tel quel :

Défaut amont Correctif
Activation tout-ou-rien : pbotall allumait aussi monde, LFG et arène cotée (88 bots en ligne en permanence) Clé pbotbg indépendante
Remplissage codé en dur à 6 bots par faction, sur tous les brackets, avec un printf de debug Réécriture sur BattlegroundQueue::QueryNeedPlayerCount() — besoin réel du bracket
Aucun plafond : AV visait 40 v 40, soit ~78 bots pour 2 joueurs pbotbg_maxperteam (0 = tailles blizzlike)
Bots restant en ligne indéfiniment après le BG UpdateIdleBotLogout + pbotbg_idlelogout (300 s)

Chaîne de bugs corrigés (août 2026)

Cette liste vaut comme carte des pièges du sous-système :

  • file aléatoire RB = 32 non résolue vers un BG couvert ;
  • crash irand(0,-1) quand un compte n'avait qu'un seul personnage ;
  • noms de bots à chiffres refusés au login → renommage via ai_playerbot_names + contournement de CheckPlayerName ;
  • QueueID = 0 dans ProcessInBGQueue, plus une garde anti sur-provision sur GetScheduledBotCount ;
  • schedule EnterBG jamais poussé → c'est InviteGroupToBG qui le pousse ;
  • StartCommander jamais appelé à l'ouverture des portes ;
  • 🔴 GUID 128 bits tronqués en bool dans les conteneurs uint64 des commandants — tout le registre tactique n'avait qu'une seule clé ;
  • tuiles navmesh des BG préchargées au boot, générateur de mouvement concurrent supprimé ;
  • filtre eau, verrou anti ping-pong de 15 s, rejet des destinations (0,0,0) ;
  • capture des bannières AB : détecteur réécrit, approche à moins de 8 m avant le sort 21651 ;
  • un seul BG peuplé à la fois (GetBotBGActivity + verrous).

Doctrine tactique

Le ciblage n'est plus aléatoire — il est noté :

Critère Poids
Porteur de drapeau ennemi +1000
Soigneur ennemi (classe + spé) +400
Cible blessée +3 par % de vie manquant
Feu concentré (par allié déjà au contact, lu sur getAttackers()) +60
Distance −1 par mètre
Hors ligne de vue −250
À plus de 50 m de l'objectif forte dépriorisation (sauf porteur de drapeau)

Le porteur de drapeau ami ne sélectionne plus de cible : il court au but. Escorte à WS (3 alliés dans 60 m). Vague de sortie de cimetière : attente de 3 alliés à 30 m, 8 s maximum, annulée si le bot est attaqué, si un ennemi entre au cimetière, ou s'il porte le drapeau.

Limites connues (v1)

  • Seuls WS, AB, EY, AV, IC déclenchent des bots (liste m_BGTypes, PlayerBotMgr.cpp:126). Les BG Cataclysm et ultérieurs (Twin Peaks, Silvershard, Kotmogu, Deepwind, Seething Shore) n'ont pas de commandant.
  • Arène cotée et LFG restent sous pbotall, donc éteints.
  • Jamais entièrement validé en jeu : les captures de bannières et de drapeaux restent à confirmer après les correctifs d'approche.

Reste à faire

  • Persistance d'objectif par événement (à la manière de mod-playerbots) au lieu du verrou de 15 s.
  • Routes prédéfinies via aiwaypoints.link — la colonne est vide aujourd'hui, les bots coupent au lieu de suivre les routes.

Configuration

Voir Configuration pour le tableau complet.

pbot              = 0    # pas de bots amis à l'arrivée d'un joueur
pbotall           = 0    # pas de peuplement automatique du monde / LFG
pbotbg            = 1    # remplissage des champs de bataille
pbotbg_maxperteam = 0    # 0 = tailles blizzlike
pbotbg_idlelogout = 300  # déconnexion d'un bot inactif hors BG/file
pbotasl           = 88   # plafond global de bots en ligne
pbottitle         = 600  # titre « Mercenaire » imposé à tout bot

Donner des ordres

Le core embarque déjà un système complet d'ordres (BotGroupAI::ProcessBotCommand) : summon, follow, stop, attack, gestion d'équipement, ciblage @tank / @heal / par classe. Ne le réécrivez pas — voir Commandes en jeu.


Reconnaître un bot

Tout bot porte le titre custom « Mercenaire » (CharTitles 600, MaskID 380), imposé à chaque login, précisément pour qu'un joueur ne puisse jamais le confondre avec un vrai joueur. Voir Autres customs et Hotfixes DB2.

En base, ne confondez pas les bots avec des joueurs bloqués : les dizaines de personnages sur les cartes 529 et 628 sont les bots de champ de bataille.

Clone this wiki locally