@@ -20,46 +20,46 @@ IOBosstiary &IOBosstiary::getInstance() {
20
20
}
21
21
22
22
void 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);
33
31
auto timeNow = getTimeNow ();
34
32
auto time = localtime (&timeNow);
35
33
auto today = time->tm_mday ;
36
34
37
- auto bossMap = getBosstiaryMap ();
35
+ const auto & bossMap = getBosstiaryMap ();
38
36
if (bossMap.size () <= 1 ) {
39
37
g_logger ().error (" [{}] It is not possible to create a boosted boss with only one registered boss. (CODE 02)" , __FUNCTION__);
40
38
return ;
41
39
}
42
40
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
+ }
52
53
}
53
54
54
55
// 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);
58
59
if (!mType || mType ->info .bosstiaryRace != BosstiaryRarity_t::RARITY_ARCHFOE) {
59
60
continue ;
60
61
}
61
-
62
- bossInfo.try_emplace (infoBossRaceId, infoBossName);
62
+ bossInfo.emplace_back (infoBossRaceId, infoBossName);
63
63
}
64
64
65
65
// Check if not have archfoe registered boss
@@ -68,55 +68,39 @@ void IOBosstiary::loadBoostedBoss() {
68
68
return ;
69
69
}
70
70
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
+ );
87
88
}
89
+ query += fmt::format (" `raceid` = {}" , bossId);
88
90
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__);
107
93
return ;
108
94
}
109
95
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__);
114
99
}
115
100
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__);
120
104
}
121
105
122
106
setBossBoostedName (bossName);
0 commit comments