From a430786133a4846eff6d4e1fa9fa7fa2b40e3390 Mon Sep 17 00:00:00 2001 From: Bobblybook Date: Sat, 19 Oct 2024 22:44:11 +1100 Subject: [PATCH] Reapply "Preferred mount selection for bots" This reverts commit eb5dd450cdcf3de57805f221d95faf8d4d8d5f89. --- .../base/playerbots_preferred_mounts.sql | 10 ++++++ .../actions/CheckMountStateAction.cpp | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 sql/playerbots/base/playerbots_preferred_mounts.sql diff --git a/sql/playerbots/base/playerbots_preferred_mounts.sql b/sql/playerbots/base/playerbots_preferred_mounts.sql new file mode 100644 index 00000000..6d904fb3 --- /dev/null +++ b/sql/playerbots/base/playerbots_preferred_mounts.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `playerbots_preferred_mounts`; +CREATE TABLE `playerbots_preferred_mounts` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `guid` INT(11) NOT NULL, + `type` TINYINT(3) NOT NULL COMMENT '0: Ground, 1: Flying', + `spellid` INT(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `guid` (`guid`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 0300827b..7ae52f74 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -270,6 +270,42 @@ bool CheckMountStateAction::Mount() : 0; } + // Check for preferred mounts table in db + QueryResult checkTable = PlayerbotsDatabase.Query( + "SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = 'acore_playerbots' AND table_name = 'playerbots_preferred_mounts')"); + + if (checkTable) + { + uint32 tableExists = checkTable->Fetch()[0].Get(); + if (tableExists == 1) + { + // Check for preferred mount entry + QueryResult result = PlayerbotsDatabase.Query( + "SELECT spellid FROM playerbots_preferred_mounts WHERE guid = {} AND type = {}", + bot->GetGUID().GetCounter(), masterMountType); + + if (result) + { + std::vector mounts; + do + { + Field* fields = result->Fetch(); + uint32 spellId = fields[0].Get(); + mounts.push_back(spellId); + } while (result->NextRow()); + + uint32 index = urand(0, mounts.size() - 1); + // Validate spell ID + if (index < mounts.size() && sSpellMgr->GetSpellInfo(mounts[index])) + { + // TODO: May want to do checks for 'bot riding skill > skill required to ride the mount' + return botAI->CastSpell(mounts[index], bot); + } + } + } + } + + // No preferred mount found (or invalid), continue with random mount selection std::map>& spells = allSpells[masterMountType]; if (hasSwiftMount) {