PlayerbotV2 module with core-hooks patches and full SQL migrations

Shipped patches:
  playerbotv2_core_hooks.patch    — stock TrinityCore master
  playerbotv2_core_hooks.thordekk.patch — ThordekkCore

SQL applied at module init by PlayerbotMigrationMgr:
  sql/playerbot_v2/0000_playerbot_shared_bootstrap.sql  — creates playerbot
    shared DB + tables (handcrafted_road, playerbots_names,
    playerbot_dungeon_routes, playerbot_nav_links,
    playerbot_v2_world_metadata)
  sql/playerbot_v2/0001..0016*.sql  — character DB tables

SQL auto-applied by TC DBUpdater:
  sql/updates/auth/master/
  sql/updates/characters/master/

Manual fallback:
  sql/playerbot/playerbot_bootstrap.sql

Static data (manual):
  src/modules/PlayerbotV2/sql/shared/
  src/modules/PlayerbotV2/sql/world/

Includes: Log.h, SpellAuras.h (PlayerbotAPI), Position.h (PlayerbotHooks)
This commit is contained in:
josh
2026-08-11 16:42:02 +10:00
committed by devbox
parent 7a8377c7f6
commit b853b3ae06
27 changed files with 127305 additions and 95 deletions
+110
View File
@@ -0,0 +1,110 @@
-- ============================================================================
-- PlayerbotV2: Shared playerbot database bootstrap
-- Creates the `playerbot` database and all tables required by the module.
-- Run this once after installing the module.
--
-- Usage: mysql -u root -p < playerbot_bootstrap.sql
-- This file is NOT part of TrinityCore's auto-updater.
-- ============================================================================
CREATE DATABASE IF NOT EXISTS `playerbot` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;
USE `playerbot`;
-- ---------------------------------------------------------------------------
-- Handcrafted roads: operator-curated road centerlines for navmesh re-tagging
-- and bot pathfinding. Queried by HandcraftedRoadStorage.
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `handcrafted_road` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`mapId` INT UNSIGNED NOT NULL,
`fromX` FLOAT NOT NULL,
`fromY` FLOAT NOT NULL,
`fromZ` FLOAT NOT NULL DEFAULT 0,
`toX` FLOAT NOT NULL DEFAULT 0,
`toY` FLOAT NOT NULL DEFAULT 0,
`toZ` FLOAT NOT NULL DEFAULT 0,
`width` FLOAT NOT NULL DEFAULT 2.0,
`comment` VARCHAR(255) DEFAULT NULL,
`verified` TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_map` (`mapId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
-- ---------------------------------------------------------------------------
-- Bot name pool: pre-generated names for spawned bots.
-- Queried by Fleet::BotNamePool.
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `playerbots_names` (
`name_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(12) NOT NULL,
`gender` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`is_used` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`used_by_guid` BIGINT UNSIGNED DEFAULT NULL,
PRIMARY KEY (`name_id`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
-- ---------------------------------------------------------------------------
-- Dungeon route waypoints: auto-generated navmesh corridor chains.
-- Queried by DungeonScriptMgr.
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `playerbot_dungeon_routes` (
`map_id` SMALLINT UNSIGNED NOT NULL,
`difficulty` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 = any difficulty',
`seq` SMALLINT UNSIGNED NOT NULL COMMENT 'ordered chain index',
`position_x` FLOAT NOT NULL,
`position_y` FLOAT NOT NULL,
`position_z` FLOAT NOT NULL,
PRIMARY KEY (`map_id`, `difficulty`, `seq`),
KEY `map_idx` (`map_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
-- ---------------------------------------------------------------------------
-- Nav links: DB-authored traversal links (jumps, unmeshed walkable stretches).
-- Queried by the dungeon stepper and travel graph.
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `playerbot_nav_links` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`map_id` SMALLINT UNSIGNED NOT NULL,
`from_x` FLOAT NOT NULL,
`from_y` FLOAT NOT NULL,
`from_z` FLOAT NOT NULL,
`to_x` FLOAT NOT NULL,
`to_y` FLOAT NOT NULL,
`to_z` FLOAT NOT NULL,
`radius` FLOAT NOT NULL DEFAULT 12 COMMENT 'mouth proximity (3D yards)',
`verified` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`created_by` VARCHAR(64) NOT NULL DEFAULT '',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`comment` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_map` (`map_id`),
KEY `idx_verified` (`verified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
-- ---------------------------------------------------------------------------
-- World metadata: operator-curated world knowledge (cities, roads, danger
-- zones, vendors, mailboxes, innkeepers, crossroads). Populated via
-- `.playerbot meta add` GM commands.
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `playerbot_v2_world_metadata` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`map_id` INT UNSIGNED NOT NULL,
`zone_id` INT UNSIGNED NOT NULL DEFAULT 0,
`kind` TINYINT UNSIGNED NOT NULL,
`pos_x` FLOAT NOT NULL,
`pos_y` FLOAT NOT NULL,
`pos_z` FLOAT NOT NULL,
`radius` FLOAT NOT NULL DEFAULT 10.0,
`label` VARCHAR(96) NOT NULL DEFAULT '',
`notes` VARCHAR(255) NOT NULL DEFAULT '',
`created_by` VARCHAR(64) NOT NULL DEFAULT '',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
KEY `idx_map_kind` (map_id, kind),
KEY `idx_map_xy` (map_id, pos_x, pos_y),
KEY `idx_zone` (zone_id),
KEY `idx_kind` (kind)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
@@ -0,0 +1,89 @@
-- Migration: 0000_playerbot_shared_bootstrap
-- Date: 2026-08-10
-- Purpose: Creates the shared `playerbot` database and all tables the module
-- queries via cross-DB qualified syntax (e.g. playerbot.handcrafted_road).
-- This runs once on first boot through the PlayerbotMigrationMgr
-- (CharacterDatabase connection); the MySQL user needs CREATE DATABASE
-- and cross-schema DDL privileges on the `playerbot` schema.
-- Reverts: no (tables are IF NOT EXISTS — safe to re-run)
-- Target: MySQL server (creates `playerbot` schema), not the characters DB.
CREATE DATABASE IF NOT EXISTS `playerbot`
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;
CREATE TABLE IF NOT EXISTS `playerbot`.`handcrafted_road` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`mapId` INT UNSIGNED NOT NULL,
`fromX` FLOAT NOT NULL,
`fromY` FLOAT NOT NULL,
`fromZ` FLOAT NOT NULL DEFAULT 0,
`toX` FLOAT NOT NULL DEFAULT 0,
`toY` FLOAT NOT NULL DEFAULT 0,
`toZ` FLOAT NOT NULL DEFAULT 0,
`width` FLOAT NOT NULL DEFAULT 2.0,
`comment` VARCHAR(255) DEFAULT NULL,
`verified` TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_map` (`mapId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
CREATE TABLE IF NOT EXISTS `playerbot`.`playerbots_names` (
`name_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(12) NOT NULL,
`gender` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`is_used` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`used_by_guid` BIGINT UNSIGNED DEFAULT NULL,
PRIMARY KEY (`name_id`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
CREATE TABLE IF NOT EXISTS `playerbot`.`playerbot_dungeon_routes` (
`map_id` SMALLINT UNSIGNED NOT NULL,
`difficulty` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`seq` SMALLINT UNSIGNED NOT NULL,
`position_x` FLOAT NOT NULL,
`position_y` FLOAT NOT NULL,
`position_z` FLOAT NOT NULL,
PRIMARY KEY (`map_id`, `difficulty`, `seq`),
KEY `map_idx` (`map_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
CREATE TABLE IF NOT EXISTS `playerbot`.`playerbot_nav_links` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`map_id` SMALLINT UNSIGNED NOT NULL,
`from_x` FLOAT NOT NULL,
`from_y` FLOAT NOT NULL,
`from_z` FLOAT NOT NULL,
`to_x` FLOAT NOT NULL,
`to_y` FLOAT NOT NULL,
`to_z` FLOAT NOT NULL,
`radius` FLOAT NOT NULL DEFAULT 12,
`verified` TINYINT UNSIGNED NOT NULL DEFAULT 0,
`created_by` VARCHAR(64) NOT NULL DEFAULT '',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`comment` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_map` (`map_id`),
KEY `idx_verified` (`verified`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
CREATE TABLE IF NOT EXISTS `playerbot`.`playerbot_v2_world_metadata` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`map_id` INT UNSIGNED NOT NULL,
`zone_id` INT UNSIGNED NOT NULL DEFAULT 0,
`kind` TINYINT UNSIGNED NOT NULL,
`pos_x` FLOAT NOT NULL,
`pos_y` FLOAT NOT NULL,
`pos_z` FLOAT NOT NULL,
`radius` FLOAT NOT NULL DEFAULT 10.0,
`label` VARCHAR(96) NOT NULL DEFAULT '',
`notes` VARCHAR(255) NOT NULL DEFAULT '',
`created_by` VARCHAR(64) NOT NULL DEFAULT '',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_map_kind` (`map_id`, `kind`),
KEY `idx_map_xy` (`map_id`, `pos_x`, `pos_y`),
KEY `idx_zone` (`zone_id`),
KEY `idx_kind` (`kind`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci;
+84
View File
@@ -0,0 +1,84 @@
-- Migration: 0001_init
-- Date: 2026-05-01
-- Purpose: Bootstrap V2 schema. Creates the version table and the minimal
-- set of bot-specific tables documented in v2/SCHEMA.md.
-- Reverts: yes (all DROP TABLE).
-- Per v2/SCHEMA.md: bot character data lives in TrinityCore's `characters`
-- table. V2 owns ONLY what TrinityCore doesn't already store. No mirror
-- tables are permitted.
CREATE TABLE IF NOT EXISTS playerbot_v2_schema_version (
version INT UNSIGNED NOT NULL PRIMARY KEY,
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
sha256 CHAR(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS playerbot_v2_account (
account_id INT UNSIGNED NOT NULL PRIMARY KEY,
pseudo_account_idx INT UNSIGNED NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_used_at DATETIME NULL,
KEY idx_pseudo (pseudo_account_idx)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS playerbot_v2_character (
character_guid_low BIGINT UNSIGNED NOT NULL PRIMARY KEY,
spawned_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_active_at DATETIME NULL,
rng_seed BIGINT UNSIGNED NOT NULL,
spawn_state TINYINT UNSIGNED NOT NULL,
KEY idx_active (last_active_at),
KEY idx_state (spawn_state)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS playerbot_v2_personality (
character_guid_low BIGINT UNSIGNED NOT NULL PRIMARY KEY,
skill_tier TINYINT UNSIGNED NOT NULL,
verbosity TINYINT UNSIGNED NOT NULL,
aggression TINYINT UNSIGNED NOT NULL,
risk_tolerance TINYINT UNSIGNED NOT NULL,
politeness TINYINT UNSIGNED NOT NULL,
loyalty TINYINT UNSIGNED NOT NULL,
activity_pref TINYINT UNSIGNED NOT NULL,
response_delay_ms SMALLINT UNSIGNED NOT NULL,
response_jitter_ms SMALLINT UNSIGNED NOT NULL,
mistake_rate TINYINT UNSIGNED NOT NULL,
CONSTRAINT fk_pers_char FOREIGN KEY (character_guid_low)
REFERENCES playerbot_v2_character (character_guid_low)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS playerbot_v2_preferences (
character_guid_low BIGINT UNSIGNED NOT NULL PRIMARY KEY,
preferred_neighborhood INT UNSIGNED NULL,
preferred_house_template INT UNSIGNED NULL,
opt_in_dungeons BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_raids BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_pvp BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_arena BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_delves BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_professions BOOLEAN NOT NULL DEFAULT TRUE,
opt_in_housing BOOLEAN NOT NULL DEFAULT TRUE,
accept_player_invites TINYINT UNSIGNED NOT NULL DEFAULT 1,
follow_distance_yd FLOAT NOT NULL DEFAULT 5.0,
CONSTRAINT fk_prefs_char FOREIGN KEY (character_guid_low)
REFERENCES playerbot_v2_character (character_guid_low)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS playerbot_v2_population_target (
target_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
realm_id INT UNSIGNED NOT NULL,
effective_at DATETIME NOT NULL,
total_target INT UNSIGNED NOT NULL,
floor INT UNSIGNED NOT NULL,
ceiling INT UNSIGNED NOT NULL,
horde_pct TINYINT UNSIGNED NOT NULL,
payload_json TEXT NOT NULL,
KEY idx_realm_effective (realm_id, effective_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (1, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
@@ -0,0 +1,44 @@
-- Migration: 0002_owner_squad_control
-- Date: 2026-05-06
-- Purpose: Owner-bot binding + squad-control state. Adds persistent
-- owner_account_id / owner_player_guid so a bot's authority
-- model survives logout / group disband. Also adds squad-
-- control state (formation type/slot, follow distance,
-- verbose flag) so commands like /follow, /formation wedge,
-- and /verbose persist across restarts.
-- Reverts: yes (DROP COLUMN ... and DROP TABLE on the squad preset).
-- Per-character owner + squad state. All columns default to "no owner /
-- autonomous defaults" so existing rows keep current behaviour.
ALTER TABLE playerbot_v2_character
ADD COLUMN owner_account_id INT UNSIGNED NOT NULL DEFAULT 0
AFTER spawn_state,
ADD COLUMN owner_player_guid BIGINT UNSIGNED NOT NULL DEFAULT 0
AFTER owner_account_id,
ADD COLUMN formation_type TINYINT UNSIGNED NOT NULL DEFAULT 0
AFTER owner_player_guid,
ADD COLUMN formation_slot TINYINT UNSIGNED NOT NULL DEFAULT 0
AFTER formation_type,
ADD COLUMN follow_distance_yd FLOAT NOT NULL DEFAULT 5.0
AFTER formation_slot,
ADD COLUMN owner_verbose TINYINT(1) NOT NULL DEFAULT 0
AFTER follow_distance_yd,
ADD KEY idx_owner_account (owner_account_id),
ADD KEY idx_owner_player (owner_player_guid);
-- Owner-saved squad presets (formation per role/class snapshots that an
-- owner can re-apply after a wipe / new dungeon entry / etc).
-- One row per (owner_account_id, preset_name); the payload_json stores
-- {bot_guid → {slot, type}} mappings. We use TEXT (JSON in 8.0+) for
-- forward compat; the application layer parses.
CREATE TABLE IF NOT EXISTS playerbot_v2_squad_preset (
owner_account_id INT UNSIGNED NOT NULL,
preset_name VARCHAR(64) NOT NULL,
saved_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
payload_json TEXT NOT NULL,
PRIMARY KEY (owner_account_id, preset_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (2, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
+41
View File
@@ -0,0 +1,41 @@
-- Migration: 0003_talent_builds
-- Date: 2026-05-07
-- Purpose: Curated per-spec talent build storage. Each (class, spec, context)
-- row stores a complete trait spend as a CSV of colon-triples.
-- The bot loads these on demand, picks the row matching its
-- current context (Raid / MythicPlus / PvP / Default), and applies
-- via TraitMgr commit.
-- Reverts: yes (DROP TABLE).
CREATE TABLE IF NOT EXISTS playerbot_v2_talent_build (
class_id TINYINT UNSIGNED NOT NULL,
spec_id INT UNSIGNED NOT NULL,
context TINYINT UNSIGNED NOT NULL,
label VARCHAR(128) NOT NULL DEFAULT '',
entries_json MEDIUMTEXT NOT NULL,
source_url VARCHAR(512) NOT NULL DEFAULT '',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (class_id, spec_id, context),
KEY idx_spec (spec_id, context)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Column docs (kept here below the CREATE so the migration body stays
-- a single statement free of comment-embedded semicolons that the
-- migration parser used to choke on):
-- class_id ChrClasses.db2 id (1=Warrior, 2=Paladin, 3=Hunter...)
-- spec_id ChrSpecialization.db2 id (e.g., 71=Arms, 72=Fury)
-- context 0=Default, 1=Raid, 2=MythicPlus, 3=PvP, 4=Leveling.
-- Default is the fallback when no context-specific row
-- exists for the bot.
-- label Human-readable name for diagnostics
-- ("Arms Slaughterhouse 11.1.5").
-- entries_json CSV of colon-triples: nodeID:entryID:ranks separated
-- by commas. Loader parses into a TraitConfig.Entries
-- vector. Empty string is allowed (bot falls back to
-- TraitMgr starter build).
-- source_url wowhead / simc origin URL for human reference.
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (3, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
+59
View File
@@ -0,0 +1,59 @@
-- Migration: 0004_simc_seed
-- Date: 2026-05-07
-- Purpose: Seed playerbot_v2_talent_build with raid-context talent
-- loadouts decoded from simc/midnight via decode_simc.py.
-- Each row is REPLACE INTO upsert — re-running the
-- migration overwrites existing rows for (class, spec, context).
-- Trait build: WoW 12.0.5.67314. Trait node IDs in entries_json reference
-- this client build. If the server runs a newer build that
-- renumbered nodes, TraitMgr::ValidateConfig will reject
-- rows on apply and bots fall back to TraitMgr starter.
-- Coverage: 31 of 39 specs (DPS + tanks). Healers (Restoration Druid,
-- Holy/Disc Priest, Holy Paladin, Mistweaver Monk,
-- Restoration Shaman, Preservation Evoker) plus Augmentation
-- Evoker absent from simc; populate via separate sources.
-- Reverts: yes (DELETE rows; re-run the migration to repopulate).
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (1, 71, 1, 'simc/midnight MID1_Warrior_Arms', '90269:112121:1,90270:112122:1,90271:112123:1,90273:112125:1,90274:112126:1,90276:112128:1,90277:112129:1,90279:112131:1,90282:112134:1,90283:112135:2,90285:112137:1,90290:112144:1,90291:112145:1,90292:112146:1,90322:112179:2,90326:112183:1,90327:112184:1,90328:112185:1,90331:112188:1,90337:112198:1,90344:112206:1,90346:112208:1,90347:112209:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90438:112310:1,90439:112311:1,90441:112314:1,90444:112317:2,90445:112318:1,90447:112320:2,92537:114643:1,92614:114733:1,94784:117381:1,94786:117383:1,94787:117384:1,94788:117385:1,94795:117392:1,94801:117398:1,94809:117406:1,94810:117407:1,94813:117410:1,94814:117411:1,94818:117415:1,94820:117417:1,95956:118850:1,99853:123390:1,108543:134032:1,108544:134033:1,108676:134216:1,108686:134226:1,108705:136627:1,109391:135597:1,109680:135934:1,109684:135940:1,109685:135941:1,109687:135944:2,109815:136074:1,109816:136075:1,109817:136076:1,110118:136625:1,110119:136626:1,110176:136703:1,110407:136989:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (1, 72, 1, 'simc/midnight MID1_Warrior_Fury', '90325:112182:1,90326:112183:1,90328:112185:1,90331:112188:1,90337:112198:1,90344:112206:1,90346:112208:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90373:112240:2,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90387:112255:1,90388:119139:1,90390:112259:1,90392:112261:1,90394:112263:1,90395:112264:1,90396:112265:1,90397:112266:2,90398:112267:1,90399:112268:1,90401:112270:1,90402:112271:1,90403:112272:1,90406:112275:1,90408:112277:1,90410:112279:1,90412:112281:1,90415:112284:1,90421:112292:2,90428:112299:2,90429:112300:1,90430:112301:1,92538:114644:1,94784:117381:1,94786:117383:1,94787:117384:1,94788:117385:1,94795:117392:1,94801:117398:1,94803:117400:1,94809:117406:1,94810:117407:1,94813:117410:1,94814:117411:1,94820:117417:1,95956:118850:1,99852:123389:1,108542:134031:1,108543:134032:1,108544:134033:1,108674:134213:1,108686:134226:1,108705:136627:1,109391:135597:1,109815:136074:1,109816:136075:1,109817:136076:1,109963:136448:1,109966:136451:1,109968:136453:1,109969:136454:1,110118:136625:1,110119:136626:1,110203:136735:1,110412:137004:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (1, 73, 1, 'simc/midnight MID1_Warrior_Protection', '90261:112112:1,90264:132884:1,90265:112116:1,90295:112149:1,90296:112150:1,90297:112151:1,90298:112152:1,90301:112155:1,90302:112156:1,90303:112157:1,90304:112158:1,90305:112159:1,90306:112160:1,90308:112162:1,90309:112163:1,90310:112165:1,90311:112166:2,90312:132885:1,90314:112170:1,90317:112173:1,90318:112174:1,90319:112176:1,90320:112177:1,90324:112181:2,90326:112183:1,90328:112185:1,90329:112186:1,90330:112187:1,90331:112188:1,90343:112205:1,90346:112208:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90432:112304:1,90433:112305:1,90448:112321:1,90449:112323:1,90451:112325:1,94785:117382:1,94792:118834:1,94797:117394:1,94798:117395:1,94800:117397:1,94803:117400:1,94805:117402:1,94807:117404:1,94808:117405:1,94816:117413:1,94817:118835:1,95956:118850:1,95959:118853:1,99851:123388:1,107577:132882:1,107578:132883:1,108542:134031:1,108543:134032:1,108544:134033:1,108686:134226:1,108705:136627:1,109391:135597:1,109809:136068:1,109810:136069:1,109811:136070:1,110118:136625:1,110119:136626:1,110411:137001:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (2, 65, 1, 'method.gg Holy Paladin (Herald of the Sun)', '81496:102465:1,81508:102477:1,81510:133481:1,81554:102533:1,81555:102534:1,81557:102536:1,81558:102537:1,81560:102539:1,81561:102540:1,81564:102544:1,81565:102545:1,81567:102548:1,81568:102549:1,81569:102550:1,81570:102551:1,81571:102552:1,81575:102558:1,81578:102562:1,81580:102564:1,81583:102567:2,81584:102569:1,81585:102570:1,81588:133501:1,81589:102574:1,81590:102575:1,81591:102577:1,81592:102578:1,81594:102580:1,81595:102581:1,81597:102583:1,81598:102584:1,81600:102587:1,81605:102592:1,81609:102597:1,81613:102601:1,81614:102602:1,81615:102603:1,81616:102604:1,81621:102612:2,81630:102622:2,81631:128251:1,81632:102625:1,92220:114292:1,93009:115034:2,93180:115465:1,93191:128246:1,93520:115872:1,93521:115873:1,93522:115874:1,93927:116376:1,95069:117666:1,95071:117668:1,95072:117669:1,95073:117778:1,95080:117677:1,95086:117683:1,95094:117691:1,95095:117692:1,95098:117777:1,95099:117696:1,95105:117702:1,99839:123362:1,103851:128241:2,103856:128309:1,103858:128254:2,103861:128257:1,103863:128259:1,103864:128260:1,103866:128262:1,109748:136006:1,109749:136007:1,109750:136008:1,109998:136486:1,109999:136487:1,110012:136503:1,110092:136593:1,110257:136795:1,110417:137019:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (2, 66, 1, 'simc/midnight MID1_Paladin_Protection', '81469:102431:1,81470:102432:1,81471:102433:2,81472:102435:1,81477:102440:1,81479:102443:1,81481:102445:1,81482:102446:2,81483:102448:1,81485:102450:2,81486:102452:1,81487:102453:1,81489:102455:1,81490:102456:1,81493:102461:1,81494:102463:1,81495:102464:1,81498:102467:1,81499:102468:1,81501:102470:1,81502:102471:1,81503:102472:1,81505:136732:1,81506:102475:1,81507:102476:1,81510:133481:1,81597:102583:1,81600:102587:1,81603:102590:1,81604:102591:1,81605:102592:1,81607:102595:1,81609:102597:1,81612:102600:1,81614:102602:1,81616:102604:1,81617:102606:1,81621:102612:2,81629:102621:1,81630:102622:2,81631:128251:1,81632:102625:1,90062:111886:1,93010:102623:1,93187:115479:1,93192:128244:1,93357:115673:1,95177:117810:1,95178:117811:1,95179:117812:1,95180:117813:1,95181:117858:1,95182:117815:1,95183:117816:1,95184:117818:1,95185:117819:1,95186:117822:1,95187:117823:1,95234:117882:1,99838:123358:1,101927:102451:1,103851:128241:2,103855:128250:1,103857:128253:1,103858:128254:2,103859:128255:1,103860:128256:1,103867:128263:1,103868:128264:1,103877:128278:1,109745:136003:1,109746:136004:1,109747:136005:1,109999:136487:1,110006:136496:1,110012:136503:1,110418:137022:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (2, 70, 1, 'simc/midnight MID1_Paladin_Retribution', '81510:133481:1,81512:115475:1,81521:114828:1,81523:102493:1,81525:102497:1,81526:102498:1,81527:102499:1,81532:102504:1,81533:102505:1,81534:102506:1,81542:102516:1,81543:102518:1,81544:102519:1,81597:102583:1,81600:102587:1,81603:102590:1,81605:102592:1,81608:102596:1,81609:102597:1,81614:102602:1,81615:102603:1,81616:102604:1,81618:128243:1,81621:102612:2,81630:102622:2,81631:128251:1,81632:102625:1,92686:114824:1,92689:114830:1,92838:115022:1,92839:115024:1,92854:115043:1,92952:115165:2,93009:115034:2,93160:115439:2,93161:115440:1,93164:115443:2,93173:115453:1,93174:115454:1,93181:115467:1,93189:115481:1,93190:115483:2,93357:115673:1,95099:117696:1,95177:117810:1,95178:117811:1,95179:117812:1,95180:117813:1,95181:117858:1,95182:117815:1,95183:117816:1,95184:117818:1,95185:117819:1,95186:117822:1,95187:117823:1,99837:123357:1,103851:128241:2,103861:128257:1,103863:128259:1,103864:128260:1,103867:128263:1,103868:128264:1,109368:135564:1,109369:135565:1,109371:115438:1,109373:115435:1,109374:136809:1,109745:136003:1,109746:136004:1,109747:136005:1,109867:136127:1,109999:136487:1,110012:136503:1,110091:136592:1,110093:136594:1,110419:137025:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (3, 253, 1, 'method.gg Beast Mastery Hunter (Pack Leader Single Target)', '94962:117559:1,94966:117563:1,94967:117564:1,94969:117566:1,94972:117569:1,94979:117576:1,94984:117581:1,94985:117582:1,94988:117585:1,94991:117588:1,94992:117589:1,99832:123347:1,102292:126352:1,102336:126397:2,102339:126400:1,102340:126402:1,102342:126404:1,102343:126405:1,102344:128265:1,102345:126407:2,102346:126408:1,102347:126409:1,102353:126415:1,102354:126416:1,102356:126418:1,102357:126419:1,102358:126420:1,102362:126424:1,102365:126427:1,102367:126430:2,102368:126431:1,102370:126433:1,102372:126435:1,102373:126436:1,102374:126437:1,102376:126439:1,102377:126440:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102397:126461:1,102401:126465:2,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,107285:132188:1,107286:132189:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109488:135711:1,109489:135712:1,109802:136060:1,109803:136061:1,109804:136236:1,109961:136446:1,110152:136670:1,110157:136677:1,110158:136679:1,110164:136685:1,110428:137052:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (3, 254, 1, 'method.gg Marksmanship Hunter (Sentinel Cleave)', '94958:117555:1,94965:117562:1,94970:117567:1,94971:117568:1,94973:117570:1,94976:117573:1,94978:117575:1,94980:117577:1,94981:117578:1,94989:117586:1,94990:117587:1,99831:123345:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102389:126452:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102401:126465:2,102402:126466:1,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,103947:128367:1,103956:128376:1,103957:128377:1,103958:132194:1,103961:128383:1,103962:128384:1,103964:128386:1,103966:128388:1,103973:128395:2,103974:128396:1,103975:128397:1,103977:128399:1,103978:128400:1,103979:128401:1,103982:128404:1,103984:128406:1,103985:128407:1,103986:128408:1,103990:128413:1,104095:128609:1,104127:128710:1,104130:128717:1,107288:132192:1,107289:132193:1,107290:132195:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109488:135711:1,109489:135712:1,109805:136063:1,109807:136065:1,109938:136232:1,109961:136446:1,110028:136521:1,110157:136677:1,110164:136685:1,110430:137058:1,110572:137375:1,110573:137376:1,110574:137377:1,110575:137378:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (3, 255, 1, 'method.gg Survival Hunter (Pack Leader Single Target)', '79837:100543:1,94962:117559:1,94966:117563:1,94967:117564:1,94969:117566:1,94972:117569:1,94976:117573:1,94979:123781:1,94984:117581:1,94985:117582:1,94988:117585:1,94991:117588:1,94992:117589:1,99833:123350:1,102255:126314:1,102262:126322:1,102263:126323:1,102264:126324:1,102268:126328:1,102270:126330:1,102272:126332:1,102279:126339:1,102282:126342:1,102285:126345:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102389:126452:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102401:126465:1,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,109305:135496:1,109307:135498:1,109309:135500:1,109310:135501:1,109311:135502:1,109312:135503:2,109313:135504:2,109316:135507:1,109319:135510:1,109320:135511:2,109321:135512:1,109323:135514:1,109324:135515:1,109470:135689:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109489:135712:1,109802:136060:1,109803:136061:1,109804:136236:1,110154:136673:1,110155:136675:1,110156:136676:1,110157:136677:1,110159:136680:1,110161:136682:1,110162:136683:1,110164:136685:1,110429:137055:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (4, 259, 1, 'simc/midnight MID1_Rogue_Assassination', '90624:112509:2,90625:112510:1,90626:112511:1,90628:112513:1,90633:112518:1,90634:134840:1,90635:112520:1,90636:112521:1,90640:112526:1,90684:112572:1,90686:112574:1,90687:112575:1,90692:117152:1,90695:112583:1,90697:112585:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90744:112634:1,90745:112635:1,90746:112636:1,90747:112638:1,90748:112639:1,90749:112640:2,90750:112642:1,90751:112643:2,90752:112644:1,90754:112646:1,90756:112648:1,90757:112649:1,90758:112650:1,90759:112651:2,90760:112652:1,90762:112654:1,90763:112655:1,90764:112657:1,90766:112659:2,90767:112660:1,90768:112661:1,90769:112662:1,90770:112663:1,90771:112664:1,90772:112665:2,90777:112670:1,90780:112673:1,90783:112676:1,90784:112677:1,90785:112678:2,90786:112679:1,94536:117106:1,94552:117130:1,94553:117131:1,94554:117133:1,94556:117137:1,94562:117145:1,95107:117704:1,95114:117711:1,95119:117716:1,95120:117717:1,95122:117719:1,95125:117722:1,95127:117724:1,95129:117726:1,95130:117727:1,95136:117733:1,95138:117735:1,95139:117736:1,99844:123371:1,101714:125615:1,109766:136024:1,109767:136025:1,109768:136026:1,110323:136881:1,110433:137067:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (4, 260, 1, 'simc/midnight MID1_Rogue_Outlaw_Fatebound', '90636:112521:1,90638:112523:1,90639:112525:2,90640:112526:1,90643:112529:1,90645:112531:1,90648:112534:1,90649:112535:1,90652:112538:1,90653:112539:1,90654:112540:1,90655:135732:1,90656:112542:1,90659:112545:1,90661:112547:1,90662:112548:1,90663:112549:1,90664:112551:1,90665:112552:1,90666:112553:2,90668:112555:1,90670:112557:1,90671:112558:1,90676:112563:1,90677:112565:1,90678:112566:2,90679:112567:1,90680:112568:1,90681:112569:1,90683:112571:1,90684:112572:1,90686:112574:1,90687:112575:1,90692:117152:1,90695:112583:1,90697:112585:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90744:112634:1,90745:112635:1,90746:112636:1,90747:112638:1,90750:112642:1,90751:112643:2,90752:112644:1,90753:112645:1,90754:112646:1,90755:112647:1,90756:112648:1,90758:112650:1,90759:112651:2,90760:112652:1,90762:112654:1,90763:112656:1,90764:112657:1,94562:117145:1,95107:117704:1,95114:125139:1,95119:117716:1,95120:117717:1,95122:117719:1,95125:117722:1,95127:117724:1,95129:117726:1,95130:125140:1,95138:125132:1,95139:117736:1,95140:117737:1,99843:123374:1,101714:125615:1,109766:136024:1,109767:136025:1,109768:136026:1,110323:136881:1,110434:137070:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (4, 261, 1, 'simc/midnight MID1_Rogue_Subtlety', '90636:112521:1,90638:112523:1,90639:112525:2,90640:112526:1,90684:112572:1,90686:112574:1,90687:112575:1,90690:112578:1,90692:112580:1,90695:112583:1,90697:112585:1,90700:112588:1,90701:136807:1,90703:117172:1,90704:112592:1,90706:112594:2,90709:112597:1,90710:112598:1,90713:112601:1,90716:112604:1,90720:112608:2,90721:112609:1,90722:112610:1,90723:112611:1,90724:112612:1,90726:112614:1,90727:112615:1,90730:112618:1,90732:112620:2,90733:112621:1,90734:112623:1,90737:112627:1,90738:112628:1,90739:112629:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90745:112635:1,90746:112636:1,90748:112639:1,90749:112640:2,90750:112642:1,90751:112643:2,90752:112644:1,90754:112646:1,90758:112650:1,90760:112652:1,90762:112654:1,90763:112656:1,90764:112657:1,94562:117145:1,94580:117168:1,94582:117170:1,95106:117703:1,95108:117705:1,95109:117706:1,95110:117707:1,95117:117714:1,95123:117720:1,95131:117728:1,95132:117729:1,95135:117732:1,95136:117733:1,95140:117737:1,95142:117739:1,99842:123373:1,101714:125615:1,101715:125619:1,109760:136018:1,109761:136019:1,109762:136020:1,110323:136881:1,110324:136882:1,110325:136883:1,110432:137064:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (5, 256, 1, 'method.gg Discipline Priest (Oracle)', '82556:103834:1,82564:116182:1,82570:103695:1,82571:136829:1,82572:103697:2,82573:103698:1,82575:103700:1,82576:108226:1,82577:103702:1,82581:103706:1,82582:103708:1,82583:103709:2,82587:103713:1,82588:103714:1,82589:103717:1,82590:103718:1,82591:103719:1,82592:103721:1,82593:103722:1,82594:103723:1,82595:103724:1,82596:103725:1,82597:103726:1,82598:103727:1,82601:103731:1,82602:103732:1,82672:103818:1,82673:103819:1,82676:115884:1,82677:103823:1,82678:103825:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82696:103846:1,82697:103847:2,82702:103852:1,82703:103853:1,82711:103863:1,82712:103864:1,82713:103865:1,82715:103867:1,82716:103868:1,82717:103869:1,82718:103870:1,82719:103871:1,86730:103688:1,94673:117276:1,94674:117277:1,94675:117278:1,94679:117282:1,94683:117286:1,94687:117290:1,94689:117292:1,94690:117293:1,94691:117294:1,94698:117301:1,94700:117303:1,99801:123290:1,108731:134284:1,109006:103841:1,109010:134844:2,109011:134845:1,109012:134846:1,109015:134849:1,109020:134859:1,109021:134860:1,109781:136039:1,109782:136040:1,109783:136041:1,109890:136157:1,110008:136498:1,110277:136828:1,110278:136830:1,110410:136998:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (5, 257, 1, 'method.gg Holy Priest (Oracle)', '82554:103675:1,82556:103834:1,82606:103738:1,82608:103740:1,82610:103743:1,82611:103744:2,82612:103745:1,82613:128316:1,82614:103748:1,82615:103749:1,82616:103750:1,82617:103751:1,82618:103752:1,82620:103754:1,82621:103755:1,82622:103756:1,82623:103757:1,82627:103762:1,82630:103765:1,82631:103766:1,82632:103767:1,82633:103769:1,82636:103773:1,82637:103774:1,82638:103775:1,82641:103779:1,82642:103780:1,82672:103818:1,82673:103819:1,82676:115884:1,82677:103823:1,82678:103825:1,82682:103831:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82696:103846:1,82697:103847:2,82702:103852:1,82703:103853:1,82715:103867:1,82716:103868:1,82717:103869:1,82718:103870:1,82719:103871:1,94673:117276:1,94674:117277:1,94675:117278:1,94679:117282:1,94683:117286:1,94687:117290:1,94689:117292:1,94690:117293:1,94691:117294:1,94698:117301:1,94700:117303:1,99802:123292:1,103901:103676:1,103916:128333:1,104097:128611:1,108724:134273:1,108730:134283:1,108731:134284:1,109006:103841:1,109010:134844:2,109012:134846:1,109015:134849:1,109019:134852:1,109020:134859:1,109021:134860:1,109781:136039:1,109782:136040:1,109783:136041:1,109890:136157:1,109917:136185:1,110409:136995:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (5, 258, 1, 'simc/midnight MID1_Priest_Shadow_Voidweaver', '82552:103781:1,82555:103817:1,82556:103834:1,82559:103682:1,82560:103683:2,82563:103686:1,82643:103782:1,82645:103784:2,82647:103786:1,82649:103789:2,82651:103792:1,82654:103796:1,82656:103798:1,82657:103674:1,82658:103799:1,82659:103801:1,82663:103806:1,82665:103808:1,82666:136811:1,82667:103811:1,82668:103812:1,82669:103813:1,82672:103818:1,82673:103819:1,82676:135091:1,82677:103823:1,82678:103825:1,82679:103826:1,82680:103828:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82695:114588:1,82701:103851:1,82703:103853:1,82704:103854:1,82708:103860:1,82711:103863:1,82712:103864:1,82713:103865:1,82715:103867:1,93170:103810:1,93171:115448:1,94668:117271:1,94669:117272:1,94670:117273:1,94684:117287:1,94692:117295:1,94693:123845:1,94694:117297:1,94695:125982:1,94696:117299:1,94703:117306:1,99800:123287:1,100212:123841:1,108007:133378:1,108029:133400:1,108731:134284:1,109006:103841:1,109009:103677:1,109010:134844:2,109011:134845:1,109012:134846:1,109015:134849:1,109017:136223:1,109018:134851:1,109020:134859:1,109021:134860:1,109778:136036:1,109779:136037:1,109780:136038:1,109890:136157:1,109917:136185:1,110408:136992:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (6, 250, 1, 'method.gg Blood Death Knight (San''layn Single Target)', '76039:96167:1,76041:96169:1,76042:96170:1,76043:96171:1,76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76056:96184:1,76057:96186:1,76058:96187:1,76061:96190:1,76064:96193:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:96203:1,76076:96205:1,76079:96208:2,76080:96209:1,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76124:96255:1,76125:96256:1,76126:96257:2,76127:96258:1,76128:96259:1,76129:96260:1,76130:96261:1,76131:96262:1,76132:96263:1,76133:96264:1,76135:96266:1,76137:96268:1,76138:96269:1,76141:96273:1,76142:96274:1,76144:96277:1,76146:96279:1,76168:96303:1,76169:96304:1,76170:96305:1,76171:96306:1,76172:96307:1,76173:96308:1,95033:117630:1,95040:117637:1,95045:117642:1,95046:117643:1,95048:136836:1,95051:117648:1,95053:117650:1,95055:117652:1,95056:117891:1,95062:117659:1,95064:117661:1,95065:117662:1,99822:123325:1,102007:126015:1,102008:126016:1,102243:126298:1,102244:126300:1,109736:135994:1,109737:135995:1,109738:135996:1,110030:136524:1,110353:136917:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (6, 251, 1, 'method.gg Frost Death Knight (Breath of Sindragosa)', '76033:96161:2,76037:96165:1,76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76061:96190:1,76064:136526:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:96203:1,76075:96204:1,76076:96205:1,76078:96207:1,76079:96208:2,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76091:96220:1,76092:96221:1,76093:96222:1,76096:96225:1,76098:96228:1,76101:96231:1,76103:96233:1,76106:96236:1,76108:96238:1,76109:96239:1,76114:96244:1,76115:96245:1,76116:96246:1,76117:96247:1,76118:96248:1,76121:96252:1,76122:96253:2,76123:96254:1,95032:117629:1,95034:117631:1,95035:123420:1,95036:117633:1,95043:117640:1,95049:117646:1,95057:117654:1,95058:117655:1,95061:117658:1,95062:117659:1,95066:117663:1,95068:117665:1,99821:123324:1,101929:125874:1,101930:125875:1,101931:125876:1,101933:125878:1,102007:126015:1,102008:126016:1,102009:126017:1,106790:131618:1,106791:131619:1,109258:133362:1,109733:135991:1,109734:135992:1,109735:135993:1,110029:136523:1,110030:136524:1,110031:136525:1,110400:136968:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (6, 252, 1, 'method.gg Unholy Death Knight (Riders Single Target)', '76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76058:96187:1,76061:96190:1,76064:136526:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:133518:1,76076:96205:1,76078:96207:1,76079:96208:2,76080:96209:1,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76148:96282:1,76149:96283:2,76150:96284:2,76156:96290:1,76160:96294:1,76162:96296:1,76176:133514:1,76178:96313:1,76179:96314:1,76182:96318:1,76184:96321:1,76185:96322:1,76186:133365:1,76187:96324:1,76189:96326:1,76190:96327:1,76191:96328:1,76193:96330:1,76196:96333:1,76197:96334:1,95037:123410:1,95041:117638:1,95042:117639:1,95044:117641:1,95047:117644:1,95051:117648:1,95054:117651:1,95059:117656:1,95060:123412:1,95063:117660:1,95066:117663:1,95067:117664:1,99820:123322:1,102007:126015:1,102008:126016:1,108126:133515:1,108129:133522:1,108130:125816:1,108131:133523:1,108151:133546:1,109392:133517:1,109458:135676:1,109739:135997:1,109740:135998:1,109741:135999:1,110029:136523:1,110030:136524:1,110260:136797:1,110354:136920:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (7, 262, 1, 'simc/midnight MID1_Shaman_Elemental_Stormbringer', '80978:101844:1,80981:101850:1,80983:101853:1,80984:127924:1,80985:101855:1,80988:101859:1,80989:101860:1,80990:101861:1,80991:101862:1,80992:101864:1,80993:101865:1,80995:101867:1,80996:101869:1,80997:101870:1,80998:101871:1,80999:136714:1,81000:101873:1,81002:101876:1,81008:101885:1,81012:101889:1,81015:101892:1,81016:101893:1,94858:123631:1,94860:117457:1,94861:117458:1,94862:123632:1,94863:128226:1,94867:117464:1,94868:117465:1,94869:117466:1,94870:117467:1,94873:128225:1,94875:117472:1,94880:117477:1,94883:117480:1,94884:123630:1,94885:117482:1,94886:117483:1,94887:117484:1,94888:117485:1,94889:117486:1,94892:117489:1,94893:117490:1,94894:117491:1,99845:123376:1,103579:127851:1,103581:127854:1,103582:127855:2,103583:127856:1,103584:127857:1,103585:127858:1,103586:127859:1,103588:127861:1,103591:127864:1,103593:127868:1,103596:127871:1,103598:127873:1,103602:127877:1,103605:127880:1,103606:127881:1,103607:127882:1,103608:127884:1,103611:127888:1,103612:127889:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103620:127899:1,103624:127905:1,103625:127906:1,103626:127908:1,103627:127909:1,103628:127910:1,103631:127913:1,103633:127915:1,103634:127916:1,103635:127917:1,103638:127919:1,103639:127920:1,103640:127921:1,109387:135591:1,109727:135985:1,109728:135986:1,109729:135987:1,109730:135988:1,109731:135989:1,109732:135990:1,110066:136561:1,110085:136585:1,110402:136974:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (7, 263, 1, 'simc/midnight MID1_Shaman_Enhancement_Totemic', '80938:101801:1,80939:101802:1,80941:101804:1,80942:101805:1,80943:101806:1,80945:101809:2,80947:101811:1,80948:101812:1,80949:101813:1,80950:101814:2,80951:101815:1,80953:101818:1,80954:101819:1,80958:101823:1,80959:101824:1,80960:101825:1,80961:101826:1,80962:101827:1,80963:101828:1,80964:101829:1,80967:101832:1,80968:101833:1,80969:101834:1,80973:101839:1,80974:101840:1,80975:101841:1,94859:117456:1,94866:125824:1,94871:117468:1,94872:117469:1,94874:117471:1,94877:117474:1,94879:117476:1,94881:125822:1,94882:117479:1,94890:117487:1,94891:117488:1,94892:117489:1,99847:123379:1,103581:127854:1,103582:127855:2,103583:127856:1,103585:127858:1,103586:127859:1,103588:127861:1,103591:127865:1,103593:127868:1,103594:127869:1,103596:127871:1,103602:127877:1,103605:127880:1,103606:127881:1,103607:127882:1,103608:127884:1,103611:127888:1,103612:127889:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103622:127902:1,103624:127905:1,103625:127906:1,103627:127909:1,103628:127910:1,103871:128270:1,109194:128236:1,109386:135590:1,109387:135591:1,109388:135592:1,109389:135593:1,109724:135982:1,109725:135983:1,109726:135984:1,110085:136585:1,110401:136971:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (7, 264, 1, 'method.gg Restoration Shaman (Totemic Downpour)', '80976:101842:1,81018:101895:1,81019:101896:1,81021:101899:1,81022:101900:1,81024:101902:1,81027:101905:1,81031:101911:1,81032:101912:1,81033:135485:1,81037:101919:1,81040:101923:1,81041:101924:1,81044:101928:1,81047:101932:1,81048:101934:1,81049:101935:1,81050:101936:1,81051:101937:1,81052:101939:2,81055:101942:1,81073:101964:1,92675:114811:1,92677:114813:1,94859:117456:1,94866:125824:1,94871:117468:1,94872:117469:1,94874:117471:1,94877:117474:1,94879:117476:1,94881:125822:1,94882:117479:1,94888:117485:1,94890:117487:1,94891:117488:1,99846:123378:1,103428:127672:1,103430:127674:1,103434:127680:1,103436:127682:1,103581:127853:1,103582:127855:2,103584:127857:1,103586:127859:1,103587:127860:1,103588:127861:1,103590:127863:1,103591:127864:1,103593:127868:1,103594:127869:1,103596:127871:1,103598:127873:1,103601:127876:1,103602:127877:1,103606:127881:1,103607:127883:1,103611:127888:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103620:127899:1,103622:127902:1,103625:127906:1,103626:127908:1,103627:127909:1,104124:128703:1,109301:135487:1,109386:135590:1,109387:135591:1,109388:135592:1,109724:135982:1,109725:135983:1,109726:135984:1,110085:136585:1,110403:136977:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (8, 62, 1, 'simc/midnight MID1_Mage_Arcane_Spellslinger', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62112:80170:2,62114:80173:2,62115:80174:1,62116:80175:1,62121:80180:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,93524:115877:1,94647:117250:1,94654:117257:1,94655:117258:1,94656:117259:1,94657:128267:1,94658:117261:1,94659:117262:1,94660:117263:1,94661:117264:1,94662:117265:1,94663:117266:1,94664:117267:1,99830:123344:1,101883:125818:1,102438:126508:1,102440:126510:1,102441:126511:1,102445:126515:1,102446:126516:1,102449:126519:1,102453:126523:1,102454:136465:1,102460:126530:1,102465:134020:1,102467:126537:1,102468:126538:1,102469:126539:1,102470:126540:1,102471:126541:1,102473:126543:1,102474:126544:1,102475:126545:1,102480:126550:2,104113:128689:1,108536:134024:1,108537:134026:2,108538:134027:1,108539:134028:1,108551:134047:1,108654:134183:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108664:134194:1,108665:134196:1,109002:134834:1,109667:135918:1,109668:135919:1,109669:135920:1,110080:136578:1,110081:136579:1,110420:137028:1,110442:137084:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (8, 63, 1, 'simc/midnight MID1_Mage_Fire_Sunfury', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62112:80170:2,62114:80173:2,62115:80174:1,62119:80178:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,93524:115877:1,94643:117246:1,94644:117247:1,94645:117248:1,94646:117249:1,94647:117250:1,94648:117251:1,94649:117252:1,94650:117253:1,94651:117254:1,94652:117255:1,94653:117256:1,99829:123340:1,100989:124750:1,100995:124756:1,100998:124759:1,100999:124760:1,101007:135618:1,101009:124771:1,101019:124783:2,101024:124789:1,101027:124793:1,101029:124795:2,108654:134182:1,108656:134186:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108662:134192:2,109393:135600:1,109395:135603:1,109396:135604:1,109398:135606:1,109399:135607:1,109401:135609:1,109402:135610:1,109403:135612:1,109404:135613:2,109407:135616:1,109408:135617:1,109409:135602:1,109411:135621:1,109673:135924:1,109674:135925:1,109675:135926:1,109956:136441:1,110080:136578:1,110081:136579:1,110086:136587:1,110088:136589:1,110321:136878:1,110322:136879:1,110423:137037:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (8, 64, 1, 'simc/midnight MID1_Mage_Frost_Spellslinger', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62107:80165:1,62112:80170:2,62114:80173:2,62115:80174:1,62116:80175:1,62117:80176:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,62129:80189:1,62150:134540:1,62153:80216:1,62157:80220:1,62164:80227:1,62170:80234:1,62173:80237:1,62176:80241:1,62177:80242:1,62178:80243:1,62179:80244:1,62180:80245:1,62181:80247:1,62182:80248:1,62184:80250:1,81468:102429:1,93524:115877:1,94654:117257:1,94655:117258:1,94656:117259:1,94657:128267:1,94658:117261:1,94659:117262:1,94660:117263:1,94661:117264:1,94662:117265:1,94663:117266:1,94664:117267:1,99828:123339:1,103771:134418:1,108653:134180:1,108654:134183:1,108655:134185:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108849:134405:1,108850:134406:1,108851:134407:1,108852:134408:1,108855:134411:1,108858:134414:2,108859:134415:1,108864:134421:1,109667:135918:1,109668:135919:1,109669:135920:1,109915:136182:1,109916:136183:1,109956:136441:1,110081:136579:1,110258:136796:1,110283:136837:1,110422:137034:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (9, 265, 1, 'simc/midnight MID1_Warlock_Affliction_Soul_Harvester', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91446:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71954:91465:1,71955:91466:1,71956:91468:1,71957:91469:1,72032:91552:1,72033:91553:1,72034:91554:1,72037:91558:1,72041:91562:1,72045:124692:1,72047:91568:1,72049:91570:1,72050:91571:1,72051:91572:1,72054:91576:1,72055:91577:2,72058:91580:2,94821:117418:1,94823:117420:1,94824:117421:1,94825:117422:1,94832:117429:1,94838:117435:1,94840:117437:1,94846:117443:1,94847:117444:1,94850:123840:1,94851:117448:1,94857:117454:1,99850:123384:1,100941:124694:1,102031:126064:1,102247:126303:1,109837:136096:1,109838:136097:1,109839:136098:1,109842:136102:2,109843:136103:1,109844:136104:1,109845:136105:1,109847:136107:1,109849:136109:1,109852:136112:1,109855:136115:1,109857:136117:1,109859:136119:1,109860:136120:1,109861:136121:1,109862:136122:1,109863:136123:1,109865:136125:2,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110269:136812:1,110270:136813:1,110405:136983:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (9, 266, 1, 'simc/midnight MID1_Warlock_Demonology_Soul_Harvester', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91445:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71955:91466:1,71956:91468:1,71957:91469:1,94821:117418:1,94823:123839:1,94824:117421:1,94825:117422:1,94832:117429:1,94838:117435:1,94846:117443:1,94847:117444:1,94850:123840:1,94851:117448:1,94855:117452:1,94857:117454:1,99849:123383:1,100941:124694:1,101887:125829:2,101891:125834:1,101893:136731:1,101894:125837:1,101895:125839:1,101903:125848:2,101905:125850:1,101908:125854:1,101909:125855:1,101914:125860:2,101920:125866:1,101923:125869:1,109244:135306:1,109248:135310:1,109249:135311:2,109250:135312:1,109251:135313:1,109252:135314:1,109253:135315:1,109257:135319:1,109837:136096:1,109838:136097:1,109839:136098:1,109840:136100:1,109842:136102:2,109843:136103:1,109845:136105:1,109846:136106:1,109847:136107:1,109934:136227:1,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110191:136719:1,110193:136721:1,110194:136722:1,110197:136726:1,110198:136727:1,110404:136980:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (9, 267, 1, 'simc/midnight MID1_Warlock_Destruction_Hellcaller', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91445:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71954:91465:1,71955:91466:1,71956:91468:1,71957:91469:1,71960:91473:1,71965:91478:1,71968:91481:1,71969:91482:2,71971:91484:1,71973:91486:1,71975:91489:1,71980:91496:1,71983:91500:2,71985:91502:1,72059:91581:1,72060:91582:1,72061:91583:1,72062:91584:1,72065:91588:1,72066:91589:2,72067:91590:1,72068:91591:1,72069:91592:1,94822:117419:1,94829:117426:1,94834:117431:1,94835:117432:1,94837:117434:1,94840:117437:1,94842:117439:1,94844:117441:1,94845:117442:1,94853:117450:1,94854:123310:1,94855:117452:1,99848:123382:1,100941:124694:1,101992:126002:1,101994:126004:1,108678:134219:1,108681:134221:1,109834:136093:1,109835:136094:1,109836:136095:1,109841:136101:1,109842:136102:2,109843:136103:1,109845:136105:1,109847:136107:1,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110280:136833:1,110281:136834:2,110282:136835:1,110406:136986:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (10, 268, 1, 'simc/midnight MID1_Monk_Brewmaster', '101064:124838:1,101065:136148:1,101067:136146:1,101069:124843:1,101071:124845:1,101072:124846:1,101074:124848:2,101075:124849:1,101076:124850:1,101078:124852:1,101079:124854:1,101080:124855:1,101082:124857:1,101086:124863:1,101087:124864:1,101088:124865:1,101135:124924:1,101136:124926:1,101140:124930:1,101142:124932:1,101145:124935:1,101146:124936:1,101147:124937:1,101152:124943:1,101153:124944:1,101156:124948:1,101160:124954:1,101161:124955:1,101163:124957:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101177:124974:1,101178:124975:1,101179:124976:2,101181:124979:1,101182:124980:1,101183:124982:1,101184:124983:2,101187:124987:1,101188:124988:1,101190:124991:1,101193:124996:1,101195:124999:1,101197:125001:1,101198:125003:1,101201:125006:1,101202:125008:1,101219:125028:1,101220:125029:1,101221:125031:1,101222:125032:1,101223:125033:1,101224:125035:1,101225:125036:1,101226:125037:1,101227:125039:1,101228:125040:1,101229:125042:1,101230:125043:1,101248:125069:1,101711:125002:1,102004:124859:1,102433:126501:1,109694:135952:1,109695:135953:1,109696:135954:1,109826:136085:1,109827:136086:1,109882:136145:1,109910:136177:1,110435:137075:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (10, 269, 1, 'simc/midnight MID1_Monk_Windwalker', '101035:124805:2,101036:124806:1,101037:124807:1,101039:124810:1,101044:126026:1,101045:124817:1,101048:124820:1,101051:124823:1,101052:124825:1,101053:124826:1,101054:124827:1,101055:124828:1,101056:124829:1,101057:124830:1,101059:124833:1,101060:124834:1,101136:124926:1,101137:124927:1,101140:124930:1,101142:124932:1,101146:124936:1,101147:124937:1,101149:124939:1,101150:124941:1,101153:124944:1,101159:124953:1,101160:124954:1,101162:124956:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101178:124975:1,101179:124976:2,101182:124980:1,101183:124982:1,101184:124983:2,101185:124984:1,101186:124985:1,101203:125009:1,101205:125012:1,101206:125013:1,101207:134452:1,101208:125015:1,101209:125016:1,101210:125017:1,101213:125020:1,101215:125022:1,101216:125023:1,101217:125025:1,101218:125026:1,101232:125046:1,101243:125062:1,101244:125063:1,101245:125065:1,101246:125066:1,101247:125068:1,101248:125069:1,101249:125070:1,101250:125071:1,101251:125072:1,101252:125073:1,101253:125074:1,101254:125076:1,108946:134543:1,109697:135955:1,109698:135956:1,109699:135957:1,110022:136514:1,110023:136515:1,110025:136518:1,110098:136599:1,110436:137076:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (10, 270, 1, 'method.gg Mistweaver Monk (Conduit of the Celestials)', '101089:124866:1,101093:124871:1,101095:124873:1,101096:124875:1,101097:124876:1,101102:128221:1,101104:124885:1,101107:124888:1,101108:124889:1,101110:124891:1,101111:124892:2,101112:124893:1,101113:124894:1,101114:124896:2,101115:124897:1,101117:124899:1,101121:124905:1,101122:124906:1,101123:124907:1,101124:124908:2,101127:125932:1,101128:124913:1,101129:124915:1,101130:124916:1,101131:124918:1,101132:124920:1,101133:124921:1,101134:124922:1,101136:124926:1,101139:124929:1,101140:124930:1,101142:124932:1,101143:124933:1,101144:124934:1,101146:124936:1,101147:124937:1,101153:124944:1,101157:124949:1,101161:124955:1,101164:124958:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101179:124976:2,101183:124982:1,101185:124984:1,101186:124985:1,101223:125033:1,101231:125045:1,101233:125049:1,101234:125050:1,101235:125052:1,101236:125054:1,101237:125055:1,101238:125056:1,101239:125058:1,101240:125059:1,101242:125061:1,102432:126500:1,109516:135749:1,109700:135958:1,109701:135959:1,110019:136510:1,110021:136512:1,110024:136517:1,110026:136519:1,110027:136520:1,110067:136562:1,110097:136598:1,110211:136747:1,110218:136754:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (11, 102, 1, 'simc/midnight MID1_Druid_Balance', '82198:103276:1,82201:103279:1,82202:103280:1,82206:103284:1,82207:128589:1,82208:103286:1,82209:103287:1,82210:103288:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82228:103306:1,82229:103307:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82237:103316:1,82241:103320:1,82246:103326:1,88201:109833:1,88202:109834:1,88203:109835:1,88204:109836:1,88206:109839:1,88207:109840:2,88208:109842:1,88212:109846:1,88213:109847:1,88214:109848:2,88215:109849:1,88218:109852:1,88221:109856:1,88222:109857:1,88223:109858:1,88224:109859:1,88225:109861:1,88226:109862:1,88227:109863:2,88231:109867:1,88234:109870:1,88235:109871:1,88236:109872:1,91048:115458:1,92229:114300:1,93714:116102:1,94585:117772:1,94586:117178:1,94587:117179:1,94588:117181:1,94590:117183:1,94594:117769:1,94596:117190:1,94597:123304:1,94598:117193:1,94600:117195:1,94607:117204:1,94608:117205:1,99808:123302:1,100174:123793:1,100175:123794:1,100176:123795:1,100177:123796:2,100223:123868:1,103846:128230:1,103847:128231:1,104078:128579:1,104080:128584:1,104083:128588:1,104085:128591:1,108032:133404:1,109718:135976:1,109719:135977:1,109720:135978:1,110421:137031:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (11, 103, 1, 'simc/midnight MID1_Druid_Feral_Wildstalker', '82088:103147:1,82091:103150:1,82092:103152:1,82096:103157:1,82098:103159:1,82099:103160:1,82100:103161:1,82101:103162:1,82102:103163:1,82103:103164:1,82104:103165:1,82106:103167:1,82107:103168:1,82108:103170:1,82110:103173:1,82111:103174:1,82112:103175:1,82113:103176:1,82114:103177:1,82115:103179:2,82116:103180:1,82118:103182:1,82119:103183:1,82121:103185:2,82122:103186:1,82123:103187:1,82124:103188:1,82198:103276:1,82199:103277:1,82206:103284:1,82207:128589:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82222:103300:1,82223:103301:1,82224:103302:1,82225:103303:2,82228:103306:1,82229:103307:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82239:103318:1,82241:103320:1,82242:103322:1,82243:103323:2,82244:103324:1,82246:103326:1,92641:114771:1,94609:117206:1,94621:117221:1,94622:119855:1,94623:117223:1,94624:117224:1,94625:117225:1,94626:117226:1,94627:117227:1,94628:117229:1,94629:117231:1,94630:117232:1,94631:117234:1,99805:123296:1,100175:123794:1,100176:123795:1,100177:123796:2,104078:128580:1,104080:128584:1,104081:128585:1,104085:128591:1,109715:135973:1,109716:135974:1,109717:135975:1,110426:137046:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (11, 104, 1, 'simc/midnight MID1_Druid_Guardian', '82126:103190:1,82127:103191:1,82129:103193:1,82131:103195:1,82135:103199:1,82136:103201:1,82138:103203:2,82140:103206:1,82142:103209:1,82143:103210:2,82145:103212:1,82146:103213:2,82147:135336:1,82149:103216:1,82152:103221:1,82153:103222:1,82160:103229:1,82161:103230:1,82198:103276:1,82199:103277:1,82206:103284:1,82208:103286:1,82209:103287:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82223:103301:1,82224:103302:1,82225:103303:2,82227:103305:1,82228:103306:1,82229:103307:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82237:103316:1,82239:103318:1,82241:103320:1,82242:103322:1,82243:103323:1,82246:103326:1,91044:112967:1,91046:112969:1,92226:103208:1,92227:103218:1,92585:114698:1,92586:114699:1,92587:114700:1,94608:117205:1,94609:117206:1,94610:117207:1,94611:117208:1,94612:117210:1,94613:117211:1,94614:117214:1,94615:117215:1,94616:117216:1,94618:117218:1,94619:117219:1,94620:117220:1,99807:123301:1,100175:123794:1,100176:123795:1,104078:128580:1,104080:128584:1,104081:128585:1,104085:128591:1,109375:135568:1,109377:135491:1,109378:135570:1,109379:135490:1,109721:135979:1,109722:135980:1,109723:136624:1,110431:137061:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (11, 105, 1, 'method.gg Restoration Druid (Wildstalker)', '82043:117104:1,82045:103096:1,82047:103098:1,82049:103100:1,82050:103101:1,82051:103102:1,82052:103105:1,82053:103106:1,82054:103108:1,82055:103109:1,82057:103111:1,82058:103112:1,82059:103113:1,82060:103114:1,82063:103118:1,82064:103119:1,82065:103121:1,82068:103124:1,82071:103127:1,82072:103128:1,82073:103129:1,82074:114809:1,82076:103132:1,82079:103137:1,82082:103141:1,82083:103142:1,82198:103275:1,82205:103283:1,82206:103284:1,82207:128589:1,82209:103287:1,82210:103288:1,82214:103292:2,82217:103295:1,82218:103296:1,82219:103297:1,82220:103298:1,82225:103303:2,82228:103306:1,82229:103307:1,82230:103308:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82240:103319:1,82243:103323:2,82244:103324:1,94600:117195:1,94621:117221:1,94622:119855:1,94623:117223:1,94624:117224:1,94625:117225:1,94626:117226:1,94627:117227:1,94628:117229:1,94629:117231:1,94630:117232:1,94631:117233:1,99806:123298:1,100173:123792:1,100175:123794:1,100176:123795:1,100177:123796:2,100223:123868:1,103873:128274:1,103874:128708:1,103876:128277:1,104082:128586:1,104084:128590:1,104085:128591:1,104125:128707:1,109715:135973:1,109716:135974:1,109717:135975:1,110424:137040:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (12, 577, 1, 'simc/midnight MID1_Demon_Hunter_Havoc_Fel-Scarred', '90914:112823:1,90919:112828:1,90921:112830:1,90922:112831:1,90923:112832:1,90925:112834:1,90928:112838:1,90929:112839:1,90931:112841:1,90933:112844:1,90934:112845:1,90935:112846:2,90936:112847:2,90937:112848:1,90938:112849:1,90941:112852:1,90942:112853:1,90946:112859:1,90948:112861:1,90949:112862:2,90950:112863:1,90993:112911:1,90994:117768:1,90997:117755:1,91000:112918:2,91001:112919:1,91002:112921:1,91003:112923:1,91004:112924:2,91006:112926:1,91007:112927:1,91008:112928:1,91011:112932:1,91012:117764:1,91013:112934:1,91015:112936:2,91017:112938:1,91018:112939:1,91021:117744:1,91022:112944:1,91024:117765:1,91025:112948:1,91026:112949:1,91027:112950:1,91028:112951:1,91032:112955:1,91034:112957:2,91036:112959:1,93013:115244:1,93015:115246:1,93016:115248:1,94899:124010:1,94901:117498:1,94902:117499:1,94904:117501:1,94905:117502:1,94909:117506:1,94912:117509:1,94913:124011:1,94915:117512:1,94916:117513:1,94917:117514:1,94918:117515:1,95143:117741:1,95147:117754:2,95149:117758:1,95150:117759:1,95152:117762:1,99824:123329:1,109772:136030:1,109773:136031:1,109774:136032:1,110011:136501:1,110427:137049:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (12, 581, 1, 'simc/midnight MID1_Demon_Hunter_Vengeance_Annihilator', '90929:112839:1,90931:112841:1,90933:112844:1,90934:112845:1,90935:112846:2,90936:112847:2,90938:112849:1,90941:112852:1,90942:112853:1,90946:112859:1,90948:112861:1,90949:112862:2,90950:112863:1,90951:112864:1,90952:112865:1,90953:112866:1,90955:112868:1,90958:112872:2,90959:112873:1,90960:112875:1,90961:112876:1,90962:112877:2,90963:112878:1,90964:112879:1,90968:112883:1,90970:112886:1,90971:112887:1,90972:112888:1,90974:112890:1,90975:112891:1,90977:112893:1,90978:112894:1,90980:112896:1,90981:112897:2,90984:112900:1,90986:112902:1,90987:112903:1,90989:112906:1,90990:112907:1,90991:112908:1,90994:112912:1,90996:112914:2,90999:112917:1,91000:112918:2,91001:112920:1,91002:112921:1,91004:112924:2,91006:112926:1,91007:112927:1,95149:117758:1,95150:117759:1,95151:117761:1,95152:117762:1,99823:134253:1,108722:134271:1,108729:134282:1,109442:135660:1,109443:135661:1,109444:135662:1,109445:135663:1,109446:135664:1,109447:135665:1,109448:135659:1,109449:135667:1,109450:136810:1,109451:135669:1,109452:135670:1,109453:135671:1,109454:135672:1,109455:135673:1,110011:136501:1,110425:137043:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (13, 1467, 1, 'simc/midnight MID1_Evoker_Devastation_SC', '93272:115578:1,93273:115579:1,93274:115580:2,93275:115581:1,93280:115587:1,93281:115588:2,93284:115592:1,93285:115593:1,93289:115597:1,93294:115602:1,93295:115603:2,93297:115606:1,93298:115607:1,93300:115609:1,93302:115611:2,93304:115613:1,93305:115614:1,93306:115615:1,93309:115618:1,93310:115619:2,93311:115620:1,93312:115621:1,93313:115623:1,93314:115624:1,93316:115627:1,93318:115630:1,93319:115631:1,93320:115632:1,93322:115634:1,93323:115635:1,93324:115636:1,93325:115637:1,93326:115638:1,93327:115639:1,93328:115640:1,93329:115641:1,93330:115642:1,93331:115643:1,93332:115645:1,93333:115646:1,93334:115647:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93346:115661:1,93348:115663:1,93349:115664:2,93350:115665:1,93351:115666:1,93352:115667:1,93353:115668:1,93354:115669:1,93355:115670:2,93366:115683:1,93715:116103:1,94921:117518:1,94928:117525:1,94933:117530:1,94934:117531:1,94936:117533:1,94939:117536:1,94941:117538:1,94943:120123:1,94944:117541:1,94950:117547:1,94952:117549:1,94953:117550:1,98931:122279:1,99827:123333:1,103843:128216:1,103844:128217:1,109793:136051:1,109794:136052:1,109795:136053:1,110064:136559:1,110414:137010:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (13, 1468, 1, 'method.gg Preservation Evoker (Chronowarden Raid)', '93238:115540:1,93239:115541:1,93240:115542:1,93241:115543:1,93242:115544:1,93243:115546:1,93245:115549:1,93246:115550:1,93250:115554:1,93253:115557:1,93254:115558:2,93255:115559:1,93257:115561:1,93258:115562:1,93260:115565:1,93262:115567:1,93263:115568:2,93264:115570:1,93265:115571:1,93266:115572:1,93267:115573:1,93268:115574:2,93269:115575:1,93271:115577:1,93288:115596:1,93289:115597:1,93291:115599:1,93292:115600:2,93294:115602:1,93299:115608:1,93300:115609:1,93302:115611:2,93304:115613:1,93306:115615:1,93308:115617:1,93309:115618:1,93310:115619:2,93311:115620:1,93336:115650:1,93337:115651:1,93338:115652:1,93339:115653:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93346:115661:1,93347:115662:2,93348:115663:1,93350:115665:1,93351:125610:1,93352:115667:1,93353:115668:1,93354:115669:1,93355:115670:2,93715:116103:1,94925:117522:1,94929:117526:1,94930:126310:1,94932:117786:1,94935:117532:1,94942:117539:1,94947:117544:1,94948:117545:1,94950:117547:1,94951:117548:1,94954:117551:1,94955:117552:1,99826:123335:1,103843:128216:1,109508:135741:1,109509:135742:1,109510:135743:1,110064:136559:1,110413:137007:1', 'https://www.method.gg/guides');
REPLACE INTO playerbot_v2_talent_build (class_id, spec_id, context, label, entries_json, source_url) VALUES (13, 1473, 1, 'method.gg Augmentation Evoker (Chronowarden ST+Cleave)', '93195:115493:1,93197:115495:1,93198:115496:1,93199:115690:1,93200:115498:1,93201:115499:1,93202:115500:1,93203:115502:1,93205:115504:1,93206:115505:1,93207:115506:1,93208:115507:1,93209:115508:1,93211:115511:1,93212:115512:1,93219:115519:1,93220:115520:1,93221:115521:1,93222:115522:1,93223:115523:1,93226:115527:1,93229:115530:1,93232:115533:1,93234:115536:1,93271:115577:1,93287:115595:1,93288:115596:1,93289:115597:1,93290:115598:1,93295:115603:2,93300:115609:1,93302:115611:2,93304:115613:1,93305:115614:1,93306:115615:1,93308:115617:1,93309:115618:1,93310:115619:2,93311:115620:1,93312:115621:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93345:115660:1,93346:115661:1,93348:115663:1,93349:115664:2,93350:115665:1,93351:115666:1,93352:115667:1,93354:115669:1,93355:115670:2,93358:115675:1,93367:115685:1,93368:115688:1,93369:115686:1,93715:116103:1,94925:117522:1,94929:117526:1,94930:126310:1,94932:117529:1,94935:117532:1,94942:117539:1,94947:117544:1,94948:117545:1,94951:117548:1,94954:117551:1,94955:117552:1,98931:122279:1,99825:123334:1,102248:126304:1,102249:126305:1,103843:128216:1,109508:135741:1,109509:135742:1,109510:135743:1,110415:137013:1', 'https://www.method.gg/guides');
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (4, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
@@ -0,0 +1,53 @@
-- Migration: 0005_population_columns
-- Date: 2026-05-07
-- Purpose: Schema additions for the world-population subsystem
-- (BotPopulationManager + BotSetupPipeline). Tracks the
-- one-shot distribution levelup, idempotent setup-pipeline
-- progress, JIT queue-fill provenance, and LRU timestamps.
-- Reverts: yes (DROP COLUMN per added column).
ALTER TABLE playerbot_v2_character
ADD COLUMN distribution_level TINYINT UNSIGNED NOT NULL DEFAULT 0
AFTER owner_verbose,
ADD COLUMN distribution_at TIMESTAMP NULL DEFAULT NULL
AFTER distribution_level,
ADD COLUMN setup_pipeline_state TINYINT UNSIGNED NOT NULL DEFAULT 0
AFTER distribution_at,
ADD COLUMN jit_for_queue VARCHAR(48) NULL DEFAULT NULL
AFTER setup_pipeline_state,
ADD COLUMN last_seen_at TIMESTAMP NULL DEFAULT NULL
AFTER jit_for_queue,
ADD KEY idx_distribution_level (distribution_level),
ADD KEY idx_jit_for_queue (jit_for_queue),
ADD KEY idx_last_seen_at (last_seen_at);
-- Column docs (kept here below the ALTER so the migration body stays a
-- single statement free of comment-embedded semicolons that the migration
-- parser used to choke on):
-- distribution_level Floor level the BotPopulationManager set this
-- bot to. 0 = never distributed. The shaper
-- refuses to lower a bot's level (see
-- project_v2_world_population.md A5). Gameplay
-- leveling beyond this floor proceeds normally.
-- distribution_at When the distribution levelup happened.
-- Used by hygiene + diagnostics; NULL until set.
-- setup_pipeline_state Bitmask of completed BotSetupPipeline steps.
-- bit 0 = SetLevel, 1 = StarterKit,
-- 2 = GenerateGear, 3 = AutoEquip,
-- 4 = ApplyTalents, 5 = LearnProfessions,
-- 6 = AcquireMount, 7 = PlaceInCapital,
-- 8 (high bits in 0xFF marker) = TravelToZone +
-- Mark complete. 0xFF = pipeline complete.
-- jit_for_queue Tag set when the bot was JIT-spawned to fill
-- a player's queue (e.g. "BG_AB", "LFG_5man").
-- Used by hygiene cleanup to delete bots that
-- were created solely for queue-fill and have
-- outlived their retention window. NULL = bot
-- is part of the regular distribution pool.
-- last_seen_at UTC timestamp of last login or significant
-- AI tick. Drives LRU log-out when the
-- population exceeds target.
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (5, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
+94
View File
@@ -0,0 +1,94 @@
-- Migration: 0006_bot_guild_meta
-- Date: 2026-05-16
-- Purpose: Schema for the bot guild ecosystem (see
-- src/modules/PlayerbotV2/docs/GUILD_PLAN.md).
-- - bot_guild_meta: maps TC's `guild.guildid` to BotGuildMgr
-- metadata (faction, theme, founder, rival, member cap).
-- Distinguishes bot-founded guilds from operator/player
-- guilds so the manager never modifies guilds it didn't
-- create.
-- - bot_guild_name_reserved: in-flight name reservations
-- while a charter FSM is collecting signatures. Prevents
-- two parallel founders from picking the same name.
-- Reverts: yes (DROP TABLE both).
CREATE TABLE IF NOT EXISTS bot_guild_meta (
guild_id BIGINT UNSIGNED NOT NULL,
faction TINYINT UNSIGNED NOT NULL,
theme VARCHAR(32) NOT NULL DEFAULT 'adventurers',
founder_low BIGINT UNSIGNED NOT NULL,
rival_low BIGINT UNSIGNED DEFAULT NULL,
member_cap SMALLINT UNSIGNED NOT NULL DEFAULT 75,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_event_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (guild_id),
KEY idx_bot_guild_meta_faction (faction),
KEY idx_bot_guild_meta_founder (founder_low)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Column docs:
-- guild_id FK to guild.guildid (CharacterDatabase). Not a real
-- FK constraint because TC's guild table doesn't carry
-- one for player rosters and we mirror the convention.
-- faction 0 = Alliance, 1 = Horde. Matches
-- BotGuildMgr::Faction enum.
-- theme 'adventurers' for the default Phase A.2 guild kind;
-- 'crafters' / 'raiders' for Phase E themed guilds.
-- founder_low Character guid_low of the bot that founded the
-- guild. NOT necessarily the current GM (GM rotates
-- via Phase B hygiene). Used by recently-disbanded
-- cooldowns and ownership lineage.
-- rival_low Optional rival guild_id (intra-faction). Set at
-- creation (Phase A.2 picks the longest-active
-- existing bot guild of same faction; NULL if first).
-- Phase E rivalries read this.
-- member_cap Per-guild membership ceiling. Defaults to 75 from
-- BotGuildMgr::kDefaultMaxMembersPerGuild but
-- configurable per guild for special cases.
-- created_at Insertion time = guild submission time.
-- last_event_at Last scheduled-event start (Phase D). NULL until
-- first event runs.
CREATE TABLE IF NOT EXISTS bot_guild_name_reserved (
name VARCHAR(64) NOT NULL,
faction TINYINT UNSIGNED NOT NULL,
founder_low BIGINT UNSIGNED NOT NULL,
reserved_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (name),
KEY idx_bot_guild_name_reserved_founder (founder_low)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Column docs:
-- name The candidate guild name reserved by the charter
-- FSM at phase 2 (buy_charter). Released on success
-- (row deleted when bot_guild_meta row is INSERTed)
-- OR on FSM abort (founder lost the charter, exceeded
-- the 30-min total time-to-found budget, etc.).
-- faction Founder's faction (sanity check + queryability).
-- founder_low Owner of the reservation. Hygiene cron sweeps
-- reservations older than 60 min as orphans.
-- reserved_at For 60-min sweep cutoff.
CREATE TABLE IF NOT EXISTS bot_guild_member_meta (
guild_id BIGINT UNSIGNED NOT NULL,
char_guid_low BIGINT UNSIGNED NOT NULL,
joined_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_promoted_at TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (guild_id, char_guid_low),
KEY idx_bot_gmm_char (char_guid_low),
KEY idx_bot_gmm_joined (joined_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Column docs:
-- guild_id FK to guild.guildid (CharacterDatabase).
-- char_guid_low Bot character guid_low (FK to characters.guid).
-- joined_at When the bot joined this guild — populated by the
-- manager whenever Guild::AddMember succeeds for a
-- bot (charter-signer turn-in, organic recruitment,
-- etc). Drives the rank ladder hygiene cron
-- (Initiate <7d, Member <30d, Veteran >30d).
-- last_promoted_at Last rank change; null until first promotion.
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (6, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
@@ -0,0 +1,111 @@
-- Migration: 0007_talent_builds_seed
-- Date: 2026-05-07
-- Purpose: Populate context=0 (Default) rows in playerbot_v2_talent_build
-- by mirroring the curated raid loadouts seeded in 0004.
-- The API loader (LookupCuratedBuildRow in PlayerbotAPI.cpp)
-- falls back from any requested context (M+/PvP/Leveling)
-- to context=0/Default when the requested row is missing.
-- Seeding Default for all 39 specs therefore guarantees that
-- every bot in every context receives a curated build instead
-- of the TraitMgr generic starter, regardless of role.
-- Coverage: 39/39 specs at context=0 (Default).
-- Per-context rows (Raid=1 already in 0004; M+=2, PvP=3,
-- Leveling=4) deferred until per-context simc/method profiles
-- are sourced.
-- Reverts: yes (DELETE rows; re-run the migration to repopulate).
-- Populated 39/195 rows
-- ===== Warrior =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(1, 71, 0, 'Default: simc/midnight MID1_Warrior_Arms', '90269:112121:1,90270:112122:1,90271:112123:1,90273:112125:1,90274:112126:1,90276:112128:1,90277:112129:1,90279:112131:1,90282:112134:1,90283:112135:2,90285:112137:1,90290:112144:1,90291:112145:1,90292:112146:1,90322:112179:2,90326:112183:1,90327:112184:1,90328:112185:1,90331:112188:1,90337:112198:1,90344:112206:1,90346:112208:1,90347:112209:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90438:112310:1,90439:112311:1,90441:112314:1,90444:112317:2,90445:112318:1,90447:112320:2,92537:114643:1,92614:114733:1,94784:117381:1,94786:117383:1,94787:117384:1,94788:117385:1,94795:117392:1,94801:117398:1,94809:117406:1,94810:117407:1,94813:117410:1,94814:117411:1,94818:117415:1,94820:117417:1,95956:118850:1,99853:123390:1,108543:134032:1,108544:134033:1,108676:134216:1,108686:134226:1,108705:136627:1,109391:135597:1,109680:135934:1,109684:135940:1,109685:135941:1,109687:135944:2,109815:136074:1,109816:136075:1,109817:136076:1,110118:136625:1,110119:136626:1,110176:136703:1,110407:136989:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(1, 72, 0, 'Default: simc/midnight MID1_Warrior_Fury', '90325:112182:1,90326:112183:1,90328:112185:1,90331:112188:1,90337:112198:1,90344:112206:1,90346:112208:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90373:112240:2,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90387:112255:1,90388:119139:1,90390:112259:1,90392:112261:1,90394:112263:1,90395:112264:1,90396:112265:1,90397:112266:2,90398:112267:1,90399:112268:1,90401:112270:1,90402:112271:1,90403:112272:1,90406:112275:1,90408:112277:1,90410:112279:1,90412:112281:1,90415:112284:1,90421:112292:2,90428:112299:2,90429:112300:1,90430:112301:1,92538:114644:1,94784:117381:1,94786:117383:1,94787:117384:1,94788:117385:1,94795:117392:1,94801:117398:1,94803:117400:1,94809:117406:1,94810:117407:1,94813:117410:1,94814:117411:1,94820:117417:1,95956:118850:1,99852:123389:1,108542:134031:1,108543:134032:1,108544:134033:1,108674:134213:1,108686:134226:1,108705:136627:1,109391:135597:1,109815:136074:1,109816:136075:1,109817:136076:1,109963:136448:1,109966:136451:1,109968:136453:1,109969:136454:1,110118:136625:1,110119:136626:1,110203:136735:1,110412:137004:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(1, 73, 0, 'Default: simc/midnight MID1_Warrior_Protection', '90261:112112:1,90264:132884:1,90265:112116:1,90295:112149:1,90296:112150:1,90297:112151:1,90298:112152:1,90301:112155:1,90302:112156:1,90303:112157:1,90304:112158:1,90305:112159:1,90306:112160:1,90308:112162:1,90309:112163:1,90310:112165:1,90311:112166:2,90312:132885:1,90314:112170:1,90317:112173:1,90318:112174:1,90319:112176:1,90320:112177:1,90324:112181:2,90326:112183:1,90328:112185:1,90329:112186:1,90330:112187:1,90331:112188:1,90343:112205:1,90346:112208:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90432:112304:1,90433:112305:1,90448:112321:1,90449:112323:1,90451:112325:1,94785:117382:1,94792:118834:1,94797:117394:1,94798:117395:1,94800:117397:1,94803:117400:1,94805:117402:1,94807:117404:1,94808:117405:1,94816:117413:1,94817:118835:1,95956:118850:1,95959:118853:1,99851:123388:1,107577:132882:1,107578:132883:1,108542:134031:1,108543:134032:1,108544:134033:1,108686:134226:1,108705:136627:1,109391:135597:1,109809:136068:1,109810:136069:1,109811:136070:1,110118:136625:1,110119:136626:1,110411:137001:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Paladin =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(2, 65, 0, 'Default: method.gg Holy Paladin (Herald of the Sun)', '81496:102465:1,81508:102477:1,81510:133481:1,81554:102533:1,81555:102534:1,81557:102536:1,81558:102537:1,81560:102539:1,81561:102540:1,81564:102544:1,81565:102545:1,81567:102548:1,81568:102549:1,81569:102550:1,81570:102551:1,81571:102552:1,81575:102558:1,81578:102562:1,81580:102564:1,81583:102567:2,81584:102569:1,81585:102570:1,81588:133501:1,81589:102574:1,81590:102575:1,81591:102577:1,81592:102578:1,81594:102580:1,81595:102581:1,81597:102583:1,81598:102584:1,81600:102587:1,81605:102592:1,81609:102597:1,81613:102601:1,81614:102602:1,81615:102603:1,81616:102604:1,81621:102612:2,81630:102622:2,81631:128251:1,81632:102625:1,92220:114292:1,93009:115034:2,93180:115465:1,93191:128246:1,93520:115872:1,93521:115873:1,93522:115874:1,93927:116376:1,95069:117666:1,95071:117668:1,95072:117669:1,95073:117778:1,95080:117677:1,95086:117683:1,95094:117691:1,95095:117692:1,95098:117777:1,95099:117696:1,95105:117702:1,99839:123362:1,103851:128241:2,103856:128309:1,103858:128254:2,103861:128257:1,103863:128259:1,103864:128260:1,103866:128262:1,109748:136006:1,109749:136007:1,109750:136008:1,109998:136486:1,109999:136487:1,110012:136503:1,110092:136593:1,110257:136795:1,110417:137019:1', 'https://www.method.gg/guides'),
(2, 66, 0, 'Default: simc/midnight MID1_Paladin_Protection', '81469:102431:1,81470:102432:1,81471:102433:2,81472:102435:1,81477:102440:1,81479:102443:1,81481:102445:1,81482:102446:2,81483:102448:1,81485:102450:2,81486:102452:1,81487:102453:1,81489:102455:1,81490:102456:1,81493:102461:1,81494:102463:1,81495:102464:1,81498:102467:1,81499:102468:1,81501:102470:1,81502:102471:1,81503:102472:1,81505:136732:1,81506:102475:1,81507:102476:1,81510:133481:1,81597:102583:1,81600:102587:1,81603:102590:1,81604:102591:1,81605:102592:1,81607:102595:1,81609:102597:1,81612:102600:1,81614:102602:1,81616:102604:1,81617:102606:1,81621:102612:2,81629:102621:1,81630:102622:2,81631:128251:1,81632:102625:1,90062:111886:1,93010:102623:1,93187:115479:1,93192:128244:1,93357:115673:1,95177:117810:1,95178:117811:1,95179:117812:1,95180:117813:1,95181:117858:1,95182:117815:1,95183:117816:1,95184:117818:1,95185:117819:1,95186:117822:1,95187:117823:1,95234:117882:1,99838:123358:1,101927:102451:1,103851:128241:2,103855:128250:1,103857:128253:1,103858:128254:2,103859:128255:1,103860:128256:1,103867:128263:1,103868:128264:1,103877:128278:1,109745:136003:1,109746:136004:1,109747:136005:1,109999:136487:1,110006:136496:1,110012:136503:1,110418:137022:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(2, 70, 0, 'Default: simc/midnight MID1_Paladin_Retribution', '81510:133481:1,81512:115475:1,81521:114828:1,81523:102493:1,81525:102497:1,81526:102498:1,81527:102499:1,81532:102504:1,81533:102505:1,81534:102506:1,81542:102516:1,81543:102518:1,81544:102519:1,81597:102583:1,81600:102587:1,81603:102590:1,81605:102592:1,81608:102596:1,81609:102597:1,81614:102602:1,81615:102603:1,81616:102604:1,81618:128243:1,81621:102612:2,81630:102622:2,81631:128251:1,81632:102625:1,92686:114824:1,92689:114830:1,92838:115022:1,92839:115024:1,92854:115043:1,92952:115165:2,93009:115034:2,93160:115439:2,93161:115440:1,93164:115443:2,93173:115453:1,93174:115454:1,93181:115467:1,93189:115481:1,93190:115483:2,93357:115673:1,95099:117696:1,95177:117810:1,95178:117811:1,95179:117812:1,95180:117813:1,95181:117858:1,95182:117815:1,95183:117816:1,95184:117818:1,95185:117819:1,95186:117822:1,95187:117823:1,99837:123357:1,103851:128241:2,103861:128257:1,103863:128259:1,103864:128260:1,103867:128263:1,103868:128264:1,109368:135564:1,109369:135565:1,109371:115438:1,109373:115435:1,109374:136809:1,109745:136003:1,109746:136004:1,109747:136005:1,109867:136127:1,109999:136487:1,110012:136503:1,110091:136592:1,110093:136594:1,110419:137025:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Hunter =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(3, 253, 0, 'Default: method.gg Beast Mastery Hunter (Pack Leader Single Target)', '94962:117559:1,94966:117563:1,94967:117564:1,94969:117566:1,94972:117569:1,94979:117576:1,94984:117581:1,94985:117582:1,94988:117585:1,94991:117588:1,94992:117589:1,99832:123347:1,102292:126352:1,102336:126397:2,102339:126400:1,102340:126402:1,102342:126404:1,102343:126405:1,102344:128265:1,102345:126407:2,102346:126408:1,102347:126409:1,102353:126415:1,102354:126416:1,102356:126418:1,102357:126419:1,102358:126420:1,102362:126424:1,102365:126427:1,102367:126430:2,102368:126431:1,102370:126433:1,102372:126435:1,102373:126436:1,102374:126437:1,102376:126439:1,102377:126440:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102397:126461:1,102401:126465:2,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,107285:132188:1,107286:132189:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109488:135711:1,109489:135712:1,109802:136060:1,109803:136061:1,109804:136236:1,109961:136446:1,110152:136670:1,110157:136677:1,110158:136679:1,110164:136685:1,110428:137052:1', 'https://www.method.gg/guides'),
(3, 254, 0, 'Default: method.gg Marksmanship Hunter (Sentinel Cleave)', '94958:117555:1,94965:117562:1,94970:117567:1,94971:117568:1,94973:117570:1,94976:117573:1,94978:117575:1,94980:117577:1,94981:117578:1,94989:117586:1,94990:117587:1,99831:123345:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102389:126452:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102401:126465:2,102402:126466:1,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,103947:128367:1,103956:128376:1,103957:128377:1,103958:132194:1,103961:128383:1,103962:128384:1,103964:128386:1,103966:128388:1,103973:128395:2,103974:128396:1,103975:128397:1,103977:128399:1,103978:128400:1,103979:128401:1,103982:128404:1,103984:128406:1,103985:128407:1,103986:128408:1,103990:128413:1,104095:128609:1,104127:128710:1,104130:128717:1,107288:132192:1,107289:132193:1,107290:132195:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109488:135711:1,109489:135712:1,109805:136063:1,109807:136065:1,109938:136232:1,109961:136446:1,110028:136521:1,110157:136677:1,110164:136685:1,110430:137058:1,110572:137375:1,110573:137376:1,110574:137377:1,110575:137378:1', 'https://www.method.gg/guides'),
(3, 255, 0, 'Default: method.gg Survival Hunter (Pack Leader Single Target)', '79837:100543:1,94962:117559:1,94966:117563:1,94967:117564:1,94969:117566:1,94972:117569:1,94976:117573:1,94979:123781:1,94984:117581:1,94985:117582:1,94988:117585:1,94991:117588:1,94992:117589:1,99833:123350:1,102255:126314:1,102262:126322:1,102263:126323:1,102264:126324:1,102268:126328:1,102270:126330:1,102272:126332:1,102279:126339:1,102282:126342:1,102285:126345:1,102380:126443:1,102381:126444:1,102384:126447:2,102387:126450:1,102389:126452:1,102390:126453:1,102391:126454:1,102395:126459:1,102396:126460:2,102401:126465:1,102404:126468:1,102406:126470:1,102409:126473:2,102411:126475:1,102416:126481:2,102419:126484:1,102422:126488:1,102423:126489:1,102424:126490:1,109305:135496:1,109307:135498:1,109309:135500:1,109310:135501:1,109311:135502:1,109312:135503:2,109313:135504:2,109316:135507:1,109319:135510:1,109320:135511:2,109321:135512:1,109323:135514:1,109324:135515:1,109470:135689:1,109483:135705:1,109485:135708:1,109486:135709:1,109487:135710:2,109489:135712:1,109802:136060:1,109803:136061:1,109804:136236:1,110154:136673:1,110155:136675:1,110156:136676:1,110157:136677:1,110159:136680:1,110161:136682:1,110162:136683:1,110164:136685:1,110429:137055:1', 'https://www.method.gg/guides');
-- ===== Rogue =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(4, 259, 0, 'Default: simc/midnight MID1_Rogue_Assassination', '90624:112509:2,90625:112510:1,90626:112511:1,90628:112513:1,90633:112518:1,90634:134840:1,90635:112520:1,90636:112521:1,90640:112526:1,90684:112572:1,90686:112574:1,90687:112575:1,90692:117152:1,90695:112583:1,90697:112585:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90744:112634:1,90745:112635:1,90746:112636:1,90747:112638:1,90748:112639:1,90749:112640:2,90750:112642:1,90751:112643:2,90752:112644:1,90754:112646:1,90756:112648:1,90757:112649:1,90758:112650:1,90759:112651:2,90760:112652:1,90762:112654:1,90763:112655:1,90764:112657:1,90766:112659:2,90767:112660:1,90768:112661:1,90769:112662:1,90770:112663:1,90771:112664:1,90772:112665:2,90777:112670:1,90780:112673:1,90783:112676:1,90784:112677:1,90785:112678:2,90786:112679:1,94536:117106:1,94552:117130:1,94553:117131:1,94554:117133:1,94556:117137:1,94562:117145:1,95107:117704:1,95114:117711:1,95119:117716:1,95120:117717:1,95122:117719:1,95125:117722:1,95127:117724:1,95129:117726:1,95130:117727:1,95136:117733:1,95138:117735:1,95139:117736:1,99844:123371:1,101714:125615:1,109766:136024:1,109767:136025:1,109768:136026:1,110323:136881:1,110433:137067:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(4, 260, 0, 'Default: simc/midnight MID1_Rogue_Outlaw_Fatebound', '90636:112521:1,90638:112523:1,90639:112525:2,90640:112526:1,90643:112529:1,90645:112531:1,90648:112534:1,90649:112535:1,90652:112538:1,90653:112539:1,90654:112540:1,90655:135732:1,90656:112542:1,90659:112545:1,90661:112547:1,90662:112548:1,90663:112549:1,90664:112551:1,90665:112552:1,90666:112553:2,90668:112555:1,90670:112557:1,90671:112558:1,90676:112563:1,90677:112565:1,90678:112566:2,90679:112567:1,90680:112568:1,90681:112569:1,90683:112571:1,90684:112572:1,90686:112574:1,90687:112575:1,90692:117152:1,90695:112583:1,90697:112585:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90744:112634:1,90745:112635:1,90746:112636:1,90747:112638:1,90750:112642:1,90751:112643:2,90752:112644:1,90753:112645:1,90754:112646:1,90755:112647:1,90756:112648:1,90758:112650:1,90759:112651:2,90760:112652:1,90762:112654:1,90763:112656:1,90764:112657:1,94562:117145:1,95107:117704:1,95114:125139:1,95119:117716:1,95120:117717:1,95122:117719:1,95125:117722:1,95127:117724:1,95129:117726:1,95130:125140:1,95138:125132:1,95139:117736:1,95140:117737:1,99843:123374:1,101714:125615:1,109766:136024:1,109767:136025:1,109768:136026:1,110323:136881:1,110434:137070:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(4, 261, 0, 'Default: simc/midnight MID1_Rogue_Subtlety', '90636:112521:1,90638:112523:1,90639:112525:2,90640:112526:1,90684:112572:1,90686:112574:1,90687:112575:1,90690:112578:1,90692:112580:1,90695:112583:1,90697:112585:1,90700:112588:1,90701:136807:1,90703:117172:1,90704:112592:1,90706:112594:2,90709:112597:1,90710:112598:1,90713:112601:1,90716:112604:1,90720:112608:2,90721:112609:1,90722:112610:1,90723:112611:1,90724:112612:1,90726:112614:1,90727:112615:1,90730:112618:1,90732:112620:2,90733:112621:1,90734:112623:1,90737:112627:1,90738:112628:1,90739:112629:1,90740:112630:1,90741:117740:1,90742:114737:1,90743:112633:1,90745:112635:1,90746:112636:1,90748:112639:1,90749:112640:2,90750:112642:1,90751:112643:2,90752:112644:1,90754:112646:1,90758:112650:1,90760:112652:1,90762:112654:1,90763:112656:1,90764:112657:1,94562:117145:1,94580:117168:1,94582:117170:1,95106:117703:1,95108:117705:1,95109:117706:1,95110:117707:1,95117:117714:1,95123:117720:1,95131:117728:1,95132:117729:1,95135:117732:1,95136:117733:1,95140:117737:1,95142:117739:1,99842:123373:1,101714:125615:1,101715:125619:1,109760:136018:1,109761:136019:1,109762:136020:1,110323:136881:1,110324:136882:1,110325:136883:1,110432:137064:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Priest =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(5, 256, 0, 'Default: method.gg Discipline Priest (Oracle)', '82556:103834:1,82564:116182:1,82570:103695:1,82571:136829:1,82572:103697:2,82573:103698:1,82575:103700:1,82576:108226:1,82577:103702:1,82581:103706:1,82582:103708:1,82583:103709:2,82587:103713:1,82588:103714:1,82589:103717:1,82590:103718:1,82591:103719:1,82592:103721:1,82593:103722:1,82594:103723:1,82595:103724:1,82596:103725:1,82597:103726:1,82598:103727:1,82601:103731:1,82602:103732:1,82672:103818:1,82673:103819:1,82676:115884:1,82677:103823:1,82678:103825:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82696:103846:1,82697:103847:2,82702:103852:1,82703:103853:1,82711:103863:1,82712:103864:1,82713:103865:1,82715:103867:1,82716:103868:1,82717:103869:1,82718:103870:1,82719:103871:1,86730:103688:1,94673:117276:1,94674:117277:1,94675:117278:1,94679:117282:1,94683:117286:1,94687:117290:1,94689:117292:1,94690:117293:1,94691:117294:1,94698:117301:1,94700:117303:1,99801:123290:1,108731:134284:1,109006:103841:1,109010:134844:2,109011:134845:1,109012:134846:1,109015:134849:1,109020:134859:1,109021:134860:1,109781:136039:1,109782:136040:1,109783:136041:1,109890:136157:1,110008:136498:1,110277:136828:1,110278:136830:1,110410:136998:1', 'https://www.method.gg/guides'),
(5, 257, 0, 'Default: method.gg Holy Priest (Oracle)', '82554:103675:1,82556:103834:1,82606:103738:1,82608:103740:1,82610:103743:1,82611:103744:2,82612:103745:1,82613:128316:1,82614:103748:1,82615:103749:1,82616:103750:1,82617:103751:1,82618:103752:1,82620:103754:1,82621:103755:1,82622:103756:1,82623:103757:1,82627:103762:1,82630:103765:1,82631:103766:1,82632:103767:1,82633:103769:1,82636:103773:1,82637:103774:1,82638:103775:1,82641:103779:1,82642:103780:1,82672:103818:1,82673:103819:1,82676:115884:1,82677:103823:1,82678:103825:1,82682:103831:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82696:103846:1,82697:103847:2,82702:103852:1,82703:103853:1,82715:103867:1,82716:103868:1,82717:103869:1,82718:103870:1,82719:103871:1,94673:117276:1,94674:117277:1,94675:117278:1,94679:117282:1,94683:117286:1,94687:117290:1,94689:117292:1,94690:117293:1,94691:117294:1,94698:117301:1,94700:117303:1,99802:123292:1,103901:103676:1,103916:128333:1,104097:128611:1,108724:134273:1,108730:134283:1,108731:134284:1,109006:103841:1,109010:134844:2,109012:134846:1,109015:134849:1,109019:134852:1,109020:134859:1,109021:134860:1,109781:136039:1,109782:136040:1,109783:136041:1,109890:136157:1,109917:136185:1,110409:136995:1', 'https://www.method.gg/guides'),
(5, 258, 0, 'Default: simc/midnight MID1_Priest_Shadow_Voidweaver', '82552:103781:1,82555:103817:1,82556:103834:1,82559:103682:1,82560:103683:2,82563:103686:1,82643:103782:1,82645:103784:2,82647:103786:1,82649:103789:2,82651:103792:1,82654:103796:1,82656:103798:1,82657:103674:1,82658:103799:1,82659:103801:1,82663:103806:1,82665:103808:1,82666:136811:1,82667:103811:1,82668:103812:1,82669:103813:1,82672:103818:1,82673:103819:1,82676:135091:1,82677:103823:1,82678:103825:1,82679:103826:1,82680:103828:1,82684:103833:2,82685:103835:1,82686:103836:2,82687:103837:1,82690:103840:1,82695:114588:1,82701:103851:1,82703:103853:1,82704:103854:1,82708:103860:1,82711:103863:1,82712:103864:1,82713:103865:1,82715:103867:1,93170:103810:1,93171:115448:1,94668:117271:1,94669:117272:1,94670:117273:1,94684:117287:1,94692:117295:1,94693:123845:1,94694:117297:1,94695:125982:1,94696:117299:1,94703:117306:1,99800:123287:1,100212:123841:1,108007:133378:1,108029:133400:1,108731:134284:1,109006:103841:1,109009:103677:1,109010:134844:2,109011:134845:1,109012:134846:1,109015:134849:1,109017:136223:1,109018:134851:1,109020:134859:1,109021:134860:1,109778:136036:1,109779:136037:1,109780:136038:1,109890:136157:1,109917:136185:1,110408:136992:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Death Knight =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(6, 250, 0, 'Default: method.gg Blood Death Knight (San''layn Single Target)', '76039:96167:1,76041:96169:1,76042:96170:1,76043:96171:1,76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76056:96184:1,76057:96186:1,76058:96187:1,76061:96190:1,76064:96193:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:96203:1,76076:96205:1,76079:96208:2,76080:96209:1,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76124:96255:1,76125:96256:1,76126:96257:2,76127:96258:1,76128:96259:1,76129:96260:1,76130:96261:1,76131:96262:1,76132:96263:1,76133:96264:1,76135:96266:1,76137:96268:1,76138:96269:1,76141:96273:1,76142:96274:1,76144:96277:1,76146:96279:1,76168:96303:1,76169:96304:1,76170:96305:1,76171:96306:1,76172:96307:1,76173:96308:1,95033:117630:1,95040:117637:1,95045:117642:1,95046:117643:1,95048:136836:1,95051:117648:1,95053:117650:1,95055:117652:1,95056:117891:1,95062:117659:1,95064:117661:1,95065:117662:1,99822:123325:1,102007:126015:1,102008:126016:1,102243:126298:1,102244:126300:1,109736:135994:1,109737:135995:1,109738:135996:1,110030:136524:1,110353:136917:1', 'https://www.method.gg/guides'),
(6, 251, 0, 'Default: method.gg Frost Death Knight (Breath of Sindragosa)', '76033:96161:2,76037:96165:1,76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76061:96190:1,76064:136526:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:96203:1,76075:96204:1,76076:96205:1,76078:96207:1,76079:96208:2,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76091:96220:1,76092:96221:1,76093:96222:1,76096:96225:1,76098:96228:1,76101:96231:1,76103:96233:1,76106:96236:1,76108:96238:1,76109:96239:1,76114:96244:1,76115:96245:1,76116:96246:1,76117:96247:1,76118:96248:1,76121:96252:1,76122:96253:2,76123:96254:1,95032:117629:1,95034:117631:1,95035:123420:1,95036:117633:1,95043:117640:1,95049:117646:1,95057:117654:1,95058:117655:1,95061:117658:1,95062:117659:1,95066:117663:1,95068:117665:1,99821:123324:1,101929:125874:1,101930:125875:1,101931:125876:1,101933:125878:1,102007:126015:1,102008:126016:1,102009:126017:1,106790:131618:1,106791:131619:1,109258:133362:1,109733:135991:1,109734:135992:1,109735:135993:1,110029:136523:1,110030:136524:1,110031:136525:1,110400:136968:1', 'https://www.method.gg/guides'),
(6, 252, 0, 'Default: method.gg Unholy Death Knight (Riders Single Target)', '76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76058:96187:1,76061:96190:1,76064:136526:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:133518:1,76076:96205:1,76078:96207:1,76079:96208:2,76080:96209:1,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76148:96282:1,76149:96283:2,76150:96284:2,76156:96290:1,76160:96294:1,76162:96296:1,76176:133514:1,76178:96313:1,76179:96314:1,76182:96318:1,76184:96321:1,76185:96322:1,76186:133365:1,76187:96324:1,76189:96326:1,76190:96327:1,76191:96328:1,76193:96330:1,76196:96333:1,76197:96334:1,95037:123410:1,95041:117638:1,95042:117639:1,95044:117641:1,95047:117644:1,95051:117648:1,95054:117651:1,95059:117656:1,95060:123412:1,95063:117660:1,95066:117663:1,95067:117664:1,99820:123322:1,102007:126015:1,102008:126016:1,108126:133515:1,108129:133522:1,108130:125816:1,108131:133523:1,108151:133546:1,109392:133517:1,109458:135676:1,109739:135997:1,109740:135998:1,109741:135999:1,110029:136523:1,110030:136524:1,110260:136797:1,110354:136920:1', 'https://www.method.gg/guides');
-- ===== Shaman =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(7, 262, 0, 'Default: simc/midnight MID1_Shaman_Elemental_Stormbringer', '80978:101844:1,80981:101850:1,80983:101853:1,80984:127924:1,80985:101855:1,80988:101859:1,80989:101860:1,80990:101861:1,80991:101862:1,80992:101864:1,80993:101865:1,80995:101867:1,80996:101869:1,80997:101870:1,80998:101871:1,80999:136714:1,81000:101873:1,81002:101876:1,81008:101885:1,81012:101889:1,81015:101892:1,81016:101893:1,94858:123631:1,94860:117457:1,94861:117458:1,94862:123632:1,94863:128226:1,94867:117464:1,94868:117465:1,94869:117466:1,94870:117467:1,94873:128225:1,94875:117472:1,94880:117477:1,94883:117480:1,94884:123630:1,94885:117482:1,94886:117483:1,94887:117484:1,94888:117485:1,94889:117486:1,94892:117489:1,94893:117490:1,94894:117491:1,99845:123376:1,103579:127851:1,103581:127854:1,103582:127855:2,103583:127856:1,103584:127857:1,103585:127858:1,103586:127859:1,103588:127861:1,103591:127864:1,103593:127868:1,103596:127871:1,103598:127873:1,103602:127877:1,103605:127880:1,103606:127881:1,103607:127882:1,103608:127884:1,103611:127888:1,103612:127889:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103620:127899:1,103624:127905:1,103625:127906:1,103626:127908:1,103627:127909:1,103628:127910:1,103631:127913:1,103633:127915:1,103634:127916:1,103635:127917:1,103638:127919:1,103639:127920:1,103640:127921:1,109387:135591:1,109727:135985:1,109728:135986:1,109729:135987:1,109730:135988:1,109731:135989:1,109732:135990:1,110066:136561:1,110085:136585:1,110402:136974:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(7, 263, 0, 'Default: simc/midnight MID1_Shaman_Enhancement_Totemic', '80938:101801:1,80939:101802:1,80941:101804:1,80942:101805:1,80943:101806:1,80945:101809:2,80947:101811:1,80948:101812:1,80949:101813:1,80950:101814:2,80951:101815:1,80953:101818:1,80954:101819:1,80958:101823:1,80959:101824:1,80960:101825:1,80961:101826:1,80962:101827:1,80963:101828:1,80964:101829:1,80967:101832:1,80968:101833:1,80969:101834:1,80973:101839:1,80974:101840:1,80975:101841:1,94859:117456:1,94866:125824:1,94871:117468:1,94872:117469:1,94874:117471:1,94877:117474:1,94879:117476:1,94881:125822:1,94882:117479:1,94890:117487:1,94891:117488:1,94892:117489:1,99847:123379:1,103581:127854:1,103582:127855:2,103583:127856:1,103585:127858:1,103586:127859:1,103588:127861:1,103591:127865:1,103593:127868:1,103594:127869:1,103596:127871:1,103602:127877:1,103605:127880:1,103606:127881:1,103607:127882:1,103608:127884:1,103611:127888:1,103612:127889:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103622:127902:1,103624:127905:1,103625:127906:1,103627:127909:1,103628:127910:1,103871:128270:1,109194:128236:1,109386:135590:1,109387:135591:1,109388:135592:1,109389:135593:1,109724:135982:1,109725:135983:1,109726:135984:1,110085:136585:1,110401:136971:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(7, 264, 0, 'Default: method.gg Restoration Shaman (Totemic Downpour)', '80976:101842:1,81018:101895:1,81019:101896:1,81021:101899:1,81022:101900:1,81024:101902:1,81027:101905:1,81031:101911:1,81032:101912:1,81033:135485:1,81037:101919:1,81040:101923:1,81041:101924:1,81044:101928:1,81047:101932:1,81048:101934:1,81049:101935:1,81050:101936:1,81051:101937:1,81052:101939:2,81055:101942:1,81073:101964:1,92675:114811:1,92677:114813:1,94859:117456:1,94866:125824:1,94871:117468:1,94872:117469:1,94874:117471:1,94877:117474:1,94879:117476:1,94881:125822:1,94882:117479:1,94888:117485:1,94890:117487:1,94891:117488:1,99846:123378:1,103428:127672:1,103430:127674:1,103434:127680:1,103436:127682:1,103581:127853:1,103582:127855:2,103584:127857:1,103586:127859:1,103587:127860:1,103588:127861:1,103590:127863:1,103591:127864:1,103593:127868:1,103594:127869:1,103596:127871:1,103598:127873:1,103601:127876:1,103602:127877:1,103606:127881:1,103607:127883:1,103611:127888:1,103613:127890:1,103614:127891:2,103615:127892:1,103616:127893:1,103617:127894:2,103620:127899:1,103622:127902:1,103625:127906:1,103626:127908:1,103627:127909:1,104124:128703:1,109301:135487:1,109386:135590:1,109387:135591:1,109388:135592:1,109724:135982:1,109725:135983:1,109726:135984:1,110085:136585:1,110403:136977:1', 'https://www.method.gg/guides');
-- ===== Mage =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(8, 62, 0, 'Default: simc/midnight MID1_Mage_Arcane_Spellslinger', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62112:80170:2,62114:80173:2,62115:80174:1,62116:80175:1,62121:80180:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,93524:115877:1,94647:117250:1,94654:117257:1,94655:117258:1,94656:117259:1,94657:128267:1,94658:117261:1,94659:117262:1,94660:117263:1,94661:117264:1,94662:117265:1,94663:117266:1,94664:117267:1,99830:123344:1,101883:125818:1,102438:126508:1,102440:126510:1,102441:126511:1,102445:126515:1,102446:126516:1,102449:126519:1,102453:126523:1,102454:136465:1,102460:126530:1,102465:134020:1,102467:126537:1,102468:126538:1,102469:126539:1,102470:126540:1,102471:126541:1,102473:126543:1,102474:126544:1,102475:126545:1,102480:126550:2,104113:128689:1,108536:134024:1,108537:134026:2,108538:134027:1,108539:134028:1,108551:134047:1,108654:134183:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108664:134194:1,108665:134196:1,109002:134834:1,109667:135918:1,109668:135919:1,109669:135920:1,110080:136578:1,110081:136579:1,110420:137028:1,110442:137084:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(8, 63, 0, 'Default: simc/midnight MID1_Mage_Fire_Sunfury', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62112:80170:2,62114:80173:2,62115:80174:1,62119:80178:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,93524:115877:1,94643:117246:1,94644:117247:1,94645:117248:1,94646:117249:1,94647:117250:1,94648:117251:1,94649:117252:1,94650:117253:1,94651:117254:1,94652:117255:1,94653:117256:1,99829:123340:1,100989:124750:1,100995:124756:1,100998:124759:1,100999:124760:1,101007:135618:1,101009:124771:1,101019:124783:2,101024:124789:1,101027:124793:1,101029:124795:2,108654:134182:1,108656:134186:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108662:134192:2,109393:135600:1,109395:135603:1,109396:135604:1,109398:135606:1,109399:135607:1,109401:135609:1,109402:135610:1,109403:135612:1,109404:135613:2,109407:135616:1,109408:135617:1,109409:135602:1,109411:135621:1,109673:135924:1,109674:135925:1,109675:135926:1,109956:136441:1,110080:136578:1,110081:136579:1,110086:136587:1,110088:136589:1,110321:136878:1,110322:136879:1,110423:137037:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(8, 64, 0, 'Default: simc/midnight MID1_Mage_Frost_Spellslinger', '62085:80141:1,62086:80142:1,62091:80147:1,62094:126060:1,62096:80153:1,62098:80155:1,62100:80157:1,62102:80159:2,62104:80161:1,62105:80163:1,62107:80165:1,62112:80170:2,62114:80173:2,62115:80174:1,62116:80175:1,62117:80176:1,62122:80181:1,62123:80182:2,62124:80183:1,62125:134184:1,62127:80187:1,62129:80189:1,62150:134540:1,62153:80216:1,62157:80220:1,62164:80227:1,62170:80234:1,62173:80237:1,62176:80241:1,62177:80242:1,62178:80243:1,62179:80244:1,62180:80245:1,62181:80247:1,62182:80248:1,62184:80250:1,81468:102429:1,93524:115877:1,94654:117257:1,94655:117258:1,94656:117259:1,94657:128267:1,94658:117261:1,94659:117262:1,94660:117263:1,94661:117264:1,94662:117265:1,94663:117266:1,94664:117267:1,99828:123339:1,103771:134418:1,108653:134180:1,108654:134183:1,108655:134185:1,108657:134187:1,108658:134188:1,108659:134189:1,108660:134190:1,108661:134191:1,108849:134405:1,108850:134406:1,108851:134407:1,108852:134408:1,108855:134411:1,108858:134414:2,108859:134415:1,108864:134421:1,109667:135918:1,109668:135919:1,109669:135920:1,109915:136182:1,109916:136183:1,109956:136441:1,110081:136579:1,110258:136796:1,110283:136837:1,110422:137034:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Warlock =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(9, 265, 0, 'Default: simc/midnight MID1_Warlock_Affliction_Soul_Harvester', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91446:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71954:91465:1,71955:91466:1,71956:91468:1,71957:91469:1,72032:91552:1,72033:91553:1,72034:91554:1,72037:91558:1,72041:91562:1,72045:124692:1,72047:91568:1,72049:91570:1,72050:91571:1,72051:91572:1,72054:91576:1,72055:91577:2,72058:91580:2,94821:117418:1,94823:117420:1,94824:117421:1,94825:117422:1,94832:117429:1,94838:117435:1,94840:117437:1,94846:117443:1,94847:117444:1,94850:123840:1,94851:117448:1,94857:117454:1,99850:123384:1,100941:124694:1,102031:126064:1,102247:126303:1,109837:136096:1,109838:136097:1,109839:136098:1,109842:136102:2,109843:136103:1,109844:136104:1,109845:136105:1,109847:136107:1,109849:136109:1,109852:136112:1,109855:136115:1,109857:136117:1,109859:136119:1,109860:136120:1,109861:136121:1,109862:136122:1,109863:136123:1,109865:136125:2,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110269:136812:1,110270:136813:1,110405:136983:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(9, 266, 0, 'Default: simc/midnight MID1_Warlock_Demonology_Soul_Harvester', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91445:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71955:91466:1,71956:91468:1,71957:91469:1,94821:117418:1,94823:123839:1,94824:117421:1,94825:117422:1,94832:117429:1,94838:117435:1,94846:117443:1,94847:117444:1,94850:123840:1,94851:117448:1,94855:117452:1,94857:117454:1,99849:123383:1,100941:124694:1,101887:125829:2,101891:125834:1,101893:136731:1,101894:125837:1,101895:125839:1,101903:125848:2,101905:125850:1,101908:125854:1,101909:125855:1,101914:125860:2,101920:125866:1,101923:125869:1,109244:135306:1,109248:135310:1,109249:135311:2,109250:135312:1,109251:135313:1,109252:135314:1,109253:135315:1,109257:135319:1,109837:136096:1,109838:136097:1,109839:136098:1,109840:136100:1,109842:136102:2,109843:136103:1,109845:136105:1,109846:136106:1,109847:136107:1,109934:136227:1,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110191:136719:1,110193:136721:1,110194:136722:1,110197:136726:1,110198:136727:1,110404:136980:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(9, 267, 0, 'Default: simc/midnight MID1_Warlock_Destruction_Hellcaller', '71918:91425:1,71922:91430:1,71923:91431:1,71924:91432:2,71926:91434:1,71930:91438:1,71931:91439:1,71933:91441:1,71936:91444:1,71937:91445:1,71942:91452:1,71948:91459:1,71949:91460:1,71950:91461:2,71952:91463:2,71954:91465:1,71955:91466:1,71956:91468:1,71957:91469:1,71960:91473:1,71965:91478:1,71968:91481:1,71969:91482:2,71971:91484:1,71973:91486:1,71975:91489:1,71980:91496:1,71983:91500:2,71985:91502:1,72059:91581:1,72060:91582:1,72061:91583:1,72062:91584:1,72065:91588:1,72066:91589:2,72067:91590:1,72068:91591:1,72069:91592:1,94822:117419:1,94829:117426:1,94834:117431:1,94835:117432:1,94837:117434:1,94840:117437:1,94842:117439:1,94844:117441:1,94845:117442:1,94853:117450:1,94854:123310:1,94855:117452:1,99848:123382:1,100941:124694:1,101992:126002:1,101994:126004:1,108678:134219:1,108681:134221:1,109834:136093:1,109835:136094:1,109836:136095:1,109841:136101:1,109842:136102:2,109843:136103:1,109845:136105:1,109847:136107:1,110071:136568:1,110072:136569:1,110073:136570:1,110074:136571:1,110075:136572:1,110076:136573:1,110280:136833:1,110281:136834:2,110282:136835:1,110406:136986:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Monk =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(10, 268, 0, 'Default: simc/midnight MID1_Monk_Brewmaster', '101064:124838:1,101065:136148:1,101067:136146:1,101069:124843:1,101071:124845:1,101072:124846:1,101074:124848:2,101075:124849:1,101076:124850:1,101078:124852:1,101079:124854:1,101080:124855:1,101082:124857:1,101086:124863:1,101087:124864:1,101088:124865:1,101135:124924:1,101136:124926:1,101140:124930:1,101142:124932:1,101145:124935:1,101146:124936:1,101147:124937:1,101152:124943:1,101153:124944:1,101156:124948:1,101160:124954:1,101161:124955:1,101163:124957:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101177:124974:1,101178:124975:1,101179:124976:2,101181:124979:1,101182:124980:1,101183:124982:1,101184:124983:2,101187:124987:1,101188:124988:1,101190:124991:1,101193:124996:1,101195:124999:1,101197:125001:1,101198:125003:1,101201:125006:1,101202:125008:1,101219:125028:1,101220:125029:1,101221:125031:1,101222:125032:1,101223:125033:1,101224:125035:1,101225:125036:1,101226:125037:1,101227:125039:1,101228:125040:1,101229:125042:1,101230:125043:1,101248:125069:1,101711:125002:1,102004:124859:1,102433:126501:1,109694:135952:1,109695:135953:1,109696:135954:1,109826:136085:1,109827:136086:1,109882:136145:1,109910:136177:1,110435:137075:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(10, 269, 0, 'Default: simc/midnight MID1_Monk_Windwalker', '101035:124805:2,101036:124806:1,101037:124807:1,101039:124810:1,101044:126026:1,101045:124817:1,101048:124820:1,101051:124823:1,101052:124825:1,101053:124826:1,101054:124827:1,101055:124828:1,101056:124829:1,101057:124830:1,101059:124833:1,101060:124834:1,101136:124926:1,101137:124927:1,101140:124930:1,101142:124932:1,101146:124936:1,101147:124937:1,101149:124939:1,101150:124941:1,101153:124944:1,101159:124953:1,101160:124954:1,101162:124956:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101178:124975:1,101179:124976:2,101182:124980:1,101183:124982:1,101184:124983:2,101185:124984:1,101186:124985:1,101203:125009:1,101205:125012:1,101206:125013:1,101207:134452:1,101208:125015:1,101209:125016:1,101210:125017:1,101213:125020:1,101215:125022:1,101216:125023:1,101217:125025:1,101218:125026:1,101232:125046:1,101243:125062:1,101244:125063:1,101245:125065:1,101246:125066:1,101247:125068:1,101248:125069:1,101249:125070:1,101250:125071:1,101251:125072:1,101252:125073:1,101253:125074:1,101254:125076:1,108946:134543:1,109697:135955:1,109698:135956:1,109699:135957:1,110022:136514:1,110023:136515:1,110025:136518:1,110098:136599:1,110436:137076:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(10, 270, 0, 'Default: method.gg Mistweaver Monk (Conduit of the Celestials)', '101089:124866:1,101093:124871:1,101095:124873:1,101096:124875:1,101097:124876:1,101102:128221:1,101104:124885:1,101107:124888:1,101108:124889:1,101110:124891:1,101111:124892:2,101112:124893:1,101113:124894:1,101114:124896:2,101115:124897:1,101117:124899:1,101121:124905:1,101122:124906:1,101123:124907:1,101124:124908:2,101127:125932:1,101128:124913:1,101129:124915:1,101130:124916:1,101131:124918:1,101132:124920:1,101133:124921:1,101134:124922:1,101136:124926:1,101139:124929:1,101140:124930:1,101142:124932:1,101143:124933:1,101144:124934:1,101146:124936:1,101147:124937:1,101153:124944:1,101157:124949:1,101161:124955:1,101164:124958:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101179:124976:2,101183:124982:1,101185:124984:1,101186:124985:1,101223:125033:1,101231:125045:1,101233:125049:1,101234:125050:1,101235:125052:1,101236:125054:1,101237:125055:1,101238:125056:1,101239:125058:1,101240:125059:1,101242:125061:1,102432:126500:1,109516:135749:1,109700:135958:1,109701:135959:1,110019:136510:1,110021:136512:1,110024:136517:1,110026:136519:1,110027:136520:1,110067:136562:1,110097:136598:1,110211:136747:1,110218:136754:1', 'https://www.method.gg/guides');
-- ===== Druid =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(11, 102, 0, 'Default: simc/midnight MID1_Druid_Balance', '82198:103276:1,82201:103279:1,82202:103280:1,82206:103284:1,82207:128589:1,82208:103286:1,82209:103287:1,82210:103288:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82228:103306:1,82229:103307:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82237:103316:1,82241:103320:1,82246:103326:1,88201:109833:1,88202:109834:1,88203:109835:1,88204:109836:1,88206:109839:1,88207:109840:2,88208:109842:1,88212:109846:1,88213:109847:1,88214:109848:2,88215:109849:1,88218:109852:1,88221:109856:1,88222:109857:1,88223:109858:1,88224:109859:1,88225:109861:1,88226:109862:1,88227:109863:2,88231:109867:1,88234:109870:1,88235:109871:1,88236:109872:1,91048:115458:1,92229:114300:1,93714:116102:1,94585:117772:1,94586:117178:1,94587:117179:1,94588:117181:1,94590:117183:1,94594:117769:1,94596:117190:1,94597:123304:1,94598:117193:1,94600:117195:1,94607:117204:1,94608:117205:1,99808:123302:1,100174:123793:1,100175:123794:1,100176:123795:1,100177:123796:2,100223:123868:1,103846:128230:1,103847:128231:1,104078:128579:1,104080:128584:1,104083:128588:1,104085:128591:1,108032:133404:1,109718:135976:1,109719:135977:1,109720:135978:1,110421:137031:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(11, 103, 0, 'Default: simc/midnight MID1_Druid_Feral_Wildstalker', '82088:103147:1,82091:103150:1,82092:103152:1,82096:103157:1,82098:103159:1,82099:103160:1,82100:103161:1,82101:103162:1,82102:103163:1,82103:103164:1,82104:103165:1,82106:103167:1,82107:103168:1,82108:103170:1,82110:103173:1,82111:103174:1,82112:103175:1,82113:103176:1,82114:103177:1,82115:103179:2,82116:103180:1,82118:103182:1,82119:103183:1,82121:103185:2,82122:103186:1,82123:103187:1,82124:103188:1,82198:103276:1,82199:103277:1,82206:103284:1,82207:128589:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82222:103300:1,82223:103301:1,82224:103302:1,82225:103303:2,82228:103306:1,82229:103307:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82239:103318:1,82241:103320:1,82242:103322:1,82243:103323:2,82244:103324:1,82246:103326:1,92641:114771:1,94609:117206:1,94621:117221:1,94622:119855:1,94623:117223:1,94624:117224:1,94625:117225:1,94626:117226:1,94627:117227:1,94628:117229:1,94629:117231:1,94630:117232:1,94631:117234:1,99805:123296:1,100175:123794:1,100176:123795:1,100177:123796:2,104078:128580:1,104080:128584:1,104081:128585:1,104085:128591:1,109715:135973:1,109716:135974:1,109717:135975:1,110426:137046:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(11, 104, 0, 'Default: simc/midnight MID1_Druid_Guardian', '82126:103190:1,82127:103191:1,82129:103193:1,82131:103195:1,82135:103199:1,82136:103201:1,82138:103203:2,82140:103206:1,82142:103209:1,82143:103210:2,82145:103212:1,82146:103213:2,82147:135336:1,82149:103216:1,82152:103221:1,82153:103222:1,82160:103229:1,82161:103230:1,82198:103276:1,82199:103277:1,82206:103284:1,82208:103286:1,82209:103287:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82223:103301:1,82224:103302:1,82225:103303:2,82227:103305:1,82228:103306:1,82229:103307:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82237:103316:1,82239:103318:1,82241:103320:1,82242:103322:1,82243:103323:1,82246:103326:1,91044:112967:1,91046:112969:1,92226:103208:1,92227:103218:1,92585:114698:1,92586:114699:1,92587:114700:1,94608:117205:1,94609:117206:1,94610:117207:1,94611:117208:1,94612:117210:1,94613:117211:1,94614:117214:1,94615:117215:1,94616:117216:1,94618:117218:1,94619:117219:1,94620:117220:1,99807:123301:1,100175:123794:1,100176:123795:1,104078:128580:1,104080:128584:1,104081:128585:1,104085:128591:1,109375:135568:1,109377:135491:1,109378:135570:1,109379:135490:1,109721:135979:1,109722:135980:1,109723:136624:1,110431:137061:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(11, 105, 0, 'Default: method.gg Restoration Druid (Wildstalker)', '82043:117104:1,82045:103096:1,82047:103098:1,82049:103100:1,82050:103101:1,82051:103102:1,82052:103105:1,82053:103106:1,82054:103108:1,82055:103109:1,82057:103111:1,82058:103112:1,82059:103113:1,82060:103114:1,82063:103118:1,82064:103119:1,82065:103121:1,82068:103124:1,82071:103127:1,82072:103128:1,82073:103129:1,82074:114809:1,82076:103132:1,82079:103137:1,82082:103141:1,82083:103142:1,82198:103275:1,82205:103283:1,82206:103284:1,82207:128589:1,82209:103287:1,82210:103288:1,82214:103292:2,82217:103295:1,82218:103296:1,82219:103297:1,82220:103298:1,82225:103303:2,82228:103306:1,82229:103307:1,82230:103308:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82240:103319:1,82243:103323:2,82244:103324:1,94600:117195:1,94621:117221:1,94622:119855:1,94623:117223:1,94624:117224:1,94625:117225:1,94626:117226:1,94627:117227:1,94628:117229:1,94629:117231:1,94630:117232:1,94631:117233:1,99806:123298:1,100173:123792:1,100175:123794:1,100176:123795:1,100177:123796:2,100223:123868:1,103873:128274:1,103874:128708:1,103876:128277:1,104082:128586:1,104084:128590:1,104085:128591:1,104125:128707:1,109715:135973:1,109716:135974:1,109717:135975:1,110424:137040:1', 'https://www.method.gg/guides');
-- ===== Demon Hunter =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(12, 577, 0, 'Default: simc/midnight MID1_Demon_Hunter_Havoc_Fel-Scarred', '90914:112823:1,90919:112828:1,90921:112830:1,90922:112831:1,90923:112832:1,90925:112834:1,90928:112838:1,90929:112839:1,90931:112841:1,90933:112844:1,90934:112845:1,90935:112846:2,90936:112847:2,90937:112848:1,90938:112849:1,90941:112852:1,90942:112853:1,90946:112859:1,90948:112861:1,90949:112862:2,90950:112863:1,90993:112911:1,90994:117768:1,90997:117755:1,91000:112918:2,91001:112919:1,91002:112921:1,91003:112923:1,91004:112924:2,91006:112926:1,91007:112927:1,91008:112928:1,91011:112932:1,91012:117764:1,91013:112934:1,91015:112936:2,91017:112938:1,91018:112939:1,91021:117744:1,91022:112944:1,91024:117765:1,91025:112948:1,91026:112949:1,91027:112950:1,91028:112951:1,91032:112955:1,91034:112957:2,91036:112959:1,93013:115244:1,93015:115246:1,93016:115248:1,94899:124010:1,94901:117498:1,94902:117499:1,94904:117501:1,94905:117502:1,94909:117506:1,94912:117509:1,94913:124011:1,94915:117512:1,94916:117513:1,94917:117514:1,94918:117515:1,95143:117741:1,95147:117754:2,95149:117758:1,95150:117759:1,95152:117762:1,99824:123329:1,109772:136030:1,109773:136031:1,109774:136032:1,110011:136501:1,110427:137049:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(12, 581, 0, 'Default: simc/midnight MID1_Demon_Hunter_Vengeance_Annihilator', '90929:112839:1,90931:112841:1,90933:112844:1,90934:112845:1,90935:112846:2,90936:112847:2,90938:112849:1,90941:112852:1,90942:112853:1,90946:112859:1,90948:112861:1,90949:112862:2,90950:112863:1,90951:112864:1,90952:112865:1,90953:112866:1,90955:112868:1,90958:112872:2,90959:112873:1,90960:112875:1,90961:112876:1,90962:112877:2,90963:112878:1,90964:112879:1,90968:112883:1,90970:112886:1,90971:112887:1,90972:112888:1,90974:112890:1,90975:112891:1,90977:112893:1,90978:112894:1,90980:112896:1,90981:112897:2,90984:112900:1,90986:112902:1,90987:112903:1,90989:112906:1,90990:112907:1,90991:112908:1,90994:112912:1,90996:112914:2,90999:112917:1,91000:112918:2,91001:112920:1,91002:112921:1,91004:112924:2,91006:112926:1,91007:112927:1,95149:117758:1,95150:117759:1,95151:117761:1,95152:117762:1,99823:134253:1,108722:134271:1,108729:134282:1,109442:135660:1,109443:135661:1,109444:135662:1,109445:135663:1,109446:135664:1,109447:135665:1,109448:135659:1,109449:135667:1,109450:136810:1,109451:135669:1,109452:135670:1,109453:135671:1,109454:135672:1,109455:135673:1,110011:136501:1,110425:137043:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- ===== Evoker =====
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(13, 1467, 0, 'Default: simc/midnight MID1_Evoker_Devastation_SC', '93272:115578:1,93273:115579:1,93274:115580:2,93275:115581:1,93280:115587:1,93281:115588:2,93284:115592:1,93285:115593:1,93289:115597:1,93294:115602:1,93295:115603:2,93297:115606:1,93298:115607:1,93300:115609:1,93302:115611:2,93304:115613:1,93305:115614:1,93306:115615:1,93309:115618:1,93310:115619:2,93311:115620:1,93312:115621:1,93313:115623:1,93314:115624:1,93316:115627:1,93318:115630:1,93319:115631:1,93320:115632:1,93322:115634:1,93323:115635:1,93324:115636:1,93325:115637:1,93326:115638:1,93327:115639:1,93328:115640:1,93329:115641:1,93330:115642:1,93331:115643:1,93332:115645:1,93333:115646:1,93334:115647:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93346:115661:1,93348:115663:1,93349:115664:2,93350:115665:1,93351:115666:1,93352:115667:1,93353:115668:1,93354:115669:1,93355:115670:2,93366:115683:1,93715:116103:1,94921:117518:1,94928:117525:1,94933:117530:1,94934:117531:1,94936:117533:1,94939:117536:1,94941:117538:1,94943:120123:1,94944:117541:1,94950:117547:1,94952:117549:1,94953:117550:1,98931:122279:1,99827:123333:1,103843:128216:1,103844:128217:1,109793:136051:1,109794:136052:1,109795:136053:1,110064:136559:1,110414:137010:1', 'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1'),
(13, 1468, 0, 'Default: method.gg Preservation Evoker (Chronowarden Raid)', '93238:115540:1,93239:115541:1,93240:115542:1,93241:115543:1,93242:115544:1,93243:115546:1,93245:115549:1,93246:115550:1,93250:115554:1,93253:115557:1,93254:115558:2,93255:115559:1,93257:115561:1,93258:115562:1,93260:115565:1,93262:115567:1,93263:115568:2,93264:115570:1,93265:115571:1,93266:115572:1,93267:115573:1,93268:115574:2,93269:115575:1,93271:115577:1,93288:115596:1,93289:115597:1,93291:115599:1,93292:115600:2,93294:115602:1,93299:115608:1,93300:115609:1,93302:115611:2,93304:115613:1,93306:115615:1,93308:115617:1,93309:115618:1,93310:115619:2,93311:115620:1,93336:115650:1,93337:115651:1,93338:115652:1,93339:115653:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93346:115661:1,93347:115662:2,93348:115663:1,93350:115665:1,93351:125610:1,93352:115667:1,93353:115668:1,93354:115669:1,93355:115670:2,93715:116103:1,94925:117522:1,94929:117526:1,94930:126310:1,94932:117786:1,94935:117532:1,94942:117539:1,94947:117544:1,94948:117545:1,94950:117547:1,94951:117548:1,94954:117551:1,94955:117552:1,99826:123335:1,103843:128216:1,109508:135741:1,109509:135742:1,109510:135743:1,110064:136559:1,110413:137007:1', 'https://www.method.gg/guides'),
(13, 1473, 0, 'Default: method.gg Augmentation Evoker (Chronowarden ST+Cleave)', '93195:115493:1,93197:115495:1,93198:115496:1,93199:115690:1,93200:115498:1,93201:115499:1,93202:115500:1,93203:115502:1,93205:115504:1,93206:115505:1,93207:115506:1,93208:115507:1,93209:115508:1,93211:115511:1,93212:115512:1,93219:115519:1,93220:115520:1,93221:115521:1,93222:115522:1,93223:115523:1,93226:115527:1,93229:115530:1,93232:115533:1,93234:115536:1,93271:115577:1,93287:115595:1,93288:115596:1,93289:115597:1,93290:115598:1,93295:115603:2,93300:115609:1,93302:115611:2,93304:115613:1,93305:115614:1,93306:115615:1,93308:115617:1,93309:115618:1,93310:115619:2,93311:115620:1,93312:115621:1,93340:115654:1,93341:115655:1,93343:115657:1,93344:115658:1,93345:115660:1,93346:115661:1,93348:115663:1,93349:115664:2,93350:115665:1,93351:115666:1,93352:115667:1,93354:115669:1,93355:115670:2,93358:115675:1,93367:115685:1,93368:115688:1,93369:115686:1,93715:116103:1,94925:117522:1,94929:117526:1,94930:126310:1,94932:117529:1,94935:117532:1,94942:117539:1,94947:117544:1,94948:117545:1,94951:117548:1,94954:117551:1,94955:117552:1,98931:122279:1,99825:123334:1,102248:126304:1,102249:126305:1,103843:128216:1,109508:135741:1,109509:135742:1,109510:135743:1,110415:137013:1', 'https://www.method.gg/guides');
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (7, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
@@ -0,0 +1,117 @@
-- Migration: 0008_talent_builds_per_context
-- Date: 2026-05-07
-- Purpose: Populate per-context (M+/PvP/Leveling) talent loadouts in
-- playerbot_v2_talent_build for the subset of (class, spec, context)
-- tuples where a curated build is honestly sourceable today.
--
-- Research summary
-- ----------------
-- 1. simc/midnight branch (the source for 0004_simc_seed.sql) publishes ONLY
-- raid profiles for Midnight (profiles/MID1/MID1_*.simc). There are no
-- M+/PvP/Leveling .simc files on that branch — the directory listing
-- confirms 50 raid-only profiles. Historic dragonflight branches had the
-- same convention. Conclusion: simc cannot seed contexts 2/3/4.
--
-- 2. method.gg / wowhead publish per-context builds as base64 talent strings
-- on guide pages. Decoding them requires (a) the simc trait_data.inc DB
-- for the live wow build (currently 12.0.5.67314 — used by 0004) and
-- (b) re-running decode_simc.py against fresh profile headers. The
-- trait_data.inc isn't checked in (decode_simc.py expects it at
-- src/modules/PlayerbotV2/Bot/Talent/data/trait_data.inc; not present
-- in this tree), and bulk-decoding 30-100 fresh strings is out of scope
-- for a one-shot migration. Deferred for a future pass.
--
-- 3. TraitMgr starter builds (DB2-driven SkillLine_TraitTree starters) cover
-- the Leveling case natively — at sub-cap level the TraitMgr starter is
-- objectively correct (player doesn't have all talent points yet), and
-- the API loader in PlayerbotAPI.cpp already falls back to TraitMgr when
-- no curated row matches. Seeding curated max-level loadouts for
-- context=4/Leveling would actively harm low-level bots, so we
-- intentionally do NOT populate Leveling.
--
-- 4. PvP talents come from a separate system (PvP_Talent.db2 — not the
-- Trait_*.db2 family that this table represents). A "context=3 PvP"
-- talent row would only carry the PvE talents you'd take for arenas/BGs;
-- it cannot encode honor talents. Without a sourced/curated PvP-PvE-talent
-- string per spec we'd just be mirroring the raid build with a misleading
-- label. Deferred for a future pass.
--
-- What this migration ships
-- -------------------------
-- Tank M+ rows (context=2). For tank specs, the high-key M+ build and the
-- raid build genuinely overlap — both prioritize survivability + threat +
-- single-target/cleave throughput, and method.gg/Wowhead routinely publish
-- a single "Mythic+ / Raid" combined build per tank spec. Mirroring 0004's
-- raid loadout into context=2 with an honest "mirrors raid build" label
-- gives the M+ branch of the API a genuine curated build instead of
-- bouncing off context=2 → context=0 fallback for every tank dispatch.
--
-- Coverage: 6/117 rows (6 tank specs × M+ context).
-- Remaining 111 rows deferred — see notes 1-4 above.
-- Reverts: yes (DELETE rows; re-run the migration to repopulate).
-- Populated 6/117 rows
-- ===== Tank M+ (context=2): mirror of curated raid build =====
-- Each entries_json below is byte-for-byte identical to the corresponding
-- row in 0004_simc_seed.sql (context=1) / 0007_talent_builds_seed.sql
-- (context=0). Honest "mirrors raid" label so future maintainers know to
-- re-source these when method.gg ships a divergent M+ build.
-- Protection Warrior (class 1, spec 73) — simc/midnight raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(1, 73, 2, 'M+: mirrors raid (simc/midnight MID1_Warrior_Protection)',
'90261:112112:1,90264:132884:1,90265:112116:1,90295:112149:1,90296:112150:1,90297:112151:1,90298:112152:1,90301:112155:1,90302:112156:1,90303:112157:1,90304:112158:1,90305:112159:1,90306:112160:1,90308:112162:1,90309:112163:1,90310:112165:1,90311:112166:2,90312:132885:1,90314:112170:1,90317:112173:1,90318:112174:1,90319:112176:1,90320:112177:1,90324:112181:2,90326:112183:1,90328:112185:1,90329:112186:1,90330:112187:1,90331:112188:1,90343:112205:1,90346:112208:1,90351:112215:1,90352:112216:1,90353:112217:1,90355:112219:1,90360:112224:2,90366:112233:2,90368:112235:2,90371:112238:1,90378:112245:1,90381:112248:2,90382:112249:1,90385:112253:1,90432:112304:1,90433:112305:1,90448:112321:1,90449:112323:1,90451:112325:1,94785:117382:1,94792:118834:1,94797:117394:1,94798:117395:1,94800:117397:1,94803:117400:1,94805:117402:1,94807:117404:1,94808:117405:1,94816:117413:1,94817:118835:1,95956:118850:1,95959:118853:1,99851:123388:1,107577:132882:1,107578:132883:1,108542:134031:1,108543:134032:1,108544:134033:1,108686:134226:1,108705:136627:1,109391:135597:1,109809:136068:1,109810:136069:1,109811:136070:1,110118:136625:1,110119:136626:1,110411:137001:1',
'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- Protection Paladin (class 2, spec 66) — simc/midnight raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(2, 66, 2, 'M+: mirrors raid (simc/midnight MID1_Paladin_Protection)',
'81469:102431:1,81470:102432:1,81471:102433:2,81472:102435:1,81477:102440:1,81479:102443:1,81481:102445:1,81482:102446:2,81483:102448:1,81485:102450:2,81486:102452:1,81487:102453:1,81489:102455:1,81490:102456:1,81493:102461:1,81494:102463:1,81495:102464:1,81498:102467:1,81499:102468:1,81501:102470:1,81502:102471:1,81503:102472:1,81505:136732:1,81506:102475:1,81507:102476:1,81510:133481:1,81597:102583:1,81600:102587:1,81603:102590:1,81604:102591:1,81605:102592:1,81607:102595:1,81609:102597:1,81612:102600:1,81614:102602:1,81616:102604:1,81617:102606:1,81621:102612:2,81629:102621:1,81630:102622:2,81631:128251:1,81632:102625:1,90062:111886:1,93010:102623:1,93187:115479:1,93192:128244:1,93357:115673:1,95177:117810:1,95178:117811:1,95179:117812:1,95180:117813:1,95181:117858:1,95182:117815:1,95183:117816:1,95184:117818:1,95185:117819:1,95186:117822:1,95187:117823:1,95234:117882:1,99838:123358:1,101927:102451:1,103851:128241:2,103855:128250:1,103857:128253:1,103858:128254:2,103859:128255:1,103860:128256:1,103867:128263:1,103868:128264:1,103877:128278:1,109745:136003:1,109746:136004:1,109747:136005:1,109999:136487:1,110006:136496:1,110012:136503:1,110418:137022:1',
'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- Blood Death Knight (class 6, spec 250) — method.gg raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(6, 250, 2, 'M+: mirrors raid (method.gg Blood DK San''layn)',
'76039:96167:1,76041:96169:1,76042:96170:1,76043:96171:1,76045:96173:1,76046:96174:1,76048:96176:1,76051:96179:1,76052:96180:2,76054:96182:2,76055:96183:1,76056:96184:1,76057:96186:1,76058:96187:1,76061:96190:1,76064:96193:1,76065:96194:1,76066:96195:1,76067:96196:1,76068:96197:1,76069:96198:2,76071:96200:1,76072:96201:1,76073:96202:1,76074:96203:1,76076:96205:1,76079:96208:2,76080:96209:1,76081:96210:1,76084:96213:1,76085:96214:1,76087:96216:1,76124:96255:1,76125:96256:1,76126:96257:2,76127:96258:1,76128:96259:1,76129:96260:1,76130:96261:1,76131:96262:1,76132:96263:1,76133:96264:1,76135:96266:1,76137:96268:1,76138:96269:1,76141:96273:1,76142:96274:1,76144:96277:1,76146:96279:1,76168:96303:1,76169:96304:1,76170:96305:1,76171:96306:1,76172:96307:1,76173:96308:1,95033:117630:1,95040:117637:1,95045:117642:1,95046:117643:1,95048:136836:1,95051:117648:1,95053:117650:1,95055:117652:1,95056:117891:1,95062:117659:1,95064:117661:1,95065:117662:1,99822:123325:1,102007:126015:1,102008:126016:1,102243:126298:1,102244:126300:1,109736:135994:1,109737:135995:1,109738:135996:1,110030:136524:1,110353:136917:1',
'https://www.method.gg/guides');
-- Brewmaster Monk (class 10, spec 268) — simc/midnight raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(10, 268, 2, 'M+: mirrors raid (simc/midnight MID1_Monk_Brewmaster)',
'101064:124838:1,101065:136148:1,101067:136146:1,101069:124843:1,101071:124845:1,101072:124846:1,101074:124848:2,101075:124849:1,101076:124850:1,101078:124852:1,101079:124854:1,101080:124855:1,101082:124857:1,101086:124863:1,101087:124864:1,101088:124865:1,101135:124924:1,101136:124926:1,101140:124930:1,101142:124932:1,101145:124935:1,101146:124936:1,101147:124937:1,101152:124943:1,101153:124944:1,101156:124948:1,101160:124954:1,101161:124955:1,101163:124957:1,101165:124960:1,101166:124961:2,101167:124962:1,101168:124963:1,101169:124964:2,101170:124965:1,101173:124968:1,101174:124970:1,101175:124971:1,101177:124974:1,101178:124975:1,101179:124976:2,101181:124979:1,101182:124980:1,101183:124982:1,101184:124983:2,101187:124987:1,101188:124988:1,101190:124991:1,101193:124996:1,101195:124999:1,101197:125001:1,101198:125003:1,101201:125006:1,101202:125008:1,101219:125028:1,101220:125029:1,101221:125031:1,101222:125032:1,101223:125033:1,101224:125035:1,101225:125036:1,101226:125037:1,101227:125039:1,101228:125040:1,101229:125042:1,101230:125043:1,101248:125069:1,101711:125002:1,102004:124859:1,102433:126501:1,109694:135952:1,109695:135953:1,109696:135954:1,109826:136085:1,109827:136086:1,109882:136145:1,109910:136177:1,110435:137075:1',
'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- Guardian Druid (class 11, spec 104) — simc/midnight raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(11, 104, 2, 'M+: mirrors raid (simc/midnight MID1_Druid_Guardian)',
'82126:103190:1,82127:103191:1,82129:103193:1,82131:103195:1,82135:103199:1,82136:103201:1,82138:103203:2,82140:103206:1,82142:103209:1,82143:103210:2,82145:103212:1,82146:103213:2,82147:135336:1,82149:103216:1,82152:103221:1,82153:103222:1,82160:103229:1,82161:103230:1,82198:103276:1,82199:103277:1,82206:103284:1,82208:103286:1,82209:103287:1,82214:103292:2,82218:103296:1,82219:103297:1,82220:103298:1,82223:103301:1,82224:103302:1,82225:103303:2,82227:103305:1,82228:103306:1,82229:103307:1,82231:103309:1,82232:128581:1,82233:103311:2,82234:103312:1,82235:103313:1,82236:103314:1,82237:103316:1,82239:103318:1,82241:103320:1,82242:103322:1,82243:103323:1,82246:103326:1,91044:112967:1,91046:112969:1,92226:103208:1,92227:103218:1,92585:114698:1,92586:114699:1,92587:114700:1,94608:117205:1,94609:117206:1,94610:117207:1,94611:117208:1,94612:117210:1,94613:117211:1,94614:117214:1,94615:117215:1,94616:117216:1,94618:117218:1,94619:117219:1,94620:117220:1,99807:123301:1,100175:123794:1,100176:123795:1,104078:128580:1,104080:128584:1,104081:128585:1,104085:128591:1,109375:135568:1,109377:135491:1,109378:135570:1,109379:135490:1,109721:135979:1,109722:135980:1,109723:136624:1,110431:137061:1',
'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- Vengeance Demon Hunter (class 12, spec 581) — simc/midnight raid loadout.
INSERT IGNORE INTO playerbot_v2_talent_build
(class_id, spec_id, context, label, entries_json, source_url) VALUES
(12, 581, 2, 'M+: mirrors raid (simc/midnight MID1_DH_Vengeance_Annihilator)',
'90929:112839:1,90931:112841:1,90933:112844:1,90934:112845:1,90935:112846:2,90936:112847:2,90938:112849:1,90941:112852:1,90942:112853:1,90946:112859:1,90948:112861:1,90949:112862:2,90950:112863:1,90951:112864:1,90952:112865:1,90953:112866:1,90955:112868:1,90958:112872:2,90959:112873:1,90960:112875:1,90961:112876:1,90962:112877:2,90963:112878:1,90964:112879:1,90968:112883:1,90970:112886:1,90971:112887:1,90972:112888:1,90974:112890:1,90975:112891:1,90977:112893:1,90978:112894:1,90980:112896:1,90981:112897:2,90984:112900:1,90986:112902:1,90987:112903:1,90989:112906:1,90990:112907:1,90991:112908:1,90994:112912:1,90996:112914:2,90999:112917:1,91000:112918:2,91001:112920:1,91002:112921:1,91004:112924:2,91006:112926:1,91007:112927:1,95149:117758:1,95150:117759:1,95151:117761:1,95152:117762:1,99823:134253:1,108722:134271:1,108729:134282:1,109442:135660:1,109443:135661:1,109444:135662:1,109445:135663:1,109446:135664:1,109447:135665:1,109448:135659:1,109449:135667:1,109450:136810:1,109451:135669:1,109452:135670:1,109453:135671:1,109454:135672:1,109455:135673:1,110011:136501:1,110425:137043:1',
'https://github.com/simulationcraft/simc/tree/midnight/profiles/MID1');
-- Future work
-- -----------
-- M+ for DPS specs (16 specs × M+) — needs fresh decode of method.gg /
-- wowhead M+ talent strings. Most diverge from raid in cleave/AoE rows.
-- M+ for healers (6 specs × M+) — needs fresh decode; healer M+ vs raid
-- diverges on dispel/utility nodes.
-- PvP (39 specs × PvP) — separate db2 system; this table can encode the
-- PvE talents you'd take for arenas/BGs but cannot encode honor talents.
-- Defer until a curated source publishes per-spec PvE-only PvP loadouts.
-- Leveling (39 specs × Leveling) — DO NOT seed; TraitMgr starter is
-- objectively correct for sub-cap chars and the API loader already
-- falls back to it when no curated row exists.
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (8, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
+78
View File
@@ -0,0 +1,78 @@
-- Migration: 0009_world_metadata
-- Date: 2026-05-22
-- Purpose: Persist GM-curated world-knowledge points (road centerlines,
-- city/village footprints, crossroads, danger zones, hubs)
-- so bots have authoritative situational data independent of
-- texture-classifier heuristics. Two consumers:
-- 1. mmaps_generator reads `kind='road'` rows at regen time
-- and tags polygons within `radius` as NAV_AREA_ROAD.
-- Solves the Teldrassil road-tagging gap (kalidar
-- tileset's road textures don't pass the classifier's
-- effectId confidence gate, leaving zero road MCNKs in
-- .road files despite road textures being referenced).
-- 2. BotSnapshotBuilder loads same rows once at startup
-- and bots query `nearest_metadata(kind)` for awareness
-- — "am I in a city?", "is the nearest crossroad N
-- yards away?", etc.
-- Reverts: yes (DROP TABLE).
--
-- Population mechanism: in-game GM types `.playerbot meta add road [r]`
-- standing on the spot to capture; the command writes a row keyed by
-- the GM's current position and zone. List/edit/delete subcommands
-- provided. No client-side editor — the in-game capture flow IS the
-- editor.
--
-- Schema versioning: kinds enumerated as a small uint8 set rather than
-- VARCHAR so the on-disk column is fixed-width and the C++ side can
-- compare against an enum without string match. Names below match
-- WorldMetadataKind in code:
-- 0=unknown (defensive default)
-- 1=road (road centerline waypoint; mmaps_generator consumes)
-- 2=crossroad (intersection — used by route planner hints)
-- 3=city (capital / major settlement footprint)
-- 4=village (minor settlement footprint)
-- 5=hub (quest hub / outpost)
-- 6=danger (avoid-this-area, e.g. elite spawn zone)
-- 7=vendor (general vendor anchor — bot navigation hint)
-- 8=mailbox (mailbox anchor)
-- 9=innkeeper (innkeeper anchor, e.g. hearth-rebind target)
-- 10=other (operator-defined; check label/notes for context)
--
-- `radius` (yards) is mandatory for area-kinds (city/village/hub/
-- danger). For point-kinds (road waypoint, crossroad, vendor, mailbox,
-- innkeeper) radius is the "effective range" — e.g. road waypoint with
-- radius=15 means polygons within 15y of the point get NAV_AREA_ROAD
-- tagged. Default radii are picked by the GM command, not the schema.
--
-- `zone_id` (Area.db2 ID) is denormalized for fast filter; we DO NOT
-- enforce FK because the area table lives in client data we don't
-- mirror.
--
-- Indexes: (map_id, kind) for the most common query (load all roads
-- for map X), plus (map_id, x, y) for nearest-point lookups via the
-- bot snapshot.
CREATE TABLE IF NOT EXISTS playerbot_v2_world_metadata (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
map_id INT UNSIGNED NOT NULL,
zone_id INT UNSIGNED NOT NULL DEFAULT 0,
kind TINYINT UNSIGNED NOT NULL,
pos_x FLOAT NOT NULL,
pos_y FLOAT NOT NULL,
pos_z FLOAT NOT NULL,
radius FLOAT NOT NULL DEFAULT 10.0,
label VARCHAR(96) NOT NULL DEFAULT '',
notes VARCHAR(255) NOT NULL DEFAULT '',
created_by VARCHAR(64) NOT NULL DEFAULT '',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
KEY idx_map_kind (map_id, kind),
KEY idx_map_xy (map_id, pos_x, pos_y),
KEY idx_zone (zone_id),
KEY idx_kind (kind)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO playerbot_v2_schema_version (version, sha256) VALUES
(9, REPEAT('0', 64))
ON DUPLICATE KEY UPDATE applied_at = CURRENT_TIMESTAMP;
+44
View File
@@ -0,0 +1,44 @@
-- Migration: 0010_leveling_zone
-- Date: 2026-06-03
-- Purpose: Persistent per-bot leveling-zone target for R7 cross-map hub
-- relocation. When a bot exhausts its current zone's quests, it
-- picks the best level-appropriate hub from QuestHubDatabase::
-- GetQuestHubsForBot (ContentTuning DB2 bracket matrix) and STORES
-- the choice here so it is STICKY: on server restart the bot reads
-- this target and resumes traveling toward it instead of re-picking
-- (which, being distance-ranked, would flip-flop / relocate every
-- restart). The choice is re-evaluated only with HYSTERESIS — when
-- the bot's level moves OUTSIDE [bracket_lo, bracket_hi], the stored
-- hub no longer fits and a fresh pick + store happens. 0 hub = unset
-- (bot has never needed relocation, or is mid-pick).
-- Reverts: yes (DROP COLUMN per added column).
ALTER TABLE playerbot_v2_character
ADD COLUMN leveling_target_hub INT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN leveling_target_map SMALLINT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN leveling_bracket_lo TINYINT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN leveling_bracket_hi TINYINT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN leveling_chosen_at TIMESTAMP NULL DEFAULT NULL,
ADD KEY idx_leveling_target_hub (leveling_target_hub);
-- Column docs (kept below the ALTER so the migration body stays a single
-- statement, per the 0005 convention — the migration parser chokes on
-- comment-embedded semicolons inside the statement):
-- leveling_target_hub QuestHub.hubId the bot is relocating toward (the
-- sticky leveling-zone choice). 0 = unset.
-- leveling_target_map Map id of that hub. Drives the UnifiedTravelGraph
-- cross-map route (walk/fly/ship — never teleport).
-- NOTE map 0 (Eastern Kingdoms) is a REAL map, so
-- this field is only meaningful when target_hub != 0.
-- leveling_bracket_lo Inclusive min level of the chosen hub's
-- leveling_bracket_hi ContentTuning bracket. Hysteresis gate: re-pick a
-- new hub only when bot.level < lo OR > hi, so a bot
-- that out-levels its zone moves on, but small level
-- gains inside the bracket do NOT churn the choice.
-- leveling_chosen_at When the current target was chosen. Diagnostics +
-- a safety re-pick if a target somehow goes stale
-- (e.g. the hub became unreachable).
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256)
VALUES (10, 'pending-fill-at-release-time-with-actual-sha256-of-this-file');
+56
View File
@@ -0,0 +1,56 @@
-- Migration: 0011_fleet_vitals
-- Date: 2026-06-14
-- Purpose: Persist the fleet-vitals rolling window (#1C of
-- docs/LIVING_SERVER_PLAN_20260614.md) so telemetry survives a
-- worldserver restart and the operator gets a REAL trend / incident
-- replay instead of an in-memory window that resets to zero on every
-- bounce. A 60s job in PlayerbotV2.cpp computes one sample bucket
-- (the same VitalsBucket pushed into PerfCounters' in-memory ring)
-- and writes one row here.
--
-- Columns mirror PerfCounters::VitalsBucket plus the per-category
-- wedge breakdown (cheap to store, makes the persisted history
-- self-describing for a later trend dashboard). Counts are the
-- instantaneous fleet census at sample time; the *_per_* columns are
-- rates derived over the 60s window from cumulative-counter deltas.
--
-- Reverts: yes (DROP TABLE).
--
-- Retention: the writer does NOT prune — a row/min is ~525K rows/yr, trivial
-- for InnoDB, and operators want the long-tail history for incident
-- forensics. If retention is ever needed it's a single scheduled
-- DELETE on sample_at; intentionally left to operator policy.
--
-- Indexing: PRIMARY KEY on the auto-increment id; a secondary KEY on
-- sample_at for the common "last 1h / last 24h" range scan the trend
-- reader issues.
CREATE TABLE IF NOT EXISTS playerbot_v2_fleet_vitals_sample (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
sample_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
in_world INT UNSIGNED NOT NULL DEFAULT 0,
alive INT UNSIGNED NOT NULL DEFAULT 0,
in_combat INT UNSIGNED NOT NULL DEFAULT 0,
wedged INT UNSIGNED NOT NULL DEFAULT 0,
-- Per-category active wedge counts (WedgeCategory enum order; None at
-- index 0 is normally 0). Stored as discrete columns so a SQL trend query
-- can GROUP/aggregate a single category without parsing a blob.
wedged_navmesh INT UNSIGNED NOT NULL DEFAULT 0,
wedged_offmesh INT UNSIGNED NOT NULL DEFAULT 0,
wedged_travel INT UNSIGNED NOT NULL DEFAULT 0,
wedged_combatloop INT UNSIGNED NOT NULL DEFAULT 0,
wedged_pickernone INT UNSIGNED NOT NULL DEFAULT 0,
wedged_goalunreach INT UNSIGNED NOT NULL DEFAULT 0,
tick_p50_us INT UNSIGNED NOT NULL DEFAULT 0,
tick_p99_us INT UNSIGNED NOT NULL DEFAULT 0,
intents_per_sec INT UNSIGNED NOT NULL DEFAULT 0,
intents_dropped INT UNSIGNED NOT NULL DEFAULT 0,
path_fail_per_min INT UNSIGNED NOT NULL DEFAULT 0,
avg_level FLOAT NOT NULL DEFAULT 0,
KEY idx_sample_at (sample_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Record this migration as applied.
INSERT INTO playerbot_v2_schema_version (version, sha256) VALUES
(11, REPEAT('0', 64))
ON DUPLICATE KEY UPDATE applied_at = CURRENT_TIMESTAMP;
+40
View File
@@ -0,0 +1,40 @@
-- Migration: 0012_archetype
-- Date: 2026-06-14
-- Purpose: Per-bot ARCHETYPE foundation (#4A of
-- docs/LIVING_SERVER_PLAN_20260614.md). Personality (HOW a bot
-- plays) already exists; this adds Archetype (WHAT it does + WHEN it
-- is online) so the fleet is heterogeneous — casual-solo, hardcore-
-- raider, social-guildie, gatherer/AH-flipper, PvPer, altoholic-
-- explorer — the basis of a believable living server and of economy /
-- role variety.
--
-- Columns:
-- archetype_id The curated archetype id (index into
-- BotArchetype.cpp's kArchetypeTable ==
-- ArchetypeId enum). 0 = CasualSolo (the
-- default + the value an un-rolled bot
-- reads as). Assigned on first spawn via
-- RollArchetype(SeedForBot(id)) and
-- written back; deterministic per bot so
-- it is stable across restarts.
-- session_start_at When the bot's CURRENT play session
-- began. NULL when logged out. Reserved
-- for the session-rhythm logout layer
-- (documented followup) — stored now so
-- the data is available when that lands.
-- cumulative_session_minutes Lifetime online minutes accrued by
-- this bot across sessions. Also for the
-- future session-rhythm layer. Not
-- decremented; monotonic.
-- Reverts: yes (DROP COLUMN per added column).
ALTER TABLE playerbot_v2_character
ADD COLUMN archetype_id TINYINT UNSIGNED NOT NULL DEFAULT 0,
ADD COLUMN session_start_at DATETIME NULL DEFAULT NULL,
ADD COLUMN cumulative_session_minutes BIGINT UNSIGNED NOT NULL DEFAULT 0,
ADD KEY idx_archetype_id (archetype_id);
-- Record this migration as applied (mirrors the 0011 record-version pattern).
INSERT INTO playerbot_v2_schema_version (version, sha256) VALUES
(12, REPEAT('0', 64))
ON DUPLICATE KEY UPDATE applied_at = CURRENT_TIMESTAMP;
+74
View File
@@ -0,0 +1,74 @@
-- Migration: 0013_craft_orders
-- Date: 2026-06-15
-- Purpose: Bot-to-bot CRAFT-ORDER BOARD + escrow plumbing (#4B-2(a) part 1 of
-- docs/LIVING_SERVER_PLAN_20260614.md). Lets a requester bot post an
-- order for an item it can't make itself (escrowing the payment up
-- front by debiting its gold), a crafter bot that KNOWS the recipe
-- claim + fulfil it, and the escrow release/refund to settle the
-- transaction exactly once. This closes the profession economy loop:
-- gatherers feed reagents into the AH, crafters turn reagents into
-- finished goods on demand, and gold circulates between bots.
--
-- SECURITY (#4B-2 human-firewall): this is a CLOSED bot-to-bot system.
-- requester_low AND crafter_low are re-verified as CURRENT fleet bots
-- (Services::Registry()) at every state transition by CraftOrderBoard.
-- There is NO GM command / whisper / human entry point — a real player
-- can neither post, claim, fulfil, nor extract value from an order.
--
-- Columns:
-- id auto PK; the order id carried by snapshot + intent.
-- requester_low Player guid-low of the bot that posted the order
-- and whose gold was escrowed.
-- crafter_low Player guid-low of the bot that claimed it; NULL
-- while the order is still Open.
-- spell_id The craft recipe spell the order wants fulfilled.
-- item_entry The product item the recipe creates (item_template
-- entry), carried so the board / snapshot can describe
-- the order without re-resolving the spell.
-- quantity How many of the product the requester wants.
-- payment_copper The escrowed payment (copper). Debited from the
-- requester at PostOrder; paid to the crafter at
-- MarkDelivered OR refunded to the requester at
-- Fail/Cancel — EXACTLY ONCE, never both, never
-- neither. The `status` column is the single source
-- of truth that guards which of those two settlements
-- (if any) has already happened.
-- status 0=Open 1=Claimed 2=Delivered 3=Failed 4=Cancelled.
-- created_at When the order was posted (escrow taken).
-- claimed_at When a crafter claimed it; NULL while Open.
--
-- ESCROW INVARIANT (documented here + in CraftOrderBoard.h):
-- payment_copper is removed from the requester's gold EXACTLY ONCE,
-- at the Open transition (PostOrder). It then has exactly one of two
-- terminal fates:
-- * Delivered -> paid to the crafter (MarkDelivered), or
-- * Failed/Cancelled -> refunded to the requester (FailOrder).
-- A row may be settled only while transitioning OUT of a non-terminal
-- status (Open/Claimed) INTO a terminal one. Terminal rows
-- (Delivered/Failed/Cancelled) are never re-settled, so the gold can
-- never be double-released or double-refunded.
--
-- Reverts: yes (DROP TABLE).
--
-- Retention: finished rows (Delivered/Failed/Cancelled) are pruned by
-- CraftOrderBoard::Tick after a grace window; Open/Claimed rows are
-- reconciled into memory on load.
CREATE TABLE IF NOT EXISTS bot_craft_orders (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
requester_low BIGINT UNSIGNED NOT NULL,
crafter_low BIGINT UNSIGNED NULL DEFAULT NULL,
spell_id INT UNSIGNED NOT NULL DEFAULT 0,
item_entry INT UNSIGNED NOT NULL DEFAULT 0,
quantity INT UNSIGNED NOT NULL DEFAULT 1,
payment_copper BIGINT UNSIGNED NOT NULL DEFAULT 0,
status TINYINT UNSIGNED NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
claimed_at DATETIME NULL DEFAULT NULL,
KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Record this migration as applied (mirrors the 0011/0012 record-version pattern).
INSERT INTO playerbot_v2_schema_version (version, sha256) VALUES
(13, REPEAT('0', 64))
ON DUPLICATE KEY UPDATE applied_at = CURRENT_TIMESTAMP;
+68
View File
@@ -0,0 +1,68 @@
-- Migration: 0014_stuck_objective
-- Date: 2026-06-16
-- Purpose: Persistent, fleet-aggregated STUCK-OBJECTIVE LEDGER (#7 follow-up).
-- The WedgeWatchdog self-remediation layer abandons a bot's current
-- objective when it has been wedged (GoalUnreachable / CombatLoop) past
-- RemediationMs. That abandon is a 5-minute in-memory blacklist (the
-- bot RETRIES automatically once it expires) and, until now, the only
-- record of WHICH content stranded bots was the ephemeral
-- [wedge_remediate] log line (Playerbot.log is truncated every boot).
--
-- This table turns the fleet into a self-documenting content-QA system:
-- every remediation upserts a row keyed by (quest_id, obj_id), so an
-- operator can later run e.g.
-- SELECT quest_id, obj_id, category, hit_count, sample_map,
-- sample_zone, sample_x, sample_y, sample_bot, last_seen
-- FROM playerbot_v2_stuck_objective ORDER BY hit_count DESC LIMIT 50;
-- to find the quests/objectives that strand the most bots and root-cause
-- them (navmesh gap, off-mesh bridge, bad POI data, friendly-only kill
-- target, permanent blacklist, ...). It is the durable, queryable
-- successor to the manual log-forensics + character_queststatus queries
-- used in the 2026-06-15 cross-region investigation (4494 / 876 / 55660).
--
-- Columns:
-- quest_id / obj_id The stranded objective (obj_id 0 = quest-level /
-- no specific sub-objective). Composite PK so each
-- distinct objective is one accumulating row.
-- category Last WedgeCategory that remediated it
-- (GoalUnreachable / CombatLoop).
-- hit_count Cumulative remediation events across the whole
-- fleet AND across restarts (the writer flushes a
-- per-interval delta via hit_count = hit_count +
-- VALUES(hit_count)). A high count = chronically
-- stuck content worth investigating.
-- first_seen When this objective first stranded a bot (set on
-- insert, never overwritten).
-- last_seen Most recent remediation (updated every flush). A
-- stale last_seen ~ the issue resolved itself.
-- sample_* A representative stuck location + bot for the
-- objective, so an investigator can fly there /
-- reproduce without grepping logs.
--
-- Reverts: yes (DROP TABLE).
--
-- Retention: the writer does NOT prune — rows are small, bounded by the number
-- of DISTINCT stuck objectives (hundreds–low thousands), and the long
-- history is the point. Operators may DELETE on last_seen if desired.
CREATE TABLE IF NOT EXISTS playerbot_v2_stuck_objective (
quest_id INT UNSIGNED NOT NULL,
obj_id INT UNSIGNED NOT NULL DEFAULT 0,
category VARCHAR(24) NOT NULL DEFAULT '',
hit_count BIGINT UNSIGNED NOT NULL DEFAULT 0,
first_seen DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
last_seen DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
sample_map INT UNSIGNED NOT NULL DEFAULT 0,
sample_zone INT UNSIGNED NOT NULL DEFAULT 0,
sample_x FLOAT NOT NULL DEFAULT 0,
sample_y FLOAT NOT NULL DEFAULT 0,
sample_bot VARCHAR(48) NOT NULL DEFAULT '',
PRIMARY KEY (quest_id, obj_id),
KEY idx_hit_count (hit_count),
KEY idx_last_seen (last_seen)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Record this migration as applied (mirrors the 0011/0012/0013 pattern).
INSERT INTO playerbot_v2_schema_version (version, sha256) VALUES
(14, REPEAT('0', 64))
ON DUPLICATE KEY UPDATE applied_at = CURRENT_TIMESTAMP;
File diff suppressed because it is too large Load Diff
+7
View File
@@ -0,0 +1,7 @@
-- Migration: 0016_companion_bots
-- Date: 2026-07-22
-- Columns applied by Module::Init() via DirectPExecute (idempotent).
-- This file exists only as a schema-version marker.
INSERT IGNORE INTO playerbot_v2_schema_version (version, applied_at, sha256)
VALUES (16, NOW(), '0');
+19
View File
@@ -0,0 +1,19 @@
# Playerbot V2 — SQL migrations
Per `v2/SCHEMA.md`. Migration files in this directory are numbered, append-only, and idempotent. Run by `Persistence/PlayerbotMigrationMgr` at module init.
For full setup instructions (schema creation, config, world fixes) see
`v2/INSTALL.md`.
## Order
Applied in ascending numeric order; each file records itself in
`playerbot_v2_schema_version`. Current set:
- `0001_init.sql` — schema_version + core tables (account, character, personality, preferences, population_target)
- `0002`–`0014` — owner/squad control, talent builds, population columns, guild metadata, world metadata, leveling zone, fleet vitals, archetype, craft orders, stuck-objective ledger
- `0015_name_pool.sql` — the curated ~107k-row random bot **name pool** (`playerbots_names`), shipped with use-state reset so a fresh install starts with the whole pool available
## Discipline
- Never edit a numbered migration after it ships. Add a new one to amend.
- Each migration is self-contained: no cross-file dependencies on application order beyond numbering.
- Reversibility documented in the file header.
@@ -0,0 +1,12 @@
-- Grant playerbot command permissions to all security levels
INSERT IGNORE INTO `rbac_default_permissions` (`secId`, `permissionId`, `realmId`) VALUES
(0, 886, -1),
(1, 886, -1),
(2, 886, -1),
(3, 886, -1),
(4, 886, -1),
(0, 887, -1),
(1, 887, -1),
(2, 887, -1),
(3, 887, -1),
(4, 887, -1);
@@ -0,0 +1,150 @@
-- Playerbot System Tables
-- Requires: characters database
-- Date: 2026-07-16
-- Table 1: ai_playerbot_names
-- Stores pre-generated bot character names with optional gender/race/class hints
DROP TABLE IF EXISTS `ai_playerbot_names`;
CREATE TABLE `ai_playerbot_names` (
`name_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(24) NOT NULL,
`gender` TINYINT UNSIGNED NOT NULL DEFAULT '255',
`race` SMALLINT UNSIGNED NOT NULL DEFAULT '65535',
`class` TINYINT UNSIGNED NOT NULL DEFAULT '0',
`in_use` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`name_id`),
KEY `in_use` (`in_use`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 2: ai_playerbot_guild_names
-- Stores pre-generated bot guild names
DROP TABLE IF EXISTS `ai_playerbot_guild_names`;
CREATE TABLE `ai_playerbot_guild_names` (
`name_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(24) NOT NULL,
PRIMARY KEY (`name_id`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 3: ai_playerbot_random_bots
-- Tracks random bot lifecycle events (add, randomize, logout, teleport, online)
DROP TABLE IF EXISTS `ai_playerbot_random_bots`;
CREATE TABLE `ai_playerbot_random_bots` (
`owner` INT UNSIGNED NOT NULL DEFAULT '0',
`bot` INT UNSIGNED NOT NULL,
`time` INT UNSIGNED NOT NULL,
`validIn` INT UNSIGNED NOT NULL,
`event` VARCHAR(32) NOT NULL,
`value` INT UNSIGNED NOT NULL,
PRIMARY KEY (`owner`, `bot`, `event`),
KEY `bot` (`bot`),
KEY `event` (`event`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 4: ai_playerbot_guild_tasks
-- Tracks guild kill/item tasks for bots
DROP TABLE IF EXISTS `ai_playerbot_guild_tasks`;
CREATE TABLE `ai_playerbot_guild_tasks` (
`owner` INT UNSIGNED NOT NULL,
`guildid` INT UNSIGNED NOT NULL,
`time` INT UNSIGNED NOT NULL,
`validIn` INT UNSIGNED NOT NULL,
`type` VARCHAR(32) NOT NULL,
`value` INT UNSIGNED NOT NULL,
PRIMARY KEY (`owner`, `guildid`, `type`),
KEY `guildid` (`guildid`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 5: ai_playerbot_locks
-- Gear lock state for bots (prevents auto-updating gear when locked)
DROP TABLE IF EXISTS `ai_playerbot_locks`;
CREATE TABLE `ai_playerbot_locks` (
`name_id` INT UNSIGNED NOT NULL,
`gearlock` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`name_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 6: ai_playerbot_speech
-- Bot speech text categorized by qualifier name
DROP TABLE IF EXISTS `ai_playerbot_speech`;
CREATE TABLE `ai_playerbot_speech` (
`name` VARCHAR(64) NOT NULL,
`text` TEXT NOT NULL,
`type` VARCHAR(16) NOT NULL DEFAULT '',
PRIMARY KEY (`name`(64), `text`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 7: ai_playerbot_speech_probability
-- Speech probability weights per qualifier name
DROP TABLE IF EXISTS `ai_playerbot_speech_probability`;
CREATE TABLE `ai_playerbot_speech_probability` (
`name` VARCHAR(64) NOT NULL,
`probability` INT UNSIGNED NOT NULL DEFAULT '100',
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Table 8: ai_playerbot_custom_strategy
-- Custom strategy action lines
DROP TABLE IF EXISTS `ai_playerbot_custom_strategy`;
CREATE TABLE `ai_playerbot_custom_strategy` (
`name` VARCHAR(64) NOT NULL,
`action_line` TEXT NOT NULL,
PRIMARY KEY (`name`(64), `action_line`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Playerbot Guild Names Seed Data
-- Generated for TrinityCore Playerbot System
INSERT INTO `ai_playerbot_guild_names` (`name_id`, `name`) VALUES
(1, 'Stormguard'),
(2, 'Shadowfang'),
(3, 'Dawnbreaker'),
(4, 'Ironforge'),
(5, 'Silvermoon'),
(6, 'Goldshire'),
(7, 'Darkhaven'),
(8, 'Brightwater'),
(9, 'Thunderstrike'),
(10, 'Stormchaser'),
(11, 'Moonshade'),
(12, 'Sunspear'),
(13, 'Windwalker'),
(14, 'Frostguard'),
(15, 'Starfall'),
(16, 'Nightbane'),
(17, 'Bloodhoof'),
(18, 'Deathwhisper'),
(19, 'Lightfury'),
(20, 'Shadowstep'),
(21, 'Boldheart'),
(22, 'Fairweather'),
(23, 'Highpeak'),
(24, 'Longbeard'),
(25, 'Stronghold'),
(26, 'Deepforge'),
(27, 'Wildhammer'),
(28, 'Truewind'),
(29, 'Brightstar'),
(30, 'Darkmoon'),
(31, 'Northstar'),
(32, 'Eastgate'),
(33, 'Southwatch'),
(34, 'Westgate'),
(35, 'Mountainhold'),
(36, 'Riverwatch'),
(37, 'Lakerun'),
(38, 'Forestkeep'),
(39, 'Fieldguard'),
(40, 'Hillwatch'),
(41, 'Stonewall'),
(42, 'Ironbark'),
(43, 'Silverleaf'),
(44, 'Goldroot'),
(45, 'Bronzebeard'),
(46, 'Greyguard'),
(47, 'Whitepeak'),
(48, 'Blackwatch'),
(49, 'Redcloud'),
(50, 'Bluewind');
@@ -0,0 +1,704 @@
-- Playerbot Names Population
-- Generates 1000 bot names with randomized gender/race/class hints
INSERT INTO `ai_playerbot_names` (`name_id`, `name`, `gender`, `race`, `class`, `in_use`) VALUES
(1, 'Thorn', 0, 1, 1, 0),
(2, 'Elara', 1, 4, 2, 0),
(3, 'Borin', 0, 3, 3, 0),
(4, 'Shade', 1, 5, 4, 0),
(5, 'Zaren', 0, 2, 5, 0),
(6, 'Lyssa', 1, 8, 6, 0),
(7, 'Gromm', 0, 6, 7, 0),
(8, 'Sylva', 1, 11, 8, 0),
(9, 'Vex', 0, 10, 9, 0),
(10, 'Mira', 1, 1, 1, 0),
(11, 'Durnan', 0, 3, 2, 0),
(12, 'Fenris', 0, 8, 3, 0),
(13, 'Sera', 1, 4, 4, 0),
(14, 'Kael', 0, 10, 5, 0),
(15, 'Riven', 1, 5, 6, 0),
(16, 'Thrain', 0, 3, 7, 0),
(17, 'Vale', 1, 11, 8, 0),
(18, 'Zephyr', 0, 1, 9, 0),
(19, 'Nyx', 1, 8, 1, 0),
(20, 'Orin', 0, 2, 2, 0),
(21, 'Bryn', 1, 3, 3, 0),
(22, 'Talon', 0, 6, 4, 0),
(23, 'Ivy', 1, 4, 5, 0),
(24, 'Rook', 0, 10, 6, 0),
(25, 'Eira', 1, 11, 7, 0),
(26, 'Brorn', 0, 1, 8, 0),
(27, 'Kira', 1, 8, 9, 0),
(28, 'Dorn', 0, 3, 1, 0),
(29, 'Lira', 1, 5, 2, 0),
(30, 'Vorn', 0, 6, 3, 0),
(31, 'Wren', 1, 4, 4, 0),
(32, 'Thane', 0, 2, 5, 0),
(33, 'Selene', 1, 11, 6, 0),
(34, 'Ragnar', 0, 1, 7, 0),
(35, 'Maeve', 1, 10, 8, 0),
(36, 'Korr', 0, 6, 9, 0),
(37, 'Faye', 1, 8, 1, 0),
(38, 'Grimm', 0, 5, 2, 0),
(39, 'Lyra', 1, 4, 3, 0),
(40, 'Hroth', 0, 2, 4, 0),
(41, 'Nara', 1, 1, 5, 0),
(42, 'Dolg', 0, 3, 6, 0),
(43, 'Siren', 1, 5, 7, 0),
(44, 'Fang', 0, 6, 8, 0),
(45, 'Myra', 1, 10, 9, 0),
(46, 'Torin', 0, 11, 1, 0),
(47, 'Astra', 1, 8, 2, 0),
(48, 'Gorim', 0, 1, 3, 0),
(49, 'Vesper', 1, 4, 4, 0),
(50, 'Ulf', 0, 2, 5, 0),
(51, 'Rowan', 0, 10, 6, 0),
(52, 'Belle', 1, 11, 7, 0),
(53, 'Morg', 0, 5, 8, 0),
(54, 'Tess', 1, 3, 9, 0),
(55, 'Hogan', 0, 6, 1, 0),
(56, 'Rune', 1, 1, 2, 0),
(57, 'Kade', 0, 8, 3, 0),
(58, 'Frey', 1, 4, 4, 0),
(59, 'Bael', 0, 2, 5, 0),
(60, 'Niamh', 1, 11, 6, 0),
(61, 'Tork', 0, 3, 7, 0),
(62, 'Saga', 1, 10, 8, 0),
(63, 'Zane', 0, 6, 9, 0),
(64, 'Illy', 1, 8, 1, 0),
(65, 'Dane', 0, 1, 2, 0),
(66, 'Oona', 1, 5, 3, 0),
(67, 'Garet', 0, 4, 4, 0),
(68, 'Lena', 1, 2, 5, 0),
(69, 'Truk', 0, 6, 6, 0),
(70, 'Yuki', 1, 10, 7, 0),
(71, 'Brott', 0, 3, 8, 0),
(72, 'Suki', 1, 11, 9, 0),
(73, 'Finch', 0, 1, 1, 0),
(74, 'Aria', 1, 8, 2, 0),
(75, 'Gruul', 0, 2, 3, 0),
(76, 'Ezri', 1, 4, 4, 0),
(77, 'Morne', 0, 5, 5, 0),
(78, 'Tara', 1, 3, 6, 0),
(79, 'Baldr', 0, 11, 7, 0),
(80, 'Nix', 1, 6, 8, 0),
(81, 'Havak', 0, 10, 9, 0),
(82, 'Lark', 1, 1, 1, 0),
(83, 'Orik', 0, 3, 2, 0),
(84, 'Phae', 1, 8, 3, 0),
(85, 'Rourk', 0, 6, 4, 0),
(86, 'Mavis', 1, 5, 5, 0),
(87, 'Durik', 0, 2, 6, 0),
(88, 'Sybil', 1, 10, 7, 0),
(89, 'Gorak', 0, 4, 8, 0),
(90, 'Willow', 1, 11, 9, 0),
(91, 'Tyr', 0, 1, 1, 0),
(92, 'Eris', 1, 8, 2, 0),
(93, 'Grend', 0, 6, 3, 0),
(94, 'Petra', 1, 3, 4, 0),
(95, 'Krohn', 0, 2, 5, 0),
(96, 'Leela', 1, 4, 6, 0),
(97, 'Malkor', 0, 10, 7, 0),
(98, 'Nissa', 1, 11, 8, 0),
(99, 'Bog', 0, 5, 9, 0),
(100, 'Tiva', 1, 1, 1, 0),
(101, 'Aldric', 0, 1, 1, 0),
(102, 'Branwen', 1, 4, 2, 0),
(103, 'Cedric', 0, 3, 3, 0),
(104, 'Drisana', 1, 8, 4, 0),
(105, 'Eadric', 0, 10, 5, 0),
(106, 'Faelan', 0, 11, 6, 0),
(107, 'Gwyneth', 1, 4, 7, 0),
(108, 'Hadrian', 0, 1, 8, 0),
(109, 'Iseult', 1, 10, 9, 0),
(110, 'Jareth', 0, 6, 1, 0),
(111, 'Kaelen', 0, 2, 2, 0),
(112, 'Liriel', 1, 8, 3, 0),
(113, 'Morwen', 1, 5, 4, 0),
(114, 'Nevyn', 0, 11, 5, 0),
(115, 'Orlaith', 1, 3, 6, 0),
(116, 'Phelan', 0, 1, 7, 0),
(117, 'Quinn', 1, 10, 8, 0),
(118, 'Rhian', 1, 4, 9, 0),
(119, 'Soren', 0, 2, 1, 0),
(120, 'Tristan', 0, 6, 2, 0),
(121, 'Ulric', 0, 3, 3, 0),
(122, 'Vivien', 1, 8, 4, 0),
(123, 'Wulfric', 0, 6, 5, 0),
(124, 'Xanthe', 1, 11, 6, 0),
(125, 'Yseult', 1, 4, 7, 0),
(126, 'Zander', 0, 2, 8, 0),
(127, 'Aelfric', 0, 1, 9, 0),
(128, 'Brynn', 1, 3, 1, 0),
(129, 'Corbin', 0, 5, 2, 0),
(130, 'Drusilla', 1, 10, 3, 0),
(131, 'Eldon', 0, 11, 4, 0),
(132, 'Fenella', 1, 4, 5, 0),
(133, 'Godric', 0, 1, 6, 0),
(134, 'Helga', 1, 6, 7, 0),
(135, 'Isolde', 1, 8, 8, 0),
(136, 'Jorund', 0, 2, 9, 0),
(137, 'Keth', 0, 10, 1, 0),
(138, 'Lucian', 0, 5, 2, 0),
(139, 'Mirabel', 1, 3, 3, 0),
(140, 'Nerys', 1, 11, 4, 0),
(141, 'Osric', 0, 1, 5, 0),
(142, 'Pryderi', 0, 4, 6, 0),
(143, 'Ragnarok', 0, 6, 7, 0),
(144, 'Seren', 1, 8, 8, 0),
(145, 'Torsten', 0, 2, 9, 0),
(146, 'Una', 1, 10, 1, 0),
(147, 'Varian', 0, 1, 2, 0),
(148, 'Wynne', 1, 5, 3, 0),
(149, 'Yorick', 0, 6, 4, 0),
(150, 'Zelda', 1, 11, 5, 0),
(151, 'Alistair', 0, 1, 6, 0),
(152, 'Brienne', 1, 4, 7, 0),
(153, 'Caius', 0, 3, 8, 0),
(154, 'Deanna', 1, 10, 9, 0),
(155, 'Evander', 0, 2, 1, 0),
(156, 'Freya', 1, 6, 2, 0),
(157, 'Gideon', 0, 5, 3, 0),
(158, 'Harlow', 1, 8, 4, 0),
(159, 'Icarus', 0, 11, 5, 0),
(160, 'Jaina', 1, 3, 6, 0),
(161, 'Korben', 0, 1, 7, 0),
(162, 'Lilith', 1, 10, 8, 0),
(163, 'Marius', 0, 4, 9, 0),
(164, 'Nadia', 1, 2, 1, 0),
(165, 'Octavia', 1, 8, 2, 0),
(166, 'Percival', 0, 1, 3, 0),
(167, 'Ravenna', 1, 5, 4, 0),
(168, 'Silas', 0, 6, 5, 0),
(169, 'Titania', 1, 11, 6, 0),
(170, 'Uther', 0, 3, 7, 0),
(171, 'Valkyrie', 1, 6, 8, 0),
(172, 'Wesley', 0, 10, 9, 0),
(173, 'Xerxes', 0, 2, 1, 0),
(174, 'Ygraine', 1, 4, 2, 0),
(175, 'Zephyra', 1, 8, 3, 0),
(176, 'Aric', 0, 1, 4, 0),
(177, 'Beryl', 1, 3, 5, 0),
(178, 'Conrad', 0, 5, 6, 0),
(179, 'Daphne', 1, 10, 7, 0),
(180, 'Emrys', 0, 11, 8, 0),
(181, 'Fiona', 1, 4, 9, 0),
(182, 'Gareth', 0, 1, 1, 0),
(183, 'Helene', 1, 8, 2, 0),
(184, 'Ignis', 0, 2, 3, 0),
(185, 'Juniper', 1, 6, 4, 0),
(186, 'Kurt', 0, 3, 5, 0),
(187, 'Lavender', 1, 11, 6, 0),
(188, 'Magnus', 0, 1, 7, 0),
(189, 'Nyx', 1, 10, 8, 0),
(190, 'Oberon', 0, 5, 9, 0),
(191, 'Portia', 1, 4, 1, 0),
(192, 'Quentin', 0, 2, 2, 0),
(193, 'Roxana', 1, 8, 3, 0),
(194, 'Siegfried', 0, 6, 4, 0),
(195, 'Tabitha', 1, 3, 5, 0),
(196, 'Ulric', 0, 1, 6, 0),
(197, 'Vespera', 1, 11, 7, 0),
(198, 'Wolfgang', 0, 10, 8, 0),
(199, 'Xenia', 1, 5, 9, 0),
(200, 'Yannick', 0, 4, 1, 0),
(201, 'Aelar', 0, 4, 2, 0),
(202, 'Brynjar', 0, 6, 3, 0),
(203, 'Caelan', 0, 10, 4, 0),
(204, 'Dagny', 1, 3, 5, 0),
(205, 'Eldrin', 0, 1, 6, 0),
(206, 'Fjola', 1, 6, 7, 0),
(207, 'Gunnar', 0, 2, 8, 0),
(208, 'Hilda', 1, 5, 9, 0),
(209, 'Ingrid', 1, 11, 1, 0),
(210, 'Jorunn', 1, 6, 2, 0),
(211, 'Ketill', 0, 3, 3, 0),
(212, 'Lagertha', 1, 1, 4, 0),
(213, 'Mimir', 0, 8, 5, 0),
(214, 'Njord', 0, 2, 6, 0),
(215, 'Odin', 0, 1, 7, 0),
(216, 'Runa', 1, 4, 8, 0),
(217, 'Sigrid', 1, 6, 9, 0),
(218, 'Tyr', 0, 1, 1, 0),
(219, 'Ulfhednar', 0, 2, 2, 0),
(220, 'Viggo', 0, 10, 3, 0),
(221, 'Yrsa', 1, 8, 4, 0),
(222, 'Asger', 0, 3, 5, 0),
(223, 'Borghild', 1, 3, 6, 0),
(224, 'Didrik', 0, 4, 7, 0),
(225, 'Eirik', 0, 1, 8, 0),
(226, 'Freydis', 1, 5, 9, 0),
(227, 'Gorm', 0, 2, 1, 0),
(228, 'Hakon', 0, 6, 2, 0),
(229, 'Isgerd', 1, 10, 3, 0),
(230, 'Kari', 1, 1, 4, 0),
(231, 'Leif', 0, 3, 5, 0),
(232, 'Mikkel', 0, 8, 6, 0),
(233, 'Nanna', 1, 4, 7, 0),
(234, 'Orvar', 0, 6, 8, 0),
(235, 'Rikard', 0, 2, 9, 0),
(236, 'Sif', 1, 11, 1, 0),
(237, 'Toke', 0, 5, 2, 0),
(238, 'Valdis', 1, 6, 3, 0),
(239, 'Yngvar', 0, 1, 4, 0),
(240, 'Aelfwine', 0, 4, 5, 0),
(241, 'Berthold', 0, 3, 6, 0),
(242, 'Clothilde', 1, 10, 7, 0),
(243, 'Dietrich', 0, 2, 8, 0),
(244, 'Erembour', 0, 8, 9, 0),
(245, 'Faramir', 0, 1, 1, 0),
(246, 'Grimhild', 1, 5, 2, 0),
(247, 'Hildebrand', 0, 11, 3, 0),
(248, 'Isolde', 1, 4, 4, 0),
(249, 'Kriemhild', 1, 6, 5, 0),
(250, 'Lorelei', 1, 8, 6, 0),
(251, 'Meinrad', 0, 3, 7, 0),
(252, 'Notger', 0, 1, 8, 0),
(253, 'Ortwin', 0, 2, 9, 0),
(254, 'Reinmar', 0, 5, 1, 0),
(255, 'Seigwald', 0, 6, 2, 0),
(256, 'Theodoric', 0, 10, 3, 0),
(257, 'Volker', 0, 4, 4, 0),
(258, 'Wigand', 0, 1, 5, 0),
(259, 'Zerline', 1, 8, 6, 0),
(260, 'Athalstan', 0, 1, 7, 0),
(261, 'Beorn', 0, 2, 8, 0),
(262, 'Ceolwulf', 0, 3, 9, 0),
(263, 'Deorwynn', 1, 4, 1, 0),
(264, 'Eadgard', 0, 5, 2, 0),
(265, 'Frithugyth', 1, 6, 3, 0),
(266, 'Godwine', 0, 11, 4, 0),
(267, 'Hereward', 0, 8, 5, 0),
(268, 'Leofric', 0, 10, 6, 0),
(269, 'Mildryth', 1, 1, 7, 0),
(270, 'Ordgar', 0, 2, 8, 0),
(271, 'Sigeweard', 0, 3, 9, 0),
(272, 'Wulfstan', 0, 4, 1, 0),
(273, 'Aethelred', 0, 5, 2, 0),
(274, 'Burgred', 0, 6, 3, 0),
(275, 'Cenwulf', 0, 11, 4, 0),
(276, 'Ecgberht', 0, 1, 5, 0),
(277, 'Osgar', 0, 2, 6, 0),
(278, 'Wulfgar', 0, 8, 7, 0),
(279, 'Aelle', 1, 10, 8, 0),
(280, 'Badda', 1, 3, 9, 0),
(281, 'Cutha', 1, 4, 1, 0),
(282, 'Penda', 0, 1, 2, 0),
(283, 'Sabert', 0, 5, 3, 0),
(284, 'Seaxwulf', 0, 6, 4, 0),
(285, 'Tondberht', 0, 2, 5, 0),
(286, 'Wigthegn', 0, 11, 6, 0),
(287, 'Sigehelm', 0, 3, 7, 0),
(288, 'Aethelhere', 0, 4, 8, 0),
(289, 'Anna', 1, 1, 9, 0),
(290, 'Botwulf', 0, 8, 1, 0),
(291, 'Cissa', 1, 10, 2, 0),
(292, 'Eorpwald', 0, 5, 3, 0),
(293, 'Foer', 0, 6, 4, 0),
(294, 'Gipeswic', 0, 2, 5, 0),
(295, 'Hryp', 0, 3, 6, 0),
(296, 'Icanho', 0, 1, 7, 0),
(297, 'Loeg', 0, 4, 8, 0),
(298, 'Mael', 0, 11, 9, 0),
(299, 'Norf', 0, 8, 1, 0),
(300, 'Oundle', 0, 10, 2, 0),
(301, 'Peak', 0, 5, 3, 0),
(302, 'Reoda', 0, 6, 4, 0),
(303, 'Sudb', 0, 2, 5, 0),
(304, 'Tuda', 0, 3, 6, 0),
(305, 'Ubban', 0, 1, 7, 0),
(306, 'Weal', 0, 4, 8, 0),
(307, 'Ythanc', 0, 11, 9, 0),
(308, 'Arvak', 0, 6, 1, 0),
(309, 'Blodugh', 1, 8, 2, 0),
(310, 'Delling', 0, 10, 3, 0),
(311, 'Eikthyrnir', 0, 2, 4, 0),
(312, 'Fensal', 1, 4, 5, 0),
(313, 'Gladsheim', 0, 1, 6, 0),
(314, 'Himinbjorg', 0, 3, 7, 0),
(315, 'Idavoll', 0, 5, 8, 0),
(316, 'Jotunheim', 0, 6, 9, 0),
(317, 'Kvasir', 0, 11, 1, 0),
(318, 'Lidskialf', 0, 2, 2, 0),
(319, 'Mimir', 0, 1, 3, 0),
(320, 'Noatum', 1, 8, 4, 0),
(321, 'Okkolnir', 0, 10, 5, 0),
(322, 'Ragnarok', 0, 4, 6, 0),
(323, 'Sessrumnir', 0, 5, 7, 0),
(324, 'Thrudheim', 0, 6, 8, 0),
(325, 'Urd', 1, 3, 9, 0),
(326, 'Valaskialf', 0, 11, 1, 0),
(327, 'Yggdrasil', 0, 2, 2, 0),
(328, 'Alfheim', 0, 8, 3, 0),
(329, 'Bilskirnir', 0, 1, 4, 0),
(330, 'Folkvang', 0, 10, 5, 0),
(331, 'Gimle', 1, 4, 6, 0),
(332, 'Helheim', 0, 5, 7, 0),
(333, 'Muspelheim', 0, 6, 8, 0),
(334, 'Niflhel', 1, 3, 9, 0),
(335, 'Vanaheim', 0, 11, 1, 0),
(336, 'Andor', 0, 2, 2, 0),
(337, 'Belen', 0, 8, 3, 0),
(338, 'Cernunnos', 0, 1, 4, 0),
(339, 'Danu', 1, 10, 5, 0),
(340, 'Epona', 1, 4, 6, 0),
(341, 'Grian', 1, 5, 7, 0),
(342, 'Lugh', 0, 6, 8, 0),
(343, 'Morrigan', 1, 3, 9, 0),
(344, 'Nuada', 0, 11, 1, 0),
(345, 'Ogma', 0, 2, 2, 0),
(346, 'Tailtiu', 1, 8, 3, 0),
(347, 'Balor', 0, 1, 4, 0),
(348, 'Cian', 0, 10, 5, 0),
(349, 'Diancecht', 0, 4, 6, 0),
(350, 'Goibniu', 0, 5, 7, 0),
(351, 'Macha', 1, 6, 8, 0),
(352, 'Nechtan', 0, 3, 9, 0),
(353, 'Aine', 1, 11, 1, 0),
(354, 'Bres', 0, 2, 2, 0),
(355, 'Cromm', 0, 8, 3, 0),
(356, 'Etain', 1, 1, 4, 0),
(357, 'Flidais', 1, 10, 5, 0),
(358, 'Midir', 0, 4, 6, 0),
(359, 'Nemain', 1, 5, 7, 0),
(360, 'Bodb', 0, 6, 8, 0),
(361, 'Cailleach', 1, 3, 9, 0),
(362, 'Arawn', 0, 11, 1, 0),
(363, 'Beli', 0, 2, 2, 0),
(364, 'Cerridwen', 1, 8, 3, 0),
(365, 'Dylan', 0, 1, 4, 0),
(366, 'Gwydion', 0, 10, 5, 0),
(367, 'Lleu', 0, 4, 6, 0),
(368, 'Mabon', 0, 5, 7, 0),
(369, 'Pwyll', 0, 6, 8, 0),
(370, 'Rhiannon', 1, 3, 9, 0),
(371, 'Taliesin', 0, 11, 1, 0),
(372, 'Brigid', 1, 2, 2, 0),
(373, 'Creidhne', 0, 8, 3, 0),
(374, 'Ebir', 0, 1, 4, 0),
(375, 'Fionn', 0, 10, 5, 0),
(376, 'Glas', 1, 4, 6, 0),
(377, 'Lir', 0, 5, 7, 0),
(378, 'Mider', 0, 6, 8, 0),
(379, 'Sengann', 0, 3, 9, 0),
(380, 'Tuan', 0, 11, 1, 0),
(381, 'Aengus', 0, 2, 2, 0),
(382, 'Bregon', 0, 1, 3, 0),
(383, 'Cessair', 1, 8, 4, 0),
(384, 'Delbna', 1, 10, 5, 0),
(385, 'Eremon', 0, 4, 6, 0),
(386, 'Firbolg', 0, 5, 7, 0),
(387, 'Ith', 0, 6, 8, 0),
(388, 'Miled', 0, 3, 9, 0),
(389, 'Partholon', 0, 11, 1, 0),
(390, 'Calatin', 0, 2, 2, 0),
(391, 'Daire', 0, 1, 3, 0),
(392, 'Eogan', 0, 8, 4, 0),
(393, 'Fergus', 0, 10, 5, 0),
(394, 'Labraid', 0, 4, 6, 0),
(395, 'Maelduin', 0, 5, 7, 0),
(396, 'Oscar', 0, 6, 8, 0),
(397, 'Rury', 0, 3, 9, 0),
(398, 'Sualtam', 0, 11, 1, 0),
(399, 'Uathach', 1, 2, 2, 0),
(400, 'Aife', 1, 1, 3, 0),
(401, 'Briccriu', 0, 8, 4, 0),
(402, 'Curoi', 0, 10, 5, 0),
(403, 'Conchobar', 0, 4, 6, 0),
(404, 'Deichtine', 1, 5, 7, 0),
(405, 'Eimhir', 1, 6, 8, 0),
(406, 'Fand', 1, 3, 9, 0),
(407, 'Sencha', 0, 11, 1, 0),
(408, 'Blai', 1, 2, 2, 0),
(409, 'Crimthann', 0, 1, 3, 0),
(410, 'Eterscel', 0, 8, 4, 0),
(411, 'Goll', 0, 10, 5, 0),
(412, 'Lugaid', 0, 4, 6, 0),
(413, 'Mugain', 1, 5, 7, 0),
(414, 'Nath', 0, 6, 8, 0),
(415, 'Aldric', 0, 3, 9, 0),
(416, 'Bram', 0, 11, 1, 0),
(417, 'Colm', 0, 2, 2, 0),
(418, 'Daireann', 1, 1, 3, 0),
(419, 'Donn', 0, 8, 4, 0),
(420, 'Emer', 1, 10, 5, 0),
(421, 'Feidelm', 1, 4, 6, 0),
(422, 'Cet', 0, 5, 7, 0),
(423, 'Ailill', 0, 6, 8, 0),
(424, 'Bec', 0, 3, 9, 0),
(425, 'Daithi', 0, 11, 1, 0),
(426, 'Tuathal', 0, 2, 2, 0),
(427, 'Eochaid', 0, 1, 3, 0),
(428, 'Fachtna', 0, 8, 4, 0),
(429, 'Rath', 0, 10, 5, 0),
(430, 'Sli', 0, 4, 6, 0),
(431, 'Tadhg', 0, 5, 7, 0),
(432, 'Art', 0, 6, 8, 0),
(433, 'Buide', 0, 3, 9, 0),
(434, 'Cairbre', 0, 11, 1, 0),
(435, 'Dathi', 0, 2, 2, 0),
(436, 'Elcmar', 0, 1, 3, 0),
(437, 'Ir', 0, 8, 4, 0),
(438, 'Maine', 0, 10, 5, 0),
(439, 'Nia', 0, 4, 6, 0),
(440, 'Scota', 1, 5, 7, 0),
(441, 'Tea', 1, 6, 8, 0),
(442, 'Berba', 1, 3, 9, 0),
(443, 'Corb', 0, 11, 1, 0),
(444, 'Doll', 1, 2, 2, 0),
(445, 'Ethne', 1, 1, 3, 0),
(446, 'Gran', 1, 8, 4, 0),
(447, 'Assa', 1, 10, 5, 0),
(448, 'Torc', 0, 4, 6, 0),
(449, 'Uall', 0, 5, 7, 0),
(450, 'Brega', 1, 6, 8, 0),
(451, 'Cerna', 1, 3, 9, 0),
(452, 'Dubh', 0, 11, 1, 0),
(453, 'Finn', 0, 2, 2, 0),
(454, 'Glas', 1, 1, 3, 0),
(455, 'Lon', 0, 8, 4, 0),
(456, 'Odran', 0, 10, 5, 0),
(457, 'Ronan', 0, 4, 6, 0),
(458, 'Sodelb', 1, 5, 7, 0),
(459, 'Tren', 0, 6, 8, 0),
(460, 'Fulgent', 0, 3, 9, 0),
(461, 'Aura', 1, 11, 1, 0),
(462, 'Caelestis', 1, 2, 2, 0),
(463, 'Glacies', 1, 1, 3, 0),
(464, 'Ignis', 0, 8, 4, 0),
(465, 'Lux', 1, 10, 5, 0),
(466, 'Nox', 1, 4, 6, 0),
(467, 'Ordo', 0, 5, 7, 0),
(468, 'Pax', 1, 6, 8, 0),
(469, 'Sol', 1, 3, 9, 0),
(470, 'Stella', 1, 11, 1, 0),
(471, 'Bellator', 0, 2, 2, 0),
(472, 'Custos', 0, 1, 3, 0),
(473, 'Dux', 0, 8, 4, 0),
(474, 'Ferrum', 0, 10, 5, 0),
(475, 'Gladius', 0, 4, 6, 0),
(476, 'Miles', 0, 5, 7, 0),
(477, 'Scutum', 0, 6, 8, 0),
(478, 'Sagitta', 1, 3, 9, 0),
(479, 'Arcanus', 0, 11, 1, 0),
(480, 'Scientia', 1, 2, 2, 0),
(481, 'Verbum', 0, 1, 3, 0),
(482, 'Aquila', 1, 8, 4, 0),
(483, 'Leo', 0, 10, 5, 0),
(484, 'Lupus', 0, 4, 6, 0),
(485, 'Ursa', 1, 5, 7, 0),
(486, 'Vulpes', 1, 6, 8, 0),
(487, 'Corvus', 0, 3, 9, 0),
(488, 'Falco', 0, 11, 1, 0),
(489, 'Alauda', 1, 2, 2, 0),
(490, 'Ciconia', 1, 1, 3, 0),
(491, 'Ardea', 1, 8, 4, 0),
(492, 'Bubo', 0, 10, 5, 0),
(493, 'Cuculus', 0, 4, 6, 0),
(494, 'Gallus', 0, 5, 7, 0),
(495, 'Merula', 1, 6, 8, 0),
(496, 'Monedula', 1, 3, 9, 0),
(497, 'Noctua', 1, 11, 1, 0),
(498, 'Picumnus', 0, 2, 2, 0),
(499, 'Hyacinth', 1, 1, 3, 0),
(500, 'Iris', 1, 8, 4, 0),
(501, 'Laurus', 0, 10, 5, 0),
(502, 'Myrtus', 0, 4, 6, 0),
(503, 'Quercus', 0, 5, 7, 0),
(504, 'Salix', 1, 6, 8, 0),
(505, 'Ulmus', 0, 3, 9, 0),
(506, 'Vitis', 1, 11, 1, 0),
(507, 'Buxus', 0, 2, 2, 0),
(508, 'Cedrus', 0, 1, 3, 0),
(509, 'Fagus', 0, 8, 4, 0),
(510, 'Ilex', 0, 10, 5, 0),
(511, 'Taxus', 0, 4, 6, 0),
(512, 'Tilia', 1, 5, 7, 0),
(513, 'Acer', 0, 6, 8, 0),
(514, 'Alnus', 0, 3, 9, 0),
(515, 'Carpinus', 0, 11, 1, 0),
(516, 'Aesculus', 0, 2, 2, 0),
(517, 'Fraxinus', 0, 1, 3, 0),
(518, 'Liquidambar', 0, 8, 4, 0),
(519, 'Platanus', 0, 10, 5, 0),
(520, 'Populus', 0, 4, 6, 0),
(521, 'Robur', 0, 5, 7, 0),
(522, 'Sambucus', 0, 6, 8, 0),
(523, 'Asklepios', 0, 3, 9, 0),
(524, 'Briareos', 0, 11, 1, 0),
(525, 'Charon', 0, 2, 2, 0),
(526, 'Deimos', 0, 1, 3, 0),
(527, 'Erebos', 0, 8, 4, 0),
(528, 'Hypnos', 0, 10, 5, 0),
(529, 'Iapetos', 0, 4, 6, 0),
(530, 'Koios', 0, 5, 7, 0),
(531, 'Letha', 1, 6, 8, 0),
(532, 'Moros', 0, 3, 9, 0),
(533, 'Nereus', 0, 11, 1, 0),
(534, 'Oizys', 1, 2, 2, 0),
(535, 'Pallas', 0, 1, 3, 0),
(536, 'Selene', 1, 8, 4, 0),
(537, 'Thanatos', 0, 10, 5, 0),
(538, 'Eos', 1, 4, 6, 0),
(539, 'Helios', 0, 5, 7, 0),
(540, 'Nyx', 1, 6, 8, 0),
(541, 'Kronos', 0, 3, 9, 0),
(542, 'Rheia', 1, 11, 1, 0),
(543, 'Atlas', 0, 2, 2, 0),
(544, 'Echo', 1, 1, 3, 0),
(545, 'Iris', 1, 8, 4, 0),
(546, 'Styx', 1, 10, 5, 0),
(547, 'Tyche', 1, 4, 6, 0),
(548, 'Zelos', 0, 5, 7, 0),
(549, 'Bia', 1, 6, 8, 0),
(550, 'Kratos', 0, 3, 9, 0),
(551, 'Nike', 1, 11, 1, 0),
(552, 'Adrestia', 1, 2, 2, 0),
(553, 'Astraea', 1, 1, 3, 0),
(554, 'Dike', 1, 8, 4, 0),
(555, 'Eirene', 1, 10, 5, 0),
(556, 'Eunomia', 1, 4, 6, 0),
(557, 'Hegemone', 1, 5, 7, 0),
(558, 'Horme', 1, 6, 8, 0),
(559, 'Kakia', 1, 3, 9, 0),
(560, 'Arete', 1, 11, 1, 0),
(561, 'Eucleia', 1, 2, 2, 0),
(562, 'Eupheme', 1, 1, 3, 0),
(563, 'Philophrosyne', 1, 8, 4, 0),
(564, 'Ariadne', 1, 10, 5, 0),
(565, 'Cassiopeia', 1, 4, 6, 0),
(566, 'Erigone', 1, 5, 7, 0),
(567, 'Herophile', 1, 6, 8, 0),
(568, 'Manto', 1, 3, 9, 0),
(569, 'Medea', 1, 11, 1, 0),
(570, 'Phaedra', 1, 2, 2, 0),
(571, 'Xanthe', 1, 1, 3, 0),
(572, 'Chloe', 1, 8, 4, 0),
(573, 'Daphne', 1, 10, 5, 0),
(574, 'Hecuba', 1, 4, 6, 0),
(575, 'Laodice', 1, 5, 7, 0),
(576, 'Myrrha', 1, 6, 8, 0),
(577, 'Penthesilea', 1, 3, 9, 0),
(578, 'Alcestis', 1, 11, 1, 0),
(579, 'Andromache', 1, 2, 2, 0),
(580, 'Deianira', 1, 1, 3, 0),
(581, 'Europa', 1, 8, 4, 0),
(582, 'Harmonia', 1, 10, 5, 0),
(583, 'Iphigenia', 1, 4, 6, 0),
(584, 'Jocasta', 1, 5, 7, 0),
(585, 'Niobe', 1, 6, 8, 0),
(586, 'Persephone', 1, 3, 9, 0),
(587, 'Pyrrha', 1, 11, 1, 0),
(588, 'Thetis', 1, 2, 2, 0),
(589, 'Acrisius', 0, 1, 3, 0),
(590, 'Actor', 0, 2, 4, 0),
(591, 'Alcmaon', 0, 3, 5, 0),
(592, 'Antenor', 0, 4, 6, 0),
(593, 'Autolycus', 0, 5, 7, 0),
(594, 'Bellerophon', 0, 6, 8, 0),
(595, 'Chiron', 0, 8, 9, 0),
(596, 'Daedalus', 0, 10, 1, 0),
(597, 'Eleusis', 0, 11, 2, 0),
(598, 'Glaucus', 0, 1, 3, 0),
(599, 'Hippolytus', 0, 2, 4, 0),
(600, 'Iamus', 0, 3, 5, 0),
(601, 'Laertes', 0, 4, 6, 0),
(602, 'Melampus', 0, 5, 7, 0),
(603, 'Neoptolemus', 0, 6, 8, 0),
(604, 'Oicles', 0, 8, 9, 0),
(605, 'Peleus', 0, 10, 1, 0),
(606, 'Rhadamanthus', 0, 11, 2, 0),
(607, 'Sisyphus', 0, 1, 3, 0),
(608, 'Teiresias', 0, 2, 4, 0),
(609, 'Albinus', 0, 3, 5, 0),
(610, 'Augustus', 0, 4, 6, 0),
(611, 'Cato', 0, 5, 7, 0),
(612, 'Cicero', 0, 6, 8, 0),
(613, 'Drusus', 0, 8, 9, 0),
(614, 'Fabius', 0, 10, 1, 0),
(615, 'Galla', 1, 11, 2, 0),
(616, 'Horatia', 1, 1, 3, 0),
(617, 'Junia', 1, 2, 4, 0),
(618, 'Livia', 1, 3, 5, 0),
(619, 'Marcella', 1, 4, 6, 0),
(620, 'Nigrina', 1, 5, 7, 0),
(621, 'Octavia', 1, 6, 8, 0),
(622, 'Paulina', 1, 8, 9, 0),
(623, 'Quinctia', 1, 10, 1, 0),
(624, 'Rufina', 1, 11, 2, 0),
(625, 'Servilia', 1, 1, 3, 0),
(626, 'Tullia', 1, 2, 4, 0),
(627, 'Ulpia', 1, 3, 5, 0),
(628, 'Valeria', 1, 4, 6, 0),
(629, 'Vipsania', 1, 5, 7, 0),
(630, 'Allectus', 0, 6, 8, 0),
(631, 'Carausius', 0, 8, 9, 0),
(632, 'Constantius', 0, 10, 1, 0),
(633, 'Domitianus', 0, 11, 2, 0),
(634, 'Gratian', 0, 1, 3, 0),
(635, 'Honorius', 0, 2, 4, 0),
(636, 'Justinian', 0, 3, 5, 0),
(637, 'Licinius', 0, 4, 6, 0),
(638, 'Maximian', 0, 5, 7, 0),
(639, 'Numerian', 0, 6, 8, 0),
(640, 'Probus', 0, 8, 9, 0),
(641, 'Severus', 0, 10, 1, 0),
(642, 'Tacitus', 0, 11, 2, 0),
(643, 'Aurelian', 0, 1, 3, 0),
(644, 'Claudius', 0, 2, 4, 0),
(645, 'Decius', 0, 3, 5, 0),
(646, 'Florianus', 0, 4, 6, 0),
(647, 'Gallienus', 0, 5, 7, 0),
(648, 'Macrinus', 0, 6, 8, 0),
(649, 'Nepotian', 0, 8, 9, 0),
(650, 'Anullinus', 0, 10, 1, 0),
(651, 'Celsus', 0, 11, 2, 0),
(652, 'Titianus', 0, 1, 3, 0),
(653, 'Ursus', 0, 2, 4, 0),
(654, 'Victor', 0, 3, 5, 0),
(655, 'Asterius', 0, 4, 6, 0),
(656, 'Cornelius', 0, 5, 7, 0),
(657, 'Dexter', 0, 6, 8, 0),
(658, 'Firmus', 0, 8, 9, 0),
(659, 'Iustus', 0, 10, 1, 0),
(660, 'Laetus', 0, 11, 2, 0),
(661, 'Marinus', 0, 1, 3, 0),
(662, 'Regulus', 0, 2, 4, 0),
(663, 'Agrippa', 0, 3, 5, 0),
(664, 'Balbinus', 0, 4, 6, 0),
(665, 'Capitolinus', 0, 5, 7, 0),
(666, 'Catilina', 0, 6, 8, 0),
(667, 'Cinna', 0, 8, 9, 0),
(668, 'Lucullus', 0, 10, 1, 0),
(669, 'Marius', 0, 11, 2, 0),
(670, 'Pompeius', 0, 1, 3, 0),
(671, 'Romulus', 0, 2, 4, 0),
(672, 'Scipio', 0, 3, 5, 0),
(673, 'Sulla', 0, 4, 6, 0),
(674, 'Varro', 0, 5, 7, 0),
(675, 'Ambrosius', 0, 6, 8, 0),
(676, 'Cassivellaunus', 0, 8, 9, 0),
(677, 'Cunobelinus', 0, 10, 1, 0),
(678, 'Vortigern', 0, 11, 2, 0),
(679, 'Cerdic', 0, 1, 3, 0),
(680, 'Cynric', 0, 2, 4, 0),
(681, 'Caewlin', 0, 3, 5, 0),
(682, 'Aethelberht', 0, 4, 6, 0),
(683, 'Raedwald', 0, 5, 7, 0),
(684, 'Eorpwald', 0, 6, 8, 0),
(685, 'Sigeberht', 0, 8, 9, 0),
(686, 'Oswald', 0, 10, 1, 0),
(687, 'Oswiu', 0, 11, 2, 0),
(688, 'Ecgfrith', 0, 1, 3, 0),
(689, 'Aldfrith', 0, 2, 4, 0),
(690, 'Coenred', 0, 3, 5, 0),
(691, 'Ceolred', 0, 4, 6, 0),
(692, 'Aethelbald', 0, 5, 7, 0),
(693, 'Offa', 0, 6, 8, 0),
(694, 'Coenwulf', 0, 8, 9, 0),
(695, 'Beornwulf', 0, 10, 1, 0),
(696, 'Burgred', 0, 11, 2, 0),
(697, 'Aethelwulf', 0, 1, 3, 0),
(698, 'Aethelbald', 0, 2, 4, 0),
(699, 'Eadweard', 0, 3, 5, 0),
(700, 'Aelfweard', 0, 4, 6, 0);
@@ -36,6 +36,7 @@
#include "SocialMgr.h" // SOCIAL_FLAG_FRIEND/IGNORED for friend ops #include "SocialMgr.h" // SOCIAL_FLAG_FRIEND/IGNORED for friend ops
#include "CalendarMgr.h" // sCalendarMgr for calendar_rsvp_all_pending #include "CalendarMgr.h" // sCalendarMgr for calendar_rsvp_all_pending
#include "SpellAuraDefines.h" #include "SpellAuraDefines.h"
#include "SpellAuras.h"
#include "Pet.h" #include "Pet.h"
#include "PetAI.h" #include "PetAI.h"
#include "CreatureAI.h" #include "CreatureAI.h"
@@ -43,6 +44,7 @@
#include "GroupMgr.h" #include "GroupMgr.h"
#include "ChatPackets.h" #include "ChatPackets.h"
#include "Language.h" #include "Language.h"
#include "Log.h"
#include "PartyPackets.h" #include "PartyPackets.h"
#include "GameObject.h" #include "GameObject.h"
#include "GameObjectAI.h" #include "GameObjectAI.h"
@@ -9,6 +9,7 @@
#include "Define.h" #include "Define.h"
#include "ObjectGuid.h" #include "ObjectGuid.h"
#include "Position.h"
#include "SharedDefines.h" #include "SharedDefines.h"
#include <string> #include <string>
+41 -95
View File
@@ -1,103 +1,49 @@
# PlayerbotV2 — Installation Guide # PlayerbotV2 — Installation Guide
Apply these changes to a clean TrinityCore source tree to enable the Two core-hooks patches are shipped for different host cores:
PlayerbotV2 module. Each section lists the exact file, line (approximate —
may shift with TC updates), and the change needed.
There are two installation methods: | Patch | Target | Description |
|-------|--------|-------------|
| `playerbotv2_core_hooks.patch` | Stock TrinityCore `master` (f1d9bbe9ca) | Full V2 bundle — core hooks, accessors, DB statements, module harness, build wiring |
| `playerbotv2_core_hooks.thordekk.patch` | ThordekkCore `main` (4db5b776e2) | V2-only — assumes ThordekkCore already carries fork API additions (`GetTargetIcon`, `virtual SendPacket`, etc.) |
1. **Quick install (recommended): git patch** — see Section 1. One command, Apply the patch that matches your target core, then copy the module into place:
applies the module + all core hooks + build integration automatically.
Every core hook is wrapped in an `#if TRINITY_PLAYERBOT_V2` guard, so the
core files stay clean and the whole integration can be toggled via
`-DBUILD_PLAYERBOT_V2`.
2. **Manual install** — see Sections 2–6. Copy the changes by hand.
---
## 1. Quick Install (Recommended): Git Patch
The repository ships a single patch file that turns a clean TrinityCore tree
into a PlayerbotV2-enabled one:
```
playerbotv2_core_hooks.patch
```
It contains:
- the full module: `src/modules/PlayerbotV2/` (all 14 sub-libraries)
- the core forwarding headers: `src/server/game/Playerbot/`
- the command script: `src/server/scripts/Commands/cs_playerbot_v2.cpp`
- every core hook (each a self-delineated `#if TRINITY_PLAYERBOT_V2` block)
- the build integration (`cmake/options.cmake`, `src/modules/CMakeLists.txt`,
and the `game` / `scripts` / `worldserver` CMakeLists)
### Applying the patch
From a clean TrinityCore checkout:
```bash ```bash
git apply playerbotv2_core_hooks.patch # Step 1: apply the core hooks patch for your target
git apply src/modules/PlayerbotV2/playerbotv2_core_hooks.patch
# Step 2: if you applied the thordekk variant, skip to step 3.
# For stock TC, the patch already includes src/modules/Common and
# src/modules/CMakeLists.txt.
# Step 3: configure and build
cmake -S . -B build -DBUILD_PLAYERBOT_V2=ON
cmake --build build --target worldserver
``` ```
> If you have no local commits yet, `git am playerbotv2_core_hooks.patch` Every hook in the patch is wrapped in `#if TRINITY_PLAYERBOT_V2`, so if you
> also works (it produces one commit). build without `-DBUILD_PLAYERBOT_V2=ON` the changes compile to no-ops.
Then configure and build (see Section 8). ### Regenerating the patch
### Keeping a dedicated branch (leaves `origin` untouched) The patches live in the repo at `src/modules/PlayerbotV2/`. Run
`/tmp/opencode/gen_v2_patch.sh` followed by the V2-only hunk filter
(`/tmp/opencode/filter_v2.py`) to regenerate the stock-TC patch. Hand-edit
the output to drop fork-noise hunks and add module-required core APIs
that stock TC lacks (`GetTargetIcon`, `virtual SendPacket`).
To keep the module on its own branch without touching the `origin` remote, For ThordekkCore, diff the patched worktree against clean `thordekk/main`
create a branch from your upstream base and apply the patch onto it: excluding the module directory:
```bash ```bash
# From your clone: git diff thordekk/main -- . ':(exclude)src/modules/PlayerbotV2' \
git checkout -b playerbotv2-module origin/master # or tc-upstream/master > src/modules/PlayerbotV2/playerbotv2_core_hooks.thordekk.patch
git apply playerbotv2_core_hooks.patch
git add -A
git commit -m "Add PlayerbotV2 module + core hooks"
# Push it to a remote that is NOT origin (e.g. your module repo):
git remote add playerbot-v2 <your-module-repo-url> # once
git push -u playerbot-v2 playerbotv2-module
```
`origin` and all its branches are never modified by these commands; the
branch is purely local until you push it to the chosen remote.
### Regenerating the patch after edits
The patch is generated from a clean base so it stays self-contained:
```bash
git diff <clean-base>..HEAD -- \
src/modules/PlayerbotV2/ src/server/game/Playerbot/ \
src/server/scripts/Commands/cs_playerbot_v2.cpp \
cmake/options.cmake src/modules/CMakeLists.txt \
src/server/game/CMakeLists.txt src/server/scripts/CMakeLists.txt \
src/server/scripts/Commands/cs_script_loader.cpp src/server/worldserver/CMakeLists.txt \
src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Unit/Unit.cpp \
src/server/game/Server/WorldSession.cpp src/server/game/Server/WorldSession.h \
src/server/game/World/World.cpp src/server/game/Handlers/CharacterHandler.cpp \
src/server/game/Handlers/ChatHandler.cpp src/server/game/Handlers/BattleGroundHandler.cpp \
src/server/game/Handlers/LootHandler.cpp src/server/game/Handlers/ItemHandler.cpp \
src/server/game/Handlers/LFGHandler.cpp src/server/game/Handlers/NPCHandler.cpp \
src/server/game/DungeonFinding/LFGMgr.cpp src/server/game/Battlegrounds/BattlegroundQueue.cpp \
src/server/game/Guilds/Guild.cpp \
> playerbotv2_core_hooks.patch
```
Replace `<clean-base>` with the upstream commit you want the patch rooted at
(e.g. `tc-upstream/master`). Verify it still applies to a clean tree first:
```bash
git apply --check playerbotv2_core_hooks.patch
``` ```
--- ---
## 2. World Thread Integration ## 3. World Thread Integration
**File:** `src/server/game/World/World.cpp` **File:** `src/server/game/World/World.cpp`
@@ -113,7 +59,7 @@ git apply --check playerbotv2_core_hooks.patch
--- ---
## 3. Core Hook Points ## 4. Core Hook Points
### Entity Hooks ### Entity Hooks
@@ -242,7 +188,7 @@ class WorldSession {
--- ---
## 4. Script Registration ## 5. Script Registration
**File:** `src/server/scripts/Commands/cs_script_loader.cpp` **File:** `src/server/scripts/Commands/cs_script_loader.cpp`
@@ -259,7 +205,7 @@ and is compiled as part of the `scripts_commands` library.
--- ---
## 5. Build System Integration ## 6. Build System Integration
**File:** `src/server/worldserver/CMakeLists.txt` **File:** `src/server/worldserver/CMakeLists.txt`
@@ -316,7 +262,7 @@ The umbrella `playerbot-v2` INTERFACE library links all 14 sub-libs transitively
--- ---
## 6. Directory Structure After Installation ## 7. Directory Structure After Installation
``` ```
src/ src/
@@ -353,7 +299,7 @@ src/
--- ---
## 7. Core Files Touched (Summary) ## 8. Core Files Touched (Summary)
| File | # of hooks | Category | | File | # of hooks | Category |
|------|-----------|----------| |------|-----------|----------|
@@ -375,20 +321,20 @@ src/
--- ---
## 8. First-Time Setup ## 9. First-Time Setup
```bash ```bash
# 1. Apply the module — recommended: `git apply playerbotv2_core_hooks.patch` # 1. Apply the bundled patch (Section 1) — this covers all core hooks,
# (Section 1). Manual fallback: apply Sections 2–5 by hand. # forwarding headers, and build integration in one step
# 2. Configure and build: # 3. Configure and build:
cmake -S . -B build -DBUILD_PLAYERBOT_V2=ON cmake -S . -B build -DBUILD_PLAYERBOT_V2=ON
cmake --build build --target worldserver cmake --build build --target worldserver
# 3. Apply DB migrations (optional — altbot table auto-creates on first use): # 4. Apply DB migrations (optional — altbot table auto-creates on first use):
mysql < src/modules/PlayerbotV2/sql/world/0007_playerbot_v2_altbot.sql mysql < src/modules/PlayerbotV2/sql/world/0007_playerbot_v2_altbot.sql
# 4. Copy config: # 5. Copy config:
cp src/modules/PlayerbotV2/conf/playerbot.conf.dist <server_etc_dir>/playerbot.conf cp src/modules/PlayerbotV2/conf/playerbot.conf.dist <server_etc_dir>/playerbot.conf
# 5. Start worldserver — the module initializes automatically # 6. Start worldserver — the module initializes automatically
``` ```
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff