@@ -20,46 +20,46 @@ IOBosstiary &IOBosstiary::getInstance() {
2020}
2121
2222void IOBosstiary::loadBoostedBoss () {
23- Database &database = Database::getInstance ();
24- std::ostringstream query;
25- query << " SELECT * FROM `boosted_boss`" ;
26- DBResult_ptr result = database.storeQuery (query.str ());
27- if (!result) {
28- g_logger ().error (" [{}] Failed to detect boosted boss database. (CODE 01)" , __FUNCTION__);
29- return ;
30- }
31-
32- auto date = result->getNumber <uint16_t >(" date" );
23+ std::string query = R"SQL(
24+ SELECT `date`, `boostname`, `raceid`, `looktypeEx`, `looktype`,
25+ `lookfeet`, `looklegs`, `lookhead`, `lookbody`,
26+ `lookaddons`, `lookmount`
27+ FROM `boosted_boss`
28+ )SQL" ;
29+
30+ DBResult_ptr result = g_database ().storeQuery (query);
3331 auto timeNow = getTimeNow ();
3432 auto time = localtime (&timeNow);
3533 auto today = time->tm_mday ;
3634
37- auto bossMap = getBosstiaryMap ();
35+ const auto & bossMap = getBosstiaryMap ();
3836 if (bossMap.size () <= 1 ) {
3937 g_logger ().error (" [{}] It is not possible to create a boosted boss with only one registered boss. (CODE 02)" , __FUNCTION__);
4038 return ;
4139 }
4240
43- std::string bossName;
44- uint16_t bossId = 0 ;
45- if (date == today) {
46- bossName = result->getString (" boostname" );
47- bossId = result->getNumber <uint16_t >(" raceid" );
48- setBossBoostedName (bossName);
49- setBossBoostedId (bossId);
50- g_logger ().info (" Boosted boss: {}" , bossName);
51- return ;
41+ if (!result) {
42+ g_logger ().warn (" [{}] No boosted boss found in g_database(). A new one will be selected." , __FUNCTION__);
43+ } else {
44+ auto date = result->getNumber <uint16_t >(" date" );
45+ if (date == today) {
46+ std::string bossName = result->getString (" boostname" );
47+ uint16_t bossId = result->getNumber <uint16_t >(" raceid" );
48+ setBossBoostedName (bossName);
49+ setBossBoostedId (bossId);
50+ g_logger ().info (" Boosted boss: {}" , bossName);
51+ return ;
52+ }
5253 }
5354
5455 // Filter only archfoe bosses
55- std::map< uint16_t , std::string> bossInfo;
56- for (auto [infoBossRaceId, infoBossName] : bossMap) {
57- const auto mType = getMonsterTypeByBossRaceId (infoBossRaceId);
56+ std::vector<std::pair< uint16_t , std::string> > bossInfo;
57+ for (const auto & [infoBossRaceId, infoBossName] : bossMap) {
58+ const auto & mType = getMonsterTypeByBossRaceId (infoBossRaceId);
5859 if (!mType || mType ->info .bosstiaryRace != BosstiaryRarity_t::RARITY_ARCHFOE) {
5960 continue ;
6061 }
61-
62- bossInfo.try_emplace (infoBossRaceId, infoBossName);
62+ bossInfo.emplace_back (infoBossRaceId, infoBossName);
6363 }
6464
6565 // Check if not have archfoe registered boss
@@ -68,55 +68,39 @@ void IOBosstiary::loadBoostedBoss() {
6868 return ;
6969 }
7070
71- auto oldBossRace = result->getNumber <uint16_t >(" raceid" );
72- while (true ) {
73- uint32_t randomIndex = uniform_random (0 , static_cast <int32_t >(bossInfo.size ()));
74- auto it = std::next (bossInfo.begin (), randomIndex);
75- if (it == bossInfo.end ()) {
76- break ;
77- }
78-
79- const auto &[randomBossId, randomBossName] = *it;
80- if (randomBossId == oldBossRace) {
81- continue ;
82- }
83-
84- bossName = randomBossName;
85- bossId = randomBossId;
86- break ;
71+ const auto &[randomBossId, randomBossName] = bossInfo[uniform_random (0 , static_cast <int32_t >(bossInfo.size () - 1 ))];
72+ std::string bossName = randomBossName;
73+ uint16_t bossId = randomBossId;
74+
75+ query = fmt::format (
76+ " UPDATE `boosted_boss` SET `date` = '{}', `boostname` = {}, " ,
77+ today, g_database ().escapeString (bossName)
78+ );
79+ if (const auto &bossType = getMonsterTypeByBossRaceId (bossId); bossType) {
80+ query += fmt::format (
81+ " `looktypeEx` = {}, `looktype` = {}, `lookfeet` = {}, `looklegs` = {}, "
82+ " `lookhead` = {}, `lookbody` = {}, `lookaddons` = {}, `lookmount` = {}, " ,
83+ bossType->info .outfit .lookTypeEx , bossType->info .outfit .lookType ,
84+ bossType->info .outfit .lookFeet , bossType->info .outfit .lookLegs ,
85+ bossType->info .outfit .lookHead , bossType->info .outfit .lookBody ,
86+ bossType->info .outfit .lookAddons , bossType->info .outfit .lookMount
87+ );
8788 }
89+ query += fmt::format (" `raceid` = {}" , bossId);
8890
89- query.str (std::string ());
90- query << " UPDATE `boosted_boss` SET " ;
91- query << " `date` = '" << today << " '," ;
92- query << " `boostname` = " << database.escapeString (bossName) << " ," ;
93- if (const auto bossType = getMonsterTypeByBossRaceId (bossId);
94- bossType) {
95- query << " `looktypeEx` = " << static_cast <int >(bossType->info .outfit .lookTypeEx ) << " ," ;
96- query << " `looktype` = " << static_cast <int >(bossType->info .outfit .lookType ) << " ," ;
97- query << " `lookfeet` = " << static_cast <int >(bossType->info .outfit .lookFeet ) << " ," ;
98- query << " `looklegs` = " << static_cast <int >(bossType->info .outfit .lookLegs ) << " ," ;
99- query << " `lookhead` = " << static_cast <int >(bossType->info .outfit .lookHead ) << " ," ;
100- query << " `lookbody` = " << static_cast <int >(bossType->info .outfit .lookBody ) << " ," ;
101- query << " `lookaddons` = " << static_cast <int >(bossType->info .outfit .lookAddons ) << " ," ;
102- query << " `lookmount` = " << static_cast <int >(bossType->info .outfit .lookMount ) << " ," ;
103- }
104- query << " `raceid` = '" << bossId << " '" ;
105- if (!database.executeQuery (query.str ())) {
106- g_logger ().error (" [{}] Failed to detect boosted boss database. (CODE 03)" , __FUNCTION__);
91+ if (!g_database ().executeQuery (query)) {
92+ g_logger ().error (" [{}] Failed to update boosted boss in g_database(). (CODE 03)" , __FUNCTION__);
10793 return ;
10894 }
10995
110- query.str (std::string ());
111- query << " UPDATE `player_bosstiary` SET `bossIdSlotOne` = 0 WHERE `bossIdSlotOne` = " << bossId;
112- if (!database.executeQuery (query.str ())) {
113- g_logger ().error (" [{}] Failed to reset players selected boss slot 1. (CODE 03)" , __FUNCTION__);
96+ query = fmt::format (" UPDATE `player_bosstiary` SET `bossIdSlotOne` = 0 WHERE `bossIdSlotOne` = {}" , bossId);
97+ if (!g_database ().executeQuery (query)) {
98+ g_logger ().error (" [{}] Failed to reset players' selected boss slot 1. (CODE 03)" , __FUNCTION__);
11499 }
115100
116- query.str (std::string ());
117- query << " UPDATE `player_bosstiary` SET `bossIdSlotTwo` = 0 WHERE `bossIdSlotTwo` = " << bossId;
118- if (!database.executeQuery (query.str ())) {
119- g_logger ().error (" [{}] Failed to reset players selected boss slot 1. (CODE 03)" , __FUNCTION__);
101+ query = fmt::format (" UPDATE `player_bosstiary` SET `bossIdSlotTwo` = 0 WHERE `bossIdSlotTwo` = {}" , bossId);
102+ if (!g_database ().executeQuery (query)) {
103+ g_logger ().error (" [{}] Failed to reset players' selected boss slot 2. (CODE 03)" , __FUNCTION__);
120104 }
121105
122106 setBossBoostedName (bossName);
0 commit comments