Merge pull request #898 from EQEmu/faction_queries

Faction queries
This commit is contained in:
Uleat 2019-09-09 22:07:59 -04:00 committed by GitHub
commit 8bb76ae2fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -15,6 +15,7 @@
#include <ctime> #include <ctime>
#include <iostream> #include <iostream>
#include <fmt/format.h>
extern Zone* zone; extern Zone* zone;
@ -4072,60 +4073,121 @@ bool ZoneDatabase::SetCharacterFactionLevel(uint32 char_id, int32 faction_id, in
bool ZoneDatabase::LoadFactionData() bool ZoneDatabase::LoadFactionData()
{ {
std::string query = "SELECT MAX(id) FROM faction_list"; std::string query("SELECT MAX(`id`) FROM `faction_list`");
auto results = QueryDatabase(query);
if (!results.Success()) { auto faction_max_results = QueryDatabase(query);
if (!faction_max_results.Success() || faction_max_results.RowCount() == 0) {
return false; return false;
} }
if (results.RowCount() == 0) auto fmr_row = faction_max_results.begin();
return false;
auto row = results.begin(); max_faction = atoul(fmr_row[0]);
faction_array = new Faction *[max_faction + 1];
max_faction = row[0] ? atoi(row[0]) : 0; memset(faction_array, 0, (sizeof(Faction*) * (max_faction + 1)));
faction_array = new Faction*[max_faction+1];
for(unsigned int index=0; index<max_faction; index++) std::vector<size_t> faction_ids;
faction_array[index] = nullptr;
// load factions
query = "SELECT `id`, `name`, `base` FROM `faction_list`";
query = "SELECT id, name, base FROM faction_list"; auto faction_results = QueryDatabase(query);
results = QueryDatabase(query); if (!faction_results.Success()) {
if (!results.Success()) {
return false; return false;
} }
for (row = results.begin(); row != results.end(); ++row) { for (auto fr_row : faction_results) {
uint32 index = atoi(row[0]);
uint32 index = atoul(fr_row[0]);
if (index > max_faction) {
Log(Logs::General, Logs::Error, "Faction '%u' is out-of-bounds for faction array size!", index);
continue;
}
// this should never hit since `id` is keyed..but, it alleviates any risk of lost pointers
if (faction_array[index] != nullptr) {
Log(Logs::General, Logs::Error, "Faction '%u' has already been assigned! (Duplicate Entry)", index);
continue;
}
faction_array[index] = new Faction; faction_array[index] = new Faction;
strn0cpy(faction_array[index]->name, row[1], 50); strn0cpy(faction_array[index]->name, fr_row[1], 50);
faction_array[index]->base = atoi(row[2]); faction_array[index]->base = atoi(fr_row[2]);
faction_array[index]->min = MIN_PERSONAL_FACTION; faction_array[index]->min = MIN_PERSONAL_FACTION;
faction_array[index]->max = MAX_PERSONAL_FACTION; faction_array[index]->max = MAX_PERSONAL_FACTION;
faction_ids.push_back(index);
}
// Load in the mimimum and maximum faction that can be earned for this faction Log(Logs::General, Logs::Status, "%u Faction%s loaded...", faction_ids.size(), (faction_ids.size() == 1 ? "" : "s"));
query = StringFormat("SELECT `min` , `max` FROM `faction_base_data` WHERE client_faction_id = %u", index);
auto baseResults = QueryDatabase(query); // this can be removed once the 'io_work' branch has been merged
if (!baseResults.Success() || baseResults.RowCount() == 0) { std::vector<std::string> faction_id_strings;
Log(Logs::General, Logs::General, "Faction %d has no base data", (int)index); for (auto id : faction_ids) {
} faction_id_strings.push_back(fmt::format("'{}'", id));
else { }
for (auto modRow = baseResults.begin(); modRow != baseResults.end(); ++modRow) { const std::string faction_id_criteria(implode(",", faction_id_strings));
faction_array[index]->min = atoi(modRow[0]);
faction_array[index]->max = atoi(modRow[1]); // code to activate (note above)
Log(Logs::General, Logs::None, "Min(%d), Max(%d) for faction (%u)",faction_array[index]->min, faction_array[index]->max, index); //const std::string faction_id_criteria(implode(",", std::pair<char, char>('\'', '\''), faction_ids));
// load faction mins/maxes
query = fmt::format("SELECT `client_faction_id`, `min`, `max` FROM `faction_base_data` WHERE `client_faction_id` IN ({})", faction_id_criteria);
auto base_results = QueryDatabase(query);
if (base_results.Success()) {
for (auto br_row : base_results) {
uint32 index = atoul(br_row[0]);
if (index > max_faction) {
Log(Logs::General, Logs::Error, "Faction '%u' is out-of-bounds for faction array size in Base adjustment!", index);
continue;
} }
if (faction_array[index] == nullptr) {
Log(Logs::General, Logs::Error, "Faction '%u' does not exist for Base adjustment!", index);
continue;
}
faction_array[index]->min = atoi(br_row[1]);
faction_array[index]->max = atoi(br_row[2]);
} }
// Load in modifiers to the faction based on characters race, class and diety. Log(Logs::General, Logs::Status, "%u Faction Base%s loaded...", base_results.RowCount(), (base_results.RowCount() == 1 ? "" : "s"));
query = StringFormat("SELECT `mod`, `mod_name` FROM `faction_list_mod` WHERE faction_id = %u", index); }
auto modResults = QueryDatabase(query); else {
if (!modResults.Success()) Log(Logs::General, Logs::Status, "Unable to load Faction Base data...");
continue; }
// load race, class and diety modifiers
query = fmt::format("SELECT `faction_id`, `mod`, `mod_name` FROM `faction_list_mod` WHERE `faction_id` IN ({})", faction_id_criteria);
for (auto modRow = modResults.begin(); modRow != modResults.end(); ++modRow) { auto modifier_results = QueryDatabase(query);
faction_array[index]->mods[modRow[1]] = atoi(modRow[0]); if (modifier_results.Success()) {
for (auto mr_row : modifier_results) {
uint32 index = atoul(mr_row[0]);
if (index > max_faction) {
Log(Logs::General, Logs::Error, "Faction '%u' is out-of-bounds for faction array size in Modifier adjustment!", index);
continue;
}
if (faction_array[index] == nullptr) {
Log(Logs::General, Logs::Error, "Faction '%u' does not exist for Modifier adjustment!", index);
continue;
}
faction_array[index]->mods[mr_row[2]] = atoi(mr_row[1]);
} }
}
Log(Logs::General, Logs::Status, "%u Faction Modifier%s loaded...", modifier_results.RowCount(), (modifier_results.RowCount() == 1 ? "" : "s"));
}
else {
Log(Logs::General, Logs::Status, "Unable to load Faction Modifier data...");
}
return true; return true;
} }