Few tweaks to rules loading code - broadcast all zones that have loaded when #reloadallrules is used

This commit is contained in:
Akkadius 2018-05-27 23:44:09 -05:00
parent 7a7069959f
commit c8389103e3
2 changed files with 39 additions and 25 deletions

View File

@ -237,45 +237,50 @@ void RuleManager::SaveRules(Database *database, const char *ruleset_name) {
bool RuleManager::LoadRules(Database *database, const char *ruleset_name) { bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
int ruleset_id = GetRulesetID(database, ruleset_name); int ruleset_id = this->GetRulesetID(database, ruleset_name);
if (ruleset_id < 0) { if (ruleset_id < 0) {
Log(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name); Log(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
return(false); return (false);
} }
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset_name, ruleset_id); Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset_name, ruleset_id);
m_activeRuleset = ruleset_id; m_activeRuleset = ruleset_id;
m_activeName = ruleset_name; m_activeName = ruleset_name;
/* Load default ruleset values first if we're loading something other than default */ /* Load default ruleset values first if we're loading something other than default */
if (strcasecmp(ruleset_name, "default") != 0){ if (strcasecmp(ruleset_name, "default") != 0) {
std::string default_ruleset_name = "default"; std::string default_ruleset_name = "default";
int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str()); int default_ruleset_id = GetRulesetID(database, default_ruleset_name.c_str());
if (default_ruleset_id < 0) { if (default_ruleset_id < 0) {
Log(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.", default_ruleset_name.c_str()); Log(Logs::Detail, Logs::Rules, "Failed to find default ruleset '%s' for load operation. Canceling.",
return(false); default_ruleset_name.c_str());
return (false);
} }
Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id); Log(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", default_ruleset_name.c_str(), default_ruleset_id);
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d", default_ruleset_id); std::string query = StringFormat(
"SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id = %d",
default_ruleset_id
);
auto results = database->QueryDatabase(query); auto results = database->QueryDatabase(query);
if (!results.Success()) if (!results.Success())
return false; return false;
for (auto row = results.begin(); row != results.end(); ++row) for (auto row = results.begin(); row != results.end(); ++row)
if (!SetRule(row[0], row[1], nullptr, false)) if (!SetRule(row[0], row[1], nullptr, false))
Log(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]); Log(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]);
} }
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", ruleset_id); std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", ruleset_id);
auto results = database->QueryDatabase(query); auto results = database->QueryDatabase(query);
if (!results.Success()) if (!results.Success())
return false; return false;
for (auto row = results.begin(); row != results.end(); ++row) for (auto row = results.begin(); row != results.end(); ++row)
if (!SetRule(row[0], row[1], nullptr, false)) if (!SetRule(row[0], row[1], nullptr, false))
Log(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]); Log(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]);
return true; return true;
} }
@ -283,7 +288,7 @@ bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
void RuleManager::_SaveRule(Database *database, RuleType type, uint16 index) { void RuleManager::_SaveRule(Database *database, RuleType type, uint16 index) {
char value_string[100]; char value_string[100];
switch(type) { switch (type) {
case IntRule: case IntRule:
sprintf(value_string, "%d", m_RuleIntValues[index]); sprintf(value_string, "%d", m_RuleIntValues[index]);
break; break;
@ -291,22 +296,26 @@ void RuleManager::_SaveRule(Database *database, RuleType type, uint16 index) {
sprintf(value_string, "%.13f", m_RuleRealValues[index]); sprintf(value_string, "%.13f", m_RuleRealValues[index]);
break; break;
case BoolRule: case BoolRule:
sprintf(value_string, "%s", m_RuleBoolValues[index]?"true":"false"); sprintf(value_string, "%s", m_RuleBoolValues[index] ? "true" : "false");
break; break;
} }
std::string query = StringFormat("REPLACE INTO rule_values " std::string query = StringFormat(
"(ruleset_id, rule_name, rule_value) " "REPLACE INTO rule_values "
" VALUES(%d, '%s', '%s')", "(ruleset_id, rule_name, rule_value) "
m_activeRuleset, _GetRuleName(type, index), value_string); " VALUES(%d, '%s', '%s')",
auto results = database->QueryDatabase(query); m_activeRuleset,
_GetRuleName(type, index),
value_string
);
database->QueryDatabase(query);
} }
int RuleManager::GetRulesetID(Database *database, const char *ruleset_name) { int RuleManager::GetRulesetID(Database *database, const char *ruleset_name) {
uint32 len = strlen(ruleset_name); uint32 len = static_cast<uint32>(strlen(ruleset_name));
auto rst = new char[2 * len + 1]; auto rst = new char[2 * len + 1];
database->DoEscapeString(rst, ruleset_name, len); database->DoEscapeString(rst, ruleset_name, len);

View File

@ -1765,8 +1765,13 @@ void WorldServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p)
} }
break; break;
} }
case ServerOP_ReloadRules: case ServerOP_ReloadRules: {
{ worldserver.SendEmoteMessage(
0, 0, 0, 15,
"Rules reloaded for Zone: '%s' Instance ID: %u",
zone->GetLongName(),
zone->GetInstanceID()
);
RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset()); RuleManager::Instance()->LoadRules(&database, RuleManager::Instance()->GetActiveRuleset());
break; break;
} }