Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Paul Coene 2015-12-16 09:11:43 -05:00
commit 2865278987
71 changed files with 3553 additions and 2208 deletions

View File

@ -1,5 +1,32 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50) EQEMu Changelog (Started on Sept 24, 2003 15:50)
------------------------------------------------------- -------------------------------------------------------
== 12/14/2015 ==
Kinglykrab: Added IsBlind() and IsFeared() functionality to Perl and Lua.
- Note: Both methods are Mob methods and may be used on NPCs or PCs.
Natedog: Added Discipline functions, UpdateInstanceTimer function, and UnmemSpellBySpellID to lua and perl
-Examples: http://wiki.eqemulator.org/i?M=Pastebin&Paste=BJ0ygmNM
== 12/07/2015 ==
Uleat: Command aliases are no longer handled through the command_add() function.
- To add a command alias, edit the database table `command_settings` - here, you will find three columns: `command`, `access` and `aliases`
- Adding command aliases require that the command contain an entry in `command_settings`.`command`
- Only 'real' commands go inside of the command_init() function in command.cpp .. if you wish to add aliases, you must enter them into the database
- 'Real' commands are loaded first .. then any access/alias data is loaded and applied afterwards
- Duplicate aliases will be ignored .. only the first encountered occurrence will be honored - if it does not conflict with an existing command name
- Aliases should not contain whitespace and should be '|' (pipe) delimited
- The restriction on the number of aliases has been removed .. though each alias will still be limited to the access level of the parent command
- If you need need more name space for aliases, simply edit the `command_settings` table and increase the size of the `aliases` column
- The old `commands` table has been renamed to `commands_old` for reference
- All of the current 'standard' commands have been added to the new `command_settings` table
- YOU WILL NEED TO VERIFY/IMPORT OLD ACCESS VALUES AS THIS CHANGE REVERTS ALL COMMAND ACCESS VALUES TO THEIR PEQDB DEFAULTS
== 11/30/2015 ==
Uleat: Changed criteria for a few bots scripts from count to null/not null in hopes of fixing special case failures
== 11/22/2015 ==
Uleat: Fix for loginserver project compile failure
== 11/7/2015 == == 11/7/2015 ==
Akkadius: Implemented #repopclose [distance in units] - Used for development purposes, defaults to 500 units Akkadius: Implemented #repopclose [distance in units] - Used for development purposes, defaults to 500 units
- Real case use: Large zones with 700 NPC's and you are making fast quick tweaks to nearby NPC's you can refresh just the NPC's around you instead of all in the zone - Real case use: Large zones with 700 NPC's and you are making fast quick tweaks to nearby NPC's you can refresh just the NPC's around you instead of all in the zone

View File

@ -493,7 +493,7 @@ bool Database::CheckDatabaseConversions() {
/* Check for a new version of this script, the arg passed /* Check for a new version of this script, the arg passed
would have to be higher than the copy they have downloaded would have to be higher than the copy they have downloaded
locally and they will re fetch */ locally and they will re fetch */
system("perl eqemu_update.pl V 11"); system("perl eqemu_update.pl V 13");
/* Run Automatic Database Upgrade Script */ /* Run Automatic Database Upgrade Script */
system("perl eqemu_update.pl ran_from_world"); system("perl eqemu_update.pl ran_from_world");

View File

@ -102,6 +102,7 @@ void EQEmuLogSys::LoadLogSettingsDefaults()
log_settings[Logs::UCS_Server].log_to_console = Logs::General; log_settings[Logs::UCS_Server].log_to_console = Logs::General;
log_settings[Logs::Crash].log_to_console = Logs::General; log_settings[Logs::Crash].log_to_console = Logs::General;
log_settings[Logs::MySQLError].log_to_console = Logs::General; log_settings[Logs::MySQLError].log_to_console = Logs::General;
log_settings[Logs::Login_Server].log_to_console = Logs::General;
/* Declare process file names for log writing /* Declare process file names for log writing
If there is no process_file_name declared, no log file will be written, simply If there is no process_file_name declared, no log file will be written, simply

View File

@ -82,6 +82,7 @@ namespace Logs {
Client_Server_Packet_Unhandled, Client_Server_Packet_Unhandled,
Server_Client_Packet_With_Dump, Server_Client_Packet_With_Dump,
Client_Server_Packet_With_Dump, Client_Server_Packet_With_Dump,
Login_Server,
MaxCategoryID /* Don't Remove this*/ MaxCategoryID /* Don't Remove this*/
}; };
@ -130,6 +131,7 @@ namespace Logs {
"Packet :: Client -> Server Unhandled", "Packet :: Client -> Server Unhandled",
"Packet :: Server -> Client (Dump)", "Packet :: Server -> Client (Dump)",
"Packet :: Client -> Server (Dump)", "Packet :: Client -> Server (Dump)",
"Login Server"
}; };
} }

View File

@ -969,7 +969,7 @@ bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into) {
//load up the rank info for each guild. //load up the rank info for each guild.
std::string query; std::string query;
#ifdef BOTS #ifdef BOTS
query = StringFormat(GuildMemberBaseQuery " WHERE c.id=%d AND c.mobtype = 'C'", char_id); query = StringFormat(GuildMemberBaseQuery " WHERE c.id=%d AND c.mob_type = 'C'", char_id);
#else #else
query = StringFormat(GuildMemberBaseQuery " WHERE c.id=%d", char_id); query = StringFormat(GuildMemberBaseQuery " WHERE c.id=%d", char_id);
#endif #endif

View File

@ -17,43 +17,14 @@
*/ */
#include "rulesys.h" #include "rulesys.h"
#include "database.h" #include "database.h"
#include "string_util.h" #include "string_util.h"
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
/* /*
Commands:
FatherNitwit: Added new rules subsystem to allow game rules to be changed #rules:
at runtime. more about this will come as time goes on.
FatherNitwit: Added #rules command to manage rules data from in game.
FatherNitwit: Renamed old #rules to #serverrules
FatherNitwit: Moved max level into the rules system (Character:MaxLevel)
Requred SQL:
CREATE TABLE rule_sets (
ruleset_id TINYINT UNSIGNED NOT NULL auto_increment,
name VARCHAR(255) NOT NULL,
PRIMARY KEY(ruleset_id)
);
INSERT INTO rule_sets VALUES(0, "default");
UPDATE rule_sets SET ruleset_id=0;
CREATE TABLE rule_values (
ruleset_id TINYINT UNSIGNED NOT NULL,
rule_name VARCHAR(64) NOT NULL,
rule_value VARCHAR(10) NOT NULL,
INDEX(ruleset_id),
PRIMARY KEY(ruleset_id,rule_name)
);
Commands:
#rules:
current -> lists current set name current -> lists current set name
switch (set name) -> change set in the DB, but dont reload switch (set name) -> change set in the DB, but dont reload
load (set name) -> load set into this zone without changing the world load (set name) -> load set into this zone without changing the world
@ -94,28 +65,28 @@ RuleManager::RuleManager()
} }
RuleManager::CategoryType RuleManager::FindCategory(const char *catname) { RuleManager::CategoryType RuleManager::FindCategory(const char *catname) {
int r; int i;
for(r = 0; r < _CatCount; r++) { for (i = 0; i < _CatCount; i++) {
if(strcasecmp(catname, s_categoryNames[r]) == 0) if (strcasecmp(catname, s_categoryNames[i]) == 0)
return((CategoryType) r); return((CategoryType)i);
} }
return(InvalidCategory); return(InvalidCategory);
} }
bool RuleManager::ListRules(const char *catname, std::vector<const char *> &into) { bool RuleManager::ListRules(const char *catname, std::vector<const char *> &into) {
CategoryType cat = InvalidCategory; CategoryType cat = InvalidCategory;
if(catname != nullptr) { if (catname != nullptr) {
cat = FindCategory(catname); cat = FindCategory(catname);
if(cat == InvalidCategory) { if (cat == InvalidCategory) {
Log.Out(Logs::Detail, Logs::Rules, "Unable to find category '%s'", catname); Log.Out(Logs::Detail, Logs::Rules, "Unable to find category '%s'", catname);
return(false); return(false);
} }
} }
int r; int i;
int rcount = CountRules(); int rule_count = CountRules();
for(r = 0; r < rcount; r++) { for (i = 0; i < rule_count; i++) {
const RuleInfo &rule = s_RuleInfo[r]; const RuleInfo &rule = s_RuleInfo[i];
if(catname == nullptr || cat == rule.category) { if (catname == nullptr || cat == rule.category) {
into.push_back(rule.name); into.push_back(rule.name);
} }
} }
@ -123,15 +94,14 @@ bool RuleManager::ListRules(const char *catname, std::vector<const char *> &into
} }
bool RuleManager::ListCategories(std::vector<const char *> &into) { bool RuleManager::ListCategories(std::vector<const char *> &into) {
int r; int i;
for(r = 0; r < _CatCount; r++) { for (i = 0; i < _CatCount; i++) {
into.push_back(s_categoryNames[r]); into.push_back(s_categoryNames[i]);
} }
return(true); return(true);
} }
bool RuleManager::GetRule(const char *rule_name, std::string &return_value) {
bool RuleManager::GetRule(const char *rule_name, std::string &ret_val) {
RuleType type; RuleType type;
uint16 index; uint16 index;
if (!_FindRule(rule_name, type, index)) if (!_FindRule(rule_name, type, index))
@ -151,12 +121,12 @@ bool RuleManager::GetRule(const char *rule_name, std::string &ret_val) {
break; break;
} }
ret_val = tmp; return_value = tmp;
return true; return true;
} }
bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Database *db, bool db_save) { bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Database *database, bool db_save) {
if(rule_name == nullptr || rule_value == nullptr) if(rule_name == nullptr || rule_value == nullptr)
return(false); return(false);
@ -166,25 +136,26 @@ bool RuleManager::SetRule(const char *rule_name, const char *rule_value, Databas
return(false); return(false);
switch(type) { switch(type) {
case IntRule: case IntRule:
m_RuleIntValues [index] = atoi(rule_value); m_RuleIntValues[index] = atoi(rule_value);
Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %d", rule_name, m_RuleIntValues[index]); Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %d", rule_name, m_RuleIntValues[index]);
break; break;
case RealRule: case RealRule:
m_RuleRealValues[index] = atof(rule_value); m_RuleRealValues[index] = atof(rule_value);
Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %.13f", rule_name, m_RuleRealValues[index]); Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %.13f", rule_name, m_RuleRealValues[index]);
break; break;
case BoolRule: case BoolRule:
uint32 val = 0; uint32 val = 0;
if(!strcasecmp(rule_value, "on") || !strcasecmp(rule_value, "true") || !strcasecmp(rule_value, "yes") || !strcasecmp(rule_value, "enabled") || !strcmp(rule_value, "1")) if (!strcasecmp(rule_value, "on") || !strcasecmp(rule_value, "true") || !strcasecmp(rule_value, "yes") || !strcasecmp(rule_value, "enabled") || !strcmp(rule_value, "1"))
val = 1; val = 1;
m_RuleBoolValues[index] = val;
Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %s", rule_name, m_RuleBoolValues[index] == 1 ?"true":"false"); m_RuleBoolValues[index] = val;
break; Log.Out(Logs::Detail, Logs::Rules, "Set rule %s to value %s", rule_name, m_RuleBoolValues[index] == 1 ? "true" : "false");
break;
} }
if(db_save) if(db_save)
_SaveRule(db, type, index); _SaveRule(database, type, index);
return(true); return(true);
} }
@ -201,14 +172,14 @@ void RuleManager::ResetRules() {
} }
bool RuleManager::_FindRule(const char *rule_name, RuleType &type_into, uint16 &index_into) { bool RuleManager::_FindRule(const char *rule_name, RuleType &type_into, uint16 &index_into) {
if(rule_name == nullptr) if (rule_name == nullptr)
return(false); return(false);
int r; int i;
int rcount = CountRules(); int rule_count = CountRules();
for(r = 0; r < rcount; r++) { for (i = 0; i < rule_count; i++) {
const RuleInfo &rule = s_RuleInfo[r]; const RuleInfo &rule = s_RuleInfo[i];
if(strcmp(rule_name, rule.name) == 0) { if (strcmp(rule_name, rule.name) == 0) {
type_into = rule.type; type_into = rule.type;
index_into = rule.rule_index; index_into = rule.rule_index;
return(true); return(true);
@ -220,191 +191,177 @@ bool RuleManager::_FindRule(const char *rule_name, RuleType &type_into, uint16 &
//assumes index is valid! //assumes index is valid!
const char *RuleManager::_GetRuleName(RuleType type, uint16 index) { const char *RuleManager::_GetRuleName(RuleType type, uint16 index) {
switch(type) { switch (type) {
case IntRule: case IntRule:
return(s_RuleInfo[index].name); return(s_RuleInfo[index].name);
case RealRule: case RealRule:
return(s_RuleInfo[index+_IntRuleCount].name); return(s_RuleInfo[index + _IntRuleCount].name);
case BoolRule: case BoolRule:
return(s_RuleInfo[index+_IntRuleCount+_RealRuleCount].name); return(s_RuleInfo[index + _IntRuleCount + _RealRuleCount].name);
} }
//should never happen //should never happen
return("InvalidRule??"); return("InvalidRule??");
} }
void RuleManager::SaveRules(Database *db, const char *ruleset) { void RuleManager::SaveRules(Database *database, const char *ruleset_name) {
if(ruleset != nullptr) { if (ruleset_name != nullptr) {
//saving to a specific name //saving to a specific name
if(m_activeName != ruleset) { if (m_activeName != ruleset_name) {
//a new name... //a new name...
m_activeRuleset = _FindOrCreateRuleset(db, ruleset); m_activeRuleset = _FindOrCreateRuleset(database, ruleset_name);
if(m_activeRuleset == -1) { if (m_activeRuleset == -1) {
Log.Out(Logs::Detail, Logs::Rules, "Unable to find or create rule set %s", ruleset); Log.Out(Logs::Detail, Logs::Rules, "Unable to find or create rule set %s", ruleset_name);
return; return;
} }
m_activeName = ruleset; m_activeName = ruleset_name;
} }
Log.Out(Logs::Detail, Logs::Rules, "Saving running rules into rule set %s (%d)", ruleset, m_activeRuleset); Log.Out(Logs::Detail, Logs::Rules, "Saving running rules into rule set %s (%d)", ruleset_name, m_activeRuleset);
} else { }
else {
Log.Out(Logs::Detail, Logs::Rules, "Saving running rules into running rule set %s", m_activeName.c_str(), m_activeRuleset); Log.Out(Logs::Detail, Logs::Rules, "Saving running rules into running rule set %s", m_activeName.c_str(), m_activeRuleset);
} }
int r; int i;
for(r = 0; r < _IntRuleCount; r++) { for (i = 0; i < _IntRuleCount; i++) {
_SaveRule(db, IntRule, r); _SaveRule(database, IntRule, i);
} }
for(r = 0; r < _RealRuleCount; r++) { for (i = 0; i < _RealRuleCount; i++) {
_SaveRule(db, RealRule, r); _SaveRule(database, RealRule, i);
} }
for(r = 0; r < _BoolRuleCount; r++) { for (i = 0; i < _BoolRuleCount; i++) {
_SaveRule(db, BoolRule, r); _SaveRule(database, BoolRule, i);
} }
} }
bool RuleManager::LoadRules(Database *database, const char *ruleset_name) {
int ruleset_id = GetRulesetID(database, ruleset_name);
bool RuleManager::LoadRules(Database *db, const char *ruleset) { if (ruleset_id < 0) {
Log.Out(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset_name);
int rsid = GetRulesetID(db, ruleset);
if(rsid < 0) {
Log.Out(Logs::Detail, Logs::Rules, "Failed to find ruleset '%s' for load operation. Canceling.", ruleset);
return(false); return(false);
} }
Log.Out(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset, rsid); Log.Out(Logs::Detail, Logs::Rules, "Loading rule set '%s' (%d)", ruleset_name, ruleset_id);
m_activeRuleset = rsid; m_activeRuleset = ruleset_id;
m_activeName = ruleset; m_activeName = ruleset_name;
std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", rsid); std::string query = StringFormat("SELECT rule_name, rule_value FROM rule_values WHERE ruleset_id=%d", ruleset_id);
auto results = db->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.Out(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]); Log.Out(Logs::Detail, Logs::Rules, "Unable to interpret rule record for %s", row[0]);
return true; return true;
} }
void RuleManager::_SaveRule(Database *db, RuleType type, uint16 index) { void RuleManager::_SaveRule(Database *database, RuleType type, uint16 index) {
char vstr[100]; char value_string[100];
switch(type) { switch(type) {
case IntRule: case IntRule:
sprintf(vstr, "%d", m_RuleIntValues[index]); sprintf(value_string, "%d", m_RuleIntValues[index]);
break; break;
case RealRule: case RealRule:
sprintf(vstr, "%.13f", m_RuleRealValues[index]); sprintf(value_string, "%.13f", m_RuleRealValues[index]);
break; break;
case BoolRule: case BoolRule:
sprintf(vstr, "%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("REPLACE INTO rule_values "
"(ruleset_id, rule_name, rule_value) " "(ruleset_id, rule_name, rule_value) "
" VALUES(%d, '%s', '%s')", " VALUES(%d, '%s', '%s')",
m_activeRuleset, _GetRuleName(type, index), vstr); m_activeRuleset, _GetRuleName(type, index), value_string);
auto results = db->QueryDatabase(query); auto results = database->QueryDatabase(query);
} }
int RuleManager::GetRulesetID(Database *db, const char *rulesetname) { int RuleManager::GetRulesetID(Database *database, const char *ruleset_name) {
uint32 len = strlen(rulesetname); uint32 len = strlen(ruleset_name);
char* rst = new char[2*len+1]; char* rst = new char[2 * len + 1];
db->DoEscapeString(rst, rulesetname, len); database->DoEscapeString(rst, ruleset_name, len);
std::string query = StringFormat("SELECT ruleset_id FROM rule_sets WHERE name='%s'", rst); std::string query = StringFormat("SELECT ruleset_id FROM rule_sets WHERE name='%s'", rst);
safe_delete_array(rst); safe_delete_array(rst);
auto results = db->QueryDatabase(query); auto results = database->QueryDatabase(query);
if (!results.Success()) { if (!results.Success())
return -1; return -1;
}
if (results.RowCount() == 0) if (results.RowCount() == 0)
return -1; return -1;
auto row = results.begin(); auto row = results.begin();
return atoi(row[0]); return atoi(row[0]);
} }
int RuleManager::_FindOrCreateRuleset(Database *db, const char *ruleset) { int RuleManager::_FindOrCreateRuleset(Database *database, const char *in_ruleset_name) {
int res = GetRulesetID(db, ruleset); int ruleset_id = GetRulesetID(database, in_ruleset_name);
if(res >= 0) if (ruleset_id >= 0)
return res; //found and existing one... return ruleset_id; //found and existing one...
uint32 len = strlen(ruleset); uint32 len = strlen(in_ruleset_name);
char* rst = new char[2*len+1]; char* ruleset_name = new char[2 * len + 1];
db->DoEscapeString(rst, ruleset, len); database->DoEscapeString(ruleset_name, in_ruleset_name, len);
std::string query = StringFormat("INSERT INTO rule_sets (ruleset_id, name) VALUES(0, '%s')", rst); std::string query = StringFormat("INSERT INTO rule_sets (ruleset_id, name) VALUES(0, '%s')", ruleset_name);
safe_delete_array(rst); safe_delete_array(ruleset_name);
auto results = db->QueryDatabase(query); auto results = database->QueryDatabase(query);
if (!results.Success()) if (!results.Success())
{
return -1; return -1;
}
return results.LastInsertedID(); return results.LastInsertedID();
} }
std::string RuleManager::GetRulesetName(Database *db, int id) { std::string RuleManager::GetRulesetName(Database *database, int ruleset_id) {
std::string query = StringFormat("SELECT name FROM rule_sets WHERE ruleset_id=%d", ruleset_id);
std::string query = StringFormat("SELECT name FROM rule_sets WHERE ruleset_id=%d", id); auto results = database->QueryDatabase(query);
auto results = db->QueryDatabase(query);
if (!results.Success()) if (!results.Success())
{ return "";
return "";
}
if (results.RowCount() == 0) if (results.RowCount() == 0)
return ""; return "";
auto row = results.begin(); auto row = results.begin();
return row[0]; return row[0];
} }
bool RuleManager::ListRulesets(Database *db, std::map<int, std::string> &into) { bool RuleManager::ListRulesets(Database *database, std::map<int, std::string> &into) {
//start out with the default set which is always present. //start out with the default set which is always present.
into[0] = "default"; into[0] = "default";
std::string query = "SELECT ruleset_id, name FROM rule_sets"; std::string query = "SELECT ruleset_id, name FROM rule_sets";
auto results = db->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)
into[ atoi(row[0]) ] = row[1]; into[atoi(row[0])] = row[1];
return true; return true;
} }
int32 RuleManager::GetIntRule(RuleManager::IntType t) const int32 RuleManager::GetIntRule(RuleManager::IntType t) const{
{
return(m_RuleIntValues[t]); return(m_RuleIntValues[t]);
} }
float RuleManager::GetRealRule(RuleManager::RealType t) const float RuleManager::GetRealRule(RuleManager::RealType t) const{
{
return(m_RuleRealValues[t]); return(m_RuleRealValues[t]);
} }
bool RuleManager::GetBoolRule(RuleManager::BoolType t) const bool RuleManager::GetBoolRule(RuleManager::BoolType t) const{
{
return (m_RuleBoolValues[t] == 1); return (m_RuleBoolValues[t] == 1);
} }

View File

@ -125,6 +125,7 @@ RULE_BOOL(Character, ActiveInvSnapshots, false) // Takes a periodic snapshot of
RULE_INT(Character, InvSnapshotMinIntervalM, 180) // Minimum time (in minutes) between inventory snapshots RULE_INT(Character, InvSnapshotMinIntervalM, 180) // Minimum time (in minutes) between inventory snapshots
RULE_INT(Character, InvSnapshotMinRetryM, 30) // Time (in minutes) to re-attempt an inventory snapshot after a failure RULE_INT(Character, InvSnapshotMinRetryM, 30) // Time (in minutes) to re-attempt an inventory snapshot after a failure
RULE_INT(Character, InvSnapshotHistoryD, 30) // Time (in days) to keep snapshot entries RULE_INT(Character, InvSnapshotHistoryD, 30) // Time (in days) to keep snapshot entries
RULE_BOOL(Character, RestrictSpellScribing, false) // Restricts spell scribing to allowable races/classes of spell scroll, if true
RULE_CATEGORY_END() RULE_CATEGORY_END()
RULE_CATEGORY(Mercs) RULE_CATEGORY(Mercs)

View File

@ -523,7 +523,7 @@ struct ServerLSPlayerZoneChange_Struct {
uint32 from; // 0 = world uint32 from; // 0 = world
uint32 to; // 0 = world uint32 to; // 0 = world
}; };
struct ServerLSClientAuth { struct ClientAuth_Struct {
uint32 lsaccount_id; // ID# in login server's db uint32 lsaccount_id; // ID# in login server's db
char name[30]; // username in login server's db char name[30]; // username in login server's db
char key[30]; // the Key the client will present char key[30]; // the Key the client will present

View File

@ -1325,19 +1325,28 @@ int32 SharedDatabase::DeleteStalePlayerCorpses() {
return results.RowsAffected(); return results.RowsAffected();
} }
bool SharedDatabase::GetCommandSettings(std::map<std::string,uint8> &commands) { bool SharedDatabase::GetCommandSettings(std::map<std::string, std::pair<uint8, std::vector<std::string>>> &command_settings)
{
command_settings.clear();
const std::string query = "SELECT command, access FROM commands"; std::string query = "SELECT `command`, `access`, `aliases` FROM `command_settings`";
auto results = QueryDatabase(query); auto results = QueryDatabase(query);
if (!results.Success()) { if (!results.Success())
return false; return false;
for (auto row = results.begin(); row != results.end(); ++row) {
command_settings[row[0]].first = atoi(row[1]);
if (row[2][0] == 0)
continue;
std::vector<std::string> aliases = SplitString(row[2], '|');
for (std::vector<std::string>::iterator iter = aliases.begin(); iter != aliases.end(); ++iter) {
if (iter->empty())
continue;
command_settings[row[0]].second.push_back(*iter);
}
} }
commands.clear();
for (auto row = results.begin(); row != results.end(); ++row)
commands[row[0]]=atoi(row[1]);
return true; return true;
} }

View File

@ -51,7 +51,7 @@ class SharedDatabase : public Database
int32 DeleteStalePlayerCorpses(); int32 DeleteStalePlayerCorpses();
void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message); void LoadCharacterInspectMessage(uint32 character_id, InspectMessage_Struct* message);
void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message); void SaveCharacterInspectMessage(uint32 character_id, const InspectMessage_Struct* message);
bool GetCommandSettings(std::map<std::string, uint8> &commands); bool GetCommandSettings(std::map<std::string, std::pair<uint8, std::vector<std::string>>> &command_settings);
uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID); uint32 GetTotalTimeEntitledOnAccount(uint32 AccountID);
/* /*

View File

@ -30,7 +30,7 @@
Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
*/ */
#define CURRENT_BINARY_DATABASE_VERSION 9089 #define CURRENT_BINARY_DATABASE_VERSION 9091
#ifdef BOTS #ifdef BOTS
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9000 #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9000
#else #else

View File

@ -6,7 +6,6 @@ SET(eqlogin_sources
config.cpp config.cpp
database_mysql.cpp database_mysql.cpp
database_postgresql.cpp database_postgresql.cpp
error_log.cpp
main.cpp main.cpp
server_manager.cpp server_manager.cpp
world_server.cpp world_server.cpp
@ -26,7 +25,6 @@ SET(eqlogin_headers
database_postgresql.h database_postgresql.h
encryption.h encryption.h
eq_crypto_api.h eq_crypto_api.h
error_log.h
login_server.h login_server.h
login_structures.h login_structures.h
options.h options.h
@ -43,7 +41,7 @@ ADD_EXECUTABLE(loginserver ${eqlogin_sources} ${eqlogin_headers})
INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}) INSTALL(TARGETS loginserver RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})
TARGET_LINK_LIBRARIES(loginserver common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE}) TARGET_LINK_LIBRARIES(loginserver common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} ${ZLIB_LIBRARY})
IF(MSVC) IF(MSVC)
SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF") SET_TARGET_PROPERTIES(loginserver PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")

View File

@ -16,12 +16,12 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "client.h" #include "client.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "login_structures.h" #include "login_structures.h"
#include "../common/misc_functions.h" #include "../common/misc_functions.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log; extern EQEmuLogSys Log;
extern LoginServer server; extern LoginServer server;
Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v) Client::Client(std::shared_ptr<EQStream> c, LSClientVersion v)
@ -41,7 +41,7 @@ bool Client::Process()
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Application packet received from client (size %u)", app->Size()); Log.Out(Logs::General, Logs::Login_Server, "Application packet received from client (size %u)", app->Size());
} }
if(server.options.IsDumpInPacketsOn()) if(server.options.IsDumpInPacketsOn())
@ -55,7 +55,7 @@ bool Client::Process()
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Session ready received from client."); Log.Out(Logs::General, Logs::Login_Server, "Session ready received from client.");
} }
Handle_SessionReady((const char*)app->pBuffer, app->Size()); Handle_SessionReady((const char*)app->pBuffer, app->Size());
break; break;
@ -64,13 +64,13 @@ bool Client::Process()
{ {
if(app->Size() < 20) if(app->Size() < 20)
{ {
server_log->Log(log_network_error, "Login received but it is too small, discarding."); Log.Out(Logs::General, Logs::Error, "Login received but it is too small, discarding.");
break; break;
} }
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Login received from client."); Log.Out(Logs::General, Logs::Login_Server, "Login received from client.");
} }
Handle_Login((const char*)app->pBuffer, app->Size()); Handle_Login((const char*)app->pBuffer, app->Size());
@ -80,7 +80,7 @@ bool Client::Process()
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Server list request received from client."); Log.Out(Logs::General, Logs::Login_Server, "Server list request received from client.");
} }
SendServerListPacket(); SendServerListPacket();
@ -90,7 +90,7 @@ bool Client::Process()
{ {
if(app->Size() < sizeof(PlayEverquestRequest_Struct)) if(app->Size() < sizeof(PlayEverquestRequest_Struct))
{ {
server_log->Log(log_network_error, "Play received but it is too small, discarding."); Log.Out(Logs::General, Logs::Error, "Play received but it is too small, discarding.");
break; break;
} }
@ -101,7 +101,7 @@ bool Client::Process()
{ {
char dump[64]; char dump[64];
app->build_header_dump(dump); app->build_header_dump(dump);
server_log->Log(log_network_error, "Recieved unhandled application packet from the client: %s.", dump); Log.Out(Logs::General, Logs::Error, "Recieved unhandled application packet from the client: %s.", dump);
} }
} }
@ -116,20 +116,20 @@ void Client::Handle_SessionReady(const char* data, unsigned int size)
{ {
if(status != cs_not_sent_session_ready) if(status != cs_not_sent_session_ready)
{ {
server_log->Log(log_network_error, "Session ready received again after already being received."); Log.Out(Logs::General, Logs::Error, "Session ready received again after already being received.");
return; return;
} }
if(size < sizeof(unsigned int)) if(size < sizeof(unsigned int))
{ {
server_log->Log(log_network_error, "Session ready was too small."); Log.Out(Logs::General, Logs::Error, "Session ready was too small.");
return; return;
} }
unsigned int mode = *((unsigned int*)data); unsigned int mode = *((unsigned int*)data);
if(mode == (unsigned int)lm_from_world) if(mode == (unsigned int)lm_from_world)
{ {
server_log->Log(log_network, "Session ready indicated logged in from world(unsupported feature), disconnecting."); Log.Out(Logs::General, Logs::Login_Server, "Session ready indicated logged in from world(unsupported feature), disconnecting.");
connection->Close(); connection->Close();
return; return;
} }
@ -175,138 +175,144 @@ void Client::Handle_SessionReady(const char* data, unsigned int size)
void Client::Handle_Login(const char* data, unsigned int size) void Client::Handle_Login(const char* data, unsigned int size)
{ {
if(status != cs_waiting_for_login) if(status != cs_waiting_for_login) {
{ Log.Out(Logs::General, Logs::Error, "Login received after already having logged in.");
server_log->Log(log_network_error, "Login received after already having logged in.");
return; return;
} }
if((size - 12) % 8 != 0) if((size - 12) % 8 != 0) {
{ Log.Out(Logs::General, Logs::Error, "Login received packet of size: %u, this would cause a block corruption, discarding.", size);
server_log->Log(log_network_error, "Login received packet of size: %u, this would cause a block corruption, discarding.", size);
return; return;
} }
status = cs_logged_in; status = cs_logged_in;
string e_user; string entered_username;
string e_hash; string entered_password_hash_result;
char *e_buffer = nullptr;
unsigned int d_account_id = 0; char *login_packet_buffer = nullptr;
string d_pass_hash;
unsigned int db_account_id = 0;
string db_account_password_hash;
#ifdef WIN32 #ifdef WIN32
e_buffer = server.eq_crypto->DecryptUsernamePassword(data, size, server.options.GetEncryptionMode()); login_packet_buffer = server.eq_crypto->DecryptUsernamePassword(data, size, server.options.GetEncryptionMode());
int buffer_len = strlen(e_buffer); int login_packet_buffer_length = strlen(login_packet_buffer);
e_hash.assign(e_buffer, buffer_len); entered_password_hash_result.assign(login_packet_buffer, login_packet_buffer_length);
e_user.assign((e_buffer + buffer_len + 1), strlen(e_buffer + buffer_len + 1)); entered_username.assign((login_packet_buffer + login_packet_buffer_length + 1), strlen(login_packet_buffer + login_packet_buffer_length + 1));
if(server.options.IsTraceOn()) if(server.options.IsTraceOn()) {
{ Log.Out(Logs::General, Logs::Debug, "User: %s", entered_username.c_str());
server_log->Log(log_client, "User: %s", e_user.c_str()); Log.Out(Logs::General, Logs::Debug, "Hash: %s", entered_password_hash_result.c_str());
server_log->Log(log_client, "Hash: %s", e_hash.c_str());
} }
server.eq_crypto->DeleteHeap(e_buffer); server.eq_crypto->DeleteHeap(login_packet_buffer);
#else #else
e_buffer = DecryptUsernamePassword(data, size, server.options.GetEncryptionMode()); login_packet_buffer = DecryptUsernamePassword(data, size, server.options.GetEncryptionMode());
int buffer_len = strlen(e_buffer); int login_packet_buffer_length = strlen(login_packet_buffer);
e_hash.assign(e_buffer, buffer_len); entered_password_hash_result.assign(login_packet_buffer, login_packet_buffer_length);
e_user.assign((e_buffer + buffer_len + 1), strlen(e_buffer + buffer_len + 1)); entered_username.assign((login_packet_buffer + login_packet_buffer_length + 1), strlen(login_packet_buffer + login_packet_buffer_length + 1));
if(server.options.IsTraceOn()) if(server.options.IsTraceOn()) {
{ Log.Out(Logs::General, Logs::Debug, "User: %s", entered_username.c_str());
server_log->Log(log_client, "User: %s", e_user.c_str()); Log.Out(Logs::General, Logs::Debug, "Hash: %s", entered_password_hash_result.c_str());
server_log->Log(log_client, "Hash: %s", e_hash.c_str());
} }
_HeapDeleteCharBuffer(e_buffer); _HeapDeleteCharBuffer(login_packet_buffer);
#endif #endif
bool result; bool result;
if(server.db->GetLoginDataFromAccountName(e_user, d_pass_hash, d_account_id) == false) if(server.db->GetLoginDataFromAccountName(entered_username, db_account_password_hash, db_account_id) == false) {
{ /* If we have auto_create_accounts enabled in the login.ini, we will process the creation of an account on our own*/
server_log->Log(log_client_error, "Error logging in, user %s does not exist in the database.", e_user.c_str()); if (
result = false; server.config->GetVariable("options", "auto_create_accounts").compare("TRUE") == 0 &&
} server.db->CreateLoginData(entered_username, entered_password_hash_result, db_account_id) == true
else ){
{ Log.Out(Logs::General, Logs::Error, "User %s does not exist in the database, so we created it...", entered_username.c_str());
if(d_pass_hash.compare(e_hash) == 0)
{
result = true; result = true;
} }
else else{
{ Log.Out(Logs::General, Logs::Error, "Error logging in, user %s does not exist in the database.", entered_username.c_str());
result = false;
}
}
else {
if(db_account_password_hash.compare(entered_password_hash_result) == 0) {
result = true;
}
else {
result = false; result = false;
} }
} }
if(result) /* Login Accepted */
{ if(result) {
server.CM->RemoveExistingClient(d_account_id);
server.client_manager->RemoveExistingClient(db_account_id);
in_addr in; in_addr in;
in.s_addr = connection->GetRemoteIP(); in.s_addr = connection->GetRemoteIP();
server.db->UpdateLSAccountData(d_account_id, string(inet_ntoa(in)));
server.db->UpdateLSAccountData(db_account_id, string(inet_ntoa(in)));
GenerateKey(); GenerateKey();
account_id = d_account_id;
account_name = e_user; account_id = db_account_id;
account_name = entered_username;
EQApplicationPacket *outapp = new EQApplicationPacket(OP_LoginAccepted, 10 + 80); EQApplicationPacket *outapp = new EQApplicationPacket(OP_LoginAccepted, 10 + 80);
const LoginLoginRequest_Struct* llrs = (const LoginLoginRequest_Struct *)data; const LoginLoginRequest_Struct* llrs = (const LoginLoginRequest_Struct *)data;
LoginLoginAccepted_Struct* llas = (LoginLoginAccepted_Struct *)outapp->pBuffer; LoginAccepted_Struct* login_accepted = (LoginAccepted_Struct *)outapp->pBuffer;
llas->unknown1 = llrs->unknown1; login_accepted->unknown1 = llrs->unknown1;
llas->unknown2 = llrs->unknown2; login_accepted->unknown2 = llrs->unknown2;
llas->unknown3 = llrs->unknown3; login_accepted->unknown3 = llrs->unknown3;
llas->unknown4 = llrs->unknown4; login_accepted->unknown4 = llrs->unknown4;
llas->unknown5 = llrs->unknown5; login_accepted->unknown5 = llrs->unknown5;
Login_ReplyBlock_Struct * lrbs = new Login_ReplyBlock_Struct; LoginFailedAttempts_Struct * login_failed_attempts = new LoginFailedAttempts_Struct;
memset(lrbs, 0, sizeof(Login_ReplyBlock_Struct)); memset(login_failed_attempts, 0, sizeof(LoginFailedAttempts_Struct));
lrbs->failed_attempts = 0; login_failed_attempts->failed_attempts = 0;
lrbs->message = 0x01; login_failed_attempts->message = 0x01;
lrbs->lsid = d_account_id; login_failed_attempts->lsid = db_account_id;
lrbs->unknown3[3] = 0x03; login_failed_attempts->unknown3[3] = 0x03;
lrbs->unknown4[3] = 0x02; login_failed_attempts->unknown4[3] = 0x02;
lrbs->unknown5[0] = 0xe7; login_failed_attempts->unknown5[0] = 0xe7;
lrbs->unknown5[1] = 0x03; login_failed_attempts->unknown5[1] = 0x03;
lrbs->unknown6[0] = 0xff; login_failed_attempts->unknown6[0] = 0xff;
lrbs->unknown6[1] = 0xff; login_failed_attempts->unknown6[1] = 0xff;
lrbs->unknown6[2] = 0xff; login_failed_attempts->unknown6[2] = 0xff;
lrbs->unknown6[3] = 0xff; login_failed_attempts->unknown6[3] = 0xff;
lrbs->unknown7[0] = 0xa0; login_failed_attempts->unknown7[0] = 0xa0;
lrbs->unknown7[1] = 0x05; login_failed_attempts->unknown7[1] = 0x05;
lrbs->unknown8[3] = 0x02; login_failed_attempts->unknown8[3] = 0x02;
lrbs->unknown9[0] = 0xff; login_failed_attempts->unknown9[0] = 0xff;
lrbs->unknown9[1] = 0x03; login_failed_attempts->unknown9[1] = 0x03;
lrbs->unknown11[0] = 0x63; login_failed_attempts->unknown11[0] = 0x63;
lrbs->unknown12[0] = 0x01; login_failed_attempts->unknown12[0] = 0x01;
memcpy(lrbs->key, key.c_str(), key.size()); memcpy(login_failed_attempts->key, key.c_str(), key.size());
#ifdef WIN32 #ifdef WIN32
unsigned int e_size; unsigned int e_size;
char *encrypted_buffer = server.eq_crypto->Encrypt((const char*)lrbs, 75, e_size); char *encrypted_buffer = server.eq_crypto->Encrypt((const char*)login_failed_attempts, 75, e_size);
memcpy(llas->encrypt, encrypted_buffer, 80); memcpy(login_accepted->encrypt, encrypted_buffer, 80);
server.eq_crypto->DeleteHeap(encrypted_buffer); server.eq_crypto->DeleteHeap(encrypted_buffer);
#else #else
unsigned int e_size; unsigned int e_size;
char *encrypted_buffer = Encrypt((const char*)lrbs, 75, e_size); char *encrypted_buffer = Encrypt((const char*)login_failed_attempts, 75, e_size);
memcpy(llas->encrypt, encrypted_buffer, 80); memcpy(login_accepted->encrypt, encrypted_buffer, 80);
_HeapDeleteCharBuffer(encrypted_buffer); _HeapDeleteCharBuffer(encrypted_buffer);
#endif #endif
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn()) {
{
DumpPacket(outapp); DumpPacket(outapp);
} }
connection->QueuePacket(outapp); connection->QueuePacket(outapp);
delete outapp; delete outapp;
} }
else else {
{
EQApplicationPacket *outapp = new EQApplicationPacket(OP_LoginAccepted, sizeof(LoginLoginFailed_Struct)); EQApplicationPacket *outapp = new EQApplicationPacket(OP_LoginAccepted, sizeof(LoginLoginFailed_Struct));
const LoginLoginRequest_Struct* llrs = (const LoginLoginRequest_Struct *)data; const LoginLoginRequest_Struct* llrs = (const LoginLoginRequest_Struct *)data;
LoginLoginFailed_Struct* llas = (LoginLoginFailed_Struct *)outapp->pBuffer; LoginLoginFailed_Struct* llas = (LoginLoginFailed_Struct *)outapp->pBuffer;
@ -317,8 +323,7 @@ void Client::Handle_Login(const char* data, unsigned int size)
llas->unknown5 = llrs->unknown5; llas->unknown5 = llrs->unknown5;
memcpy(llas->unknown6, FailedLoginResponseData, sizeof(FailedLoginResponseData)); memcpy(llas->unknown6, FailedLoginResponseData, sizeof(FailedLoginResponseData));
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn()) {
{
DumpPacket(outapp); DumpPacket(outapp);
} }
@ -331,7 +336,7 @@ void Client::Handle_Play(const char* data)
{ {
if(status != cs_logged_in) if(status != cs_logged_in)
{ {
server_log->Log(log_client_error, "Client sent a play request when they either were not logged in, discarding."); Log.Out(Logs::General, Logs::Error, "Client sent a play request when they either were not logged in, discarding.");
return; return;
} }
@ -341,18 +346,18 @@ void Client::Handle_Play(const char* data)
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network, "Play received from client, server number %u sequence %u.", server_id_in, sequence_in); Log.Out(Logs::General, Logs::Login_Server, "Play received from client, server number %u sequence %u.", server_id_in, sequence_in);
} }
this->play_server_id = (unsigned int)play->ServerNumber; this->play_server_id = (unsigned int)play->ServerNumber;
play_sequence_id = sequence_in; play_sequence_id = sequence_in;
play_server_id = server_id_in; play_server_id = server_id_in;
server.SM->SendUserToWorldRequest(server_id_in, account_id); server.server_manager->SendUserToWorldRequest(server_id_in, account_id);
} }
void Client::SendServerListPacket() void Client::SendServerListPacket()
{ {
EQApplicationPacket *outapp = server.SM->CreateServerListPacket(this); EQApplicationPacket *outapp = server.server_manager->CreateServerListPacket(this);
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn())
{ {
@ -367,8 +372,8 @@ void Client::SendPlayResponse(EQApplicationPacket *outapp)
{ {
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "Sending play response for %s.", GetAccountName().c_str()); Log.Out(Logs::General, Logs::Netcode, "Sending play response for %s.", GetAccountName().c_str());
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size); // server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size);
} }
connection->QueuePacket(outapp); connection->QueuePacket(outapp);
status = cs_logged_in; status = cs_logged_in;
@ -378,7 +383,7 @@ void Client::GenerateKey()
{ {
key.clear(); key.clear();
int count = 0; int count = 0;
while(count < 10) while (count < 10)
{ {
static const char key_selection[] = static const char key_selection[] =
{ {

View File

@ -16,13 +16,14 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "client_manager.h" #include "client_manager.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
extern bool run_server; extern bool run_server;
#include "../common/eqemu_logsys.h"
extern EQEmuLogSys Log;
ClientManager::ClientManager() ClientManager::ClientManager()
{ {
int titanium_port = atoi(server.config->GetVariable("Titanium", "port").c_str()); int titanium_port = atoi(server.config->GetVariable("Titanium", "port").c_str());
@ -30,18 +31,18 @@ ClientManager::ClientManager()
titanium_ops = new RegularOpcodeManager; titanium_ops = new RegularOpcodeManager;
if(!titanium_ops->LoadOpcodes(server.config->GetVariable("Titanium", "opcodes").c_str())) if(!titanium_ops->LoadOpcodes(server.config->GetVariable("Titanium", "opcodes").c_str()))
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't load opcodes for Titanium file %s.", Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't load opcodes for Titanium file %s.",
server.config->GetVariable("Titanium", "opcodes").c_str()); server.config->GetVariable("Titanium", "opcodes").c_str());
run_server = false; run_server = false;
} }
if(titanium_stream->Open()) if(titanium_stream->Open())
{ {
server_log->Log(log_network, "ClientManager listening on Titanium stream."); Log.Out(Logs::General, Logs::Login_Server, "ClientManager listening on Titanium stream.");
} }
else else
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't open Titanium stream."); Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't open Titanium stream.");
run_server = false; run_server = false;
} }
@ -50,18 +51,18 @@ ClientManager::ClientManager()
sod_ops = new RegularOpcodeManager; sod_ops = new RegularOpcodeManager;
if(!sod_ops->LoadOpcodes(server.config->GetVariable("SoD", "opcodes").c_str())) if(!sod_ops->LoadOpcodes(server.config->GetVariable("SoD", "opcodes").c_str()))
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.", Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't load opcodes for SoD file %s.",
server.config->GetVariable("SoD", "opcodes").c_str()); server.config->GetVariable("SoD", "opcodes").c_str());
run_server = false; run_server = false;
} }
if(sod_stream->Open()) if(sod_stream->Open())
{ {
server_log->Log(log_network, "ClientManager listening on SoD stream."); Log.Out(Logs::General, Logs::Login_Server, "ClientManager listening on SoD stream.");
} }
else else
{ {
server_log->Log(log_error, "ClientManager fatal error: couldn't open SoD stream."); Log.Out(Logs::General, Logs::Error, "ClientManager fatal error: couldn't open SoD stream.");
run_server = false; run_server = false;
} }
} }
@ -99,7 +100,7 @@ void ClientManager::Process()
{ {
struct in_addr in; struct in_addr in;
in.s_addr = cur->GetRemoteIP(); in.s_addr = cur->GetRemoteIP();
server_log->Log(log_network, "New Titanium client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort())); Log.Out(Logs::General, Logs::Login_Server, "New Titanium client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort()));
cur->SetOpcodeManager(&titanium_ops); cur->SetOpcodeManager(&titanium_ops);
Client *c = new Client(cur, cv_titanium); Client *c = new Client(cur, cv_titanium);
@ -112,7 +113,7 @@ void ClientManager::Process()
{ {
struct in_addr in; struct in_addr in;
in.s_addr = cur->GetRemoteIP(); in.s_addr = cur->GetRemoteIP();
server_log->Log(log_network, "New SoD client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort())); Log.Out(Logs::General, Logs::Login_Server, "New SoD client connection from %s:%d", inet_ntoa(in), ntohs(cur->GetRemotePort()));
cur->SetOpcodeManager(&sod_ops); cur->SetOpcodeManager(&sod_ops);
Client *c = new Client(cur, cv_sod); Client *c = new Client(cur, cv_sod);
@ -125,7 +126,7 @@ void ClientManager::Process()
{ {
if((*iter)->Process() == false) if((*iter)->Process() == false)
{ {
server_log->Log(log_client, "Client had a fatal error and had to be removed from the login."); Log.Out(Logs::General, Logs::Debug, "Client had a fatal error and had to be removed from the login.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@ -144,7 +145,7 @@ void ClientManager::ProcessDisconnect()
std::shared_ptr<EQStream> c = (*iter)->GetConnection(); std::shared_ptr<EQStream> c = (*iter)->GetConnection();
if(c->CheckClosed()) if(c->CheckClosed())
{ {
server_log->Log(log_network, "Client disconnected from the server, removing client."); Log.Out(Logs::General, Logs::Login_Server, "Client disconnected from the server, removing client.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@ -172,7 +173,7 @@ void ClientManager::RemoveExistingClient(unsigned int account_id)
{ {
if((*iter)->GetAccountID() == account_id) if((*iter)->GetAccountID() == account_id)
{ {
server_log->Log(log_network, "Client attempting to log in and existing client already logged in, removing existing client."); Log.Out(Logs::General, Logs::Login_Server, "Client attempting to log in and existing client already logged in, removing existing client.");
delete (*iter); delete (*iter);
iter = clients.erase(iter); iter = clients.erase(iter);
} }
@ -200,7 +201,7 @@ Client *ClientManager::GetClient(unsigned int account_id)
if(count > 1) if(count > 1)
{ {
server_log->Log(log_client_error, "More than one client with a given account_id existed in the client list."); Log.Out(Logs::General, Logs::Error, "More than one client with a given account_id existed in the client list.");
} }
return cur; return cur;
} }

View File

@ -16,10 +16,10 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "../common/global_define.h" #include "../common/global_define.h"
#include "../common/eqemu_logsys.h"
#include "config.h" #include "config.h"
#include "error_log.h"
extern ErrorLog *server_log; extern EQEmuLogSys Log;
/** /**
* Retrieves the variable we want from our title or theme * Retrieves the variable we want from our title or theme
* First gets the map from the title * First gets the map from the title
@ -48,7 +48,7 @@ void Config::Parse(const char *file_name)
{ {
if(file_name == nullptr) if(file_name == nullptr)
{ {
server_log->Log(log_error, "Config::Parse(), file_name passed was null."); Log.Out(Logs::General, Logs::Error, "Config::Parse(), file_name passed was null.");
return; return;
} }
@ -71,7 +71,7 @@ void Config::Parse(const char *file_name)
++iter; ++iter;
if(iter == tokens.end()) if(iter == tokens.end())
{ {
server_log->Log(log_error, "Config::Parse(), EOF before title done parsing."); Log.Out(Logs::General, Logs::Error, "Config::Parse(), EOF before title done parsing.");
fclose(input); fclose(input);
vars.clear(); vars.clear();
return; return;
@ -104,7 +104,7 @@ void Config::Parse(const char *file_name)
mode++; mode++;
if((*iter).compare("=") != 0) if((*iter).compare("=") != 0)
{ {
server_log->Log(log_error, "Config::Parse(), invalid parse token where = should be."); Log.Out(Logs::General, Logs::Error, "Config::Parse(), invalid parse token where = should be.");
fclose(input); fclose(input);
vars.clear(); vars.clear();
return; return;
@ -133,7 +133,7 @@ void Config::Parse(const char *file_name)
} }
else else
{ {
server_log->Log(log_error, "Config::Parse(), file was unable to be opened for parsing."); Log.Out(Logs::General, Logs::Error, "Config::Parse(), file was unable to be opened for parsing.");
} }
} }

View File

@ -44,6 +44,8 @@ public:
*/ */
virtual bool GetLoginDataFromAccountName(std::string name, std::string &password, unsigned int &id) { return false; } virtual bool GetLoginDataFromAccountName(std::string name, std::string &password, unsigned int &id) { return false; }
virtual bool CreateLoginData(std::string name, std::string &password, unsigned int &id) { return false; }
/** /**
* Retrieves the world registration from the long and short names provided. * Retrieves the world registration from the long and short names provided.
* Needed for world login procedure. * Needed for world login procedure.

View File

@ -20,14 +20,12 @@
#ifdef EQEMU_MYSQL_ENABLED #ifdef EQEMU_MYSQL_ENABLED
#include "database_mysql.h" #include "database_mysql.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "../common/eqemu_logsys.h"
extern ErrorLog *server_log; extern EQEmuLogSys Log;
extern LoginServer server; extern LoginServer server;
#pragma comment(lib, "mysqlclient.lib")
DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port, string name) DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port, string name)
{ {
this->user = user; this->user = user;
@ -35,35 +33,35 @@ DatabaseMySQL::DatabaseMySQL(string user, string pass, string host, string port,
this->host = host; this->host = host;
this->name = name; this->name = name;
db = mysql_init(nullptr); database = mysql_init(nullptr);
if(db) if(database)
{ {
my_bool r = 1; my_bool r = 1;
mysql_options(db, MYSQL_OPT_RECONNECT, &r); mysql_options(database, MYSQL_OPT_RECONNECT, &r);
if(!mysql_real_connect(db, host.c_str(), user.c_str(), pass.c_str(), name.c_str(), atoi(port.c_str()), nullptr, 0)) if(!mysql_real_connect(database, host.c_str(), user.c_str(), pass.c_str(), name.c_str(), atoi(port.c_str()), nullptr, 0))
{ {
mysql_close(db); mysql_close(database);
server_log->Log(log_database, "Failed to connect to MySQL database. Error: %s", mysql_error(db)); Log.Out(Logs::General, Logs::Error, "Failed to connect to MySQL database. Error: %s", mysql_error(database));
exit(1); exit(1);
} }
} }
else else
{ {
server_log->Log(log_database, "Failed to create db object in MySQL database."); Log.Out(Logs::General, Logs::Error, "Failed to create db object in MySQL database.");
} }
} }
DatabaseMySQL::~DatabaseMySQL() DatabaseMySQL::~DatabaseMySQL()
{ {
if(db) if(database)
{ {
mysql_close(db); mysql_close(database);
} }
} }
bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id) bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, unsigned int &id)
{ {
if(!db) if (!database)
{ {
return false; return false;
} }
@ -75,17 +73,17 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, u
query << name; query << name;
query << "'"; query << "'";
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
res = mysql_use_result(db); res = mysql_use_result(database);
if(res) if (res)
{ {
while((row = mysql_fetch_row(res)) != nullptr) while ((row = mysql_fetch_row(res)) != nullptr)
{ {
id = atoi(row[0]); id = atoi(row[0]);
password = row[1]; password = row[1];
@ -94,14 +92,41 @@ bool DatabaseMySQL::GetLoginDataFromAccountName(string name, string &password, u
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
return false;
}
bool DatabaseMySQL::CreateLoginData(string name, string &password, unsigned int &id)
{
if (!database) {
return false;
}
MYSQL_RES *result;
MYSQL_ROW row;
stringstream query(stringstream::in | stringstream::out);
query << "INSERT INTO " << server.options.GetAccountTable() << " (AccountName, AccountPassword, AccountEmail, LastLoginDate, LastIPAddress) ";
query << " VALUES('" << name << "', '" << password << "', 'local_creation', NOW(), '127.0.0.1'); ";
if (mysql_query(database, query.str().c_str()) != 0) {
Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false;
}
else{
id = mysql_insert_id(database);
return true;
}
Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id, bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, unsigned int &id, string &desc, unsigned int &list_id,
unsigned int &trusted, string &list_desc, string &account, string &password) unsigned int &trusted, string &list_desc, string &account, string &password)
{ {
if(!db) if (!database)
{ {
return false; return false;
} }
@ -110,8 +135,8 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
MYSQL_ROW row; MYSQL_ROW row;
char escaped_short_name[101]; char escaped_short_name[101];
unsigned long length; unsigned long length;
length = mysql_real_escape_string(db, escaped_short_name, short_name.substr(0, 100).c_str(), short_name.substr(0, 100).length()); length = mysql_real_escape_string(database, escaped_short_name, short_name.substr(0, 100).c_str(), short_name.substr(0, 100).length());
escaped_short_name[length+1] = 0; escaped_short_name[length + 1] = 0;
stringstream query(stringstream::in | stringstream::out); stringstream query(stringstream::in | stringstream::out);
query << "SELECT ifnull(WSR.ServerID,999999) AS ServerID, WSR.ServerTagDescription, ifnull(WSR.ServerTrusted,0) AS ServerTrusted, ifnull(SLT.ServerListTypeID,3) AS ServerListTypeID, "; query << "SELECT ifnull(WSR.ServerID,999999) AS ServerID, WSR.ServerTagDescription, ifnull(WSR.ServerTrusted,0) AS ServerTrusted, ifnull(SLT.ServerListTypeID,3) AS ServerListTypeID, ";
query << "SLT.ServerListTypeDescription, ifnull(WSR.ServerAdminID,0) AS ServerAdminID FROM " << server.options.GetWorldRegistrationTable(); query << "SLT.ServerListTypeDescription, ifnull(WSR.ServerAdminID,0) AS ServerAdminID FROM " << server.options.GetWorldRegistrationTable();
@ -120,16 +145,16 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
query << escaped_short_name; query << escaped_short_name;
query << "'"; query << "'";
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
res = mysql_use_result(db); res = mysql_use_result(database);
if(res) if (res)
{ {
if((row = mysql_fetch_row(res)) != nullptr) if ((row = mysql_fetch_row(res)) != nullptr)
{ {
id = atoi(row[0]); id = atoi(row[0]);
desc = row[1]; desc = row[1];
@ -139,22 +164,22 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
int db_account_id = atoi(row[5]); int db_account_id = atoi(row[5]);
mysql_free_result(res); mysql_free_result(res);
if(db_account_id > 0) if (db_account_id > 0)
{ {
stringstream query(stringstream::in | stringstream::out); stringstream query(stringstream::in | stringstream::out);
query << "SELECT AccountName, AccountPassword FROM " << server.options.GetWorldAdminRegistrationTable(); query << "SELECT AccountName, AccountPassword FROM " << server.options.GetWorldAdminRegistrationTable();
query << " WHERE ServerAdminID = " << db_account_id; query << " WHERE ServerAdminID = " << db_account_id;
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
res = mysql_use_result(db); res = mysql_use_result(database);
if(res) if (res)
{ {
if((row = mysql_fetch_row(res)) != nullptr) if ((row = mysql_fetch_row(res)) != nullptr)
{ {
account = row[0]; account = row[0];
password = row[1]; password = row[1];
@ -163,20 +188,20 @@ bool DatabaseMySQL::GetWorldRegistration(string long_name, string short_name, un
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
return true; return true;
} }
} }
server_log->Log(log_database, "Mysql query returned no result: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query returned no result: %s", query.str().c_str());
return false; return false;
} }
void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address) void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address)
{ {
if(!db) if (!database)
{ {
return; return;
} }
@ -187,15 +212,15 @@ void DatabaseMySQL::UpdateLSAccountData(unsigned int id, string ip_address)
query << "', LastLoginDate = now() where LoginServerID = "; query << "', LastLoginDate = now() where LoginServerID = ";
query << id; query << id;
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
} }
} }
void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string password, string email) void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string password, string email)
{ {
if(!db) if (!database)
{ {
return; return;
} }
@ -206,23 +231,23 @@ void DatabaseMySQL::UpdateLSAccountInfo(unsigned int id, string name, string pas
query << password << "'), AccountCreateDate = now(), AccountEmail = '" << email; query << password << "'), AccountCreateDate = now(), AccountEmail = '" << email;
query << "', LastIPAddress = '0.0.0.0', LastLoginDate = now()"; query << "', LastIPAddress = '0.0.0.0', LastLoginDate = now()";
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
} }
} }
void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address) void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, string ip_address)
{ {
if(!db) if (!database)
{ {
return; return;
} }
char escaped_long_name[101]; char escaped_long_name[101];
unsigned long length; unsigned long length;
length = mysql_real_escape_string(db, escaped_long_name, long_name.substr(0, 100).c_str(), long_name.substr(0, 100).length()); length = mysql_real_escape_string(database, escaped_long_name, long_name.substr(0, 100).c_str(), long_name.substr(0, 100).length());
escaped_long_name[length+1] = 0; escaped_long_name[length + 1] = 0;
stringstream query(stringstream::in | stringstream::out); stringstream query(stringstream::in | stringstream::out);
query << "UPDATE " << server.options.GetWorldRegistrationTable() << " SET ServerLastLoginDate = now(), ServerLastIPAddr = '"; query << "UPDATE " << server.options.GetWorldRegistrationTable() << " SET ServerLastLoginDate = now(), ServerLastIPAddr = '";
query << ip_address; query << ip_address;
@ -231,15 +256,15 @@ void DatabaseMySQL::UpdateWorldRegistration(unsigned int id, string long_name, s
query << "' WHERE ServerID = "; query << "' WHERE ServerID = ";
query << id; query << id;
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
} }
} }
bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name, unsigned int &id) bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name, unsigned int &id)
{ {
if(!db) if (!database)
{ {
return false; return false;
} }
@ -249,23 +274,23 @@ bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name,
char escaped_long_name[201]; char escaped_long_name[201];
char escaped_short_name[101]; char escaped_short_name[101];
unsigned long length; unsigned long length;
length = mysql_real_escape_string(db, escaped_long_name, long_name.substr(0, 100).c_str(), long_name.substr(0, 100).length()); length = mysql_real_escape_string(database, escaped_long_name, long_name.substr(0, 100).c_str(), long_name.substr(0, 100).length());
escaped_long_name[length+1] = 0; escaped_long_name[length + 1] = 0;
length = mysql_real_escape_string(db, escaped_short_name, short_name.substr(0, 100).c_str(), short_name.substr(0, 100).length()); length = mysql_real_escape_string(database, escaped_short_name, short_name.substr(0, 100).c_str(), short_name.substr(0, 100).length());
escaped_short_name[length+1] = 0; escaped_short_name[length + 1] = 0;
stringstream query(stringstream::in | stringstream::out); stringstream query(stringstream::in | stringstream::out);
query << "SELECT ifnull(max(ServerID),0) FROM " << server.options.GetWorldRegistrationTable(); query << "SELECT ifnull(max(ServerID),0) FROM " << server.options.GetWorldRegistrationTable();
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
res = mysql_use_result(db); res = mysql_use_result(database);
if(res) if (res)
{ {
if((row = mysql_fetch_row(res)) != nullptr) if ((row = mysql_fetch_row(res)) != nullptr)
{ {
id = atoi(row[0]) + 1; id = atoi(row[0]) + 1;
mysql_free_result(res); mysql_free_result(res);
@ -275,15 +300,15 @@ bool DatabaseMySQL::CreateWorldRegistration(string long_name, string short_name,
query << ", ServerLongName = '" << escaped_long_name << "', ServerShortName = '" << escaped_short_name; query << ", ServerLongName = '" << escaped_long_name << "', ServerShortName = '" << escaped_short_name;
query << "', ServerListTypeID = 3, ServerAdminID = 0, ServerTrusted = 0, ServerTagDescription = ''"; query << "', ServerListTypeID = 3, ServerAdminID = 0, ServerTrusted = 0, ServerTagDescription = ''";
if(mysql_query(db, query.str().c_str()) != 0) if (mysql_query(database, query.str().c_str()) != 0)
{ {
server_log->Log(log_database, "Mysql query failed: %s", query.str().c_str()); Log.Out(Logs::General, Logs::Error, "Mysql query failed: %s", query.str().c_str());
return false; return false;
} }
return true; return true;
} }
} }
server_log->Log(log_database, "World registration did not exist in the database for %s %s", long_name.c_str(), short_name.c_str()); Log.Out(Logs::General, Logs::Error, "World registration did not exist in the database for %s %s", long_name.c_str(), short_name.c_str());
return false; return false;
} }

View File

@ -35,7 +35,7 @@ public:
/** /**
* Constructor, sets our database to null. * Constructor, sets our database to null.
*/ */
DatabaseMySQL() { db = nullptr; } DatabaseMySQL() { database = nullptr; }
/** /**
* Constructor, tries to set our database to connect to the supplied options. * Constructor, tries to set our database to connect to the supplied options.
@ -50,7 +50,7 @@ public:
/** /**
* @return Returns true if the database successfully connected. * @return Returns true if the database successfully connected.
*/ */
virtual bool IsConnected() { return (db != nullptr); } virtual bool IsConnected() { return (database != nullptr); }
/** /**
* Retrieves the login data (password hash and account id) from the account name provided * Retrieves the login data (password hash and account id) from the account name provided
@ -59,6 +59,8 @@ public:
*/ */
virtual bool GetLoginDataFromAccountName(std::string name, std::string &password, unsigned int &id); virtual bool GetLoginDataFromAccountName(std::string name, std::string &password, unsigned int &id);
virtual bool CreateLoginData(std::string name, std::string &password, unsigned int &id);
/** /**
* Retrieves the world registration from the long and short names provided. * Retrieves the world registration from the long and short names provided.
* Needed for world login procedure. * Needed for world login procedure.
@ -88,7 +90,7 @@ public:
virtual bool CreateWorldRegistration(std::string long_name, std::string short_name, unsigned int &id); virtual bool CreateWorldRegistration(std::string long_name, std::string short_name, unsigned int &id);
protected: protected:
std::string user, pass, host, port, name; std::string user, pass, host, port, name;
MYSQL *db; MYSQL *database;
}; };
#endif #endif

View File

@ -23,7 +23,7 @@
#include "error_log.h" #include "error_log.h"
#include "login_server.h" #include "login_server.h"
extern ErrorLog *server_log;
extern LoginServer server; extern LoginServer server;
#pragma comment(lib, "libpq.lib") #pragma comment(lib, "libpq.lib")
@ -34,12 +34,12 @@ DatabasePostgreSQL::DatabasePostgreSQL(string user, string pass, string host, st
db = PQsetdbLogin(host.c_str(), port.c_str(), nullptr, nullptr, name.c_str(), user.c_str(), pass.c_str()); db = PQsetdbLogin(host.c_str(), port.c_str(), nullptr, nullptr, name.c_str(), user.c_str(), pass.c_str());
if(!db) if(!db)
{ {
server_log->Log(log_database, "Failed to connect to PostgreSQL Database."); Log.Out(Logs::General, Logs::Error, "Failed to connect to PostgreSQL Database.");
} }
if(PQstatus(db) != CONNECTION_OK) if(PQstatus(db) != CONNECTION_OK)
{ {
server_log->Log(log_database, "Failed to connect to PostgreSQL Database."); Log.Out(Logs::General, Logs::Error, "Failed to connect to PostgreSQL Database.");
PQfinish(db); PQfinish(db);
db = nullptr; db = nullptr;
} }
@ -83,7 +83,7 @@ bool DatabasePostgreSQL::GetLoginDataFromAccountName(string name, string &passwo
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
PQclear(res); PQclear(res);
return false; return false;
} }
@ -135,7 +135,7 @@ bool DatabasePostgreSQL::GetWorldRegistration(string long_name, string short_nam
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetWorldRegistration(): %s", error); Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetWorldRegistration(): %s", error);
PQclear(res); PQclear(res);
return false; return false;
} }
@ -188,7 +188,7 @@ void DatabasePostgreSQL::UpdateLSAccountData(unsigned int id, string ip_address)
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
} }
PQclear(res); PQclear(res);
} }
@ -225,7 +225,7 @@ void DatabasePostgreSQL::UpdateWorldRegistration(unsigned int id, string long_na
char *error = PQresultErrorMessage(res); char *error = PQresultErrorMessage(res);
if(strlen(error) > 0) if(strlen(error) > 0)
{ {
server_log->Log(log_database, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error); Log.Out(Logs::General, Logs::Error, "Database error in DatabasePostgreSQL::GetLoginDataFromAccountName(): %s", error);
} }
PQclear(res); PQclear(res);
} }

View File

@ -17,16 +17,16 @@
*/ */
#include "../common/global_define.h" #include "../common/global_define.h"
#include "encryption.h" #include "encryption.h"
#include "error_log.h"
#include <string> #include <string>
extern ErrorLog *server_log; #include "../common/eqemu_logsys.h"
extern EQEmuLogSys Log;
bool Encryption::LoadCrypto(std::string name) bool Encryption::LoadCrypto(std::string name)
{ {
if(!Load(name.c_str())) if(!Load(name.c_str()))
{ {
server_log->Log(log_error, "Failed to load %s from the operating system.", name.c_str()); Log.Out(Logs::General, Logs::Error, "Failed to load %s from the operating system.", name.c_str());
return false; return false;
} }
else else
@ -34,21 +34,21 @@ bool Encryption::LoadCrypto(std::string name)
encrypt_func = (DLLFUNC_Encrypt)GetSym("Encrypt"); encrypt_func = (DLLFUNC_Encrypt)GetSym("Encrypt");
if(encrypt_func == NULL) if(encrypt_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach Encrypt."); Log.Out(Logs::General, Logs::Error, "Failed to attach Encrypt.");
Unload(); Unload();
return false; return false;
} }
decrypt_func = (DLLFUNC_DecryptUsernamePassword)GetSym("DecryptUsernamePassword"); decrypt_func = (DLLFUNC_DecryptUsernamePassword)GetSym("DecryptUsernamePassword");
if(decrypt_func == NULL) if(decrypt_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach DecryptUsernamePassword."); Log.Out(Logs::General, Logs::Error, "Failed to attach DecryptUsernamePassword.");
Unload(); Unload();
return false; return false;
} }
delete_func = (DLLFUNC_HeapDelete)GetSym("_HeapDeleteCharBuffer"); delete_func = (DLLFUNC_HeapDelete)GetSym("_HeapDeleteCharBuffer");
if(delete_func == NULL) if(delete_func == NULL)
{ {
server_log->Log(log_error, "Failed to attach _HeapDeleteCharBuffer."); Log.Out(Logs::General, Logs::Error, "Failed to attach _HeapDeleteCharBuffer.");
Unload(); Unload();
return false; return false;
} }

View File

@ -1,210 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <string.h>
#include "error_log.h"
const char *eqLogTypes[_log_largest_type] =
{
"Debug",
"Error",
"Database",
"Network",
"Network Trace",
"Network Error",
"World",
"World Error",
"Client",
"Client Error"
};
ErrorLog::ErrorLog(const char* file_name)
{
log_mutex = new Mutex();
error_log = fopen(file_name, "w");
}
ErrorLog::~ErrorLog()
{
log_mutex->lock();
if(error_log)
{
fclose(error_log);
}
log_mutex->unlock();
delete log_mutex;
}
void ErrorLog::Log(eqLogType type, const char *message, ...)
{
if(type >= _log_largest_type)
{
return;
}
va_list argptr;
char *buffer = new char[4096];
va_start(argptr, message);
vsnprintf(buffer, 4096, message, argptr);
va_end(argptr);
time_t m_clock;
struct tm *m_time;
time(&m_clock);
m_time = localtime(&m_clock);
log_mutex->lock();
printf("[%s] [%02d.%02d.%02d - %02d:%02d:%02d] %s\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
buffer);
if(error_log)
{
fprintf(error_log, "[%s] [%02d.%02d.%02d - %02d:%02d:%02d] %s\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
buffer);
fflush(error_log);
}
log_mutex->unlock();
delete[] buffer;
}
void ErrorLog::LogPacket(eqLogType type, const char *data, size_t size)
{
if(type >= _log_largest_type)
{
return;
}
log_mutex->lock();
time_t m_clock;
struct tm *m_time;
time(&m_clock);
m_time = localtime(&m_clock);
log_mutex->lock();
printf("[%s] [%02d.%02d.%02d - %02d:%02d:%02d] dumping packet of size %u:\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
(unsigned int)size);
if(error_log)
{
fprintf(error_log, "[%s] [%02d.%02d.%02d - %02d:%02d:%02d] dumping packet of size %u\n",
eqLogTypes[type],
m_time->tm_mon+1,
m_time->tm_mday,
m_time->tm_year%100,
m_time->tm_hour,
m_time->tm_min,
m_time->tm_sec,
(unsigned int)size);
}
char ascii[17]; //16 columns + 1 null term
memset(ascii, 0, 17);
size_t j = 0;
size_t i = 0;
for(; i < size; ++i)
{
if(i % 16 == 0)
{
if(i != 0)
{
printf(" | %s\n", ascii);
if(error_log)
{
fprintf(error_log, " | %s\n", ascii);
}
}
printf("%.4u: ", (unsigned int)i);
memset(ascii, 0, 17);
j = 0;
}
else if(i % 8 == 0)
{
printf("- ");
if(error_log)
{
fprintf(error_log, "- ");
}
}
printf("%02X ", (unsigned int)data[i]);
if(error_log)
{
fprintf(error_log, "%02X ", (unsigned int)data[i]);
}
if(data[i] >= 32 && data[i] < 127)
{
ascii[j++] = data[i];
}
else
{
ascii[j++] = '.';
}
}
size_t k = (i - 1) % 16;
if(k < 8)
{
printf(" ");
if(error_log)
{
fprintf(error_log, " ");
}
}
for(size_t h = k + 1; h < 16; ++h)
{
printf(" ");
if(error_log)
{
fprintf(error_log, " ");
}
}
printf(" | %s\n", ascii);
if(error_log)
{
fprintf(error_log, " | %s\n", ascii);
fflush(error_log);
}
log_mutex->unlock();
}

View File

@ -1,79 +0,0 @@
/* EQEMu: Everquest Server Emulator
Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY except by those people which sell it, which
are required to give you total support for your newly bought product;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef EQEMU_ERROR_LOG_H
#define EQEMU_ERROR_LOG_H
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <string>
#include "../common/mutex.h"
/**
* Dictates the log type specified in ErrorLog for Log(...)
*/
enum eqLogType
{
log_debug,
log_error,
log_database,
log_network,
log_network_trace,
log_network_error,
log_world,
log_world_error,
log_client,
log_client_error,
_log_largest_type
};
/**
* Basic error logging class.
* Thread safe logging class that records time and date to both a file and to console(if exists).
*/
class ErrorLog
{
public:
/**
* Constructor: opens the log file for writing and creates our mutex for writing to the log.
*/
ErrorLog(const char* file_name);
/**
* Closes the file and destroys the mutex.
*/
~ErrorLog();
/**
* Writes to the log system a variable message.
*/
void Log(eqLogType type, const char *message, ...);
/**
* Writes to the log system a packet.
*/
void LogPacket(eqLogType type, const char *data, size_t size);
protected:
Mutex *log_mutex;
FILE* error_log;
};
#endif

View File

@ -18,7 +18,6 @@
#ifndef EQEMU_LOGINSERVER_H #ifndef EQEMU_LOGINSERVER_H
#define EQEMU_LOGINSERVER_H #define EQEMU_LOGINSERVER_H
#include "error_log.h"
#include "config.h" #include "config.h"
#include "database.h" #include "database.h"
#include "database_mysql.h" #include "database_mysql.h"
@ -40,7 +39,7 @@ public:
* but it's the most trivial way to do this. * but it's the most trivial way to do this.
*/ */
#ifdef WIN32 #ifdef WIN32
LoginServer() : config(nullptr), db(nullptr), eq_crypto(nullptr), SM(nullptr) { } LoginServer() : config(nullptr), db(nullptr), eq_crypto(nullptr), server_manager(nullptr) { }
#else #else
LoginServer() : config(nullptr), db(nullptr) { } LoginServer() : config(nullptr), db(nullptr) { }
#endif #endif
@ -48,8 +47,8 @@ public:
Config *config; Config *config;
Database *db; Database *db;
Options options; Options options;
ServerManager *SM; ServerManager *server_manager;
ClientManager *CM; ClientManager *client_manager;
#ifdef WIN32 #ifdef WIN32
Encryption *eq_crypto; Encryption *eq_crypto;

View File

@ -38,7 +38,7 @@ struct LoginLoginRequest_Struct {
char unknown6[16]; char unknown6[16];
}; };
struct LoginLoginAccepted_Struct { struct LoginAccepted_Struct {
short unknown1; short unknown1;
short unknown2; short unknown2;
short unknown3; short unknown3;
@ -47,7 +47,7 @@ struct LoginLoginAccepted_Struct {
char encrypt[80]; char encrypt[80];
}; };
struct Login_ReplyBlock_Struct struct LoginFailedAttempts_Struct
{ {
char message; //0x01 char message; //0x01
char unknown2[7]; //0x00 char unknown2[7]; //0x00

View File

@ -32,7 +32,6 @@
TimeoutManager timeout_manager; TimeoutManager timeout_manager;
LoginServer server; LoginServer server;
EQEmuLogSys Log; EQEmuLogSys Log;
ErrorLog *server_log;
bool run_server = true; bool run_server = true;
void CatchSignal(int sig_num) void CatchSignal(int sig_num)
@ -43,106 +42,63 @@ int main()
{ {
RegisterExecutablePlatform(ExePlatformLogin); RegisterExecutablePlatform(ExePlatformLogin);
set_exception_handler(); set_exception_handler();
Log.LoadLogSettingsDefaults();
//Create our error log, is of format login_<number>.log Log.log_settings[Logs::Error].log_to_console = Logs::General;
time_t current_time = time(nullptr);
std::stringstream log_name(std::stringstream::in | std::stringstream::out);
#ifdef WIN32
log_name << ".\\logs\\login_" << (unsigned int)current_time << ".log";
#else
log_name << "./logs/login_" << (unsigned int)current_time << ".log";
#endif
server_log = new ErrorLog(log_name.str().c_str());
server_log->Log(log_debug, "Logging System Init.");
//Create our subsystem and parse the ini file. Log.Out(Logs::General, Logs::Login_Server, "Logging System Init.");
/* Parse out login.ini */
server.config = new Config(); server.config = new Config();
server_log->Log(log_debug, "Config System Init."); Log.Out(Logs::General, Logs::Login_Server, "Config System Init.");
server.config->Parse("login.ini"); server.config->Parse("login.ini");
//Parse unregistered allowed option. if (server.config->GetVariable("options", "unregistered_allowed").compare("FALSE") == 0)
if(server.config->GetVariable("options", "unregistered_allowed").compare("FALSE") == 0)
{
server.options.AllowUnregistered(false); server.options.AllowUnregistered(false);
}
//Parse trace option. if (server.config->GetVariable("options", "trace").compare("TRUE") == 0)
if(server.config->GetVariable("options", "trace").compare("TRUE") == 0)
{
server.options.Trace(true); server.options.Trace(true);
}
//Parse trace option. if (server.config->GetVariable("options", "world_trace").compare("TRUE") == 0)
if(server.config->GetVariable("options", "world_trace").compare("TRUE") == 0)
{
server.options.WorldTrace(true); server.options.WorldTrace(true);
}
//Parse packet inc dump option. if (server.config->GetVariable("options", "dump_packets_in").compare("TRUE") == 0)
if(server.config->GetVariable("options", "dump_packets_in").compare("TRUE") == 0)
{
server.options.DumpInPackets(true); server.options.DumpInPackets(true);
}
//Parse packet out dump option. if (server.config->GetVariable("options", "dump_packets_out").compare("TRUE") == 0)
if(server.config->GetVariable("options", "dump_packets_out").compare("TRUE") == 0)
{
server.options.DumpOutPackets(true); server.options.DumpOutPackets(true);
}
//Parse encryption mode option.
std::string mode = server.config->GetVariable("security", "mode"); std::string mode = server.config->GetVariable("security", "mode");
if(mode.size() > 0) if (mode.size() > 0)
{
server.options.EncryptionMode(atoi(mode.c_str())); server.options.EncryptionMode(atoi(mode.c_str()));
}
//Parse local network option. std::string local_network = server.config->GetVariable("options", "local_network");
std::string ln = server.config->GetVariable("options", "local_network"); if (local_network.size() > 0)
if(ln.size() > 0) server.options.LocalNetwork(local_network);
{
server.options.LocalNetwork(ln);
}
//Parse reject duplicate servers option. if (server.config->GetVariable("options", "reject_duplicate_servers").compare("TRUE") == 0)
if(server.config->GetVariable("options", "reject_duplicate_servers").compare("TRUE") == 0)
{
server.options.RejectDuplicateServers(true); server.options.RejectDuplicateServers(true);
}
//Parse account table option. local_network = server.config->GetVariable("schema", "account_table");
ln = server.config->GetVariable("schema", "account_table"); if (local_network.size() > 0)
if(ln.size() > 0) server.options.AccountTable(local_network);
{
server.options.AccountTable(ln);
}
//Parse world account table option. local_network = server.config->GetVariable("schema", "world_registration_table");
ln = server.config->GetVariable("schema", "world_registration_table"); if (local_network.size() > 0)
if(ln.size() > 0) server.options.WorldRegistrationTable(local_network);
{
server.options.WorldRegistrationTable(ln);
}
//Parse admin world account table option. local_network = server.config->GetVariable("schema", "world_admin_registration_table");
ln = server.config->GetVariable("schema", "world_admin_registration_table"); if (local_network.size() > 0)
if(ln.size() > 0) server.options.WorldAdminRegistrationTable(local_network);
{
server.options.WorldAdminRegistrationTable(ln);
}
//Parse world type table option. local_network = server.config->GetVariable("schema", "world_server_type_table");
ln = server.config->GetVariable("schema", "world_server_type_table"); if (local_network.size() > 0)
if(ln.size() > 0) server.options.WorldServerTypeTable(local_network);
{
server.options.WorldServerTypeTable(ln);
}
//Create our DB from options. /* Create database connection */
if(server.config->GetVariable("database", "subsystem").compare("MySQL") == 0) if (server.config->GetVariable("database", "subsystem").compare("MySQL") == 0) {
{
#ifdef EQEMU_MYSQL_ENABLED #ifdef EQEMU_MYSQL_ENABLED
server_log->Log(log_debug, "MySQL Database Init."); Log.Out(Logs::General, Logs::Login_Server, "MySQL Database Init.");
server.db = (Database*)new DatabaseMySQL( server.db = (Database*)new DatabaseMySQL(
server.config->GetVariable("database", "user"), server.config->GetVariable("database", "user"),
server.config->GetVariable("database", "password"), server.config->GetVariable("database", "password"),
@ -151,10 +107,9 @@ int main()
server.config->GetVariable("database", "db")); server.config->GetVariable("database", "db"));
#endif #endif
} }
else if(server.config->GetVariable("database", "subsystem").compare("PostgreSQL") == 0) else if (server.config->GetVariable("database", "subsystem").compare("PostgreSQL") == 0) {
{
#ifdef EQEMU_POSTGRESQL_ENABLED #ifdef EQEMU_POSTGRESQL_ENABLED
server_log->Log(log_debug, "PostgreSQL Database Init."); Log.Out(Logs::General, Logs::Login_Server, "PostgreSQL Database Init.");
server.db = (Database*)new DatabasePostgreSQL( server.db = (Database*)new DatabasePostgreSQL(
server.config->GetVariable("database", "user"), server.config->GetVariable("database", "user"),
server.config->GetVariable("database", "password"), server.config->GetVariable("database", "password"),
@ -164,78 +119,70 @@ int main()
#endif #endif
} }
//Make sure our database got created okay, otherwise cleanup and exit. /* Make sure our database got created okay, otherwise cleanup and exit. */
if(!server.db) if (!server.db) {
{ Log.Out(Logs::General, Logs::Error, "Database Initialization Failure.");
server_log->Log(log_error, "Database Initialization Failure."); Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
server_log->Log(log_debug, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
#if WIN32 #if WIN32
//initialize our encryption. //initialize our encryption.
server_log->Log(log_debug, "Encryption Initialize."); Log.Out(Logs::General, Logs::Login_Server, "Encryption Initialize.");
server.eq_crypto = new Encryption(); server.eq_crypto = new Encryption();
if(server.eq_crypto->LoadCrypto(server.config->GetVariable("security", "plugin"))) if (server.eq_crypto->LoadCrypto(server.config->GetVariable("security", "plugin"))) {
{ Log.Out(Logs::General, Logs::Login_Server, "Encryption Loaded Successfully.");
server_log->Log(log_debug, "Encryption Loaded Successfully.");
} }
else else {
{
//We can't run without encryption, cleanup and exit. //We can't run without encryption, cleanup and exit.
server_log->Log(log_error, "Encryption Failed to Load."); Log.Out(Logs::General, Logs::Error, "Encryption Failed to Load.");
server_log->Log(log_debug, "Database System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
#endif #endif
//create our server manager. //create our server manager.
server_log->Log(log_debug, "Server Manager Initialize."); Log.Out(Logs::General, Logs::Login_Server, "Server Manager Initialize.");
server.SM = new ServerManager(); server.server_manager = new ServerManager();
if(!server.SM) if (!server.server_manager) {
{
//We can't run without a server manager, cleanup and exit. //We can't run without a server manager, cleanup and exit.
server_log->Log(log_error, "Server Manager Failed to Start."); Log.Out(Logs::General, Logs::Error, "Server Manager Failed to Start.");
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown.");
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
//create our client manager. //create our client manager.
server_log->Log(log_debug, "Client Manager Initialize."); Log.Out(Logs::General, Logs::Login_Server, "Client Manager Initialize.");
server.CM = new ClientManager(); server.client_manager = new ClientManager();
if(!server.CM) if (!server.client_manager) {
{
//We can't run without a client manager, cleanup and exit. //We can't run without a client manager, cleanup and exit.
server_log->Log(log_error, "Client Manager Failed to Start."); Log.Out(Logs::General, Logs::Error, "Client Manager Failed to Start.");
server_log->Log(log_debug, "Server Manager Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
delete server.SM; delete server.server_manager;
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown.");
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 1; return 1;
} }
@ -247,30 +194,29 @@ int main()
#endif #endif
#endif #endif
server_log->Log(log_debug, "Server Started."); Log.Out(Logs::General, Logs::Login_Server, "Server Started.");
while(run_server) while (run_server) {
{
Timer::SetCurrentTime(); Timer::SetCurrentTime();
server.CM->Process(); server.client_manager->Process();
server.SM->Process(); server.server_manager->Process();
Sleep(100); Sleep(100);
} }
server_log->Log(log_debug, "Server Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Server Shutdown.");
server_log->Log(log_debug, "Client Manager Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Client Manager Shutdown.");
delete server.CM; delete server.client_manager;
server_log->Log(log_debug, "Server Manager Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Server Manager Shutdown.");
delete server.SM; delete server.server_manager;
#ifdef WIN32 #ifdef WIN32
server_log->Log(log_debug, "Encryption System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Encryption System Shutdown.");
delete server.eq_crypto; delete server.eq_crypto;
#endif #endif
server_log->Log(log_debug, "Database System Shutdown.");
Log.Out(Logs::General, Logs::Login_Server, "Database System Shutdown.");
delete server.db; delete server.db;
server_log->Log(log_debug, "Config System Shutdown."); Log.Out(Logs::General, Logs::Login_Server, "Config System Shutdown.");
delete server.config; delete server.config;
server_log->Log(log_debug, "Log System Shutdown.");
delete server_log;
return 0; return 0;
} }

View File

@ -17,11 +17,12 @@
*/ */
#include "server_manager.h" #include "server_manager.h"
#include "login_server.h" #include "login_server.h"
#include "error_log.h"
#include "login_structures.h" #include "login_structures.h"
#include <stdlib.h> #include <stdlib.h>
extern ErrorLog *server_log; #include "../common/eqemu_logsys.h"
extern EQEmuLogSys Log;
extern LoginServer server; extern LoginServer server;
extern bool run_server; extern bool run_server;
@ -31,21 +32,18 @@ ServerManager::ServerManager()
int listen_port = atoi(server.config->GetVariable("options", "listen_port").c_str()); int listen_port = atoi(server.config->GetVariable("options", "listen_port").c_str());
tcps = new EmuTCPServer(listen_port, true); tcps = new EmuTCPServer(listen_port, true);
if(tcps->Open(listen_port, error_buffer)) if(tcps->Open(listen_port, error_buffer)) {
{ Log.Out(Logs::General, Logs::Login_Server, "ServerManager listening on port %u", listen_port);
server_log->Log(log_network, "ServerManager listening on port %u", listen_port);
} }
else else {
{ Log.Out(Logs::General, Logs::Error, "ServerManager fatal error opening port on %u: %s", listen_port, error_buffer);
server_log->Log(log_error, "ServerManager fatal error opening port on %u: %s", listen_port, error_buffer);
run_server = false; run_server = false;
} }
} }
ServerManager::~ServerManager() ServerManager::~ServerManager()
{ {
if(tcps) if (tcps) {
{
tcps->Close(); tcps->Close();
delete tcps; delete tcps;
} }
@ -55,38 +53,32 @@ void ServerManager::Process()
{ {
ProcessDisconnect(); ProcessDisconnect();
EmuTCPConnection *tcp_c = nullptr; EmuTCPConnection *tcp_c = nullptr;
while(tcp_c = tcps->NewQueuePop()) while (tcp_c = tcps->NewQueuePop()) {
{
in_addr tmp; in_addr tmp;
tmp.s_addr = tcp_c->GetrIP(); tmp.s_addr = tcp_c->GetrIP();
server_log->Log(log_network, "New world server connection from %s:%d", inet_ntoa(tmp), tcp_c->GetrPort()); Log.Out(Logs::General, Logs::Login_Server, "New world server connection from %s:%d", inet_ntoa(tmp), tcp_c->GetrPort());
WorldServer *cur = GetServerByAddress(tcp_c->GetrIP()); WorldServer *server_entity = GetServerByAddress(tcp_c->GetrIP());
if(cur) if (server_entity) {
{ Log.Out(Logs::General, Logs::Login_Server, "World server already existed for %s, removing existing connection and updating current.", inet_ntoa(tmp));
server_log->Log(log_network, "World server already existed for %s, removing existing connection and updating current.", inet_ntoa(tmp)); server_entity->GetConnection()->Free();
cur->GetConnection()->Free(); server_entity->SetConnection(tcp_c);
cur->SetConnection(tcp_c); server_entity->Reset();
cur->Reset();
} }
else else {
{
WorldServer *w = new WorldServer(tcp_c); WorldServer *w = new WorldServer(tcp_c);
world_servers.push_back(w); world_servers.push_back(w);
} }
} }
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter)->Process() == false) {
if((*iter)->Process() == false) Log.Out(Logs::General, Logs::World_Server, "World server %s had a fatal error and had to be removed from the login.", (*iter)->GetLongName().c_str());
{
server_log->Log(log_world, "World server %s had a fatal error and had to be removed from the login.", (*iter)->GetLongName().c_str());
delete (*iter); delete (*iter);
iter = world_servers.erase(iter); iter = world_servers.erase(iter);
} }
else else {
{
++iter; ++iter;
} }
} }
@ -95,20 +87,17 @@ void ServerManager::Process()
void ServerManager::ProcessDisconnect() void ServerManager::ProcessDisconnect()
{ {
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ EmuTCPConnection *connection = (*iter)->GetConnection();
EmuTCPConnection *c = (*iter)->GetConnection(); if (!connection->Connected()) {
if(!c->Connected())
{
in_addr tmp; in_addr tmp;
tmp.s_addr = c->GetrIP(); tmp.s_addr = connection->GetrIP();
server_log->Log(log_network, "World server disconnected from the server, removing server and freeing connection."); Log.Out(Logs::General, Logs::Login_Server, "World server disconnected from the server, removing server and freeing connection.");
c->Free(); connection->Free();
delete (*iter); delete (*iter);
iter = world_servers.erase(iter); iter = world_servers.erase(iter);
} }
else else {
{
++iter; ++iter;
} }
} }
@ -117,10 +106,8 @@ void ServerManager::ProcessDisconnect()
WorldServer* ServerManager::GetServerByAddress(unsigned int address) WorldServer* ServerManager::GetServerByAddress(unsigned int address)
{ {
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter)->GetConnection()->GetrIP() == address) {
if((*iter)->GetConnection()->GetrIP() == address)
{
return (*iter); return (*iter);
} }
++iter; ++iter;
@ -138,10 +125,8 @@ EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c)
string client_ip = inet_ntoa(in); string client_ip = inet_ntoa(in);
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter)->IsAuthorized() == false) {
if((*iter)->IsAuthorized() == false)
{
++iter; ++iter;
continue; continue;
} }
@ -149,16 +134,13 @@ EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c)
in.s_addr = (*iter)->GetConnection()->GetrIP(); in.s_addr = (*iter)->GetConnection()->GetrIP();
string world_ip = inet_ntoa(in); string world_ip = inet_ntoa(in);
if(world_ip.compare(client_ip) == 0) if (world_ip.compare(client_ip) == 0) {
{
packet_size += (*iter)->GetLongName().size() + (*iter)->GetLocalIP().size() + 24; packet_size += (*iter)->GetLongName().size() + (*iter)->GetLocalIP().size() + 24;
} }
else if(client_ip.find(server.options.GetLocalNetwork()) != string::npos) else if (client_ip.find(server.options.GetLocalNetwork()) != string::npos) {
{
packet_size += (*iter)->GetLongName().size() + (*iter)->GetLocalIP().size() + 24; packet_size += (*iter)->GetLongName().size() + (*iter)->GetLocalIP().size() + 24;
} }
else else {
{
packet_size += (*iter)->GetLongName().size() + (*iter)->GetRemoteIP().size() + 24; packet_size += (*iter)->GetLongName().size() + (*iter)->GetRemoteIP().size() + 24;
} }
@ -167,98 +149,87 @@ EQApplicationPacket *ServerManager::CreateServerListPacket(Client *c)
} }
EQApplicationPacket *outapp = new EQApplicationPacket(OP_ServerListResponse, packet_size); EQApplicationPacket *outapp = new EQApplicationPacket(OP_ServerListResponse, packet_size);
ServerListHeader_Struct *sl = (ServerListHeader_Struct*)outapp->pBuffer; ServerListHeader_Struct *server_list = (ServerListHeader_Struct*)outapp->pBuffer;
sl->Unknown1 = 0x00000004; server_list->Unknown1 = 0x00000004;
sl->Unknown2 = 0x00000000; server_list->Unknown2 = 0x00000000;
sl->Unknown3 = 0x01650000; server_list->Unknown3 = 0x01650000;
/**
* Not sure what this is but it should be noted setting it to
* 0xFFFFFFFF crashes the client so: don't do that.
*/
sl->Unknown4 = 0x00000000;
sl->NumberOfServers = server_count;
unsigned char *data_ptr = outapp->pBuffer; /**
data_ptr += sizeof(ServerListHeader_Struct); * Not sure what this is but it should be noted setting it to
* 0xFFFFFFFF crashes the client so: don't do that.
*/
server_list->Unknown4 = 0x00000000;
server_list->NumberOfServers = server_count;
unsigned char *data_pointer = outapp->pBuffer;
data_pointer += sizeof(ServerListHeader_Struct);
iter = world_servers.begin(); iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter)->IsAuthorized() == false) {
if((*iter)->IsAuthorized() == false)
{
++iter; ++iter;
continue; continue;
} }
in.s_addr = (*iter)->GetConnection()->GetrIP(); in.s_addr = (*iter)->GetConnection()->GetrIP();
string world_ip = inet_ntoa(in); string world_ip = inet_ntoa(in);
if(world_ip.compare(client_ip) == 0) if (world_ip.compare(client_ip) == 0) {
{ memcpy(data_pointer, (*iter)->GetLocalIP().c_str(), (*iter)->GetLocalIP().size());
memcpy(data_ptr, (*iter)->GetLocalIP().c_str(), (*iter)->GetLocalIP().size()); data_pointer += ((*iter)->GetLocalIP().size() + 1);
data_ptr += ((*iter)->GetLocalIP().size() + 1);
} }
else if(client_ip.find(server.options.GetLocalNetwork()) != string::npos) else if (client_ip.find(server.options.GetLocalNetwork()) != string::npos) {
{ memcpy(data_pointer, (*iter)->GetLocalIP().c_str(), (*iter)->GetLocalIP().size());
memcpy(data_ptr, (*iter)->GetLocalIP().c_str(), (*iter)->GetLocalIP().size()); data_pointer += ((*iter)->GetLocalIP().size() + 1);
data_ptr += ((*iter)->GetLocalIP().size() + 1);
} }
else else {
{ memcpy(data_pointer, (*iter)->GetRemoteIP().c_str(), (*iter)->GetRemoteIP().size());
memcpy(data_ptr, (*iter)->GetRemoteIP().c_str(), (*iter)->GetRemoteIP().size()); data_pointer += ((*iter)->GetRemoteIP().size() + 1);
data_ptr += ((*iter)->GetRemoteIP().size() + 1);
} }
switch((*iter)->GetServerListID()) switch ((*iter)->GetServerListID()) {
{ case 1: {
case 1: *(unsigned int*)data_pointer = 0x00000030;
{
*(unsigned int*)data_ptr = 0x00000030;
break; break;
} }
case 2: case 2: {
{ *(unsigned int*)data_pointer = 0x00000009;
*(unsigned int*)data_ptr = 0x00000009;
break; break;
} }
default: default: {
{ *(unsigned int*)data_pointer = 0x00000001;
*(unsigned int*)data_ptr = 0x00000001;
} }
} }
data_ptr += 4;
*(unsigned int*)data_ptr = (*iter)->GetRuntimeID(); data_pointer += 4;
data_ptr += 4;
memcpy(data_ptr, (*iter)->GetLongName().c_str(), (*iter)->GetLongName().size()); *(unsigned int*)data_pointer = (*iter)->GetRuntimeID();
data_ptr += ((*iter)->GetLongName().size() + 1); data_pointer += 4;
memcpy(data_ptr, "EN", 2); memcpy(data_pointer, (*iter)->GetLongName().c_str(), (*iter)->GetLongName().size());
data_ptr += 3; data_pointer += ((*iter)->GetLongName().size() + 1);
memcpy(data_ptr, "US", 2); memcpy(data_pointer, "EN", 2);
data_ptr += 3; data_pointer += 3;
memcpy(data_pointer, "US", 2);
data_pointer += 3;
// 0 = Up, 1 = Down, 2 = Up, 3 = down, 4 = locked, 5 = locked(down) // 0 = Up, 1 = Down, 2 = Up, 3 = down, 4 = locked, 5 = locked(down)
if((*iter)->GetStatus() < 0) if ((*iter)->GetStatus() < 0) {
{ if ((*iter)->GetZonesBooted() == 0) {
if((*iter)->GetZonesBooted() == 0) *(uint32*)data_pointer = 0x01;
{
*(uint32*)data_ptr = 0x01;
} }
else else {
{ *(uint32*)data_pointer = 0x04;
*(uint32*)data_ptr = 0x04;
} }
} }
else else {
{ *(uint32*)data_pointer = 0x02;
*(uint32*)data_ptr = 0x02;
} }
data_ptr += 4; data_pointer += 4;
*(uint32*)data_ptr = (*iter)->GetPlayersOnline(); *(uint32*)data_pointer = (*iter)->GetPlayersOnline();
data_ptr += 4; data_pointer += 4;
++iter; ++iter;
} }
@ -270,10 +241,8 @@ void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int
{ {
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
bool found = false; bool found = false;
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter)->GetRuntimeID() == server_id) {
if((*iter)->GetRuntimeID() == server_id)
{
ServerPacket *outapp = new ServerPacket(ServerOP_UsertoWorldReq, sizeof(UsertoWorldRequest_Struct)); ServerPacket *outapp = new ServerPacket(ServerOP_UsertoWorldReq, sizeof(UsertoWorldRequest_Struct));
UsertoWorldRequest_Struct *utwr = (UsertoWorldRequest_Struct*)outapp->pBuffer; UsertoWorldRequest_Struct *utwr = (UsertoWorldRequest_Struct*)outapp->pBuffer;
utwr->worldid = server_id; utwr->worldid = server_id;
@ -281,8 +250,7 @@ void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int
(*iter)->GetConnection()->SendPacket(outapp); (*iter)->GetConnection()->SendPacket(outapp);
found = true; found = true;
if(server.options.IsDumpInPacketsOn()) if (server.options.IsDumpInPacketsOn()) {
{
DumpPacket(outapp); DumpPacket(outapp);
} }
delete outapp; delete outapp;
@ -290,25 +258,21 @@ void ServerManager::SendUserToWorldRequest(unsigned int server_id, unsigned int
++iter; ++iter;
} }
if(!found && server.options.IsTraceOn()) if (!found && server.options.IsTraceOn()) {
{ Log.Out(Logs::General, Logs::Error, "Client requested a user to world but supplied an invalid id of %u.", server_id);
server_log->Log(log_client_error, "Client requested a user to world but supplied an invalid id of %u.", server_id);
} }
} }
bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *ignore) bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *ignore)
{ {
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter) == ignore) {
if((*iter) == ignore)
{
++iter; ++iter;
continue; continue;
} }
if((*iter)->GetLongName().compare(l_name) == 0 && (*iter)->GetShortName().compare(s_name) == 0) if ((*iter)->GetLongName().compare(l_name) == 0 && (*iter)->GetShortName().compare(s_name) == 0) {
{
return true; return true;
} }
@ -320,18 +284,14 @@ bool ServerManager::ServerExists(string l_name, string s_name, WorldServer *igno
void ServerManager::DestroyServerByName(string l_name, string s_name, WorldServer *ignore) void ServerManager::DestroyServerByName(string l_name, string s_name, WorldServer *ignore)
{ {
list<WorldServer*>::iterator iter = world_servers.begin(); list<WorldServer*>::iterator iter = world_servers.begin();
while(iter != world_servers.end()) while (iter != world_servers.end()) {
{ if ((*iter) == ignore) {
if((*iter) == ignore)
{
++iter; ++iter;
} }
if((*iter)->GetLongName().compare(l_name) == 0 && (*iter)->GetShortName().compare(s_name) == 0) if ((*iter)->GetLongName().compare(l_name) == 0 && (*iter)->GetShortName().compare(s_name) == 0) {
{
EmuTCPConnection *c = (*iter)->GetConnection(); EmuTCPConnection *c = (*iter)->GetConnection();
if(c->Connected()) if (c->Connected()) {
{
c->Disconnect(); c->Disconnect();
} }
c->Free(); c->Free();
@ -341,5 +301,4 @@ void ServerManager::DestroyServerByName(string l_name, string s_name, WorldServe
++iter; ++iter;
} }
} }

View File

@ -16,11 +16,13 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "world_server.h" #include "world_server.h"
#include "error_log.h"
#include "login_server.h" #include "login_server.h"
#include "login_structures.h" #include "login_structures.h"
#include "config.h"
extern ErrorLog *server_log; #include "../common/eqemu_logsys.h"
extern EQEmuLogSys Log;
extern LoginServer server; extern LoginServer server;
WorldServer::WorldServer(EmuTCPConnection *c) WorldServer::WorldServer(EmuTCPConnection *c)
@ -28,19 +30,18 @@ WorldServer::WorldServer(EmuTCPConnection *c)
connection = c; connection = c;
zones_booted = 0; zones_booted = 0;
players_online = 0; players_online = 0;
status = 0; server_status = 0;
runtime_id = 0; runtime_id = 0;
server_list_id = 0; server_list_id = 0;
server_type = 0; server_type = 0;
authorized = false; is_server_authorized = false;
trusted = false; is_server_trusted = false;
logged_in = false; is_server_logged_in = false;
} }
WorldServer::~WorldServer() WorldServer::~WorldServer()
{ {
if(connection) if(connection) {
{
connection->Free(); connection->Free();
} }
} }
@ -49,12 +50,12 @@ void WorldServer::Reset()
{ {
zones_booted = 0; zones_booted = 0;
players_online = 0; players_online = 0;
status = 0; server_status = 0;
runtime_id; runtime_id;
server_list_id = 0; server_list_id = 0;
server_type = 0; server_type = 0;
authorized = false; is_server_authorized = false;
logged_in = false; is_server_logged_in = false;
} }
bool WorldServer::Process() bool WorldServer::Process()
@ -64,7 +65,7 @@ bool WorldServer::Process()
{ {
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "Application packet received from server: 0x%.4X, (size %u)", app->opcode, app->size); Log.Out(Logs::General, Logs::Netcode, "Application packet received from server: 0x%.4X, (size %u)", app->opcode, app->size);
} }
if(server.options.IsDumpInPacketsOn()) if(server.options.IsDumpInPacketsOn())
@ -78,14 +79,14 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerNewLSInfo_Struct)) if(app->size < sizeof(ServerNewLSInfo_Struct))
{ {
server_log->Log(log_network_error, "Received application packet from server that had opcode ServerOP_NewLSInfo, " Log.Out(Logs::General, Logs::Error, "Received application packet from server that had opcode ServerOP_NewLSInfo, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "New Login Info Recieved."); Log.Out(Logs::General, Logs::Netcode, "New Login Info Recieved.");
} }
ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)app->pBuffer; ServerNewLSInfo_Struct *info = (ServerNewLSInfo_Struct*)app->pBuffer;
@ -96,14 +97,14 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerLSStatus_Struct)) if(app->size < sizeof(ServerLSStatus_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerOP_LSStatus, " Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerOP_LSStatus, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
if(server.options.IsWorldTraceOn()) if(server.options.IsWorldTraceOn())
{ {
server_log->Log(log_network_trace, "World Server Status Recieved."); Log.Out(Logs::General, Logs::Netcode, "World Server Status Recieved.");
} }
ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)app->pBuffer; ServerLSStatus_Struct *ls_status = (ServerLSStatus_Struct*)app->pBuffer;
@ -127,7 +128,7 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(UsertoWorldResponse_Struct)) if(app->size < sizeof(UsertoWorldResponse_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerOP_UsertoWorldResp, " Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerOP_UsertoWorldResp, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
@ -137,21 +138,22 @@ bool WorldServer::Process()
//While keeping world server spam with multiple servers connected almost impossible. //While keeping world server spam with multiple servers connected almost impossible.
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "User-To-World Response received."); Log.Out(Logs::General, Logs::Netcode, "User-To-World Response received.");
} }
UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)app->pBuffer; UsertoWorldResponse_Struct *utwr = (UsertoWorldResponse_Struct*)app->pBuffer;
server_log->Log(log_client, "Trying to find client with user id of %u.", utwr->lsaccountid); Log.Out(Logs::General, Logs::Debug, "Trying to find client with user id of %u.", utwr->lsaccountid);
Client *c = server.CM->GetClient(utwr->lsaccountid); Client *c = server.client_manager->GetClient(utwr->lsaccountid);
if(c) if(c)
{ {
server_log->Log(log_client, "Found client with user id of %u and account name of %s.", utwr->lsaccountid, c->GetAccountName().c_str()); Log.Out(Logs::General, Logs::Debug, "Found client with user id of %u and account name of %s.", utwr->lsaccountid, c->GetAccountName().c_str());
EQApplicationPacket *outapp = new EQApplicationPacket(OP_PlayEverquestResponse, sizeof(PlayEverquestResponse_Struct)); EQApplicationPacket *outapp = new EQApplicationPacket(OP_PlayEverquestResponse, sizeof(PlayEverquestResponse_Struct));
PlayEverquestResponse_Struct *per = (PlayEverquestResponse_Struct*)outapp->pBuffer; PlayEverquestResponse_Struct *per = (PlayEverquestResponse_Struct*)outapp->pBuffer;
per->Sequence = c->GetPlaySequence(); per->Sequence = c->GetPlaySequence();
per->ServerNumber = c->GetPlayServerID(); per->ServerNumber = c->GetPlayServerID();
server_log->Log(log_client, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID()); Log.Out(Logs::General, Logs::Debug, "Found sequence and play of %u %u", c->GetPlaySequence(), c->GetPlayServerID());
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size);
Log.Out(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
if(utwr->response > 0) if(utwr->response > 0)
{ {
@ -180,9 +182,9 @@ bool WorldServer::Process()
if(server.options.IsTraceOn()) if(server.options.IsTraceOn())
{ {
server_log->Log(log_network_trace, "Sending play response with following data, allowed %u, sequence %u, server number %u, message %u", Log.Out(Logs::General, Logs::Netcode, "Sending play response with following data, allowed %u, sequence %u, server number %u, message %u",
per->Allowed, per->Sequence, per->ServerNumber, per->Message); per->Allowed, per->Sequence, per->ServerNumber, per->Message);
server_log->LogPacket(log_network_trace, (const char*)outapp->pBuffer, outapp->size); Log.Out(Logs::General, Logs::Netcode, "[Size: %u] %s", outapp->size, DumpPacketToString(outapp).c_str());
} }
if(server.options.IsDumpOutPacketsOn()) if(server.options.IsDumpOutPacketsOn())
@ -195,7 +197,7 @@ bool WorldServer::Process()
} }
else else
{ {
server_log->Log(log_client_error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid); Log.Out(Logs::General, Logs::Error, "Recieved User-To-World Response for %u but could not find the client referenced!.", utwr->lsaccountid);
} }
break; break;
} }
@ -203,16 +205,16 @@ bool WorldServer::Process()
{ {
if(app->size < sizeof(ServerLSAccountUpdate_Struct)) if(app->size < sizeof(ServerLSAccountUpdate_Struct))
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had opcode ServerLSAccountUpdate_Struct, " Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had opcode ServerLSAccountUpdate_Struct, "
"but was too small. Discarded to avoid buffer overrun."); "but was too small. Discarded to avoid buffer overrun.");
break; break;
} }
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str()); Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate packet received from: %s", short_name.c_str());
ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)app->pBuffer; ServerLSAccountUpdate_Struct *lsau = (ServerLSAccountUpdate_Struct*)app->pBuffer;
if(trusted) if(is_server_trusted)
{ {
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount); Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate update processed for: %s", lsau->useraccount);
string name; string name;
string password; string password;
string email; string email;
@ -225,7 +227,7 @@ bool WorldServer::Process()
} }
default: default:
{ {
server_log->Log(log_network_error, "Recieved application packet from server that had an unknown operation code 0x%.4X.", app->opcode); Log.Out(Logs::General, Logs::Error, "Recieved application packet from server that had an unknown operation code 0x%.4X.", app->opcode);
} }
} }
@ -237,9 +239,9 @@ bool WorldServer::Process()
void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i) void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(logged_in) if(is_server_logged_in)
{ {
server_log->Log(log_network_error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting."); Log.Out(Logs::General, Logs::Error, "WorldServer::Handle_NewLSInfo called but the login server was already marked as logged in, aborting.");
return; return;
} }
@ -249,7 +251,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, account name was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, account name was too long.");
return; return;
} }
@ -259,7 +261,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, account password was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, account password was too long.");
return; return;
} }
@ -269,7 +271,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, long name was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, long name was too long.");
return; return;
} }
@ -279,7 +281,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, short name was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, short name was too long.");
return; return;
} }
@ -287,7 +289,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(strlen(i->local_address) == 0) if(strlen(i->local_address) == 0)
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was null, defaulting to localhost"); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, local address was null, defaulting to localhost");
local_ip = "127.0.0.1"; local_ip = "127.0.0.1";
} }
else else
@ -297,7 +299,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, local address was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, local address was too long.");
return; return;
} }
@ -308,7 +310,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
in_addr in; in_addr in;
in.s_addr = GetConnection()->GetrIP(); in.s_addr = GetConnection()->GetrIP();
remote_ip = inet_ntoa(in); remote_ip = inet_ntoa(in);
server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str()); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, remote address was null, defaulting to stream address %s.", remote_ip.c_str());
} }
else else
{ {
@ -320,7 +322,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
in_addr in; in_addr in;
in.s_addr = GetConnection()->GetrIP(); in.s_addr = GetConnection()->GetrIP();
remote_ip = inet_ntoa(in); remote_ip = inet_ntoa(in);
server_log->Log(log_network_error, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str()); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, remote address was too long, defaulting to stream address %s.", remote_ip.c_str());
} }
if(strlen(i->serverversion) <= 64) if(strlen(i->serverversion) <= 64)
@ -329,7 +331,7 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, server version was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, server version was too long.");
return; return;
} }
@ -339,27 +341,27 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
} }
else else
{ {
server_log->Log(log_network_error, "Handle_NewLSInfo error, protocol version was too long."); Log.Out(Logs::General, Logs::Error, "Handle_NewLSInfo error, protocol version was too long.");
return; return;
} }
server_type = i->servertype; server_type = i->servertype;
logged_in = true; is_server_logged_in = true;
if(server.options.IsRejectingDuplicateServers()) if(server.options.IsRejectingDuplicateServers())
{ {
if(server.SM->ServerExists(long_name, short_name, this)) if(server.server_manager->ServerExists(long_name, short_name, this))
{ {
server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
return; return;
} }
} }
else else
{ {
if(server.SM->ServerExists(long_name, short_name, this)) if(server.server_manager->ServerExists(long_name, short_name, this))
{ {
server_log->Log(log_world_error, "World tried to login but there already exists a server that has that name."); Log.Out(Logs::General, Logs::Error, "World tried to login but there already exists a server that has that name.");
server.SM->DestroyServerByName(long_name, short_name, this); server.server_manager->DestroyServerByName(long_name, short_name, this);
} }
} }
@ -378,112 +380,112 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
{ {
if(s_acct_name.size() == 0 || s_acct_pass.size() == 0) if(s_acct_name.size() == 0 || s_acct_pass.size() == 0)
{ {
server_log->Log(log_world, "Server %s(%s) successfully logged into account that had no user/password requirement.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged into account that had no user/password requirement.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; is_server_authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
server_list_id = s_list_type; server_list_id = s_list_type;
desc = s_desc; desc = s_desc;
} }
else if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) else if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0)
{ {
server_log->Log(log_world, "Server %s(%s) successfully logged in.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged in.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; is_server_authorized = true;
SetRuntimeID(s_id); SetRuntimeID(s_id);
server_list_id = s_list_type; server_list_id = s_list_type;
desc = s_desc; desc = s_desc;
if(s_trusted) if(s_trusted) {
{ Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); is_server_trusted = true;
trusted = true;
ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0);
connection->SendPacket(outapp); connection->SendPacket(outapp);
} }
} }
else else {
{ Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but account and password did not match the entry in the database, and only"
server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database, and only"
" registered servers are allowed.", long_name.c_str(), short_name.c_str()); " registered servers are allowed.", long_name.c_str(), short_name.c_str());
return; return;
} }
} }
else else {
{ Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but database couldn't find an entry and only registered servers are allowed.",
server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry and only registered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
return; return;
} }
} }
else else {
{ Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but only registered servers are allowed.",
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but only registered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
return; return;
} }
} }
else else {
{ unsigned int server_id = 0;
unsigned int s_id = 0; unsigned int server_list_type = 0;
unsigned int s_list_type = 0; unsigned int is_server_trusted = 0;
unsigned int s_trusted = 0; string server_description;
string s_desc; string server_list_description;
string s_list_desc; string server_account_name;
string s_acct_name; string server_account_password;
string s_acct_pass;
if(server.db->GetWorldRegistration(long_name, short_name, s_id, s_desc, s_list_type, s_trusted, s_list_desc, s_acct_name, s_acct_pass))
if(server.db->GetWorldRegistration(
long_name,
short_name,
server_id,
server_description,
server_list_type,
is_server_trusted,
server_list_description,
server_account_name,
server_account_password))
{ {
if(account_name.size() > 0 && account_password.size() > 0)
{ if(account_name.size() > 0 && account_password.size() > 0) {
if(s_acct_name.compare(account_name) == 0 && s_acct_pass.compare(account_password) == 0) if(server_account_name.compare(account_name) == 0 && server_account_password.compare(account_password) == 0) {
{ Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) successfully logged in.",
server_log->Log(log_world, "Server %s(%s) successfully logged in.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; is_server_authorized = true;
SetRuntimeID(s_id); SetRuntimeID(server_id);
server_list_id = s_list_type; server_list_id = server_list_type;
desc = s_desc; desc = server_description;
if(s_trusted)
{ if(is_server_trusted) {
server_log->Log(log_network_trace, "ServerOP_LSAccountUpdate sent to world"); Log.Out(Logs::General, Logs::Netcode, "ServerOP_LSAccountUpdate sent to world");
trusted = true; is_server_trusted = true;
ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0); ServerPacket *outapp = new ServerPacket(ServerOP_LSAccountUpdate, 0);
connection->SendPacket(outapp); connection->SendPacket(outapp);
} }
} }
else else {
{
// this is the first of two cases where we should deny access even if unregistered is allowed // this is the first of two cases where we should deny access even if unregistered is allowed
server_log->Log(log_world, "Server %s(%s) attempted to log in but account and password did not match the entry in the database.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but account and password did not match the entry in the database.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
} }
} }
else else {
{ if(server_account_name.size() > 0 || server_account_password.size() > 0) {
if(s_acct_name.size() > 0 || s_acct_pass.size() > 0)
{
// this is the second of two cases where we should deny access even if unregistered is allowed // this is the second of two cases where we should deny access even if unregistered is allowed
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but this server requires a password.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but this server requires a password.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
} }
else else {
{ Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) did not attempt to log in but unregistered servers are allowed.",
server_log->Log(log_world, "Server %s(%s) did not attempt to log in but unregistered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
authorized = true; is_server_authorized = true;
SetRuntimeID(s_id); SetRuntimeID(server_id);
server_list_id = 3; server_list_id = 3;
} }
} }
} }
else else
{ {
server_log->Log(log_world, "Server %s(%s) attempted to log in but database couldn't find an entry but unregistered servers are allowed.", Log.Out(Logs::General, Logs::World_Server, "Server %s(%s) attempted to log in but database couldn't find an entry but unregistered servers are allowed.",
long_name.c_str(), short_name.c_str()); long_name.c_str(), short_name.c_str());
if(server.db->CreateWorldRegistration(long_name, short_name, s_id)) if(server.db->CreateWorldRegistration(long_name, short_name, server_id)) {
{ is_server_authorized = true;
authorized = true; SetRuntimeID(server_id);
SetRuntimeID(s_id);
server_list_id = 3; server_list_id = 3;
} }
} }
@ -493,9 +495,9 @@ void WorldServer::Handle_NewLSInfo(ServerNewLSInfo_Struct* i)
in.s_addr = connection->GetrIP(); in.s_addr = connection->GetrIP();
server.db->UpdateWorldRegistration(GetRuntimeID(), long_name, string(inet_ntoa(in))); server.db->UpdateWorldRegistration(GetRuntimeID(), long_name, string(inet_ntoa(in)));
if(authorized) if(is_server_authorized)
{ {
server.CM->UpdateServerList(); server.client_manager->UpdateServerList();
} }
} }
@ -503,43 +505,40 @@ void WorldServer::Handle_LSStatus(ServerLSStatus_Struct *s)
{ {
players_online = s->num_players; players_online = s->num_players;
zones_booted = s->num_zones; zones_booted = s->num_zones;
status = s->status; server_status = s->status;
} }
void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id) void WorldServer::SendClientAuth(unsigned int ip, string account, string key, unsigned int account_id)
{ {
ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ServerLSClientAuth)); ServerPacket *outapp = new ServerPacket(ServerOP_LSClientAuth, sizeof(ClientAuth_Struct));
ServerLSClientAuth* slsca = (ServerLSClientAuth*)outapp->pBuffer; ClientAuth_Struct* client_auth = (ClientAuth_Struct*)outapp->pBuffer;
slsca->lsaccount_id = account_id; client_auth->lsaccount_id = account_id;
strncpy(slsca->name, account.c_str(), account.size() > 30 ? 30 : account.size()); strncpy(client_auth->name, account.c_str(), account.size() > 30 ? 30 : account.size());
strncpy(slsca->key, key.c_str(), 10); strncpy(client_auth->key, key.c_str(), 10);
slsca->lsadmin = 0; client_auth->lsadmin = 0;
slsca->worldadmin = 0; client_auth->worldadmin = 0;
slsca->ip = ip; client_auth->ip = ip;
in_addr in; in_addr in;
in.s_addr = ip;connection->GetrIP(); in.s_addr = ip; connection->GetrIP();
string client_address(inet_ntoa(in)); string client_address(inet_ntoa(in));
in.s_addr = connection->GetrIP(); in.s_addr = connection->GetrIP();
string world_address(inet_ntoa(in)); string world_address(inet_ntoa(in));
if(client_address.compare(world_address) == 0) if (client_address.compare(world_address) == 0) {
{ client_auth->local = 1;
slsca->local = 1;
} }
else if(client_address.find(server.options.GetLocalNetwork()) != string::npos) else if (client_address.find(server.options.GetLocalNetwork()) != string::npos) {
{ client_auth->local = 1;
slsca->local = 1;
} }
else else {
{ client_auth->local = 0;
slsca->local = 0;
} }
connection->SendPacket(outapp); connection->SendPacket(outapp);
if(server.options.IsDumpInPacketsOn()) if (server.options.IsDumpInPacketsOn())
{ {
DumpPacket(outapp); DumpPacket(outapp);
} }

View File

@ -86,7 +86,7 @@ public:
/** /**
* Gets whether the server is authorized to show up on the server list or not. * Gets whether the server is authorized to show up on the server list or not.
*/ */
bool IsAuthorized() const { return authorized; } bool IsAuthorized() const { return is_server_authorized; }
/** /**
* Gets the local ip of the server. * Gets the local ip of the server.
@ -106,7 +106,7 @@ public:
/** /**
* Gets the status of the server. * Gets the status of the server.
*/ */
int GetStatus() const { return status; } int GetStatus() const { return server_status; }
/** /**
* Gets the number of zones online on the server. * Gets the number of zones online on the server.
@ -138,7 +138,7 @@ private:
EmuTCPConnection *connection; EmuTCPConnection *connection;
unsigned int zones_booted; unsigned int zones_booted;
unsigned int players_online; unsigned int players_online;
int status; int server_status;
unsigned int runtime_id; unsigned int runtime_id;
unsigned int server_list_id; unsigned int server_list_id;
unsigned int server_type; unsigned int server_type;
@ -151,9 +151,9 @@ private:
std::string local_ip; std::string local_ip;
std::string protocol; std::string protocol;
std::string version; std::string version;
bool authorized; bool is_server_authorized;
bool logged_in; bool is_server_logged_in;
bool trusted; bool is_server_trusted;
}; };
#endif #endif

View File

@ -0,0 +1,135 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '1' AND `CastRestriction` = '0' THEN 'TargetOptional'
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
WHEN `targettype` = '4' AND `CastRestriction` = '0' THEN 'AECaster'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '5' AND `CastRestriction` = '150' THEN 'Animal'
WHEN `targettype` = '6' AND `CastRestriction` = '0' THEN 'Self'
WHEN `targettype` = '8' AND `CastRestriction` = '0' THEN 'AETarget'
WHEN `targettype` = '9' AND `CastRestriction` = '0' THEN 'Animal'
WHEN `targettype` = '10' AND `CastRestriction` = '0' THEN 'Undead'
WHEN `targettype` = '11' AND `CastRestriction` = '0' THEN 'Summoned'
WHEN `targettype` = '13' AND `CastRestriction` = '0' THEN 'Tap'
WHEN `targettype` = '14' AND `CastRestriction` = '0' THEN 'Pet'
WHEN `targettype` = '15' AND `CastRestriction` = '0' THEN 'Corpse'
WHEN `targettype` = '16' AND `CastRestriction` = '0' THEN 'Plant'
WHEN `targettype` = '17' AND `CastRestriction` = '0' THEN 'Giant'
WHEN `targettype` = '18' AND `CastRestriction` = '0' THEN 'Dragon'
WHEN `targettype` = '34' AND `CastRestriction` = '0' THEN 'LDoNChest_Cursed'
WHEN `targettype` = '38' AND `CastRestriction` = '0' THEN 'SummonedPet'
WHEN `targettype` = '39' AND `CastRestriction` = '0' THEN 'GroupNoPets' -- V1 or V2?
WHEN `targettype` = '40' AND `CastRestriction` = '0' THEN 'AEBard'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
WHEN `targettype` = '42' AND `CastRestriction` = '0' THEN 'Directional'
WHEN `targettype` = '43' AND `CastRestriction` = '0' THEN 'GroupClientAndPet'
WHEN `targettype` = '44' AND `CastRestriction` = '0' THEN 'Beam'
WHEN `targettype` = '45' AND `CastRestriction` = '0' THEN 'Ring'
WHEN `targettype` = '46' AND `CastRestriction` = '0' THEN 'TargetsTarget'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name
-- base <end>
FROM (
SELECT 'WARRIOR' caster_class, `classes1` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes1` NOT IN ('254', '255')
UNION ALL
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
UNION ALL
SELECT 'RANGER' caster_class, `classes4` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
UNION ALL
SELECT 'SHADOWKNIGHT' caster_class, `classes5` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes5` NOT IN ('254', '255')
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
UNION ALL
SELECT 'MONK' caster_class, `classes7` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes7` NOT IN ('254', '255')
UNION ALL
SELECT 'BARD' caster_class, `classes8` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes8` NOT IN ('254', '255')
UNION ALL
SELECT 'ROGUE' caster_class, `classes9` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes9` NOT IN ('254', '255')
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
UNION ALL
SELECT 'BERSERKER' caster_class, `classes16` spell_level,
`spells_new`.*
FROM `spells_new`
WHERE `classes16` NOT IN ('254', '255')
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Animal', 'Undead', 'Summoned', 'Pet', 'Plant', 'TargetsTarget', 'Single', 'Self', 'GroupV1', 'GroupV2', 'GroupNoPets', 'AECaster', 'AETarget', 'Corpse'),
zone_type,
FIELD(caster_class, 'WARRIOR', 'CLERIC', 'PALADIN', 'RANGER', 'SHADOWKNIGHT', 'DRUID', 'MONK', 'BARD', 'ROGUE', 'SHAMAN', 'NECROMANCER', 'WIZARD', 'MAGICIAN', 'ENCHANTER', 'BEASTLORD', 'BERSERKER'),
spell_level,
spell_id,
spell_name

View File

@ -0,0 +1,78 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` = '14'
AND '25' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY mana_cost DESC,
FIELD(target_type, 'Single'),
spell_level,
FIELD(caster_class, 'CLERIC', 'DRUID', 'SHAMAN', 'NECROMANCER', 'WIZARD', 'MAGICIAN', 'ENCHANTER')

View File

@ -0,0 +1,73 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '9' AND `CastRestriction` = '0' THEN 'Animal'
WHEN `targettype` = '10' AND `CastRestriction` = '0' THEN 'Undead'
WHEN `targettype` = '11' AND `CastRestriction` = '0' THEN 'Summoned'
WHEN `targettype` = '16' AND `CastRestriction` = '0' THEN 'Plant'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
`ResistDiff` resist_diff,
`max1` max_target_level
-- extra <end>
FROM (
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '22' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '22' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '22' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '22' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '22' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY resist_diff,
FIELD(target_type, 'Animal', 'Undead', 'Summoned', 'Plant', 'Single'),
max_target_level DESC,
spell_level,
FIELD(caster_class, 'DRUID', 'SHAMAN', 'NECROMANCER', 'MAGICIAN', 'ENCHANTER')

View File

@ -0,0 +1,193 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
(
(IF(('20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '1', '0')) |
(IF(('35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '2', '0')) |
(IF(('36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '4', '0')) |
(IF(('116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '8', '0')) |
(IF(('369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '16', '0'))
) cure_mask
-- extra <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'SHADOWKNIGHT' caster_class, `classes5` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes5` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'BARD' caster_class, `classes8` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes8` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` = '1'
-- 6-self, 10-undead, 14-pet, 45-ring
AND `targettype` NOT IN ('6', '10', '14', '45')
AND (
-- 20-blindness, 35-disease, 36-poison, 116-curse, 369-corruption
'20' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '35' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '36' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '116' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '369' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV1', 'GroupV2'),
spell_level DESC,
cure_mask DESC,
FIELD(caster_class, 'CLERIC', 'PALADIN', 'RANGER', 'SHADOWKNIGHT', 'DRUID', 'BARD', 'SHAMAN', 'NECROMANCER', 'BEASTLORD')

View File

@ -0,0 +1,61 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
CONCAT('"', `teleport_zone`, '"') short_name,
CONCAT('"', IFNULL((SELECT `long_name` FROM `zone` WHERE `short_name` = `teleport_zone` LIMIT 1), 'Unreachable Destination'), '"') long_name
-- extra <end>
FROM (
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `teleport_zone`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '40'
AND (
'83' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '86' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR (
'88' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
AND `teleport_zone` NOT LIKE 'same'
)
)
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `teleport_zone`
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
AND `SpellAffectIndex` = '40'
AND (
'83' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '86' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR (
'88' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
AND `teleport_zone` NOT LIKE 'same'
)
)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'GroupV1'),
FIELD(caster_class, 'DRUID', 'WIZARD'),
spell_level,
spell_name

View File

@ -0,0 +1,45 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '40'
AND '88' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
AND `teleport_zone` LIKE 'same'
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
AND `SpellAffectIndex` = '40'
AND '88' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
AND `teleport_zone` LIKE 'same'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'GroupV2'),
FIELD(caster_class, 'DRUID', 'WIZARD'),
spell_level,
spell_name

View File

@ -0,0 +1,39 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '10'
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '89' -- implementation restricted to `effectid1`
AND `effect_base_value1` > 100 -- implementation restricted to `effect_base_value1`
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single'),
FIELD(caster_class, 'SHAMAN'),
spell_level,
spell_name

View File

@ -0,0 +1,151 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
CASE
WHEN `effectid1` = '12' THEN 'Living'
WHEN `effectid1` = '13' THEN 'See'
WHEN `effectid1` = '28' THEN 'Undead'
WHEN `effectid1` = '29' THEN 'Animal'
ELSE `effectid1` -- 'UNDEFINED'
END invis_type
-- extra <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'SHADOWKNIGHT' caster_class, `classes5` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes5` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effectid1`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('5', '9')
-- 6-self
AND `targettype` NOT IN ('6')
-- 12-living, 13-see, 28-undead, 29-animal
AND `effectid1` IN ('12', '13', '28', '29') -- implementation restricted to `effectid1`
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(invis_type, 'Animal', 'Undead', 'Living', 'See'),
FIELD(target_type, 'Single', 'GroupV2'),
zone_type,
spell_level DESC,
spell_name,
FIELD(caster_class, 'CLERIC', 'PALADIN', 'RANGER', 'SHADOWKNIGHT', 'DRUID', 'SHAMAN', 'NECROMANCER', 'WIZARD', 'MAGICIAN', 'ENCHANTER', 'BEASTLORD')

View File

@ -0,0 +1,94 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'WIZARD' caster_class, `classes12` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes12` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '28')
-- 6-self, 43-groupclientandpet
AND `targettype` NOT IN ('6', '43')
AND '57' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV2'),
zone_type,
spell_level DESC,
spell_name,
FIELD(caster_class, 'RANGER', 'DRUID', 'SHAMAN', 'NECROMANCER', 'WIZARD', 'ENCHANTER', 'BEASTLORD')

View File

@ -0,0 +1,86 @@
-- needs criteria refinement
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '8' AND `CastRestriction` = '0' THEN 'AETarget'
WHEN `targettype` = '9' AND `CastRestriction` = '0' THEN 'Animal'
WHEN `targettype` = '10' AND `CastRestriction` = '0' THEN 'Undead'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'SHADOWKNIGHT' caster_class, `classes5` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes5` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` = '12'
AND '18' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Animal', 'Undead', 'Single', 'AETarget'),
target_type,
zone_type,
FIELD(caster_class, 'CLERIC', 'PALADIN', 'RANGER', 'SHADOWKNIGHT', 'DRUID', 'NECROMANCER', 'ENCHANTER'),
spell_level,
spell_id,
spell_name

View File

@ -0,0 +1,76 @@
-- needs criteria refinement
SELECT
-- base <begin>
CASE
WHEN `targettype` = '4' AND `CastRestriction` = '0' THEN 'AECaster'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '8' AND `CastRestriction` = '0' THEN 'AETarget'
WHEN `targettype` = '10' AND `CastRestriction` = '0' THEN 'Undead'
WHEN `targettype` = '11' AND `CastRestriction` = '0' THEN 'Summoned'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
`ResistDiff` resist_diff,
`max1` max_target_level
-- extra <end>
FROM (
SELECT 'BARD' caster_class, `classes8` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes8` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('12', '13', '25', '27', '41', '43')
-- 45-ring
AND `targettype` NOT IN ('45')
AND `effectid1` = '31'
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('12', '13', '25', '27', '41', '43')
-- 45-ring
AND `targettype` NOT IN ('45')
AND `effectid1` = '31'
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('12', '13', '25', '27', '41', '43')
-- 45-ring
AND `targettype` NOT IN ('45')
AND `effectid1` = '31'
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `ResistDiff`, `max1`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('12', '13', '25', '27', '41', '43')
-- 45-ring
AND `targettype` NOT IN ('45')
AND `effectid1` = '31'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY resist_diff,
FIELD(target_type, 'Undead', 'Summoned', 'Single', 'AECaster', 'AETarget'),
max_target_level DESC,
spell_level DESC,
FIELD(caster_class, 'BARD', 'NECROMANCER', 'MAGICIAN', 'ENCHANTER')

View File

@ -0,0 +1,74 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
`effect_base_value2` base_speed
-- extra <end>
FROM (
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value2`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('7', '10')
-- 6-self
AND `targettype` NOT IN ('6')
AND `CastRestriction` = '0'
AND `effectdescnum` = '65'
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value2`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('7', '10')
-- 6-self
AND `targettype` NOT IN ('6')
AND `CastRestriction` = '0'
AND `effectdescnum` = '65'
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value2`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('7', '10')
-- 6-self
AND `targettype` NOT IN ('6')
AND `CastRestriction` = '0'
AND `effectdescnum` = '65'
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value2`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('7', '10')
-- 6-self
AND `targettype` NOT IN ('6')
AND `CastRestriction` = '0'
AND `effectdescnum` = '65'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV1', 'GroupV2'),
effect_base_value2 DESC,
spell_level,
FIELD(caster_class, 'RANGER', 'DRUID', 'SHAMAN', 'BEASTLORD')

View File

@ -0,0 +1,221 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
(
(IF(('46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '1', '0')) |
(IF(('47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '2', '0')) |
(IF(('48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '4', '0')) |
(IF(('49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '8', '0')) |
(IF(('50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '16', '0')) |
(IF(('370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)), '32', '0'))
) resist_type
-- extra <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'SHADOWKNIGHT' caster_class, `classes5` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes5` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'MAGICIAN' caster_class, `classes13` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes13` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`,
`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
-- 6-self, 14-pet, 39-groupnopets, 46-targetstarget
AND `targettype` NOT IN ('6', '14', '39', '46')
AND (
'46' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '47' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '48' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '49' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '50' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
OR '370' IN (`effectid1`, `effectid2`, `effectid3`, `effectid4`, `effectid5`, `effectid6`, `effectid7`, `effectid8`, `effectid9`, `effectid10`, `effectid11`, `effectid12`)
)
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV1', 'GroupV2'),
spell_level DESC,
resist_type DESC,
FIELD(caster_class, 'CLERIC', 'PALADIN', 'RANGER', 'SHADOWKNIGHT', 'DRUID', 'SHAMAN', 'NECROMANCER', 'MAGICIAN', 'ENCHANTER', 'BEASTLORD')

View File

@ -0,0 +1,71 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '4' AND `CastRestriction` = '0' THEN 'AECaster'
WHEN `targettype` = '15' AND `CastRestriction` = '0' THEN 'Corpse'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
`effect_base_value1` percent
-- extra <end>
FROM (
SELECT 'CLERIC' caster_class, `classes2` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value1`
FROM `spells_new`
WHERE `classes2` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('1', '13')
AND `effectid1` = '81'
UNION ALL
SELECT 'PALADIN' caster_class, `classes3` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value1`
FROM `spells_new`
WHERE `classes3` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('1', '13')
AND `effectid1` = '81'
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value1`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('1', '13')
AND `effectid1` = '81'
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value1`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('1', '13')
AND `effectid1` = '81'
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `effect_base_value1`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('1', '13')
AND `effectid1` = '81'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY percent DESC,
FIELD(target_type, 'Corpse', 'AETarget'),
zone_type,
FIELD(caster_class, 'CLERIC', 'PALADIN', 'DRUID', 'SHAMAN', 'NECROMANCER'),
spell_level,
spell_id,
spell_name

View File

@ -0,0 +1,40 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '3' AND `CastRestriction` = '0' THEN 'GroupV1'
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost,
-- base <end>
-- extra <begin>
`max1` max_absorbtion
-- extra <end>
FROM (
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`, `max1`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` = '2'
AND `effectid1` = '55'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV1', 'GroupV2'),
spell_level DESC,
max1 DESC

View File

@ -0,0 +1,49 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` = '10'
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '89' -- implementation restricted to `effectid1`
AND `effect_base_value1` < 100 -- implementation restricted to `effect_base_value1`
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` = '10'
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '89' -- implementation restricted to `effectid1`
AND `effect_base_value1` < 100 -- implementation restricted to `effect_base_value1`
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single'),
FIELD(caster_class, 'SHAMAN', 'BEASTLORD'),
spell_level,
spell_name

View File

@ -0,0 +1,84 @@
SELECT
-- base <begin>
CASE
WHEN `targettype` = '5' AND `CastRestriction` = '0' THEN 'Single'
WHEN `targettype` = '41' AND `CastRestriction` = '0' THEN 'GroupV2'
ELSE CONCAT(`targettype`, ', ', `CastRestriction`) -- 'UNDEFINED'
END target_type,
CASE
WHEN `zonetype` NOT IN ('-1', '0') THEN `zonetype`
ELSE '0'
END zone_type,
caster_class,
spell_level,
`id` spell_id,
CONCAT('"', `name`, '"') spell_name,
`mana` mana_cost
-- base <end>
FROM (
SELECT 'RANGER' caster_class, `classes4` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes4` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
UNION ALL
SELECT 'DRUID' caster_class, `classes6` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes6` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
UNION ALL
SELECT 'SHAMAN' caster_class, `classes10` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes10` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
UNION ALL
SELECT 'NECROMANCER' caster_class, `classes11` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes11` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
UNION ALL
SELECT 'ENCHANTER' caster_class, `classes14` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes14` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
UNION ALL
SELECT 'BEASTLORD' caster_class, `classes15` spell_level,
`targettype`, `CastRestriction`, `zonetype`, `id`, `name`, `mana`
FROM `spells_new`
WHERE `classes15` NOT IN ('254', '255')
AND `SpellAffectIndex` IN ('2', '14')
-- 6-self
AND `targettype` NOT IN ('6')
AND `effectid1` = '14'
) spells
-- WHERE `name` NOT LIKE '%II'
-- ---
-- WHERE `name` NOT LIKE '%Rk. II%'
-- AND `name` NOT LIKE '%Rk.II%'
-- AND `name` NOT LIKE '%Rk. III%'
-- AND `name` NOT LIKE '%Rk.III%'
ORDER BY FIELD(target_type, 'Single', 'GroupV2'),
spell_level,
spell_name,
FIELD(caster_class, 'RANGER', 'DRUID', 'SHAMAN', 'NECROMANCER', 'ENCHANTER', 'BEASTLORD')

View File

@ -23,7 +23,7 @@ if($Config{osname}=~/linux/i){ $OS = "Linux"; }
if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; } if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; }
#::: If current version is less than what world is reporting, then download a new one... #::: If current version is less than what world is reporting, then download a new one...
$current_version = 11; $current_version = 13;
if($ARGV[0] eq "V"){ if($ARGV[0] eq "V"){
if($ARGV[1] > $current_version){ if($ARGV[1] > $current_version){
@ -111,18 +111,33 @@ if($ARGV[0] eq "installer"){
print "Running EQEmu Server installer routines...\n"; print "Running EQEmu Server installer routines...\n";
mkdir('logs'); mkdir('logs');
mkdir('updates_staged'); mkdir('updates_staged');
mkdir('shared');
fetch_latest_windows_binaries(); fetch_latest_windows_binaries();
map_files_fetch_bulk(); map_files_fetch_bulk();
opcodes_fetch(); opcodes_fetch();
plugins_fetch(); plugins_fetch();
quest_files_fetch(); quest_files_fetch();
lua_modules_fetch(); lua_modules_fetch();
#::: Binary dll's
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/lua51.dll", "lua51.dll", 1); get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/lua51.dll", "lua51.dll", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/zlib1.dll", "zlib1.dll", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/libmysql.dll", "libmysql.dll", 1);
#::: Server scripts
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/t_database_backup.bat", "t_database_backup.bat", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/t_server_crash_report.pl", "t_server_crash_report.pl", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/t_start_server.bat", "t_start_server.bat", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/t_start_server_with_login_server.bat", "t_start_server_with_login_server.bat", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/t_stop_server.bat", "t_stop_server.bat", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/win_server_launcher.pl", "win_server_launcher.pl", 1);
#::: Database Routines #::: Database Routines
print "MariaDB :: Creating Database 'peq'\n"; print "MariaDB :: Creating Database 'peq'\n";
print `"$path" --host $host --user $user --password="$pass" -N -B -e "DROP DATABASE peq;CREATE DATABASE peq"`; print `"$path" --host $host --user $user --password="$pass" -N -B -e "DROP DATABASE IF EXISTS peq;"`;
if($OS eq "Windows"){ @db_version = split(': ', `world db_version`); } print `"$path" --host $host --user $user --password="$pass" -N -B -e "CREATE DATABASE peq"`;
if($OS eq "Windows"){ @db_version = split(': ', `world db_version`); }
if($OS eq "Linux"){ @db_version = split(': ', `./world db_version`); } if($OS eq "Linux"){ @db_version = split(': ', `./world db_version`); }
$bin_db_ver = trim($db_version[1]); $bin_db_ver = trim($db_version[1]);
check_db_version_table(); check_db_version_table();
@ -132,6 +147,18 @@ if($ARGV[0] eq "installer"){
main_db_management(); main_db_management();
print "\nApplying Latest Database Updates...\n"; print "\nApplying Latest Database Updates...\n";
main_db_management(); main_db_management();
print get_mysql_result("UPDATE `launcher` SET `dynamics` = 30 WHERE `name` = 'zone'");
if($OS eq "Windows"){
check_windows_firewall_rules();
}
exit;
}
if($ARGV[0] eq "db_dump_compress"){ database_dump_compress(); exit; }
if($ARGV[0] eq "login_server_setup"){
do_windows_login_server_setup();
exit; exit;
} }
@ -221,6 +248,10 @@ sub show_menu_prompt {
8 => \&quest_files_fetch, 8 => \&quest_files_fetch,
9 => \&lua_modules_fetch, 9 => \&lua_modules_fetch,
10 => \&aa_fetch, 10 => \&aa_fetch,
11 => \&fetch_latest_windows_binaries,
12 => \&fetch_server_dlls,
13 => \&do_windows_login_server_setup,
19 => \&do_bots_db_schema_drop,
20 => \&do_update_self, 20 => \&do_update_self,
0 => \&script_exit, 0 => \&script_exit,
); );
@ -294,6 +325,10 @@ return <<EO_MENU;
8) [Quests (Perl/LUA)] :: Download latest PEQ quests and stage updates 8) [Quests (Perl/LUA)] :: Download latest PEQ quests and stage updates
9) [LUA Modules] :: Download latest LUA Modules (Required for Lua) 9) [LUA Modules] :: Download latest LUA Modules (Required for Lua)
10) [DB Data : Alternate Advancement] :: Download Latest AA's from PEQ (This overwrites existing data) 10) [DB Data : Alternate Advancement] :: Download Latest AA's from PEQ (This overwrites existing data)
11) [Windows Server Build] :: Download Latest and Stable Server Build (Overwrites existing .exe's, includes .dll's)
12) [Windows Server .dll's] :: Download Pre-Requisite Server .dll's
13) [Windows Server Loginserver Setup] :: Download and install Windows Loginserver
19) [EQEmu DB Drop Bots Schema] :: Remove Bots schema and return database to normal state
20) [Update the updater] Force update this script (Redownload) 20) [Update the updater] Force update this script (Redownload)
0) Exit 0) Exit
@ -533,6 +568,138 @@ sub fetch_latest_windows_binaries{
rmtree('updates_staged'); rmtree('updates_staged');
} }
sub do_windows_login_server_setup{
print "\n --- Fetching Loginserver... --- \n";
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/login_server.zip", "updates_staged/login_server.zip", 1);
print "\n --- Extracting... --- \n";
unzip('updates_staged/login_server.zip', 'updates_staged/login_server/');
my @files;
my $start_dir = "updates_staged/login_server";
find(
sub { push @files, $File::Find::name unless -d; },
$start_dir
);
for my $file (@files) {
$dest_file = $file;
$dest_file =~s/updates_staged\/login_server\///g;
print "Installing :: " . $dest_file . "\n";
copy_file($file, $dest_file);
}
print "\n Done... \n";
print "Pulling down Loginserver database tables...\n";
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/login_server_tables.sql", "db_update/login_server_tables.sql");
print "\n\nInstalling Loginserver tables...\n";
print get_mysql_result_from_file("db_update/login_server_tables.sql");
print "\nDone...\n\n";
add_login_server_firewall_rules();
rmtree('updates_staged');
rmtree('db_update');
print "\nPress any key to continue...\n";
<>; #Read from STDIN
}
sub add_login_server_firewall_rules{
#::: Check Loginserver Firewall install for Windows
if($OS eq "Windows"){
$output = `netsh advfirewall firewall show rule name=all`;
@output_buffer = split("\n", $output);
$has_loginserver_rules_titanium = 0;
$has_loginserver_rules_sod = 0;
foreach my $val (@output_buffer){
if($val=~/Rule Name/i){
$val=~s/Rule Name://g;
if($val=~/EQEmu Loginserver/i && $val=~/Titanium/i){
$has_loginserver_rules_titanium = 1;
print "Found existing rule :: " . trim($val) . "\n";
}
if($val=~/EQEmu Loginserver/i && $val=~/SOD/i){
$has_loginserver_rules_sod = 1;
print "Found existing rule :: " . trim($val) . "\n";
}
}
}
if($has_loginserver_rules_titanium == 0){
print "Attempting to add EQEmu Loginserver Firewall Rules (Titanium) (TCP) port 5998 \n";
print `netsh advfirewall firewall add rule name="EQEmu Loginserver (Titanium) (5998) TCP" dir=in action=allow protocol=TCP localport=5998`;
print "Attempting to add EQEmu Loginserver Firewall Rules (Titanium) (UDP) port 5998 \n";
print `netsh advfirewall firewall add rule name="EQEmu Loginserver (Titanium) (5998) UDP" dir=in action=allow protocol=UDP localport=5998`;
}
if($has_loginserver_rules_sod == 0){
print "Attempting to add EQEmu Loginserver Firewall Rules (SOD+) (TCP) port 5999 \n";
print `netsh advfirewall firewall add rule name="EQEmu Loginserver (SOD+) (5999) TCP" dir=in action=allow protocol=TCP localport=5999`;
print "Attempting to add EQEmu Loginserver Firewall Rules (SOD+) (UDP) port 5999 \n";
print `netsh advfirewall firewall add rule name="EQEmu Loginserver (SOD+) (5999) UDP" dir=in action=allow protocol=UDP localport=5999`;
}
print "If firewall rules don't add you must run this script (eqemu_update.pl) as administrator\n";
print "\n";
print "#::: Instructions \n";
print "In order to connect your server to the loginserver you must point your eqemu_config.xml to your local server similar to the following:\n";
print "
<loginserver1>
<host>login.eqemulator.net</host>
<port>5998</port>
<account></account>
<password></password>
</loginserver1>
<loginserver2>
<host>127.0.0.1</host>
<port>5998</port>
<account></account>
<password></password>
</loginserver2>
";
print "\nWhen done, make sure your EverQuest client points to your loginserver's IP (In this case it would be 127.0.0.1) in the eqhosts.txt file\n";
}
}
sub check_windows_firewall_rules{
$output = `netsh advfirewall firewall show rule name=all`;
@output_buffer = split("\n", $output);
$has_world_rules = 0;
$has_zone_rules = 0;
foreach my $val (@output_buffer){
if($val=~/Rule Name/i){
$val=~s/Rule Name://g;
if($val=~/EQEmu World/i){
$has_world_rules = 1;
print "Found existing rule :: " . trim($val) . "\n";
}
if($val=~/EQEmu Zone/i){
$has_zone_rules = 1;
print "Found existing rule :: " . trim($val) . "\n";
}
}
}
if($has_world_rules == 0){
print "Attempting to add EQEmu World Firewall Rules (TCP) port 9000 \n";
print `netsh advfirewall firewall add rule name="EQEmu World (9000) TCP" dir=in action=allow protocol=TCP localport=9000`;
print "Attempting to add EQEmu World Firewall Rules (UDP) port 9000 \n";
print `netsh advfirewall firewall add rule name="EQEmu World (9000) UDP" dir=in action=allow protocol=UDP localport=9000`;
}
if($has_zone_rules == 0){
print "Attempting to add EQEmu Zones (7000-7500) TCP \n";
print `netsh advfirewall firewall add rule name="EQEmu Zones (7000-7500) TCP" dir=in action=allow protocol=TCP localport=7000-7500`;
print "Attempting to add EQEmu Zones (7000-7500) UDP \n";
print `netsh advfirewall firewall add rule name="EQEmu Zones (7000-7500) UDP" dir=in action=allow protocol=UDP localport=7000-7500`;
}
}
sub fetch_server_dlls{
print "Fetching lua51.dll, zlib1.dll, libmysql.dll...\n";
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/lua51.dll", "lua51.dll", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/zlib1.dll", "zlib1.dll", 1);
get_remote_file("https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/libmysql.dll", "libmysql.dll", 1);
}
sub fetch_peq_db_full{ sub fetch_peq_db_full{
print "Downloading latest PEQ Database... Please wait...\n"; print "Downloading latest PEQ Database... Please wait...\n";
get_remote_file("http://edit.peqtgc.com/weekly/peq_beta.zip", "updates_staged/peq_beta.zip", 1); get_remote_file("http://edit.peqtgc.com/weekly/peq_beta.zip", "updates_staged/peq_beta.zip", 1);
@ -830,6 +997,216 @@ sub are_file_sizes_different{
return; return;
} }
sub do_bots_db_schema_drop{
#"drop_bots.sql" is run before reverting database back to 'normal'
print "Fetching drop_bots.sql...\n";
get_remote_file("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/git/bots/drop_bots.sql", "db_update/drop_bots.sql");
print get_mysql_result_from_file("db_update/drop_bots.sql");
print "Restoring normality...\n";
print get_mysql_result("DELETE FROM `rule_values` WHERE `rule_name` LIKE 'Bots:%';");
if(get_mysql_result("SHOW TABLES LIKE 'commands'") ne "" && $db){
print get_mysql_result("DELETE FROM `commands` WHERE `command` LIKE 'bot';");
}
if(get_mysql_result("SHOW TABLES LIKE 'command_settings'") ne "" && $db){
print get_mysql_result("DELETE FROM `command_settings` WHERE `command` LIKE 'bot';");
}
if(get_mysql_result("SHOW KEYS FROM `group_id` WHERE `Key_name` LIKE 'PRIMARY'") ne "" && $db){
print get_mysql_result("ALTER TABLE `group_id` DROP PRIMARY KEY;");
}
print get_mysql_result("ALTER TABLE `group_id` ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`);");
if(get_mysql_result("SHOW KEYS FROM `guild_members` WHERE `Key_name` LIKE 'PRIMARY'") ne "" && $db){
print get_mysql_result("ALTER TABLE `guild_members` DROP PRIMARY KEY;");
}
print get_mysql_result("ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`);");
print get_mysql_result("UPDATE `spawn2` SET `enabled` = 0 WHERE `id` IN (59297,59298);");
if(get_mysql_result("SHOW COLUMNS FROM `db_version` LIKE 'bots_version'") ne "" && $db){
print get_mysql_result("UPDATE `db_version` SET `bots_version` = 0;");
}
}
sub modify_db_for_bots{
#Called after the db bots schema (2015_09_30_bots.sql) has been loaded
print "Modifying database for bots...\n";
print get_mysql_result("UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);");
if(get_mysql_result("SHOW KEYS FROM `guild_members` WHERE `Key_name` LIKE 'PRIMARY'") ne "" && $db){
print get_mysql_result("ALTER TABLE `guild_members` DROP PRIMARY KEY;");
}
if(get_mysql_result("SHOW KEYS FROM `group_id` WHERE `Key_name` LIKE 'PRIMARY'") ne "" && $db){
print get_mysql_result("ALTER TABLE `group_id` DROP PRIMARY KEY;");
}
print get_mysql_result("ALTER TABLE `group_id` ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);");
if(get_mysql_result("SHOW TABLES LIKE 'command_settings'") ne "" && get_mysql_result("SELECT `command` FROM `command_settings` WHERE `command` LIKE 'bot'") eq "" && $db){
print get_mysql_result("INSERT INTO `command_settings` VALUES ('bot', '0', '');");
}
if(get_mysql_result("SHOW TABLES LIKE 'commands'") ne "" && get_mysql_result("SELECT `command` FROM `commands` WHERE `command` LIKE 'bot'") eq "" && $db){
print get_mysql_result("INSERT INTO `commands` VALUES ('bot', '0');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotAAExpansion'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:AAExpansion' WHERE `rule_name` LIKE 'Bots:BotAAExpansion';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:AAExpansion'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:AAExpansion', '8', 'The expansion through which bots will obtain AAs');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:CreateBotCount'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:CreationLimit' WHERE `rule_name` LIKE 'Bots:CreateBotCount';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:CreationLimit'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:CreationLimit', '150', 'Number of bots that each account can create');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotFinishBuffing'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:FinishBuffing' WHERE `rule_name` LIKE 'Bots:BotFinishBuffing';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:FinishBuffing'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:FinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotGroupBuffing'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:GroupBuffing' WHERE `rule_name` LIKE 'Bots:BotGroupBuffing';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:GroupBuffing'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:GroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotManaRegen'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:ManaRegen' WHERE `rule_name` LIKE 'Bots:BotManaRegen';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:ManaRegen'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:ManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotQuest'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:QuestableSpawnLimit' WHERE `rule_name` LIKE 'Bots:BotQuest';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:QuestableSpawnLimit'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:QuestableSpawnLimit', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotSpellQuest'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:QuestableSpells' WHERE `rule_name` LIKE 'Bots:BotSpellQuest';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:QuestableSpells'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:QuestableSpells', 'false', 'Anita Thrall\\\'s (Anita_Thrall.pl) Bot Spell Scriber quests.');");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:SpawnBotCount'") ne "" && $db){
print get_mysql_result("UPDATE `rule_values` SET `rule_name` = 'Bots:SpawnLimit' WHERE `rule_name` LIKE 'Bots:SpawnBotCount';");
}
if(get_mysql_result("SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Bots:SpawnLimit'") eq "" && $db){
print get_mysql_result("INSERT INTO `rule_values` VALUES ('1', 'Bots:SpawnLimit', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');");
}
convert_existing_bot_data();
}
sub convert_existing_bot_data{
if(get_mysql_result("SHOW TABLES LIKE 'bots'") ne "" && $db){
print "Converting existing bot data...\n";
print get_mysql_result("INSERT INTO `bot_data` (`bot_id`, `owner_id`, `spells_id`, `name`, `last_name`, `zone_id`, `gender`, `race`, `class`, `level`, `creation_day`, `last_spawn`, `time_spawned`, `size`, `face`, `hair_color`, `hair_style`, `beard`, `beard_color`, `eye_color_1`, `eye_color_2`, `drakkin_heritage`, `drakkin_tattoo`, `drakkin_details`, `ac`, `atk`, `hp`, `mana`, `str`, `sta`, `cha`, `dex`, `int`, `agi`, `wis`, `fire`, `cold`, `magic`, `poison`, `disease`, `corruption`) SELECT `BotID`, `BotOwnerCharacterID`, `BotSpellsID`, `Name`, `LastName`, `LastZoneId`, `Gender`, `Race`, `Class`, `BotLevel`, UNIX_TIMESTAMP(`BotCreateDate`), UNIX_TIMESTAMP(`LastSpawnDate`), `TotalPlayTime`, `Size`, `Face`, `LuclinHairColor`, `LuclinHairStyle`, `LuclinBeard`, `LuclinBeardColor`, `LuclinEyeColor`, `LuclinEyeColor2`, `DrakkinHeritage`, `DrakkinTattoo`, `DrakkinDetails`, `AC`, `ATK`, `HP`, `Mana`, `STR`, `STA`, `CHA`, `DEX`, `_INT`, `AGI`, `WIS`, `FR`, `CR`, `MR`, `PR`, `DR`, `Corrup` FROM `bots`;");
print get_mysql_result("INSERT INTO `bot_inspect_messages` (`bot_id`, `inspect_message`) SELECT `BotID`, `BotInspectMessage` FROM `bots`;");
print get_mysql_result("RENAME TABLE `bots` TO `bots_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botstances'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_stances` (`bot_id`, `stance_id`) SELECT bs.`BotID`, bs.`StanceID` FROM `botstances` bs INNER JOIN `bot_data` bd ON bs.`BotID` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `botstances` TO `botstances_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'bottimers'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_timers` (`bot_id`, `timer_id`, `timer_value`) SELECT bt.`BotID`, bt.`TimerID`, bt.`Value` FROM `bottimers` bt INNER JOIN `bot_data` bd ON bt.`BotID` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `bottimers` TO `bottimers_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botbuffs'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_buffs` (`buffs_index`, `bot_id`, `spell_id`, `caster_level`, `duration_formula`, `tics_remaining`, `poison_counters`, `disease_counters`, `curse_counters`, `corruption_counters`, `numhits`, `melee_rune`, `magic_rune`, `persistent`) SELECT bb.`BotBuffId`, bb.`BotId`, bb.`SpellId`, bb.`CasterLevel`, bb.`DurationFormula`, bb.`TicsRemaining`, bb.`PoisonCounters`, bb.`DiseaseCounters`, bb.`CurseCounters`, bb.`CorruptionCounters`, bb.`HitCount`, bb.`MeleeRune`, bb.`MagicRune`, bb.`Persistent` FROM `botbuffs` bb INNER JOIN `bot_data` bd ON bb.`BotId` = bd.`bot_id`;");
if(get_mysql_result("SHOW COLUMNS FROM `botbuffs` LIKE 'dot_rune'") ne "" && $db){
print get_mysql_result("UPDATE `bot_buffs` bb INNER JOIN `botbuffs` bbo ON bb.`buffs_index` = bbo.`BotBuffId` SET bb.`dot_rune` = bbo.`dot_rune` WHERE bb.`bot_id` = bbo.`BotID`;");
}
if(get_mysql_result("SHOW COLUMNS FROM `botbuffs` LIKE 'caston_x'") ne "" && $db){
print get_mysql_result("UPDATE `bot_buffs` bb INNER JOIN `botbuffs` bbo ON bb.`buffs_index` = bbo.`BotBuffId` SET bb.`caston_x` = bbo.`caston_x` WHERE bb.`bot_id` = bbo.`BotID`;");
}
if(get_mysql_result("SHOW COLUMNS FROM `botbuffs` LIKE 'caston_y'") ne "" && $db){
print get_mysql_result("UPDATE `bot_buffs` bb INNER JOIN `botbuffs` bbo ON bb.`buffs_index` = bbo.`BotBuffId` SET bb.`caston_y` = bbo.`caston_y` WHERE bb.`bot_id` = bbo.`BotID`;");
}
if(get_mysql_result("SHOW COLUMNS FROM `botbuffs` LIKE 'caston_z'") ne "" && $db){
print get_mysql_result("UPDATE `bot_buffs` bb INNER JOIN `botbuffs` bbo ON bb.`buffs_index` = bbo.`BotBuffId` SET bb.`caston_z` = bbo.`caston_z` WHERE bb.`bot_id` = bbo.`BotID`;");
}
if(get_mysql_result("SHOW COLUMNS FROM `botbuffs` LIKE 'ExtraDIChance'") ne "" && $db){
print get_mysql_result("UPDATE `bot_buffs` bb INNER JOIN `botbuffs` bbo ON bb.`buffs_index` = bbo.`BotBuffId` SET bb.`extra_di_chance` = bbo.`ExtraDIChance` WHERE bb.`bot_id` = bbo.`BotID`;");
}
print get_mysql_result("RENAME TABLE `botbuffs` TO `botbuffs_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botinventory'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_inventories` (`inventories_index`, `bot_id`, `slot_id`, `item_id`, `inst_charges`, `inst_color`, `inst_no_drop`, `augment_1`, `augment_2`, `augment_3`, `augment_4`, `augment_5`) SELECT bi.`BotInventoryID`, bi.`BotID`, bi.`SlotID`, bi.`ItemID`, bi.`charges`, bi.`color`, bi.`instnodrop`, bi.`augslot1`, bi.`augslot2`, bi.`augslot3`, bi.`augslot4`, bi.`augslot5` FROM `botinventory` bi INNER JOIN `bot_data` bd ON bi.`BotID` = bd.`bot_id`;");
if(get_mysql_result("SHOW COLUMNS FROM `botinventory` LIKE 'augslot6'") ne "" && $db){
print get_mysql_result("UPDATE `bot_inventories` bi INNER JOIN `botinventory` bio ON bi.`inventories_index` = bio.`BotInventoryID` SET bi.`augment_6` = bio.`augslot6` WHERE bi.`bot_id` = bio.`BotID`;");
}
print get_mysql_result("RENAME TABLE `botinventory` TO `botinventory_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botpets'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_pets` (`pets_index`, `pet_id`, `bot_id`, `name`, `mana`, `hp`) SELECT bp.`BotPetsId`, bp.`PetId`, bp.`BotId`, bp.`Name`, bp.`Mana`, bp.`HitPoints` FROM `botpets` bp INNER JOIN `bot_data` bd ON bp.`BotId` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `botpets` TO `botpets_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botpetbuffs'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_pet_buffs` (`pet_buffs_index`, `pets_index`, `spell_id`, `caster_level`, `duration`) SELECT bpb.`BotPetBuffId`, bpb.`BotPetsId`, bpb.`SpellId`, bpb.`CasterLevel`, bpb.`Duration` FROM `botpetbuffs` bpb INNER JOIN `bot_pets` bp ON bpb.`BotPetsId` = bp.`pets_index`;");
print get_mysql_result("RENAME TABLE `botpetbuffs` TO `botpetbuffs_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botpetinventory'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_pet_inventories` (`pet_inventories_index`, `pets_index`, `item_id`) SELECT bpi.`BotPetInventoryId`, bpi.`BotPetsId`, bpi.`ItemId` FROM `botpetinventory` bpi INNER JOIN `bot_pets` bp ON bpi.`BotPetsId` = bp.`pets_index`;");
print get_mysql_result("RENAME TABLE `botpetinventory` TO `botpetinventory_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botgroup'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_groups` (`groups_index`, `group_leader_id`, `group_name`) SELECT bg.`BotGroupId`, bg.`BotGroupLeaderBotId`, bg.`BotGroupName` FROM `botgroup` bg INNER JOIN `bot_data` bd ON bg.`BotGroupLeaderBotId` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `botgroup` TO `botgroup_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botgroupmembers'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_group_members` (`group_members_index`, `groups_index`, `bot_id`) SELECT bgm.`BotGroupMemberId`, bgm.`BotGroupId`, bgm.`BotId` FROM `botgroupmembers` bgm INNER JOIN `bot_groups` bg ON bgm.`BotGroupId` = bg.`groups_index` INNER JOIN `bot_data` bd ON bgm.`BotId` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `botgroupmembers` TO `botgroupmembers_old`;");
}
if(get_mysql_result("SHOW TABLES LIKE 'botguildmembers'") ne "" && $db){
print get_mysql_result("INSERT INTO `bot_guild_members` (`bot_id`, `guild_id`, `rank`, `tribute_enable`, `total_tribute`, `last_tribute`, `banker`, `public_note`, `alt`) SELECT bgm.`char_id`, bgm.`guild_id`, bgm.`rank`, bgm.`tribute_enable`, bgm.`total_tribute`, bgm.`last_tribute`, bgm.`banker`, bgm.`public_note`, bgm.`alt` FROM `botguildmembers` bgm INNER JOIN `guilds` g ON bgm.`guild_id` = g.`id` INNER JOIN `bot_data` bd ON bgm.`char_id` = bd.`bot_id`;");
print get_mysql_result("RENAME TABLE `botguildmembers` TO `botguildmembers_old`;");
}
}
sub get_bots_db_version{ sub get_bots_db_version{
#::: Check if bots_version column exists... #::: Check if bots_version column exists...
if(get_mysql_result("SHOW COLUMNS FROM db_version LIKE 'bots_version'") eq "" && $db){ if(get_mysql_result("SHOW COLUMNS FROM db_version LIKE 'bots_version'") eq "" && $db){
@ -914,6 +1291,10 @@ sub run_database_check{
print "Running Update: " . $val . " - " . $file_name . "\n"; print "Running Update: " . $val . " - " . $file_name . "\n";
print get_mysql_result_from_file("db_update/$file_name"); print get_mysql_result_from_file("db_update/$file_name");
print get_mysql_result("UPDATE db_version SET version = $val WHERE version < $val"); print get_mysql_result("UPDATE db_version SET version = $val WHERE version < $val");
if($bots_db_management == 1 && $val == 9000){
modify_db_for_bots();
}
} }
$db_run_stage = 2; $db_run_stage = 2;
} }

View File

@ -343,6 +343,8 @@
9087|2015_09_25_inventory_snapshots.sql|SHOW TABLES LIKE 'inventory_snapshots'|empty| 9087|2015_09_25_inventory_snapshots.sql|SHOW TABLES LIKE 'inventory_snapshots'|empty|
9088|2015_11_01_perl_event_export_settings.sql|SHOW TABLES LIKE 'perl_event_export_settings'|empty| 9088|2015_11_01_perl_event_export_settings.sql|SHOW TABLES LIKE 'perl_event_export_settings'|empty|
9089|2015_11_02_ai_idle_no_spell_recast_default_changes.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Spells:AI_IdleNoSpellMinRecast%' AND `rule_value` = '500'|not_empty| 9089|2015_11_02_ai_idle_no_spell_recast_default_changes.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Spells:AI_IdleNoSpellMinRecast%' AND `rule_value` = '500'|not_empty|
9090|2015_12_01_spell_scribe_restriction_rule.sql|SELECT `rule_name` FROM `rule_values` WHERE `rule_name` LIKE 'Character:RestrictSpellScribing'|empty|
9091|2015_12_07_command_settings.sql|SHOW TABLES LIKE 'command_settings'|empty|
# Upgrade conditions: # Upgrade conditions:
# This won't be needed after this system is implemented, but it is used database that are not # This won't be needed after this system is implemented, but it is used database that are not

View File

@ -1,5 +1,5 @@
-- 'drop_bots (pre-update script)' sql script file -- 'drop_bots (pre-update script)' sql script file
-- current as of 10/09/2015 -- current as of 11/30/2015
-- --
-- Note: This file will remove bot schema loaded by 'load_bots' sql scripts. -- Note: This file will remove bot schema loaded by 'load_bots' sql scripts.
-- There may still be remnants of bot activity in tables `guild_members` and -- There may still be remnants of bot activity in tables `guild_members` and
@ -50,12 +50,12 @@ BEGIN
SELECT "restoring keys..."; SELECT "restoring keys...";
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'group_id' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN IF (EXISTS(SELECT `CONSTRAINT_NAME` FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'group_id' AND `CONSTRAINT_NAME` = 'PRIMARY')) THEN
ALTER TABLE `group_id` DROP PRIMARY KEY; ALTER TABLE `group_id` DROP PRIMARY KEY;
END IF; END IF;
ALTER TABLE `group_id` ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`); ALTER TABLE `group_id` ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`);
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'guild_members' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN IF (EXISTS(SELECT `CONSTRAINT_NAME` FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'guild_members' AND `CONSTRAINT_NAME` = 'PRIMARY')) THEN
ALTER TABLE `guild_members` DROP PRIMARY KEY; ALTER TABLE `guild_members` DROP PRIMARY KEY;
END IF; END IF;
ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`); ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`);
@ -66,7 +66,7 @@ BEGIN
SELECT "clearing database version..."; SELECT "clearing database version...";
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'db_version' AND `COLUMN_NAME` = 'bots_version') > 0) THEN IF (EXISTS(SELECT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'db_version' AND `COLUMN_NAME` = 'bots_version')) THEN
UPDATE `db_version` UPDATE `db_version`
SET `bots_version` = 0; SET `bots_version` = 0;
END IF; END IF;

View File

@ -1,26 +1,47 @@
-- 'drop_bots' sql script file -- 'drop_bots' sql script file
-- current as of 10/09/2015 -- current as of 12/11/2015
-- --
-- Note: This file will remove bot schema loaded by 'load_bots' sql scripts. -- Note: This file will remove bot schema loaded by 'load_bots' sql scripts.
-- There may still be remnants of bot activity in tables `guild_members` and -- There may still be remnants of bot activity in tables `guild_members` and
-- `group_id`. If these entries are causing issues, you may need to manually -- `group_id`. If these entries are causing issues, you may need to manually
-- remove them. -- remove them.
--
-- Use eqemu_update.pl to administer this script
SELECT "dropping views..."; DROP VIEW IF EXISTS `vwguildmembers`;
DROP VIEW IF EXISTS `vwgroups`;
DROP VIEW IF EXISTS `vwbotgroups`;
DROP VIEW IF EXISTS `vwbotcharactermobs`;
DROP VIEW IF EXISTS `vwGuildMembers`;
DROP VIEW IF EXISTS `vwGroups`;
DROP VIEW IF EXISTS `vwBotGroups`;
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
DROP VIEW IF EXISTS `vw_guild_members`; DROP VIEW IF EXISTS `vw_guild_members`;
DROP VIEW IF EXISTS `vw_groups`; DROP VIEW IF EXISTS `vw_groups`;
DROP VIEW IF EXISTS `vw_bot_groups`; DROP VIEW IF EXISTS `vw_bot_groups`;
DROP VIEW IF EXISTS `vw_bot_character_mobs`; DROP VIEW IF EXISTS `vw_bot_character_mobs`;
SELECT "dropping functions...";
DROP FUNCTION IF EXISTS `GetMobTypeByName`; DROP FUNCTION IF EXISTS `GetMobTypeByName`;
DROP FUNCTION IF EXISTS `GetMobTypeByID`; DROP FUNCTION IF EXISTS `GetMobTypeByID`;
DROP FUNCTION IF EXISTS `GetMobType`; DROP FUNCTION IF EXISTS `GetMobType`;
DROP TABLE IF EXISTS `botguildmembers`;
DROP TABLE IF EXISTS `botgroupmembers`;
DROP TABLE IF EXISTS `botgroup`;
DROP TABLE IF EXISTS `botpetinventory`;
DROP TABLE IF EXISTS `botpetbuffs`;
DROP TABLE IF EXISTS `botpets`;
DROP TABLE IF EXISTS `botinventory`;
DROP TABLE IF EXISTS `botbuffs`;
DROP TABLE IF EXISTS `bottimers`;
DROP TABLE IF EXISTS `botstances`;
DROP TABLE IF EXISTS `bots`;
DROP TABLE IF EXISTS `botgroups`; -- this table is not a part of 'load_bots.sql'
SELECT "dropping tables...";
DROP TABLE IF EXISTS `botguildmembers_old`; DROP TABLE IF EXISTS `botguildmembers_old`;
DROP TABLE IF EXISTS `botgroupmembers_old`; DROP TABLE IF EXISTS `botgroupmembers_old`;
DROP TABLE IF EXISTS `botgroup_old`; DROP TABLE IF EXISTS `botgroup_old`;
@ -46,51 +67,7 @@ DROP TABLE IF EXISTS `bot_stances`;
DROP TABLE IF EXISTS `bot_inspect_messages`; DROP TABLE IF EXISTS `bot_inspect_messages`;
DROP TABLE IF EXISTS `bot_data`; DROP TABLE IF EXISTS `bot_data`;
DROP PROCEDURE IF EXISTS `DropBotsSchema`; DROP PROCEDURE IF EXISTS `LoadBotsSchema`;
DELIMITER $$
CREATE PROCEDURE `DropBotsSchema` ()
BEGIN
SELECT "deleting rules...";
DELETE FROM `rule_values` WHERE `rule_name` LIKE 'Bots%';
SELECT "deleting command...";
DELETE FROM `commands` WHERE `command` LIKE 'bot';
SELECT "restoring keys...";
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'group_id' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN
ALTER TABLE `group_id` DROP PRIMARY KEY;
END IF;
ALTER TABLE `group_id` ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`);
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'guild_members' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN
ALTER TABLE `guild_members` DROP PRIMARY KEY;
END IF;
ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`);
SELECT "de-activating spawns...";
UPDATE `spawn2` SET `enabled` = 0 WHERE `id` IN (59297,59298);
SELECT "clearing database version...";
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'db_version' AND `COLUMN_NAME` = 'bots_version') > 0) THEN
UPDATE `db_version`
SET `bots_version` = 0;
END IF;
END$$
DELIMITER ;
CALL `DropBotsSchema`();
SELECT "dropping procedure...";
DROP PROCEDURE IF EXISTS `DropBotsSchema`; DROP PROCEDURE IF EXISTS `DropBotsSchema`;

View File

@ -1,10 +1,15 @@
-- '2015_09_30_bots' sql script file -- '2015_09_30_bots' sql script file
-- current as of 10/13/2015 -- current as of 12/11/2015
-- --
-- Use eqemu_update.pl to administer this script -- Use eqemu_update.pl to administer this script
-- Clean-up -- Clean-up
DROP VIEW IF EXISTS `vwbotcharactermobs`;
DROP VIEW IF EXISTS `vwbotgroups`;
DROP VIEW IF EXISTS `vwgroups`;
DROP VIEW IF EXISTS `vwguildmembers`;
DROP VIEW IF EXISTS `vwBotCharacterMobs`; DROP VIEW IF EXISTS `vwBotCharacterMobs`;
DROP VIEW IF EXISTS `vwBotGroups`; DROP VIEW IF EXISTS `vwBotGroups`;
DROP VIEW IF EXISTS `vwGroups`; DROP VIEW IF EXISTS `vwGroups`;
@ -22,659 +27,193 @@ DROP FUNCTION IF EXISTS `GetMobTypeByID`;
DROP PROCEDURE IF EXISTS `LoadBotsSchema`; DROP PROCEDURE IF EXISTS `LoadBotsSchema`;
DELIMITER $$ -- Tables
CREATE TABLE `bot_data` (
`bot_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`owner_id` INT(11) UNSIGNED NOT NULL,
`spells_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`name` VARCHAR(64) NOT NULL DEFAULT '',
`last_name` VARCHAR(64) NOT NULL DEFAULT '',
`title` VARCHAR(32) NOT NULL DEFAULT '', -- Unused
`suffix` VARCHAR(32) NOT NULL DEFAULT '', -- Unused
`zone_id` SMALLINT(6) NOT NULL DEFAULT '0',
`gender` TINYINT(2) NOT NULL DEFAULT '0',
`race` SMALLINT(5) NOT NULL DEFAULT '0',
`class` TINYINT(2) NOT NULL DEFAULT '0',
`level` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
`deity` INT(11) UNSIGNED NOT NULL DEFAULT '0', -- Unused
`creation_day` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`last_spawn` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`time_spawned` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`size` FLOAT NOT NULL DEFAULT '0',
`face` INT(10) NOT NULL DEFAULT '1',
`hair_color` INT(10) NOT NULL DEFAULT '1',
`hair_style` INT(10) NOT NULL DEFAULT '1',
`beard` INT(10) NOT NULL DEFAULT '0',
`beard_color` INT(10) NOT NULL DEFAULT '1',
`eye_color_1` INT(10) NOT NULL DEFAULT '1',
`eye_color_2` INT(10) NOT NULL DEFAULT '1',
`drakkin_heritage` INT(10) NOT NULL DEFAULT '0',
`drakkin_tattoo` INT(10) NOT NULL DEFAULT '0',
`drakkin_details` INT(10) NOT NULL DEFAULT '0',
`ac` SMALLINT(5) NOT NULL DEFAULT '0',
`atk` MEDIUMINT(9) NOT NULL DEFAULT '0',
`hp` INTEGER NOT NULL DEFAULT '0',
`mana` INTEGER NOT NULL DEFAULT '0',
`str` MEDIUMINT(8) NOT NULL DEFAULT '75',
`sta` MEDIUMINT(8) NOT NULL DEFAULT '75',
`cha` MEDIUMINT(8) NOT NULL DEFAULT '75',
`dex` MEDIUMINT(8) NOT NULL DEFAULT '75',
`int` MEDIUMINT(8) NOT NULL DEFAULT '75',
`agi` MEDIUMINT(8) NOT NULL DEFAULT '75',
`wis` MEDIUMINT(8) NOT NULL DEFAULT '75',
`fire` SMALLINT(5) NOT NULL DEFAULT '0',
`cold` SMALLINT(5) NOT NULL DEFAULT '0',
`magic` SMALLINT(5) NOT NULL DEFAULT '0',
`poison` SMALLINT(5) NOT NULL DEFAULT '0',
`disease` SMALLINT(5) NOT NULL DEFAULT '0',
`corruption` SMALLINT(5) NOT NULL DEFAULT '0',
`show_helm` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`follow_distance` INT(11) UNSIGNED NOT NULL DEFAULT '200',
PRIMARY KEY (`bot_id`)
) ENGINE=InnoDB;
CREATE PROCEDURE `LoadBotsSchema` () CREATE TABLE `bot_inspect_messages` (
BEGIN `bot_id` INT(11) UNSIGNED NOT NULL,
-- Activate `inspect_message` VARCHAR(256) NOT NULL DEFAULT '',
UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298); PRIMARY KEY (`bot_id`),
INDEX `bot_id` (`bot_id`)
) ENGINE=InnoDB;
-- Alter
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'guild_members' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN
ALTER TABLE `guild_members` DROP PRIMARY KEY;
END IF;
IF ((SELECT COUNT(*) FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'group_id' AND `CONSTRAINT_NAME` = 'PRIMARY') > 0) THEN
ALTER TABLE `group_id` DROP PRIMARY KEY;
END IF;
ALTER TABLE `group_id` ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);
--
-- From original bots.sql (for reference)
-- ALTER TABLE `group_id` ADD UNIQUE INDEX `U_group_id_1`(`name`);
-- ALTER TABLE `group_leaders` ADD UNIQUE INDEX `U_group_leaders_1`(`leadername`);
-- Commands
IF ((SELECT COUNT(`command`) FROM `commands` WHERE `command` LIKE 'bot') = 0) THEN
INSERT INTO `commands` VALUES ('bot', '0');
END IF;
-- Rules
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotAAExpansion') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:AAExpansion' WHERE `rule_name` LIKE 'Bots:BotAAExpansion';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:AAExpansion') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:AAExpansion', '8', 'The expansion through which bots will obtain AAs');
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:CreateBotCount') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:CreationLimit' WHERE `rule_name` LIKE 'Bots:CreateBotCount';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:CreationLimit') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:CreationLimit', '150', 'Number of bots that each account can create');
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotFinishBuffing') > 0) THEN CREATE TABLE `bot_stances` (
UPDATE `rule_values` SET `rule_name` = 'Bots:FinishBuffing' WHERE `rule_name` LIKE 'Bots:BotFinishBuffing'; `bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
END IF; `stance_id` TINYINT UNSIGNED NOT NULL DEFAULT '0',
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:FinishBuffing') = 0) THEN PRIMARY KEY (`bot_id`),
INSERT INTO `rule_values` VALUES ('1', 'Bots:FinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.'); CONSTRAINT `FK_bot_stances_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
END IF; );
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotGroupBuffing') > 0) THEN CREATE TABLE `bot_timers` (
UPDATE `rule_values` SET `rule_name` = 'Bots:GroupBuffing' WHERE `rule_name` LIKE 'Bots:BotGroupBuffing'; `bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
END IF; `timer_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:GroupBuffing') = 0) THEN `timer_value` INT(11) UNSIGNED NOT NULL DEFAULT '0',
INSERT INTO `rule_values` VALUES ('1', 'Bots:GroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.'); PRIMARY KEY (`bot_id`),
END IF; CONSTRAINT `FK_bot_timers_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
);
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotManaRegen') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:ManaRegen' WHERE `rule_name` LIKE 'Bots:BotManaRegen';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:ManaRegen') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:ManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.');
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotQuest') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:QuestableSpawnLimit' WHERE `rule_name` LIKE 'Bots:BotQuest';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:QuestableSpawnLimit') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:QuestableSpawnLimit', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl');
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:BotSpellQuest') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:QuestableSpells' WHERE `rule_name` LIKE 'Bots:BotSpellQuest';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:QuestableSpells') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:QuestableSpells', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.');
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:SpawnBotCount') > 0) THEN
UPDATE `rule_values` SET `rule_name` = 'Bots:SpawnLimit' WHERE `rule_name` LIKE 'Bots:SpawnBotCount';
END IF;
IF ((SELECT COUNT(`rule_name`) FROM `rule_values` WHERE `rule_name` LIKE 'Bots:SpawnLimit') = 0) THEN
INSERT INTO `rule_values` VALUES ('1', 'Bots:SpawnLimit', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
END IF;
-- Tables
CREATE TABLE `bot_data` (
`bot_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`owner_id` INT(11) UNSIGNED NOT NULL,
`spells_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`name` VARCHAR(64) NOT NULL DEFAULT '',
`last_name` VARCHAR(64) NOT NULL DEFAULT '', -- Change unused (64) from (32)
`title` VARCHAR(32) NOT NULL DEFAULT '', -- Unused
`suffix` VARCHAR(32) NOT NULL DEFAULT '', -- Unused
`zone_id` SMALLINT(6) NOT NULL DEFAULT '0',
`gender` TINYINT(2) NOT NULL DEFAULT '0',
`race` SMALLINT(5) NOT NULL DEFAULT '0',
`class` TINYINT(2) NOT NULL DEFAULT '0',
`level` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
`deity` INT(11) UNSIGNED NOT NULL DEFAULT '0', -- Unused
`creation_day` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`last_spawn` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`time_spawned` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`size` FLOAT NOT NULL DEFAULT '0',
`face` INT(10) NOT NULL DEFAULT '1',
`hair_color` INT(10) NOT NULL DEFAULT '1',
`hair_style` INT(10) NOT NULL DEFAULT '1',
`beard` INT(10) NOT NULL DEFAULT '0',
`beard_color` INT(10) NOT NULL DEFAULT '1',
`eye_color_1` INT(10) NOT NULL DEFAULT '1',
`eye_color_2` INT(10) NOT NULL DEFAULT '1',
`drakkin_heritage` INT(10) NOT NULL DEFAULT '0',
`drakkin_tattoo` INT(10) NOT NULL DEFAULT '0',
`drakkin_details` INT(10) NOT NULL DEFAULT '0',
`ac` SMALLINT(5) NOT NULL DEFAULT '0',
`atk` MEDIUMINT(9) NOT NULL DEFAULT '0',
`hp` INTEGER NOT NULL DEFAULT '0',
`mana` INTEGER NOT NULL DEFAULT '0',
`str` MEDIUMINT(8) NOT NULL DEFAULT '75',
`sta` MEDIUMINT(8) NOT NULL DEFAULT '75',
`cha` MEDIUMINT(8) NOT NULL DEFAULT '75',
`dex` MEDIUMINT(8) NOT NULL DEFAULT '75',
`int` MEDIUMINT(8) NOT NULL DEFAULT '75',
`agi` MEDIUMINT(8) NOT NULL DEFAULT '75',
`wis` MEDIUMINT(8) NOT NULL DEFAULT '75',
`fire` SMALLINT(5) NOT NULL DEFAULT '0',
`cold` SMALLINT(5) NOT NULL DEFAULT '0',
`magic` SMALLINT(5) NOT NULL DEFAULT '0',
`poison` SMALLINT(5) NOT NULL DEFAULT '0',
`disease` SMALLINT(5) NOT NULL DEFAULT '0',
`corruption` SMALLINT(5) NOT NULL DEFAULT '0',
`show_helm` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`follow_distance` INT(11) UNSIGNED NOT NULL DEFAULT '200',
PRIMARY KEY (`bot_id`)
) ENGINE=InnoDB;
CREATE TABLE `bot_inspect_messages` (
`bot_id` INT(11) UNSIGNED NOT NULL,
`inspect_message` VARCHAR(256) NOT NULL DEFAULT '',
PRIMARY KEY (`bot_id`),
INDEX `bot_id` (`bot_id`)
) ENGINE=InnoDB;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'bots') > 0) THEN
INSERT INTO `bot_data` (
`bot_id`,
`owner_id`,
`spells_id`,
`name`,
`last_name`,
`zone_id`,
`gender`,
`race`,
`class`,
`level`,
`creation_day`,
`last_spawn`,
`time_spawned`,
`size`,
`face`,
`hair_color`,
`hair_style`,
`beard`,
`beard_color`,
`eye_color_1`,
`eye_color_2`,
`drakkin_heritage`,
`drakkin_tattoo`,
`drakkin_details`,
`ac`,
`atk`,
`hp`,
`mana`,
`str`,
`sta`,
`cha`,
`dex`,
`int`,
`agi`,
`wis`,
`fire`,
`cold`,
`magic`,
`poison`,
`disease`,
`corruption`
)
SELECT
`BotID`,
`BotOwnerCharacterID`,
`BotSpellsID`,
`Name`,
`LastName`,
`LastZoneId`,
`Gender`,
`Race`,
`Class`,
`BotLevel`,
UNIX_TIMESTAMP(`BotCreateDate`),
UNIX_TIMESTAMP(`LastSpawnDate`),
`TotalPlayTime`,
`Size`,
`Face`,
`LuclinHairColor`,
`LuclinHairStyle`,
`LuclinBeard`,
`LuclinBeardColor`,
`LuclinEyeColor`,
`LuclinEyeColor2`,
`DrakkinHeritage`,
`DrakkinTattoo`,
`DrakkinDetails`,
`AC`,
`ATK`,
`HP`,
`Mana`,
`STR`,
`STA`,
`CHA`,
`DEX`,
`_INT`,
`AGI`,
`WIS`,
`FR`,
`CR`,
`MR`,
`PR`,
`DR`,
`Corrup`
FROM `bots`;
INSERT INTO `bot_inspect_messages` (
`bot_id`,
`inspect_message`
)
SELECT
`BotID`,
`BotInspectMessage`
FROM `bots`;
RENAME TABLE `bots` TO `bots_old`;
END IF;
CREATE TABLE `bot_stances` (
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`stance_id` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`bot_id`),
CONSTRAINT `FK_bot_stances_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
);
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botstances') > 0) THEN
INSERT INTO `bot_stances` (
`bot_id`,
`stance_id`
)
SELECT
bs.`BotID`,
bs.`StanceID`
FROM `botstances` bs
INNER JOIN `bot_data` bd
ON bs.`BotID` = bd.`bot_id`;
RENAME TABLE `botstances` TO `botstances_old`;
END IF;
CREATE TABLE `bot_timers` (
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`timer_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`timer_value` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`bot_id`),
CONSTRAINT `FK_bot_timers_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
);
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'bottimers') > 0) THEN
INSERT INTO `bot_timers` (
`bot_id`,
`timer_id`,
`timer_value`
)
SELECT
bt.`BotID`,
bt.`TimerID`,
bt.`Value`
FROM `bottimers` bt
INNER JOIN `bot_data` bd
ON bt.`BotID` = bd.`bot_id`;
RENAME TABLE `bottimers` TO `bottimers_old`;
END IF;
CREATE TABLE `bot_buffs` (
`buffs_index` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`spell_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`caster_level` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`duration_formula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`tics_remaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`poison_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`disease_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`curse_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`corruption_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`numhits` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`melee_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`magic_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`dot_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0', -- Fix
`persistent` TINYINT(1) NOT NULL DEFAULT '0',
`caston_x` INT(10) NOT NULL DEFAULT '0', -- Fix
`caston_y` INT(10) NOT NULL DEFAULT '0', -- Fix
`caston_z` INT(10) NOT NULL DEFAULT '0', -- Fix
`extra_di_chance` INT(10) UNSIGNED NOT NULL DEFAULT '0', -- Fix
`instrument_mod` INT(10) NOT NULL DEFAULT '10', -- Unused
PRIMARY KEY (`buffs_index`),
KEY `FK_bot_buffs_1` (`bot_id`),
CONSTRAINT `FK_bot_buffs_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs') > 0) THEN
INSERT INTO `bot_buffs` (
`buffs_index`,
`bot_id`,
`spell_id`,
`caster_level`,
`duration_formula`,
`tics_remaining`,
`poison_counters`,
`disease_counters`,
`curse_counters`,
`corruption_counters`,
`numhits`,
`melee_rune`,
`magic_rune`,
`persistent`
)
SELECT
bb.`BotBuffId`,
bb.`BotId`,
bb.`SpellId`,
bb.`CasterLevel`,
bb.`DurationFormula`,
bb.`TicsRemaining`,
bb.`PoisonCounters`,
bb.`DiseaseCounters`,
bb.`CurseCounters`,
bb.`CorruptionCounters`,
bb.`HitCount`,
bb.`MeleeRune`,
bb.`MagicRune`,
bb.`Persistent`
FROM `botbuffs` bb
INNER JOIN `bot_data` bd
ON bb.`BotId` = bd.`bot_id`;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs' AND `COLUMN_NAME` = 'dot_rune') > 0) THEN
UPDATE `bot_buffs` bb
INNER JOIN `botbuffs` bbo
ON bb.`buffs_index` = bbo.`BotBuffId`
SET bb.`dot_rune` = bbo.`dot_rune`
WHERE bb.`bot_id` = bbo.`BotID`;
END IF;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs' AND `COLUMN_NAME` = 'caston_x') > 0) THEN
UPDATE `bot_buffs` bb
INNER JOIN `botbuffs` bbo
ON bb.`buffs_index` = bbo.`BotBuffId`
SET bb.`caston_x` = bbo.`caston_x`
WHERE bb.`bot_id` = bbo.`BotID`;
END IF;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs' AND `COLUMN_NAME` = 'caston_y') > 0) THEN
UPDATE `bot_buffs` bb
INNER JOIN `botbuffs` bbo
ON bb.`buffs_index` = bbo.`BotBuffId`
SET bb.`caston_y` = bbo.`caston_y`
WHERE bb.`bot_id` = bbo.`BotID`;
END IF;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs' AND `COLUMN_NAME` = 'caston_z') > 0) THEN
UPDATE `bot_buffs` bb
INNER JOIN `botbuffs` bbo
ON bb.`buffs_index` = bbo.`BotBuffId`
SET bb.`caston_z` = bbo.`caston_z`
WHERE bb.`bot_id` = bbo.`BotID`;
END IF;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botbuffs' AND `COLUMN_NAME` = 'ExtraDIChance') > 0) THEN
UPDATE `bot_buffs` bb
INNER JOIN `botbuffs` bbo
ON bb.`buffs_index` = bbo.`BotBuffId`
SET bb.`extra_di_chance` = bbo.`ExtraDIChance`
WHERE bb.`bot_id` = bbo.`BotID`;
END IF;
RENAME TABLE `botbuffs` TO `botbuffs_old`;
END IF;
CREATE TABLE `bot_inventories` (
`inventories_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`slot_id` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`item_id` INT(11) UNSIGNED NULL DEFAULT '0',
`inst_charges` TINYINT(3) UNSIGNED DEFAULT 0,
`inst_color` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`inst_no_drop` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`inst_custom_data` TEXT NULL,
`ornament_icon` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`ornament_id_file` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`ornament_hero_model` INT(11) NOT NULL DEFAULT '0',
`augment_1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_5` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_6` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`inventories_index`),
KEY `FK_bot_inventories_1` (`bot_id`),
CONSTRAINT `FK_bot_inventories_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botinventory') > 0) THEN
INSERT INTO `bot_inventories` (
`inventories_index`,
`bot_id`,
`slot_id`,
`item_id`,
`inst_charges`,
`inst_color`,
`inst_no_drop`,
`augment_1`,
`augment_2`,
`augment_3`,
`augment_4`,
`augment_5`
)
SELECT
bi.`BotInventoryID`,
bi.`BotID`,
bi.`SlotID`,
bi.`ItemID`,
bi.`charges`,
bi.`color`,
bi.`instnodrop`,
bi.`augslot1`,
bi.`augslot2`,
bi.`augslot3`,
bi.`augslot4`,
bi.`augslot5`
FROM `botinventory` bi
INNER JOIN `bot_data` bd
ON bi.`BotID` = bd.`bot_id`;
IF ((SELECT COUNT(*) FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botinventory' AND `COLUMN_NAME` = 'augslot6') > 0) THEN
UPDATE `bot_inventories` bi
INNER JOIN `botinventory` bio
ON bi.`inventories_index` = bio.`BotInventoryID`
SET bi.`augment_6` = bio.`augslot6`
WHERE bi.`bot_id` = bio.`BotID`;
END IF;
RENAME TABLE `botinventory` TO `botinventory_old`;
END IF;
CREATE TABLE `bot_pets` (
`pets_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`pet_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`bot_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`name` VARCHAR(64) NULL,
`mana` INTEGER NOT NULL DEFAULT '0',
`hp` INTEGER NOT NULL DEFAULT '0',
PRIMARY KEY (`pets_index`),
KEY `FK_bot_pets_1` (`bot_id`),
CONSTRAINT `FK_bot_pets_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`),
CONSTRAINT `U_bot_pets_1` UNIQUE (`bot_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botpets') > 0) THEN
INSERT INTO `bot_pets` (
`pets_index`,
`pet_id`,
`bot_id`,
`name`,
`mana`,
`hp`
)
SELECT
bp.`BotPetsId`,
bp.`PetId`,
bp.`BotId`,
bp.`Name`,
bp.`Mana`,
bp.`HitPoints`
FROM `botpets` bp
INNER JOIN `bot_data` bd
ON bp.`BotId` = bd.`bot_id`;
RENAME TABLE `botpets` TO `botpets_old`;
END IF;
CREATE TABLE `bot_pet_buffs` (
`pet_buffs_index` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pets_index` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`spell_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`caster_level` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`pet_buffs_index`),
KEY `FK_bot_pet_buffs_1` (`pets_index`),
CONSTRAINT `FK_bot_pet_buffs_1` FOREIGN KEY (`pets_index`) REFERENCES `bot_pets` (`pets_index`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botpetbuffs') > 0) THEN
INSERT INTO `bot_pet_buffs` (
`pet_buffs_index`,
`pets_index`,
`spell_id`,
`caster_level`,
`duration`
)
SELECT
bpb.`BotPetBuffId`,
bpb.`BotPetsId`,
bpb.`SpellId`,
bpb.`CasterLevel`,
bpb.`Duration`
FROM `botpetbuffs` bpb
INNER JOIN `bot_pets` bp
ON bpb.`BotPetsId` = bp.`pets_index`;
RENAME TABLE `botpetbuffs` TO `botpetbuffs_old`;
END IF;
CREATE TABLE `bot_pet_inventories` (
`pet_inventories_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`pets_index` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`item_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`pet_inventories_index`),
KEY `FK_bot_pet_inventories_1` (`pets_index`),
CONSTRAINT `FK_bot_pet_inventories_1` FOREIGN KEY (`pets_index`) REFERENCES `bot_pets` (`pets_index`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botpetinventory') > 0) THEN
INSERT INTO `bot_pet_inventories` (
`pet_inventories_index`,
`pets_index`,
`item_id`
)
SELECT
bpi.`BotPetInventoryId`,
bpi.`BotPetsId`,
bpi.`ItemId`
FROM `botpetinventory` bpi
INNER JOIN `bot_pets` bp
ON bpi.`BotPetsId` = bp.`pets_index`;
RENAME TABLE `botpetinventory` TO `botpetinventory_old`;
END IF;
CREATE TABLE `bot_groups` (
`groups_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`group_leader_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`group_name` VARCHAR(64) NOT NULL,
PRIMARY KEY (`groups_index`),
KEY `FK_bot_groups_1` (`group_leader_id`),
CONSTRAINT `FK_bot_groups_1` FOREIGN KEY (`group_leader_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botgroup') > 0) THEN
INSERT INTO `bot_groups` (
`groups_index`,
`group_leader_id`,
`group_name`
)
SELECT
bg.`BotGroupId`,
bg.`BotGroupLeaderBotId`,
bg.`BotGroupName`
FROM `botgroup` bg
INNER JOIN `bot_data` bd
ON bg.`BotGroupLeaderBotId` = bd.`bot_id`;
RENAME TABLE `botgroup` TO `botgroup_old`;
END IF;
CREATE TABLE `bot_group_members` (
`group_members_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`groups_index` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`bot_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`group_members_index`),
KEY `FK_bot_group_members_1` (`groups_index`),
CONSTRAINT `FK_bot_group_members_1` FOREIGN KEY (`groups_index`) REFERENCES `bot_groups` (`groups_index`),
KEY `FK_bot_group_members_2` (`bot_id`),
CONSTRAINT `FK_bot_group_members_2` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botgroupmembers') > 0) THEN
INSERT INTO `bot_group_members` (
`group_members_index`,
`groups_index`,
`bot_id`
)
SELECT
bgm.`BotGroupMemberId`,
bgm.`BotGroupId`,
bgm.`BotId`
FROM `botgroupmembers` bgm
INNER JOIN `bot_groups` bg
ON bgm.`BotGroupId` = bg.`groups_index`
INNER JOIN `bot_data` bd
ON bgm.`BotId` = bd.`bot_id`;
RENAME TABLE `botgroupmembers` TO `botgroupmembers_old`;
END IF;
CREATE TABLE `bot_guild_members` (
`bot_id` INT(11) NOT NULL DEFAULT '0',
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`public_note` TEXT NULL,
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`bot_id`)
) ENGINE=InnoDB;
IF ((SELECT COUNT(*) FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = DATABASE() AND `TABLE_NAME` = 'botguildmembers') > 0) THEN
INSERT INTO `bot_guild_members` (
`bot_id`,
`guild_id`,
`rank`,
`tribute_enable`,
`total_tribute`,
`last_tribute`,
`banker`,
`public_note`,
`alt`
)
SELECT
bgm.`char_id`,
bgm.`guild_id`,
bgm.`rank`,
bgm.`tribute_enable`,
bgm.`total_tribute`,
bgm.`last_tribute`,
bgm.`banker`,
bgm.`public_note`,
bgm.`alt`
FROM `botguildmembers` bgm
INNER JOIN `guilds` g
ON bgm.`guild_id` = g.`id`
INNER JOIN `bot_data` bd
ON bgm.`char_id` = bd.`bot_id`;
RENAME TABLE `botguildmembers` TO `botguildmembers_old`;
END IF;
END$$
DELIMITER ; CREATE TABLE `bot_buffs` (
`buffs_index` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`spell_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`caster_level` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`duration_formula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`tics_remaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`poison_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`disease_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`curse_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`corruption_counters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`numhits` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`melee_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`magic_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`dot_rune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`persistent` TINYINT(1) NOT NULL DEFAULT '0',
`caston_x` INT(10) NOT NULL DEFAULT '0',
`caston_y` INT(10) NOT NULL DEFAULT '0',
`caston_z` INT(10) NOT NULL DEFAULT '0',
`extra_di_chance` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`instrument_mod` INT(10) NOT NULL DEFAULT '10', -- Unused
PRIMARY KEY (`buffs_index`),
KEY `FK_bot_buffs_1` (`bot_id`),
CONSTRAINT `FK_bot_buffs_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `bot_inventories` (
`inventories_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`bot_id` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`slot_id` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`item_id` INT(11) UNSIGNED NULL DEFAULT '0',
`inst_charges` TINYINT(3) UNSIGNED DEFAULT 0,
`inst_color` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`inst_no_drop` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`inst_custom_data` TEXT NULL,
`ornament_icon` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`ornament_id_file` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`ornament_hero_model` INT(11) NOT NULL DEFAULT '0',
`augment_1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_5` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
`augment_6` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`inventories_index`),
KEY `FK_bot_inventories_1` (`bot_id`),
CONSTRAINT `FK_bot_inventories_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
CALL `LoadBotsSchema`(); CREATE TABLE `bot_pets` (
`pets_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`pet_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`bot_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`name` VARCHAR(64) NULL,
`mana` INTEGER NOT NULL DEFAULT '0',
`hp` INTEGER NOT NULL DEFAULT '0',
PRIMARY KEY (`pets_index`),
KEY `FK_bot_pets_1` (`bot_id`),
CONSTRAINT `FK_bot_pets_1` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`),
CONSTRAINT `U_bot_pets_1` UNIQUE (`bot_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
DROP PROCEDURE IF EXISTS `LoadBotsSchema`; CREATE TABLE `bot_pet_buffs` (
`pet_buffs_index` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`pets_index` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`spell_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`caster_level` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`pet_buffs_index`),
KEY `FK_bot_pet_buffs_1` (`pets_index`),
CONSTRAINT `FK_bot_pet_buffs_1` FOREIGN KEY (`pets_index`) REFERENCES `bot_pets` (`pets_index`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `bot_pet_inventories` (
`pet_inventories_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`pets_index` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`item_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`pet_inventories_index`),
KEY `FK_bot_pet_inventories_1` (`pets_index`),
CONSTRAINT `FK_bot_pet_inventories_1` FOREIGN KEY (`pets_index`) REFERENCES `bot_pets` (`pets_index`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `bot_groups` (
`groups_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`group_leader_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`group_name` VARCHAR(64) NOT NULL,
PRIMARY KEY (`groups_index`),
KEY `FK_bot_groups_1` (`group_leader_id`),
CONSTRAINT `FK_bot_groups_1` FOREIGN KEY (`group_leader_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
CREATE TABLE `bot_group_members` (
`group_members_index` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`groups_index` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`bot_id` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`group_members_index`),
KEY `FK_bot_group_members_1` (`groups_index`),
CONSTRAINT `FK_bot_group_members_1` FOREIGN KEY (`groups_index`) REFERENCES `bot_groups` (`groups_index`),
KEY `FK_bot_group_members_2` (`bot_id`),
CONSTRAINT `FK_bot_group_members_2` FOREIGN KEY (`bot_id`) REFERENCES `bot_data` (`bot_id`)
) ENGINE=InnoDB;
CREATE TABLE `bot_guild_members` (
`bot_id` INT(11) NOT NULL DEFAULT '0',
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`public_note` TEXT NULL,
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`bot_id`)
) ENGINE=InnoDB;
-- Functions -- Functions

View File

@ -0,0 +1,7 @@
INSERT INTO `rule_values` VALUES ('0', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('1', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('2', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('3', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('4', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('5', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');
INSERT INTO `rule_values` VALUES ('10', 'Character:RestrictSpellScribing', 'false', 'Restricts spell scribing to allowable races/classes of spell scroll, if true');

File diff suppressed because one or more lines are too long

View File

@ -145,7 +145,7 @@ bool LoginServer::Process() {
break; break;
} }
case ServerOP_LSClientAuth: { case ServerOP_LSClientAuth: {
ServerLSClientAuth* slsca = (ServerLSClientAuth*) pack->pBuffer; ClientAuth_Struct* slsca = (ClientAuth_Struct*) pack->pBuffer;
if (RuleI(World, AccountSessionLimit) >= 0) { if (RuleI(World, AccountSessionLimit) >= 0) {
// Enforce the limit on the number of characters on the same account that can be // Enforce the limit on the number of characters on the same account that can be

View File

@ -114,6 +114,9 @@ void CatchSignal(int sig_num);
int main(int argc, char** argv) { int main(int argc, char** argv) {
RegisterExecutablePlatform(ExePlatformWorld); RegisterExecutablePlatform(ExePlatformWorld);
Log.LoadLogSettingsDefaults(); Log.LoadLogSettingsDefaults();
set_exception_handler(); set_exception_handler();
/* Database Version Check */ /* Database Version Check */
@ -481,19 +484,16 @@ int main(int argc, char** argv) {
if (InterserverTimer.Check()) { if (InterserverTimer.Check()) {
InterserverTimer.Start(); InterserverTimer.Start();
database.ping(); database.ping();
// AsyncLoadVariables(dbasync, &database);
ReconnectCounter++; if (loginserverlist.AllConnected() == false) {
if (ReconnectCounter >= 12) { // only create thread to reconnect every 10 minutes. previously we were creating a new thread every 10 seconds
ReconnectCounter = 0;
if (loginserverlist.AllConnected() == false) {
#ifdef _WINDOWS #ifdef _WINDOWS
_beginthread(AutoInitLoginServer, 0, nullptr); _beginthread(AutoInitLoginServer, 0, nullptr);
#else #else
pthread_t thread; pthread_t thread;
pthread_create(&thread, nullptr, &AutoInitLoginServer, nullptr); pthread_create(&thread, nullptr, &AutoInitLoginServer, nullptr);
#endif #endif
}
} }
} }
if (numclients == 0) { if (numclients == 0) {
Sleep(50); Sleep(50);

View File

@ -2026,6 +2026,16 @@ void Bot::LoadPetBuffs(SpellBuff_Struct* petBuffs, uint32 botPetSaveId) {
petBuffs[buffIndex].spellid = atoi(row[0]); petBuffs[buffIndex].spellid = atoi(row[0]);
petBuffs[buffIndex].level = atoi(row[1]); petBuffs[buffIndex].level = atoi(row[1]);
petBuffs[buffIndex].duration = atoi(row[2]); petBuffs[buffIndex].duration = atoi(row[2]);
//Work around for loading the counters and setting them back to max. Need entry in DB for saved counters
if(CalculatePoisonCounters(petBuffs[buffIndex].spellid) > 0)
petBuffs[buffIndex].counters = CalculatePoisonCounters(petBuffs[buffIndex].spellid);
else if(CalculateDiseaseCounters(petBuffs[buffIndex].spellid) > 0)
petBuffs[buffIndex].counters = CalculateDiseaseCounters(petBuffs[buffIndex].spellid);
else if(CalculateCurseCounters(petBuffs[buffIndex].spellid) > 0)
petBuffs[buffIndex].counters = CalculateCurseCounters(petBuffs[buffIndex].spellid);
else if(CalculateCorruptionCounters(petBuffs[buffIndex].spellid) > 0)
petBuffs[buffIndex].counters = CalculateCorruptionCounters(petBuffs[buffIndex].spellid);
buffIndex++; buffIndex++;
} }
query = StringFormat("DELETE FROM `bot_pet_buffs` WHERE `pets_index` = %u;", botPetSaveId); query = StringFormat("DELETE FROM `bot_pet_buffs` WHERE `pets_index` = %u;", botPetSaveId);

View File

@ -712,6 +712,7 @@ public:
// use this one instead // use this one instead
void MemSpell(uint16 spell_id, int slot, bool update_client = true); void MemSpell(uint16 spell_id, int slot, bool update_client = true);
void UnmemSpell(int slot, bool update_client = true); void UnmemSpell(int slot, bool update_client = true);
void UnmemSpellBySpellID(int32 spell_id);
void UnmemSpellAll(bool update_client = true); void UnmemSpellAll(bool update_client = true);
void ScribeSpell(uint16 spell_id, int slot, bool update_client = true); void ScribeSpell(uint16 spell_id, int slot, bool update_client = true);
void UnscribeSpell(int slot, bool update_client = true); void UnscribeSpell(int slot, bool update_client = true);
@ -925,6 +926,8 @@ public:
void ResetTrade(); void ResetTrade();
void DropInst(const ItemInst* inst); void DropInst(const ItemInst* inst);
bool TrainDiscipline(uint32 itemid); bool TrainDiscipline(uint32 itemid);
void TrainDiscBySpellID(int32 spell_id);
int GetDiscSlotBySpellID(int32 spellid);
void SendDisciplineUpdate(); void SendDisciplineUpdate();
void SendDisciplineTimer(uint32 timer_id, uint32 duration); void SendDisciplineTimer(uint32 timer_id, uint32 duration);
bool UseDiscipline(uint32 spell_id, uint32 target); bool UseDiscipline(uint32 spell_id, uint32 target);

View File

@ -1153,6 +1153,11 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
{ {
const Item_Struct* item = inst->GetItem(); const Item_Struct* item = inst->GetItem();
if (RuleB(Character, RestrictSpellScribing) && !item->IsEquipable(GetRace(), GetClass())) {
Message_StringID(13, CANNOT_USE_ITEM);
break;
}
if(item && item->Scroll.Effect == (int32)(memspell->spell_id)) if(item && item->Scroll.Effect == (int32)(memspell->spell_id))
{ {
ScribeSpell(memspell->spell_id, memspell->slot); ScribeSpell(memspell->spell_id, memspell->slot);

View File

@ -23,12 +23,12 @@
1. At the bottom of command.h you must add a prototype for it. 1. At the bottom of command.h you must add a prototype for it.
2. Add the function in this file. 2. Add the function in this file.
3. In the command_init function you must add a call to command_add 3. In the command_init function you must add a call to command_add
for your function. If you want an alias for your command, add for your function.
a second call to command_add with the description and access args
set to nullptr and 0 respectively since they aren't used when adding Notes: If you want an alias for your command, add an entry to the
an alias. The function pointers being equal is makes it an alias. `command_settings` table in your database. The access level you
The access level you set with command_add is only a default if set with command_add is the default setting if the command isn't
the command isn't listed in the commands db table. listed in the `command_settings` db table.
*/ */
@ -73,9 +73,7 @@ extern TaskManager *taskmanager;
void CatchSignal(int sig_num); void CatchSignal(int sig_num);
int commandcount; // how many commands we have
//struct cl_struct *commandlist; // the actual linked list of commands
int commandcount; // how many commands we have
// this is the pointer to the dispatch function, updated once // this is the pointer to the dispatch function, updated once
// init has been performed to point at the real function // init has been performed to point at the real function
@ -86,11 +84,11 @@ void command_bestz(Client *c, const Seperator *message);
void command_pf(Client *c, const Seperator *message); void command_pf(Client *c, const Seperator *message);
std::map<std::string, CommandRecord *> commandlist; std::map<std::string, CommandRecord *> commandlist;
std::map<std::string, std::string> commandaliases;
//All allocated CommandRecords get put in here so they get deleted on shutdown //All allocated CommandRecords get put in here so they get deleted on shutdown
LinkedList<CommandRecord *> cleanup_commandlist; LinkedList<CommandRecord *> cleanup_commandlist;
/* /*
* command_notavail * command_notavail
* This is the default dispatch function when commands aren't loaded. * This is the default dispatch function when commands aren't loaded.
@ -139,31 +137,17 @@ Access Levels:
* Parameters: * Parameters:
* none * none
* *
* When adding a command, if it's the first time that function pointer is * When adding a new command, only hard-code 'real' commands -
* used it is a new command. If that function pointer is used for another * all command aliases are added later through a database call
* command, the command is added as an alias; description and access level
* are not used and can be nullptr.
* *
*/ */
int command_init(void) { int command_init(void)
{
if commandaliases.clear();
(
if (
#ifdef PACKET_PROFILER
command_add("packetprofile", "- Dump packet profile for target or self.", 250, command_packetprofile) ||
#endif
#ifdef EQPROFILE
command_add("profiledump", "- Dump profiling info to logs", 250, command_profiledump) ||
command_add("profilereset", "- Reset profiling info", 250, command_profilereset) ||
#endif
#ifdef BOTS
command_add("bot", "- Type \"#bot help\" to the see the list of available commands for bots.", 0, command_bot) ||
#endif
command_add("acceptrules", "[acceptrules] - Accept the EQEmu Agreement", 0, command_acceptrules) || command_add("acceptrules", "[acceptrules] - Accept the EQEmu Agreement", 0, command_acceptrules) ||
command_add("advnpc", "analog for advnpcspawn [maketype|makegroup|addgroupentry|addgroupspawn][removegroupspawn|movespawn|editgroupbox|cleargroupbox]", 150, command_advnpcspawn) ||
command_add("advnpcspawn", "[maketype|makegroup|addgroupentry|addgroupspawn][removegroupspawn|movespawn|editgroupbox|cleargroupbox]", 150, command_advnpcspawn) || command_add("advnpcspawn", "[maketype|makegroup|addgroupentry|addgroupspawn][removegroupspawn|movespawn|editgroupbox|cleargroupbox]", 150, command_advnpcspawn) ||
command_add("aggro", "(range) [-v] - Display aggro information for all mobs 'range' distance from your target. -v is verbose faction info.", 80, command_aggro) || command_add("aggro", "(range) [-v] - Display aggro information for all mobs 'range' distance from your target. -v is verbose faction info.", 80, command_aggro) ||
command_add("aggrozone", "[aggro] - Aggro every mob in the zone with X aggro. Default is 0. Not recommend if you're not invulnerable.", 100, command_aggrozone) || command_add("aggrozone", "[aggro] - Aggro every mob in the zone with X aggro. Default is 0. Not recommend if you're not invulnerable.", 100, command_aggrozone) ||
@ -172,27 +156,27 @@ int command_init(void) {
command_add("apply_shared_memory", "[shared_memory_name] - Tells every zone and world to apply a specific shared memory segment by name.", 250, command_apply_shared_memory) || command_add("apply_shared_memory", "[shared_memory_name] - Tells every zone and world to apply a specific shared memory segment by name.", 250, command_apply_shared_memory) ||
command_add("attack", "[targetname] - Make your NPC target attack targetname", 150, command_attack) || command_add("attack", "[targetname] - Make your NPC target attack targetname", 150, command_attack) ||
command_add("augmentitem", "Force augments an item. Must have the augment item window open.", 250, command_augmentitem) || command_add("augmentitem", "Force augments an item. Must have the augment item window open.", 250, command_augmentitem) ||
command_add("aug", nullptr, 250, command_augmentitem) ||
command_add("ban", "[name] [reason]- Ban by character name", 150, command_ban) || command_add("ban", "[name] [reason]- Ban by character name", 150, command_ban) ||
command_add("beard", "- Change the beard of your target", 80, command_beard) || command_add("beard", "- Change the beard of your target", 80, command_beard) ||
command_add("beardcolor", "- Change the beard color of your target", 80, command_beardcolor) || command_add("beardcolor", "- Change the beard color of your target", 80, command_beardcolor) ||
command_add("bestz", "- Ask map for a good Z coord for your x,y coords.", 0, command_bestz) || command_add("bestz", "- Ask map for a good Z coord for your x,y coords.", 0, command_bestz) ||
command_add("bind", "- Sets your targets bind spot to their current location", 200, command_bind) || command_add("bind", "- Sets your targets bind spot to their current location", 200, command_bind) ||
#ifdef BOTS
command_add("bot", "- Type \"#bot help\" to the see the list of available commands for bots.", 0, command_bot) ||
#endif
command_add("camerashake", "Shakes the camera on everyone's screen globally.", 80, command_camerashake) || command_add("camerashake", "Shakes the camera on everyone's screen globally.", 80, command_camerashake) ||
command_add("cast", nullptr,0, command_castspell) ||
command_add("castspell", "[spellid] - Cast a spell", 50, command_castspell) || command_add("castspell", "[spellid] - Cast a spell", 50, command_castspell) ||
command_add("chat", "[channel num] [message] - Send a channel message to all zones", 200, command_chat) || command_add("chat", "[channel num] [message] - Send a channel message to all zones", 200, command_chat) ||
command_add("checklos", "- Check for line of sight to your target", 50, command_checklos) || command_add("checklos", "- Check for line of sight to your target", 50, command_checklos) ||
command_add("clearinvsnapshots", "[use rule] - Clear inventory snapshot history (true - elapsed entries, false - all entries)", 200, command_clearinvsnapshots) || command_add("clearinvsnapshots", "[use rule] - Clear inventory snapshot history (true - elapsed entries, false - all entries)", 200, command_clearinvsnapshots) ||
command_add("close_shop", nullptr, 100, command_merchantcloseshop) ||
command_add("connectworld", nullptr,0, command_connectworldserver) ||
command_add("connectworldserver", "- Make zone attempt to connect to worldserver", 200, command_connectworldserver) || command_add("connectworldserver", "- Make zone attempt to connect to worldserver", 200, command_connectworldserver) ||
command_add("corpse", "- Manipulate corpses, use with no arguments for help", 50, command_corpse) || command_add("corpse", "- Manipulate corpses, use with no arguments for help", 50, command_corpse) ||
command_add("crashtest", "- Crash the zoneserver", 255, command_crashtest) || command_add("crashtest", "- Crash the zoneserver", 255, command_crashtest) ||
command_add("cvs", "- Summary of client versions currently online.", 200, command_cvs) || command_add("cvs", "- Summary of client versions currently online.", 200, command_cvs) ||
command_add("damage", "[amount] - Damage your target", 100, command_damage) || command_add("damage", "[amount] - Damage your target", 100, command_damage) ||
command_add("date", "[yyyy] [mm] [dd] [HH] [MM] - Set EQ time", 90, command_date) || command_add("date", "[yyyy] [mm] [dd] [HH] [MM] - Set EQ time", 90, command_date) ||
command_add("dbspawn", nullptr,10, command_npctypespawn) ||
command_add("dbspawn2", "[spawngroup] [respawn] [variance] - Spawn an NPC from a predefined row in the spawn2 table", 100, command_dbspawn2) || command_add("dbspawn2", "[spawngroup] [respawn] [variance] - Spawn an NPC from a predefined row in the spawn2 table", 100, command_dbspawn2) ||
command_add("delacct", "[accountname] - Delete an account", 150, command_delacct) || command_add("delacct", "[accountname] - Delete an account", 150, command_delacct) ||
command_add("deletegraveyard", "[zone name] - Deletes the graveyard for the specified zone.", 200, command_deletegraveyard) || command_add("deletegraveyard", "[zone name] - Deletes the graveyard for the specified zone.", 200, command_deletegraveyard) ||
@ -210,8 +194,6 @@ int command_init(void) {
command_add("enablerecipe", "[recipe_id] - Enables a recipe using the recipe id.", 80, command_enablerecipe) || command_add("enablerecipe", "[recipe_id] - Enables a recipe using the recipe id.", 80, command_enablerecipe) ||
command_add("equipitem", "[slotid(0-21)] - Equip the item on your cursor into the specified slot", 50, command_equipitem) || command_add("equipitem", "[slotid(0-21)] - Equip the item on your cursor into the specified slot", 50, command_equipitem) ||
command_add("face", "- Change the face of your target", 80, command_face) || command_add("face", "- Change the face of your target", 80, command_face) ||
command_add("fi", nullptr,10, command_itemsearch) ||
command_add("finditem", nullptr,10, command_itemsearch) ||
command_add("findnpctype", "[search criteria] - Search database NPC types", 100, command_findnpctype) || command_add("findnpctype", "[search criteria] - Search database NPC types", 100, command_findnpctype) ||
command_add("findspell", "[searchstring] - Search for a spell", 50, command_findspell) || command_add("findspell", "[searchstring] - Search for a spell", 50, command_findspell) ||
command_add("findzone", "[search criteria] - Search database zones", 100, command_findzone) || command_add("findzone", "[search criteria] - Search database zones", 100, command_findzone) ||
@ -220,22 +202,17 @@ int command_init(void) {
command_add("flagedit", "- Edit zone flags on your target", 100, command_flagedit) || command_add("flagedit", "- Edit zone flags on your target", 100, command_flagedit) ||
command_add("flags", "- displays the flags of you or your target", 0, command_flags) || command_add("flags", "- displays the flags of you or your target", 0, command_flags) ||
command_add("flymode", "[0/1/2] - Set your or your player target's flymode to off/on/levitate", 50, command_flymode) || command_add("flymode", "[0/1/2] - Set your or your player target's flymode to off/on/levitate", 50, command_flymode) ||
command_add("fn", nullptr, 100, command_findnpctype) ||
command_add("fov", "- Check wether you're behind or in your target's field of view", 80, command_fov) || command_add("fov", "- Check wether you're behind or in your target's field of view", 80, command_fov) ||
command_add("freeze", "- Freeze your target", 80, command_freeze) || command_add("freeze", "- Freeze your target", 80, command_freeze) ||
command_add("fs", nullptr, 50, command_findspell) ||
command_add("fz", nullptr, 100, command_findzone) ||
command_add("gassign", "[id] - Assign targetted NPC to predefined wandering grid id", 100, command_gassign) || command_add("gassign", "[id] - Assign targetted NPC to predefined wandering grid id", 100, command_gassign) ||
command_add("gender", "[0/1/2] - Change your or your target's gender to male/female/neuter", 50, command_gender) || command_add("gender", "[0/1/2] - Change your or your target's gender to male/female/neuter", 50, command_gender) ||
command_add("getplayerburiedcorpsecount", "- Get the target's total number of buried player corpses.", 100, command_getplayerburiedcorpsecount) || command_add("getplayerburiedcorpsecount", "- Get the target's total number of buried player corpses.", 100, command_getplayerburiedcorpsecount) ||
command_add("getvariable", "[varname] - Get the value of a variable from the database", 200, command_getvariable) || command_add("getvariable", "[varname] - Get the value of a variable from the database", 200, command_getvariable) ||
command_add("gi", nullptr,200, command_giveitem) ||
command_add("ginfo", "- get group info on target.", 20, command_ginfo) || command_add("ginfo", "- get group info on target.", 20, command_ginfo) ||
command_add("giveitem", "[itemid] [charges] - Summon an item onto your target's cursor. Charges are optional.", 200, command_giveitem) || command_add("giveitem", "[itemid] [charges] - Summon an item onto your target's cursor. Charges are optional.", 200, command_giveitem) ||
command_add("givemoney", "[pp] [gp] [sp] [cp] - Gives specified amount of money to the target player.", 200, command_givemoney) || command_add("givemoney", "[pp] [gp] [sp] [cp] - Gives specified amount of money to the target player.", 200, command_givemoney) ||
command_add("globalview", "Lists all qglobals in cache if you were to do a quest with this target.", 80, command_globalview) || command_add("globalview", "Lists all qglobals in cache if you were to do a quest with this target.", 80, command_globalview) ||
command_add("gm", "- Turn player target's or your GM flag on or off", 80, command_gm) || command_add("gm", "- Turn player target's or your GM flag on or off", 80, command_gm) ||
command_add("gmhideme", nullptr,0, command_hideme) ||
command_add("gmspeed", "[on/off] - Turn GM speed hack on/off for you or your player target", 100, command_gmspeed) || command_add("gmspeed", "[on/off] - Turn GM speed hack on/off for you or your player target", 100, command_gmspeed) ||
command_add("goto", "[x] [y] [z] - Teleport to the provided coordinates or to your target", 10, command_goto) || command_add("goto", "[x] [y] [z] - Teleport to the provided coordinates or to your target", 10, command_goto) ||
command_add("grid", "[add/delete] [grid_num] [wandertype] [pausetype] - Create/delete a wandering grid", 170, command_grid) || command_add("grid", "[add/delete] [grid_num] [wandertype] [pausetype] - Create/delete a wandering grid", 170, command_grid) ||
@ -243,7 +220,6 @@ int command_init(void) {
command_add("guildapprove", "[guildapproveid] - Approve a guild with specified ID (guild creator receives the id)", 0, command_guildapprove) || command_add("guildapprove", "[guildapproveid] - Approve a guild with specified ID (guild creator receives the id)", 0, command_guildapprove) ||
command_add("guildcreate", "[guildname] - Creates an approval setup for guild name specified", 0, command_guildcreate) || command_add("guildcreate", "[guildname] - Creates an approval setup for guild name specified", 0, command_guildcreate) ||
command_add("guildlist", "[guildapproveid] - Lists character names who have approved the guild specified by the approve id", 0, command_guildlist) || command_add("guildlist", "[guildapproveid] - Lists character names who have approved the guild specified by the approve id", 0, command_guildlist) ||
command_add("guilds", nullptr,0, command_guild) ||
command_add("hair", "- Change the hair style of your target", 80, command_hair) || command_add("hair", "- Change the hair style of your target", 80, command_hair) ||
command_add("haircolor", "- Change the hair color of your target", 80, command_haircolor) || command_add("haircolor", "- Change the hair color of your target", 80, command_haircolor) ||
command_add("haste", "[percentage] - Set your haste percentage", 100, command_haste) || command_add("haste", "[percentage] - Set your haste percentage", 100, command_haste) ||
@ -254,7 +230,6 @@ int command_init(void) {
command_add("heritage", "- Change the heritage of your target (Drakkin Only)", 80, command_heritage) || command_add("heritage", "- Change the heritage of your target (Drakkin Only)", 80, command_heritage) ||
command_add("heromodel", "[hero model] [slot] - Full set of Hero's Forge Armor appearance. If slot is set, sends exact model just to slot.", 200, command_heromodel) || command_add("heromodel", "[hero model] [slot] - Full set of Hero's Forge Armor appearance. If slot is set, sends exact model just to slot.", 200, command_heromodel) ||
command_add("hideme", "[on/off] - Hide yourself from spawn lists.", 80, command_hideme) || command_add("hideme", "[on/off] - Hide yourself from spawn lists.", 80, command_hideme) ||
command_add("hm", "[hero model] [slot] - Full set of Hero's Forge Armor appearance. If slot is set, sends exact model just to slot.)", 200, command_heromodel) ||
command_add("hotfix", "[hotfix_name] - Reloads shared memory into a hotfix, equiv to load_shared_memory followed by apply_shared_memory", 250, command_hotfix) || command_add("hotfix", "[hotfix_name] - Reloads shared memory into a hotfix, equiv to load_shared_memory followed by apply_shared_memory", 250, command_hotfix) ||
command_add("hp", "- Refresh your HP bar from the server.", 0, command_hp) || command_add("hp", "- Refresh your HP bar from the server.", 0, command_hp) ||
command_add("incstat", "- Increases or Decreases a client's stats permanently.", 200, command_incstat) || command_add("incstat", "- Increases or Decreases a client's stats permanently.", 200, command_incstat) ||
@ -262,8 +237,7 @@ int command_init(void) {
command_add("interrogateinv", "- use [help] argument for available options", 0, command_interrogateinv) || command_add("interrogateinv", "- use [help] argument for available options", 0, command_interrogateinv) ||
command_add("interrupt", "[message id] [color] - Interrupt your casting. Arguments are optional.", 50, command_interrupt) || command_add("interrupt", "[message id] [color] - Interrupt your casting. Arguments are optional.", 50, command_interrupt) ||
command_add("invsnapshot", "- Takes an inventory snapshot of your current target", 80, command_invsnapshot) || command_add("invsnapshot", "- Takes an inventory snapshot of your current target", 80, command_invsnapshot) ||
command_add("invul", nullptr,0, command_invul) || command_add("invul", "[on/off] - Turn player target's or your invulnerable flag on or off", 80, command_invul) ||
command_add("invulnerable", "[on/off] - Turn player target's or your invulnerable flag on or off", 80, command_invul) ||
command_add("ipban", "[IP address] - Ban IP by character name", 200, command_ipban) || command_add("ipban", "[IP address] - Ban IP by character name", 200, command_ipban) ||
command_add("iplookup", "[charname] - Look up IP address of charname", 200, command_iplookup) || command_add("iplookup", "[charname] - Look up IP address of charname", 200, command_iplookup) ||
command_add("iteminfo", "- Get information about the item on your cursor", 10, command_iteminfo) || command_add("iteminfo", "- Get information about the item on your cursor", 10, command_iteminfo) ||
@ -279,10 +253,9 @@ int command_init(void) {
command_add("lock", "- Lock the worldserver", 150, command_lock) || command_add("lock", "- Lock the worldserver", 150, command_lock) ||
command_add("logs", "Manage anything to do with logs", 250, command_logs) || command_add("logs", "Manage anything to do with logs", 250, command_logs) ||
command_add("logtest", "Performs log performance testing.", 250, command_logtest) || command_add("logtest", "Performs log performance testing.", 250, command_logtest) ||
command_add("los", nullptr,0, command_checklos) ||
command_add("makepet", "[level] [class] [race] [texture] - Make a pet", 50, command_makepet) || command_add("makepet", "[level] [class] [race] [texture] - Make a pet", 50, command_makepet) ||
command_add("mana", "- Fill your or your target's mana", 50, command_mana) || command_add("mana", "- Fill your or your target's mana", 50, command_mana) ||
command_add("maxskills", "Maxes skills for you.", 200, command_max_all_skills) || command_add("maxskills", "Maxes skills for you.", 200, command_max_all_skills) ||
command_add("memspell", "[slotid] [spellid] - Memorize spellid in the specified slot", 50, command_memspell) || command_add("memspell", "[slotid] [spellid] - Memorize spellid in the specified slot", 50, command_memspell) ||
command_add("merchant_close_shop", "Closes a merchant shop", 100, command_merchantcloseshop) || command_add("merchant_close_shop", "Closes a merchant shop", 100, command_merchantcloseshop) ||
command_add("merchant_open_shop", "Opens a merchants shop", 100, command_merchantopenshop) || command_add("merchant_open_shop", "Opens a merchants shop", 100, command_merchantopenshop) ||
@ -291,7 +264,7 @@ int command_init(void) {
command_add("movechar", "[charname] [zonename] - Move charname to zonename", 50, command_movechar) || command_add("movechar", "[charname] [zonename] - Move charname to zonename", 50, command_movechar) ||
command_add("myskills", "- Show details about your current skill levels", 0, command_myskills) || command_add("myskills", "- Show details about your current skill levels", 0, command_myskills) ||
command_add("mysqltest", "Akkadius MySQL Bench Test", 250, command_mysqltest) || command_add("mysqltest", "Akkadius MySQL Bench Test", 250, command_mysqltest) ||
command_add("mysql", "Mysql CLI, see 'help' for options.", 250, command_mysql) || command_add("mysql", "Mysql CLI, see 'help' for options.", 250, command_mysql) ||
command_add("mystats", "- Show details about you or your pet", 50, command_mystats) || command_add("mystats", "- Show details about you or your pet", 50, command_mystats) ||
command_add("name", "[newname] - Rename your player target", 150, command_name) || command_add("name", "[newname] - Rename your player target", 150, command_name) ||
command_add("netstats", "- Gets the network stats for a stream.", 200, command_netstats) || command_add("netstats", "- Gets the network stats for a stream.", 200, command_netstats) ||
@ -302,8 +275,6 @@ int command_init(void) {
command_add("npcsay", "[message] - Make your NPC target say a message.", 150, command_npcsay) || command_add("npcsay", "[message] - Make your NPC target say a message.", 150, command_npcsay) ||
command_add("npcshout", "[message] - Make your NPC target shout a message.", 150, command_npcshout) || command_add("npcshout", "[message] - Make your NPC target shout a message.", 150, command_npcshout) ||
command_add("npcspawn", "[create/add/update/remove/delete] - Manipulate spawn DB", 170, command_npcspawn) || command_add("npcspawn", "[create/add/update/remove/delete] - Manipulate spawn DB", 170, command_npcspawn) ||
command_add("npcspecialatk", nullptr,0, command_npcspecialattk) ||
command_add("npcspecialattack", nullptr,0, command_npcspecialattk) ||
command_add("npcspecialattk", "[flagchar] [perm] - Set NPC special attack flags. Flags are E(nrage) F(lurry) R(ampage) S(ummon).", 80, command_npcspecialattk) || command_add("npcspecialattk", "[flagchar] [perm] - Set NPC special attack flags. Flags are E(nrage) F(lurry) R(ampage) S(ummon).", 80, command_npcspecialattk) ||
command_add("npcstats", "- Show stats about target NPC", 80, command_npcstats) || command_add("npcstats", "- Show stats about target NPC", 80, command_npcstats) ||
command_add("npctype_cache", "[id] or all - Clears the npc type cache for either the id or all npcs.", 250, command_npctype_cache) || command_add("npctype_cache", "[id] or all - Clears the npc type cache for either the id or all npcs.", 250, command_npctype_cache) ||
@ -313,7 +284,11 @@ int command_init(void) {
command_add("object", "List|Add|Edit|Move|Rotate|Copy|Save|Undo|Delete - Manipulate static and tradeskill objects within the zone", 100, command_object) || command_add("object", "List|Add|Edit|Move|Rotate|Copy|Save|Undo|Delete - Manipulate static and tradeskill objects within the zone", 100, command_object) ||
command_add("oocmute", "[1/0] - Mutes OOC chat", 200, command_oocmute) || command_add("oocmute", "[1/0] - Mutes OOC chat", 200, command_oocmute) ||
command_add("opcode", "- opcode management", 250, command_opcode) || command_add("opcode", "- opcode management", 250, command_opcode) ||
command_add("open_shop", nullptr, 100, command_merchantopenshop) ||
#ifdef PACKET_PROFILER
command_add("packetprofile", "- Dump packet profile for target or self.", 250, command_packetprofile) ||
#endif
command_add("path", "- view and edit pathing", 200, command_path) || command_add("path", "- view and edit pathing", 200, command_path) ||
command_add("peekinv", "[worn/inv/cursor/trib/bank/trade/world/all] - Print out contents of your player target's inventory", 100, command_peekinv) || command_add("peekinv", "[worn/inv/cursor/trib/bank/trade/world/all] - Print out contents of your player target's inventory", 100, command_peekinv) ||
command_add("peqzone", "[zonename] - Go to specified zone, if you have > 75% health", 0, command_peqzone) || command_add("peqzone", "[zonename] - Go to specified zone, if you have > 75% health", 0, command_peqzone) ||
@ -323,9 +298,15 @@ int command_init(void) {
command_add("petitioninfo", "[petition number] - Get info about a petition", 20, command_petitioninfo) || command_add("petitioninfo", "[petition number] - Get info about a petition", 20, command_petitioninfo) ||
command_add("pf", "- Display additional mob coordinate and wandering data", 0, command_pf) || command_add("pf", "- Display additional mob coordinate and wandering data", 0, command_pf) ||
command_add("picklock", "Analog for ldon pick lock for the newer clients since we still don't have it working.", 0, command_picklock) || command_add("picklock", "Analog for ldon pick lock for the newer clients since we still don't have it working.", 0, command_picklock) ||
#ifdef EQPROFILE
command_add("profiledump", "- Dump profiling info to logs", 250, command_profiledump) ||
command_add("profilereset", "- Reset profiling info", 250, command_profilereset) ||
#endif
command_add("pvp", "[on/off] - Set your or your player target's PVP status", 100, command_pvp) || command_add("pvp", "[on/off] - Set your or your player target's PVP status", 100, command_pvp) ||
command_add("qglobal", "[on/off/view] - Toggles qglobal functionality on an NPC", 100, command_qglobal) || command_add("qglobal", "[on/off/view] - Toggles qglobal functionality on an NPC", 100, command_qglobal) ||
command_add("questerrors", "Shows quest errors.", 100, command_questerrors) || command_add("questerrors", "Shows quest errors.", 100, command_questerrors) ||
command_add("race", "[racenum] - Change your or your target's race. Use racenum 0 to return to normal", 50, command_race) || command_add("race", "[racenum] - Change your or your target's race. Use racenum 0 to return to normal", 50, command_race) ||
command_add("raidloot", "LEADER|GROUPLEADER|SELECTED|ALL - Sets your raid loot settings if you have permission to do so.", 0, command_raidloot) || command_add("raidloot", "LEADER|GROUPLEADER|SELECTED|ALL - Sets your raid loot settings if you have permission to do so.", 0, command_raidloot) ||
command_add("randomfeatures", "- Temporarily randomizes the Facial Features of your target", 80, command_randomfeatures) || command_add("randomfeatures", "- Temporarily randomizes the Facial Features of your target", 80, command_randomfeatures) ||
@ -333,41 +314,32 @@ int command_init(void) {
command_add("reloadaa", "Reloads AA data", 200, command_reloadaa) || command_add("reloadaa", "Reloads AA data", 200, command_reloadaa) ||
command_add("reloadallrules", "Executes a reload of all rules.", 80, command_reloadallrules) || command_add("reloadallrules", "Executes a reload of all rules.", 80, command_reloadallrules) ||
command_add("reloademote", "Reloads NPC Emotes", 80, command_reloademote) || command_add("reloademote", "Reloads NPC Emotes", 80, command_reloademote) ||
command_add("reloadlevelmods", nullptr,255, command_reloadlevelmods) || command_add("reloadlevelmods", nullptr, 255, command_reloadlevelmods) ||
command_add("reloadperlexportsettings", nullptr, 255, command_reloadperlexportsettings) || command_add("reloadperlexportsettings", nullptr, 255, command_reloadperlexportsettings) ||
command_add("reloadqst", " - Clear quest cache (any argument causes it to also stop all timers)", 150, command_reloadqst) || command_add("reloadqst", " - Clear quest cache (any argument causes it to also stop all timers)", 150, command_reloadqst) ||
command_add("reloadquest", " - Clear quest cache (any argument causes it to also stop all timers)", 150, command_reloadqst) ||
command_add("reloadrulesworld", "Executes a reload of all rules in world specifically.", 80, command_reloadworldrules) || command_add("reloadrulesworld", "Executes a reload of all rules in world specifically.", 80, command_reloadworldrules) ||
command_add("reloadstatic", "- Reload Static Zone Data", 150, command_reloadstatic) || command_add("reloadstatic", "- Reload Static Zone Data", 150, command_reloadstatic) ||
command_add("reloadtitles", "- Reload player titles from the database", 150, command_reloadtitles) || command_add("reloadtitles", "- Reload player titles from the database", 150, command_reloadtitles) ||
command_add("reloadworld", "[0|1] - Clear quest cache (0 - no repop, 1 - repop)", 255, command_reloadworld) || command_add("reloadworld", "[0|1] - Clear quest cache (0 - no repop, 1 - repop)", 255, command_reloadworld) ||
command_add("reloadzonepoints", "- Reload zone points from database", 150, command_reloadzps) || command_add("reloadzps", "- Reload zone points from database", 150, command_reloadzps) ||
command_add("reloadzps", nullptr,0, command_reloadzps) ||
command_add("repop", "[delay] - Repop the zone with optional delay", 100, command_repop) || command_add("repop", "[delay] - Repop the zone with optional delay", 100, command_repop) ||
command_add("repopclose", "[distance in units] Repops only NPC's nearby for fast development purposes", 100, command_repopclose) || command_add("repopclose", "[distance in units] Repops only NPC's nearby for fast development purposes", 100, command_repopclose) ||
command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, may disconnect player.", 200, command_resetaa) || command_add("resetaa", "- Resets a Player's AA in their profile and refunds spent AA's to unspent, may disconnect player.", 200, command_resetaa) ||
command_add("resetaa_timer", "Command to reset AA cooldown timers.", 200, command_resetaa_timer) || command_add("resetaa_timer", "Command to reset AA cooldown timers.", 200, command_resetaa_timer) ||
command_add("revoke", "[charname] [1/0] - Makes charname unable to talk on OOC", 200, command_revoke) || command_add("revoke", "[charname] [1/0] - Makes charname unable to talk on OOC", 200, command_revoke) ||
command_add("rq", nullptr, 150, command_reloadqst) || command_add("rules", "(subcommand) - Manage server rules", 250, command_rules) ||
command_add("rules", "(subcommand) - Manage server rules", 250, command_rules) ||
command_add("save", "- Force your player or player corpse target to be saved to the database", 50, command_save) || command_add("save", "- Force your player or player corpse target to be saved to the database", 50, command_save) ||
command_add("scribespell", "[spellid] - Scribe specified spell in your target's spell book.", 180, command_scribespell) || command_add("scribespell", "[spellid] - Scribe specified spell in your target's spell book.", 180, command_scribespell) ||
command_add("scribespells", "[max level] [min level] - Scribe all spells for you or your player target that are usable by them, up to level specified. (may freeze client for a few seconds)", 150, command_scribespells) || command_add("scribespells", "[max level] [min level] - Scribe all spells for you or your player target that are usable by them, up to level specified. (may freeze client for a few seconds)", 150, command_scribespells) ||
command_add("search", nullptr,10, command_itemsearch) ||
command_add("sendzonespawns", "- Refresh spawn list for all clients in zone", 150, command_sendzonespawns) || command_add("sendzonespawns", "- Refresh spawn list for all clients in zone", 150, command_sendzonespawns) ||
command_add("sensetrap", "Analog for ldon sense trap for the newer clients since we still don't have it working.", 0, command_sensetrap) || command_add("sensetrap", "Analog for ldon sense trap for the newer clients since we still don't have it working.", 0, command_sensetrap) ||
command_add("serverinfo", "- Get OS info about server host", 200, command_serverinfo) || command_add("serverinfo", "- Get OS info about server host", 200, command_serverinfo) ||
command_add("serverrules", "- Read this server's rules", 0, command_serverrules) || command_add("serverrules", "- Read this server's rules", 0, command_serverrules) ||
command_add("setaaexp", nullptr,0, command_setaaxp) ||
command_add("setaapoints", nullptr,0, command_setaapts) ||
command_add("setaapts", "[value] - Set your or your player target's available AA points", 100, command_setaapts) || command_add("setaapts", "[value] - Set your or your player target's available AA points", 100, command_setaapts) ||
command_add("setaaxp", "[value] - Set your or your player target's AA experience", 100, command_setaaxp) || command_add("setaaxp", "[value] - Set your or your player target's AA experience", 100, command_setaaxp) ||
command_add("setadventurepoints", "- Set your or your player target's available adventure points", 150, command_set_adventure_points) || command_add("setadventurepoints", "- Set your or your player target's available adventure points", 150, command_set_adventure_points) ||
command_add("setallskill", nullptr,0, command_setskillall) ||
command_add("setallskills", nullptr,0, command_setskillall) ||
command_add("setanim", "[animnum] - Set target's appearance to animnum", 200, command_setanim) || command_add("setanim", "[animnum] - Set target's appearance to animnum", 200, command_setanim) ||
command_add("setcrystals", "[value] - Set your or your player target's available radiant or ebon crystals", 100, command_setcrystals) || command_add("setcrystals", "[value] - Set your or your player target's available radiant or ebon crystals", 100, command_setcrystals) ||
command_add("setexp", nullptr,0, command_setxp) ||
command_add("setfaction", "[faction number] - Sets targeted NPC's faction in the database", 170, command_setfaction) || command_add("setfaction", "[faction number] - Sets targeted NPC's faction in the database", 170, command_setfaction) ||
command_add("setgraveyard", "[zone name] - Creates a graveyard for the specified zone based on your target's LOC.", 200, command_setgraveyard) || command_add("setgraveyard", "[zone name] - Creates a graveyard for the specified zone based on your target's LOC.", 200, command_setgraveyard) ||
command_add("setlanguage", "[language ID] [value] - Set your target's language skillnum to value", 50, command_setlanguage) || command_add("setlanguage", "[language ID] [value] - Set your target's language skillnum to value", 50, command_setlanguage) ||
@ -386,13 +358,11 @@ int command_init(void) {
command_add("showspellslist", "Shows spell list of targeted NPC", 100, command_showspellslist) || command_add("showspellslist", "Shows spell list of targeted NPC", 100, command_showspellslist) ||
command_add("showstats", "- Show details about you or your target", 50, command_showstats) || command_add("showstats", "- Show details about you or your target", 50, command_showstats) ||
command_add("shutdown", "- Shut this zone process down", 150, command_shutdown) || command_add("shutdown", "- Shut this zone process down", 150, command_shutdown) ||
command_add("si", nullptr,200, command_summonitem) ||
command_add("size", "[size] - Change size of you or your target", 50, command_size) || command_add("size", "[size] - Change size of you or your target", 50, command_size) ||
command_add("spawn", "[name] [race] [level] [material] [hp] [gender] [class] [priweapon] [secweapon] [merchantid] - Spawn an NPC", 10, command_spawn) || command_add("spawn", "[name] [race] [level] [material] [hp] [gender] [class] [priweapon] [secweapon] [merchantid] - Spawn an NPC", 10, command_spawn) ||
command_add("spawnfix", "- Find targeted NPC in database based on its X/Y/heading and update the database to make it spawn at your current location/heading.", 170, command_spawnfix) || command_add("spawnfix", "- Find targeted NPC in database based on its X/Y/heading and update the database to make it spawn at your current location/heading.", 170, command_spawnfix) ||
command_add("spawnstatus", "- Show respawn timer status", 100, command_spawnstatus) || command_add("spawnstatus", "- Show respawn timer status", 100, command_spawnstatus) ||
command_add("spellinfo", "[spellid] - Get detailed info about a spell", 10, command_spellinfo) || command_add("spellinfo", "[spellid] - Get detailed info about a spell", 10, command_spellinfo) ||
command_add("spfind", nullptr,0, command_findspell) ||
command_add("spoff", "- Sends OP_ManaChange", 80, command_spoff) || command_add("spoff", "- Sends OP_ManaChange", 80, command_spoff) ||
command_add("spon", "- Sends OP_MemorizeSpell", 80, command_spon) || command_add("spon", "- Sends OP_MemorizeSpell", 80, command_spon) ||
command_add("stun", "[duration] - Stuns you or your target for duration", 100, command_stun) || command_add("stun", "[duration] - Stuns you or your target for duration", 100, command_stun) ||
@ -414,7 +384,7 @@ int command_init(void) {
command_add("undyeme", "- Remove dye from all of your armor slots", 0, command_undyeme) || command_add("undyeme", "- Remove dye from all of your armor slots", 0, command_undyeme) ||
command_add("unfreeze", "- Unfreeze your target", 80, command_unfreeze) || command_add("unfreeze", "- Unfreeze your target", 80, command_unfreeze) ||
command_add("unlock", "- Unlock the worldserver", 150, command_unlock) || command_add("unlock", "- Unlock the worldserver", 150, command_unlock) ||
command_add("unscribespell", "[spellid] - Unscribe specified spell from your target's spell book.", 180, command_unscribespell) || command_add("unscribespell", "[spellid] - Unscribe specified spell from your target's spell book.", 180, command_unscribespell) ||
command_add("unscribespells", "- Clear out your or your player target's spell book.", 180, command_unscribespells) || command_add("unscribespells", "- Clear out your or your player target's spell book.", 180, command_unscribespells) ||
command_add("untraindisc", "[spellid] - Untrain specified discipline from your target.", 180, command_untraindisc) || command_add("untraindisc", "[spellid] - Untrain specified discipline from your target.", 180, command_untraindisc) ||
command_add("untraindiscs", "- Untrains all disciplines from your target.", 180, command_untraindiscs) || command_add("untraindiscs", "- Untrains all disciplines from your target.", 180, command_untraindiscs) ||
@ -446,27 +416,38 @@ int command_init(void) {
command_add("zstats", "- Show info about zone header", 80, command_zstats) || command_add("zstats", "- Show info about zone header", 80, command_zstats) ||
command_add("zunderworld", "[zcoord] - Sets the underworld using zcoord", 80, command_zunderworld) || command_add("zunderworld", "[zcoord] - Sets the underworld using zcoord", 80, command_zunderworld) ||
command_add("zuwcoords", "[z coord] - Set underworld coord", 80, command_zuwcoords) command_add("zuwcoords", "[z coord] - Set underworld coord", 80, command_zuwcoords)
) ) {
{
command_deinit(); command_deinit();
return -1; return -1;
} }
std::map<std::string, CommandRecord *>::iterator cur,end; std::map<std::string, std::pair<uint8, std::vector<std::string>>> command_settings;
cur = commandlist.begin();
end = commandlist.end();
std::map<std::string,uint8> command_settings;
std::map<std::string,uint8>::iterator itr;
database.GetCommandSettings(command_settings); database.GetCommandSettings(command_settings);
for(; cur != end; ++cur) { for (std::map<std::string, CommandRecord *>::iterator iter_cl = commandlist.begin(); iter_cl != commandlist.end(); ++iter_cl) {
if ((itr=command_settings.find(cur->first))!=command_settings.end()) { std::map<std::string, std::pair<uint8, std::vector<std::string>>>::iterator iter_cs = command_settings.find(iter_cl->first);
cur->second->access = itr->second; if (iter_cs == command_settings.end()) {
Log.Out(Logs::General, Logs::Commands, "command_init(): - Command '%s' set to access level %d.", cur->first.c_str(), itr->second); if (iter_cl->second->access == 0)
Log.Out(Logs::General, Logs::Commands, "command_init(): Warning: Command '%s' defaulting to access level 0!", iter_cl->first.c_str());
continue;
} }
else
{ iter_cl->second->access = iter_cs->second.first;
if(cur->second->access == 0) Log.Out(Logs::General, Logs::Commands, "command_init(): - Command '%s' set to access level %d.", iter_cl->first.c_str(), iter_cs->second.first);
Log.Out(Logs::General, Logs::Commands, "command_init(): Warning: Command '%s' defaulting to access level 0!" , cur->first.c_str()); if (iter_cs->second.second.empty())
continue;
for (std::vector<std::string>::iterator iter_aka = iter_cs->second.second.begin(); iter_aka != iter_cs->second.second.end(); ++iter_aka) {
if (iter_aka->empty())
continue;
if (commandlist.find(*iter_aka) != commandlist.end()) {
Log.Out(Logs::General, Logs::Commands, "command_init(): Warning: Alias '%s' already exists as a command - skipping!", iter_aka->c_str());
continue;
}
commandlist[*iter_aka] = iter_cl->second;
commandaliases[*iter_aka] = iter_cl->first;
Log.Out(Logs::General, Logs::Commands, "command_init(): - Alias '%s' added to command '%s'.", iter_aka->c_str(), commandaliases[*iter_aka].c_str());
} }
} }
@ -486,6 +467,7 @@ int command_init(void) {
void command_deinit(void) void command_deinit(void)
{ {
commandlist.clear(); commandlist.clear();
commandaliases.clear();
command_dispatch = command_notavail; command_dispatch = command_notavail;
commandcount = 0; commandcount = 0;
@ -496,53 +478,43 @@ void command_deinit(void)
* adds a command to the command list; used by command_init * adds a command to the command list; used by command_init
* *
* Parameters: * Parameters:
* command_string - the command ex: "spawn" * command_name - the command ex: "spawn"
* desc - text description of command for #help * desc - text description of command for #help
* access - default access level required to use command * access - default access level required to use command
* function - pointer to function that handles command * function - pointer to function that handles command
* *
*/ */
int command_add(const char *command_string, const char *desc, int access, CmdFuncPtr function) int command_add(std::string command_name, const char *desc, int access, CmdFuncPtr function)
{ {
if(function == nullptr) if (command_name.empty()) {
return(-1); Log.Out(Logs::General, Logs::Error, "command_add() - Command added with empty name string - check command.cpp.");
return -1;
std::string cstr(command_string);
if(commandlist.count(cstr) != 0) {
Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' is a duplicate - check command.cpp." , command_string);
return(-1);
} }
if (function == nullptr) {
//look for aliases... Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' added without a valid function pointer - check command.cpp.", command_name.c_str());
std::map<std::string, CommandRecord *>::iterator cur,end,del; return -1;
cur = commandlist.begin(); }
end = commandlist.end(); if (commandlist.count(command_name) != 0) {
for(; cur != end; ++cur) { Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' is a duplicate command name - check command.cpp.", command_name.c_str());
if(cur->second->function == function) { return -1;
int r; }
for(r = 1; r < CMDALIASES; r++) { for (std::map<std::string, CommandRecord *>::iterator iter = commandlist.begin(); iter != commandlist.end(); ++iter) {
if(cur->second->command[r] == nullptr) { if (iter->second->function != function)
cur->second->command[r] = command_string; continue;
break; Log.Out(Logs::General, Logs::Error, "command_add() - Command '%s' equates to an alias of '%s' - check command.cpp.", command_name.c_str(), iter->first.c_str());
} return -1;
}
commandlist[cstr] = cur->second;
return(0);
}
} }
CommandRecord *c = new CommandRecord; CommandRecord *c = new CommandRecord;
cleanup_commandlist.Append(c);
c->desc = desc;
c->access = access; c->access = access;
c->desc = desc;
c->function = function; c->function = function;
memset(c->command, 0, sizeof(c->command));
c->command[0] = command_string;
commandlist[cstr] = c;
commandlist[command_name] = c;
commandaliases[command_name] = command_name;
cleanup_commandlist.Append(c);
commandcount++; commandcount++;
return 0; return 0;
} }

View File

@ -25,324 +25,311 @@ class Seperator;
#include "../common/types.h" #include "../common/types.h"
#define COMMAND_CHAR '#' #define COMMAND_CHAR '#'
#define CMDALIASES 5
typedef void (*CmdFuncPtr)(Client *,const Seperator *); typedef void (*CmdFuncPtr)(Client *,const Seperator *);
// this is a command list item
/*struct cl_struct
{
char *command[CMDALIASES]; // the command(s)
char *desc; // description of command
CmdFuncPtr function; // the function to call
int access; // the required 'status' level
struct cl_struct *next; // linked list
};
extern struct cl_struct *commandlist; // the head of the list
*/
typedef struct { typedef struct {
const char *command[CMDALIASES]; // the command(s)
int access; int access;
const char *desc; // description of command const char *desc; // description of command
CmdFuncPtr function; //null means perl function CmdFuncPtr function; // null means perl function
} CommandRecord; } CommandRecord;
extern int (*command_dispatch)(Client *,char const*); extern int (*command_dispatch)(Client *,char const*);
extern int commandcount; // number of commands loaded extern int commandcount; // number of commands loaded
// the command system: // the command system:
int command_init(void); int command_init(void);
void command_deinit(void); void command_deinit(void);
int command_add(const char *command_string, const char *desc, int access, CmdFuncPtr function); int command_add(std::string command_name, const char *desc, int access, CmdFuncPtr function);
int command_notavail(Client *c, const char *message); int command_notavail(Client *c, const char *message);
int command_realdispatch(Client *c, char const *message); int command_realdispatch(Client *c, char const *message);
void command_logcommand(Client *c, const char *message); void command_logcommand(Client *c, const char *message);
//commands //commands
void command_resetaa(Client* c,const Seperator *sep); void command_acceptrules(Client *c, const Seperator *sep);
void command_bind(Client* c,const Seperator *sep); void command_advnpcspawn(Client *c, const Seperator *sep);
void command_sendop(Client *c, const Seperator *sep); void command_aggro(Client *c, const Seperator *sep);
void command_optest(Client *c, const Seperator *sep); void command_aggrozone(Client *c, const Seperator *sep);
void command_setstat(Client *c, const Seperator *sep);
void command_incstat(Client *c, const Seperator *sep);
void command_help(Client *c, const Seperator *sep);
void command_version(Client *c, const Seperator *sep);
void command_setfaction(Client *c, const Seperator *sep);
void command_serversidename(Client *c, const Seperator *sep);
void command_testspawnkill(Client *c, const Seperator *sep);
void command_testspawn(Client *c, const Seperator *sep);
void command_wc(Client *c, const Seperator *sep);
void command_heromodel(Client *c, const Seperator *sep);
void command_numauths(Client *c, const Seperator *sep);
void command_setanim(Client *c, const Seperator *sep);
void command_connectworldserver(Client *c, const Seperator *sep);
void command_serverinfo(Client *c, const Seperator *sep);
void command_crashtest(Client *c, const Seperator *sep);
void command_getvariable(Client *c, const Seperator *sep);
void command_chat(Client *c, const Seperator *sep);
void command_showpetspell(Client *c, const Seperator *sep);
void command_ipc(Client *c, const Seperator *sep);
void command_npcloot(Client *c, const Seperator *sep);
void command_gm(Client *c, const Seperator *sep);
void command_summon(Client *c, const Seperator *sep);
void command_zone(Client *c, const Seperator *sep);
void command_zone_instance(Client *c, const Seperator *sep);
void command_peqzone(Client *c, const Seperator *sep);
void command_showbuffs(Client *c, const Seperator *sep);
void command_movechar(Client *c, const Seperator *sep);
void command_viewpetition(Client *c, const Seperator *sep);
void command_petitioninfo(Client *c, const Seperator *sep);
void command_delpetition(Client *c, const Seperator *sep);
void command_listnpcs(Client *c, const Seperator *sep);
void command_date(Client *c, const Seperator *sep);
void command_timezone(Client *c, const Seperator *sep);
void command_synctod(Client *c, const Seperator *sep);
void command_invul(Client *c, const Seperator *sep);
void command_hideme(Client *c, const Seperator *sep);
void command_emote(Client *c, const Seperator *sep);
void command_fov(Client *c, const Seperator *sep);
void command_manastat(Client *c, const Seperator *sep);
void command_npcstats(Client *c, const Seperator *sep);
void command_zclip(Client *c, const Seperator *sep);
void command_npccast(Client *c, const Seperator *sep);
void command_zstats(Client *c, const Seperator *sep);
void command_permaclass(Client *c, const Seperator *sep);
void command_permarace(Client *c, const Seperator *sep);
void command_permagender(Client *c, const Seperator *sep);
void command_weather(Client *c, const Seperator *sep);
void command_zheader(Client *c, const Seperator *sep);
void command_zsky(Client *c, const Seperator *sep);
void command_zcolor(Client *c, const Seperator *sep);
void command_spon(Client *c, const Seperator *sep);
void command_spoff(Client *c, const Seperator *sep);
void command_itemtest(Client *c, const Seperator *sep);
void command_gassign(Client *c, const Seperator *sep);
void command_ai(Client *c, const Seperator *sep); void command_ai(Client *c, const Seperator *sep);
void command_worldshutdown(Client *c, const Seperator *sep);
void command_sendzonespawns(Client *c, const Seperator *sep);
void command_zsave(Client *c, const Seperator *sep);
void command_dbspawn2(Client *c, const Seperator *sep);
void command_shutdown(Client *c, const Seperator *sep);
void command_delacct(Client *c, const Seperator *sep);
void command_setpass(Client *c, const Seperator *sep);
void command_setlsinfo(Client *c, const Seperator *sep);
void command_grid(Client *c, const Seperator *sep);
void command_wp(Client *c, const Seperator *sep);
void command_iplookup(Client *c, const Seperator *sep);
void command_size(Client *c, const Seperator *sep);
void command_mana(Client *c, const Seperator *sep);
void command_flymode(Client *c, const Seperator *sep);
void command_showskills(Client *c, const Seperator *sep);
void command_findspell(Client *c, const Seperator *sep);
void command_castspell(Client *c, const Seperator *sep);
void command_setlanguage(Client *c, const Seperator *sep);
void command_setskill(Client *c, const Seperator *sep);
void command_setskillall(Client *c, const Seperator *sep);
void command_race(Client *c, const Seperator *sep);
void command_gender(Client *c, const Seperator *sep);
void command_makepet(Client *c, const Seperator *sep);
void command_level(Client *c, const Seperator *sep);
void command_spawn(Client *c, const Seperator *sep);
void command_texture(Client *c, const Seperator *sep);
void command_npctypespawn(Client *c, const Seperator *sep);
void command_heal(Client *c, const Seperator *sep);
void command_appearance(Client *c, const Seperator *sep); void command_appearance(Client *c, const Seperator *sep);
void command_nukeitem(Client *c, const Seperator *sep); void command_apply_shared_memory(Client *c, const Seperator *sep);
void command_peekinv(Client *c, const Seperator *sep);
void command_interrogateinv(Client *c, const Seperator *sep);
void command_invsnapshot(Client *c, const Seperator *sep);
void command_clearinvsnapshots(Client *c, const Seperator *sep);
void command_findnpctype(Client *c, const Seperator *sep);
void command_findzone(Client *c, const Seperator *sep);
void command_viewnpctype(Client *c, const Seperator *sep);
void command_reloadqst(Client *c, const Seperator *sep);
void command_reloadworld(Client *c, const Seperator *sep);
void command_reloadzps(Client *c, const Seperator *sep);
void command_zoneshutdown(Client *c, const Seperator *sep);
void command_zonebootup(Client *c, const Seperator *sep);
void command_kick(Client *c, const Seperator *sep);
void command_attack(Client *c, const Seperator *sep); void command_attack(Client *c, const Seperator *sep);
void command_lock(Client *c, const Seperator *sep); void command_augmentitem(Client *c, const Seperator *sep);
void command_unlock(Client *c, const Seperator *sep); void command_ban(Client *c, const Seperator *sep);
void command_motd(Client *c, const Seperator *sep); void command_beard(Client *c, const Seperator *sep);
void command_listpetition(Client *c, const Seperator *sep); void command_beardcolor(Client *c, const Seperator *sep);
void command_equipitem(Client *c, const Seperator *sep); void command_bind(Client* c, const Seperator *sep);
void command_zonelock(Client *c, const Seperator *sep);
void command_corpse(Client *c, const Seperator *sep);
void command_fixmob(Client *c, const Seperator *sep);
void command_gmspeed(Client *c, const Seperator *sep);
void command_title(Client *c, const Seperator *sep);
void command_titlesuffix(Client *c, const Seperator *sep);
void command_spellinfo(Client *c, const Seperator *sep);
void command_lastname(Client *c, const Seperator *sep);
void command_memspell(Client *c, const Seperator *sep);
void command_save(Client *c, const Seperator *sep);
void command_showstats(Client *c, const Seperator *sep);
void command_mystats(Client *c, const Seperator *sep);
void command_myskills(Client *c, const Seperator *sep);
void command_depop(Client *c, const Seperator *sep);
void command_depopzone(Client *c, const Seperator *sep);
void command_repop(Client *c, const Seperator *sep);
void command_repopclose(Client *c, const Seperator *sep);
void command_spawnstatus(Client *c, const Seperator *sep);
void command_nukebuffs(Client *c, const Seperator *sep);
void command_zuwcoords(Client *c, const Seperator *sep);
void command_zunderworld(Client *c, const Seperator *sep);
void command_zsafecoords(Client *c, const Seperator *sep);
void command_freeze(Client *c, const Seperator *sep);
void command_unfreeze(Client *c, const Seperator *sep);
void command_pvp(Client *c, const Seperator *sep);
void command_setxp(Client *c, const Seperator *sep);
void command_setpvppoints(Client *c, const Seperator *sep);
void command_name(Client *c, const Seperator *sep);
void command_tempname(Client *c, const Seperator *sep);
void command_npcspecialattk(Client *c, const Seperator *sep);
void command_kill(Client *c, const Seperator *sep);
void command_haste(Client *c, const Seperator *sep);
void command_damage(Client *c, const Seperator *sep);
void command_zonespawn(Client *c, const Seperator *sep);
void command_npcspawn(Client *c, const Seperator *sep);
void command_spawnfix(Client *c, const Seperator *sep);
void command_loc(Client *c, const Seperator *sep);
void command_goto(Client *c, const Seperator *sep);
#ifdef BUGTRACK #ifdef BUGTRACK
void command_bug(Client *c, const Seperator *sep); void command_bug(Client *c, const Seperator *sep);
#endif #endif
void command_iteminfo(Client *c, const Seperator *sep);
void command_uptime(Client *c, const Seperator *sep); void command_camerashake(Client *c, const Seperator *sep);
void command_flag(Client *c, const Seperator *sep); void command_castspell(Client *c, const Seperator *sep);
void command_time(Client *c, const Seperator *sep); void command_chat(Client *c, const Seperator *sep);
void command_guild(Client *c, const Seperator *sep); void command_checklos(Client *c, const Seperator *sep);
bool helper_guild_edit(Client *c, uint32 dbid, uint32 eqid, uint8 rank, const char* what, const char* value); void command_clearinvsnapshots(Client *c, const Seperator *sep);
void command_zonestatus(Client *c, const Seperator *sep); void command_connectworldserver(Client *c, const Seperator *sep);
void command_doanim(Client *c, const Seperator *sep); void command_corpse(Client *c, const Seperator *sep);
void command_randomfeatures(Client *c, const Seperator *sep); void command_crashtest(Client *c, const Seperator *sep);
void command_face(Client *c, const Seperator *sep); void command_cvs(Client *c, const Seperator *sep);
void command_helm(Client *c, const Seperator *sep);
void command_hair(Client *c, const Seperator *sep);
void command_haircolor(Client *c, const Seperator *sep);
void command_beard(Client *c, const Seperator *sep);
void command_beardcolor(Client *c, const Seperator *sep);
void command_tattoo(Client *c, const Seperator *sep);
void command_heritage(Client *c, const Seperator *sep);
void command_details(Client *c, const Seperator *sep);
void command_scribespells(Client *c, const Seperator *sep);
void command_unscribespells(Client *c, const Seperator *sep);
void command_wpinfo(Client *c, const Seperator *sep);
void command_wpadd(Client *c, const Seperator *sep);
void command_interrupt(Client *c, const Seperator *sep);
void command_d1(Client *c, const Seperator *sep); void command_d1(Client *c, const Seperator *sep);
void command_summonitem(Client *c, const Seperator *sep); void command_damage(Client *c, const Seperator *sep);
void command_date(Client *c, const Seperator *sep);
void command_dbspawn2(Client *c, const Seperator *sep);
void command_delacct(Client *c, const Seperator *sep);
void command_deletegraveyard(Client *c, const Seperator *sep);
void command_delpetition(Client *c, const Seperator *sep);
void command_depop(Client *c, const Seperator *sep);
void command_depopzone(Client *c, const Seperator *sep);
void command_details(Client *c, const Seperator *sep);
void command_disablerecipe(Client *c, const Seperator *sep);
void command_disarmtrap(Client *c, const Seperator *sep);
void command_distance(Client *c, const Seperator *sep);
void command_doanim(Client *c, const Seperator *sep);
void command_emote(Client *c, const Seperator *sep);
void command_emotesearch(Client* c, const Seperator *sep);
void command_emoteview(Client* c, const Seperator *sep);
void command_enablerecipe(Client *c, const Seperator *sep);
void command_equipitem(Client *c, const Seperator *sep);
void command_face(Client *c, const Seperator *sep);
void command_findnpctype(Client *c, const Seperator *sep);
void command_findspell(Client *c, const Seperator *sep);
void command_findzone(Client *c, const Seperator *sep);
void command_fixmob(Client *c, const Seperator *sep);
void command_flag(Client *c, const Seperator *sep);
void command_flagedit(Client *c, const Seperator *sep);
void command_flags(Client *c, const Seperator *sep);
void command_flymode(Client *c, const Seperator *sep);
void command_fov(Client *c, const Seperator *sep);
void command_freeze(Client *c, const Seperator *sep);
void command_gassign(Client *c, const Seperator *sep);
void command_gender(Client *c, const Seperator *sep);
void command_getplayerburiedcorpsecount(Client *c, const Seperator *sep);
void command_getvariable(Client *c, const Seperator *sep);
void command_ginfo(Client *c, const Seperator *sep);
void command_giveitem(Client *c, const Seperator *sep); void command_giveitem(Client *c, const Seperator *sep);
void command_givemoney(Client *c, const Seperator *sep); void command_givemoney(Client *c, const Seperator *sep);
void command_itemsearch(Client *c, const Seperator *sep); void command_globalview(Client* c, const Seperator *sep);
void command_setaaxp(Client *c, const Seperator *sep); void command_gm(Client *c, const Seperator *sep);
void command_setaapts(Client *c, const Seperator *sep); void command_gmspeed(Client *c, const Seperator *sep);
void command_setcrystals(Client *c, const Seperator *sep); void command_goto(Client *c, const Seperator *sep);
void command_stun(Client *c, const Seperator *sep); void command_grid(Client *c, const Seperator *sep);
void command_ban(Client *c, const Seperator *sep); void command_guild(Client *c, const Seperator *sep);
void command_suspend(Client *c, const Seperator *sep); bool helper_guild_edit(Client *c, uint32 dbid, uint32 eqid, uint8 rank, const char* what, const char* value);
void command_guildapprove(Client *c, const Seperator *sep);
void command_guildcreate(Client *c, const Seperator *sep);
void command_guildlist(Client *c, const Seperator *sep);
void command_hair(Client *c, const Seperator *sep);
void command_haircolor(Client *c, const Seperator *sep);
void command_haste(Client *c, const Seperator *sep);
void command_hatelist(Client *c, const Seperator *sep);
void command_heal(Client *c, const Seperator *sep);
void command_helm(Client *c, const Seperator *sep);
void command_help(Client *c, const Seperator *sep);
void command_heritage(Client *c, const Seperator *sep);
void command_heromodel(Client *c, const Seperator *sep);
void command_hideme(Client *c, const Seperator *sep);
void command_hotfix(Client *c, const Seperator *sep);
void command_hp(Client *c, const Seperator *sep);
void command_incstat(Client *c, const Seperator *sep);
void command_instance(Client *c, const Seperator *sep);
void command_interrogateinv(Client *c, const Seperator *sep);
void command_interrupt(Client *c, const Seperator *sep);
void command_invsnapshot(Client *c, const Seperator *sep);
void command_invul(Client *c, const Seperator *sep);
void command_ipban(Client *c, const Seperator *sep); void command_ipban(Client *c, const Seperator *sep);
void command_oocmute(Client *c, const Seperator *sep); void command_ipc(Client *c, const Seperator *sep);
void command_revoke(Client *c, const Seperator *sep); void command_iplookup(Client *c, const Seperator *sep);
void command_checklos(Client *c, const Seperator *sep); void command_iteminfo(Client *c, const Seperator *sep);
void command_set_adventure_points(Client *c, const Seperator *sep); void command_itemsearch(Client *c, const Seperator *sep);
void command_itemtest(Client *c, const Seperator *sep);
void command_kick(Client *c, const Seperator *sep);
void command_kill(Client *c, const Seperator *sep);
void command_lastname(Client *c, const Seperator *sep);
void command_level(Client *c, const Seperator *sep);
void command_listnpcs(Client *c, const Seperator *sep);
void command_listpetition(Client *c, const Seperator *sep);
void command_load_shared_memory(Client *c, const Seperator *sep);
void command_loc(Client *c, const Seperator *sep);
void command_lock(Client *c, const Seperator *sep);
void command_logs(Client *c, const Seperator *sep);
void command_logtest(Client *c, const Seperator *sep);
void command_makepet(Client *c, const Seperator *sep);
void command_mana(Client *c, const Seperator *sep);
void command_manastat(Client *c, const Seperator *sep);
void command_max_all_skills(Client *c, const Seperator *sep);
void command_memspell(Client *c, const Seperator *sep);
void command_merchantcloseshop(Client *c, const Seperator *sep);
void command_merchantopenshop(Client *c, const Seperator *sep);
void command_modifynpcstat(Client *c, const Seperator *sep);
void command_motd(Client *c, const Seperator *sep);
void command_movechar(Client *c, const Seperator *sep);
void command_myskills(Client *c, const Seperator *sep);
void command_mysql(Client *c, const Seperator *sep);
void command_mysqltest(Client *c, const Seperator *sep);
void command_mystats(Client *c, const Seperator *sep);
void command_name(Client *c, const Seperator *sep);
void command_netstats(Client *c, const Seperator *sep);
void command_npccast(Client *c, const Seperator *sep);
void command_npcedit(Client *c, const Seperator *sep);
void command_npcemote(Client *c, const Seperator *sep);
void command_npcloot(Client *c, const Seperator *sep);
void command_npcsay(Client *c, const Seperator *sep); void command_npcsay(Client *c, const Seperator *sep);
void command_npcshout(Client *c, const Seperator *sep); void command_npcshout(Client *c, const Seperator *sep);
void command_npcemote(Client *c, const Seperator *sep); void command_npcspawn(Client *c, const Seperator *sep);
void command_npcedit(Client *c, const Seperator *sep); void command_npcspecialattk(Client *c, const Seperator *sep);
void command_timers(Client *c, const Seperator *sep); void command_npcstats(Client *c, const Seperator *sep);
void command_undye(Client *c, const Seperator *sep);
void command_undyeme(Client *c, const Seperator *sep);
void command_hp(Client *c, const Seperator *sep);
void command_ginfo(Client *c, const Seperator *sep);
void command_qglobal(Client *c, const Seperator *sep);
void command_path(Client *c, const Seperator *sep);
void command_ginfo(Client *c, const Seperator *sep);
void command_opcode(Client *c, const Seperator *sep);
void command_aggro(Client *c, const Seperator *sep);
void command_hatelist(Client *c, const Seperator *sep);
void command_aggrozone(Client *c, const Seperator *sep);
void command_reloadstatic(Client *c, const Seperator *sep);
void command_flags(Client *c, const Seperator *sep);
void command_flagedit(Client *c, const Seperator *sep);
void command_serverrules(Client *c, const Seperator *sep);
void command_acceptrules(Client *c, const Seperator *sep);
void command_guildcreate(Client *c, const Seperator *sep);
void command_guildapprove(Client *c, const Seperator *sep);
void command_guildlist(Client *c, const Seperator *sep);
void command_rules(Client *c, const Seperator *sep);
void command_task(Client *c, const Seperator *sep);
void command_reloadtitles(Client *c, const Seperator *sep);
void command_refundaa(Client *c, const Seperator *sep);
void command_traindisc(Client *c, const Seperator *sep);
void command_deletegraveyard(Client *c, const Seperator *sep);
void command_setgraveyard(Client *c, const Seperator *sep);
void command_getplayerburiedcorpsecount(Client *c, const Seperator *sep);
void command_summonburiedplayercorpse(Client *c, const Seperator *sep);
void command_unscribespell(Client *c, const Seperator *sep);
void command_scribespell(Client *c, const Seperator *sep);
void command_refreshgroup(Client *c, const Seperator *sep);
void command_advnpcspawn(Client *c, const Seperator *sep);
void command_modifynpcstat(Client *c, const Seperator *sep);
void command_instance(Client *c, const Seperator *sep);
void command_setstartzone(Client *c, const Seperator *sep);
void command_netstats(Client *c, const Seperator *sep);
void command_object(Client* c, const Seperator *sep);
void command_raidloot(Client* c, const Seperator *sep);
void command_globalview(Client* c, const Seperator *sep);
void command_emoteview(Client* c, const Seperator *sep);
void command_reloademote(Client* c, const Seperator *sep);
void command_emotesearch(Client* c, const Seperator *sep);
void command_distance(Client *c, const Seperator *sep);
void command_cvs(Client *c, const Seperator *sep);
void command_max_all_skills(Client *c, const Seperator *sep);
void command_showbonusstats(Client *c, const Seperator *sep);
void command_reloadallrules(Client *c, const Seperator *sep);
void command_reloadworldrules(Client *c, const Seperator *sep);
void command_reloadlevelmods(Client *c, const Seperator *sep);
void command_camerashake(Client *c, const Seperator *sep);
void command_disarmtrap(Client *c, const Seperator *sep);
void command_sensetrap(Client *c, const Seperator *sep);
void command_picklock(Client *c, const Seperator *sep);
void command_qtest(Client *c, const Seperator *sep);
void command_mysql(Client *c, const Seperator *sep);
void command_xtargets(Client *c, const Seperator *sep);
void command_zopp(Client *c, const Seperator *sep);
void command_augmentitem(Client *c, const Seperator *sep);
void command_questerrors(Client *c, const Seperator *sep);
void command_enablerecipe(Client *c, const Seperator *sep);
void command_disablerecipe(Client *c, const Seperator *sep);
void command_showspellslist(Client *c, const Seperator *sep);
void command_npctype_cache(Client *c, const Seperator *sep); void command_npctype_cache(Client *c, const Seperator *sep);
void command_merchantopenshop(Client *c, const Seperator *sep); void command_npctypespawn(Client *c, const Seperator *sep);
void command_merchantcloseshop(Client *c, const Seperator *sep); void command_nukebuffs(Client *c, const Seperator *sep);
void command_shownumhits(Client *c, const Seperator *sep); void command_nukeitem(Client *c, const Seperator *sep);
void command_tune(Client *c, const Seperator *sep); void command_numauths(Client *c, const Seperator *sep);
void command_logtest(Client *c, const Seperator *sep); void command_object(Client* c, const Seperator *sep);
void command_mysqltest(Client *c, const Seperator *sep); void command_oocmute(Client *c, const Seperator *sep);
void command_logs(Client *c, const Seperator *sep); void command_opcode(Client *c, const Seperator *sep);
void command_resetaa_timer(Client *c, const Seperator *sep); void command_optest(Client *c, const Seperator *sep);
void command_reloadaa(Client *c, const Seperator *sep);
void command_hotfix(Client *c, const Seperator *sep); #ifdef PACKET_PROFILER
void command_load_shared_memory(Client *c, const Seperator *sep); void command_packetprofile(Client *c, const Seperator *sep);
void command_apply_shared_memory(Client *c, const Seperator *sep); #endif
void command_untraindisc(Client *c, const Seperator *sep);
void command_untraindiscs(Client *c, const Seperator *sep); void command_path(Client *c, const Seperator *sep);
void command_reloadperlexportsettings(Client *c, const Seperator *sep); void command_peekinv(Client *c, const Seperator *sep);
void command_peqzone(Client *c, const Seperator *sep);
void command_permaclass(Client *c, const Seperator *sep);
void command_permagender(Client *c, const Seperator *sep);
void command_permarace(Client *c, const Seperator *sep);
void command_petitioninfo(Client *c, const Seperator *sep);
void command_picklock(Client *c, const Seperator *sep);
#ifdef EQPROFILE #ifdef EQPROFILE
void command_profiledump(Client *c, const Seperator *sep); void command_profiledump(Client *c, const Seperator *sep);
void command_profilereset(Client *c, const Seperator *sep); void command_profilereset(Client *c, const Seperator *sep);
#endif #endif
#ifdef PACKET_PROFILER void command_pvp(Client *c, const Seperator *sep);
void command_packetprofile(Client *c, const Seperator *sep); void command_qglobal(Client *c, const Seperator *sep);
#endif void command_qtest(Client *c, const Seperator *sep);
void command_questerrors(Client *c, const Seperator *sep);
void command_race(Client *c, const Seperator *sep);
void command_raidloot(Client* c, const Seperator *sep);
void command_randomfeatures(Client *c, const Seperator *sep);
void command_refreshgroup(Client *c, const Seperator *sep);
void command_refundaa(Client *c, const Seperator *sep);
void command_reloadaa(Client *c, const Seperator *sep);
void command_reloadallrules(Client *c, const Seperator *sep);
void command_reloademote(Client* c, const Seperator *sep);
void command_reloadlevelmods(Client *c, const Seperator *sep);
void command_reloadperlexportsettings(Client *c, const Seperator *sep);
void command_reloadqst(Client *c, const Seperator *sep);
void command_reloadstatic(Client *c, const Seperator *sep);
void command_reloadtitles(Client *c, const Seperator *sep);
void command_reloadworld(Client *c, const Seperator *sep);
void command_reloadworldrules(Client *c, const Seperator *sep);
void command_reloadzps(Client *c, const Seperator *sep);
void command_repop(Client *c, const Seperator *sep);
void command_repopclose(Client *c, const Seperator *sep);
void command_resetaa(Client* c,const Seperator *sep);
void command_resetaa_timer(Client *c, const Seperator *sep);
void command_revoke(Client *c, const Seperator *sep);
void command_rules(Client *c, const Seperator *sep);
void command_save(Client *c, const Seperator *sep);
void command_scribespell(Client *c, const Seperator *sep);
void command_scribespells(Client *c, const Seperator *sep);
void command_sendop(Client *c, const Seperator *sep);
void command_sendzonespawns(Client *c, const Seperator *sep);
void command_sensetrap(Client *c, const Seperator *sep);
void command_serverinfo(Client *c, const Seperator *sep);
void command_serverrules(Client *c, const Seperator *sep);
void command_serversidename(Client *c, const Seperator *sep);
void command_set_adventure_points(Client *c, const Seperator *sep);
void command_setaapts(Client *c, const Seperator *sep);
void command_setaaxp(Client *c, const Seperator *sep);
void command_setanim(Client *c, const Seperator *sep);
void command_setcrystals(Client *c, const Seperator *sep);
void command_setfaction(Client *c, const Seperator *sep);
void command_setgraveyard(Client *c, const Seperator *sep);
void command_setlanguage(Client *c, const Seperator *sep);
void command_setlsinfo(Client *c, const Seperator *sep);
void command_setpass(Client *c, const Seperator *sep);
void command_setpvppoints(Client *c, const Seperator *sep);
void command_setskill(Client *c, const Seperator *sep);
void command_setskillall(Client *c, const Seperator *sep);
void command_setstartzone(Client *c, const Seperator *sep);
void command_setstat(Client *c, const Seperator *sep);
void command_setxp(Client *c, const Seperator *sep);
void command_showbonusstats(Client *c, const Seperator *sep);
void command_showbuffs(Client *c, const Seperator *sep);
void command_shownumhits(Client *c, const Seperator *sep);
void command_showpetspell(Client *c, const Seperator *sep);
void command_showskills(Client *c, const Seperator *sep);
void command_showspellslist(Client *c, const Seperator *sep);
void command_showstats(Client *c, const Seperator *sep);
void command_shutdown(Client *c, const Seperator *sep);
void command_size(Client *c, const Seperator *sep);
void command_spawn(Client *c, const Seperator *sep);
void command_spawnfix(Client *c, const Seperator *sep);
void command_spawnstatus(Client *c, const Seperator *sep);
void command_spellinfo(Client *c, const Seperator *sep);
void command_spoff(Client *c, const Seperator *sep);
void command_spon(Client *c, const Seperator *sep);
void command_stun(Client *c, const Seperator *sep);
void command_summon(Client *c, const Seperator *sep);
void command_summonburiedplayercorpse(Client *c, const Seperator *sep);
void command_summonitem(Client *c, const Seperator *sep);
void command_suspend(Client *c, const Seperator *sep);
void command_synctod(Client *c, const Seperator *sep);
void command_task(Client *c, const Seperator *sep);
void command_tattoo(Client *c, const Seperator *sep);
void command_tempname(Client *c, const Seperator *sep);
void command_testspawn(Client *c, const Seperator *sep);
void command_testspawnkill(Client *c, const Seperator *sep);
void command_texture(Client *c, const Seperator *sep);
void command_time(Client *c, const Seperator *sep);
void command_timers(Client *c, const Seperator *sep);
void command_timezone(Client *c, const Seperator *sep);
void command_title(Client *c, const Seperator *sep);
void command_titlesuffix(Client *c, const Seperator *sep);
void command_traindisc(Client *c, const Seperator *sep);
void command_tune(Client *c, const Seperator *sep);
void command_undye(Client *c, const Seperator *sep);
void command_undyeme(Client *c, const Seperator *sep);
void command_unfreeze(Client *c, const Seperator *sep);
void command_unlock(Client *c, const Seperator *sep);
void command_unscribespell(Client *c, const Seperator *sep);
void command_unscribespells(Client *c, const Seperator *sep);
void command_untraindisc(Client *c, const Seperator *sep);
void command_untraindiscs(Client *c, const Seperator *sep);
void command_uptime(Client *c, const Seperator *sep);
void command_version(Client *c, const Seperator *sep);
void command_viewnpctype(Client *c, const Seperator *sep);
void command_viewpetition(Client *c, const Seperator *sep);
void command_wc(Client *c, const Seperator *sep);
void command_weather(Client *c, const Seperator *sep);
void command_worldshutdown(Client *c, const Seperator *sep);
void command_wp(Client *c, const Seperator *sep);
void command_wpadd(Client *c, const Seperator *sep);
void command_wpinfo(Client *c, const Seperator *sep);
void command_xtargets(Client *c, const Seperator *sep);
void command_zclip(Client *c, const Seperator *sep);
void command_zcolor(Client *c, const Seperator *sep);
void command_zheader(Client *c, const Seperator *sep);
void command_zone(Client *c, const Seperator *sep);
void command_zone_instance(Client *c, const Seperator *sep);
void command_zonebootup(Client *c, const Seperator *sep);
void command_zonelock(Client *c, const Seperator *sep);
void command_zoneshutdown(Client *c, const Seperator *sep);
void command_zonespawn(Client *c, const Seperator *sep);
void command_zonestatus(Client *c, const Seperator *sep);
void command_zopp(Client *c, const Seperator *sep);
void command_zsafecoords(Client *c, const Seperator *sep);
void command_zsave(Client *c, const Seperator *sep);
void command_zsky(Client *c, const Seperator *sep);
void command_zstats(Client *c, const Seperator *sep);
void command_zunderworld(Client *c, const Seperator *sep);
void command_zuwcoords(Client *c, const Seperator *sep);
#ifdef BOTS #ifdef BOTS
#include "bot.h" #include "bot.h"
@ -350,4 +337,3 @@ void command_bot(Client*c, const Seperator *sep);
#endif #endif
#endif #endif

View File

@ -571,6 +571,33 @@ bool Client::TrainDiscipline(uint32 itemid) {
return(false); return(false);
} }
void Client::TrainDiscBySpellID(int32 spell_id)
{
int i;
for(i = 0; i < MAX_PP_DISCIPLINES; i++) {
if(m_pp.disciplines.values[i] == 0) {
m_pp.disciplines.values[i] = spell_id;
database.SaveCharacterDisc(this->CharacterID(), i, spell_id);
SendDisciplineUpdate();
Message(15, "You have learned a new combat ability!");
return;
}
}
}
int Client::GetDiscSlotBySpellID(int32 spellid)
{
int i;
for(i = 0; i < MAX_PP_DISCIPLINES; i++)
{
if(m_pp.disciplines.values[i] == spellid)
return i;
}
return -1;
}
void Client::SendDisciplineUpdate() { void Client::SendDisciplineUpdate() {
EQApplicationPacket app(OP_DisciplineUpdate, sizeof(Disciplines_Struct)); EQApplicationPacket app(OP_DisciplineUpdate, sizeof(Disciplines_Struct));
Disciplines_Struct *d = (Disciplines_Struct*)app.pBuffer; Disciplines_Struct *d = (Disciplines_Struct*)app.pBuffer;

View File

@ -2906,6 +2906,19 @@ XS(XS__DestroyInstance) {
XSRETURN_EMPTY; XSRETURN_EMPTY;
} }
XS(XS__UpdateInstanceTimer);
XS(XS__UpdateInstanceTimer) {
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: UpdateInstanceTimer(instance_id, new_duration)");
uint16 instance_id = (uint16)SvUV(ST(0));
uint32 new_duration = (uint32)SvUV(ST(1));
quest_manager.UpdateInstanceTimer(instance_id, new_duration);
XSRETURN_EMPTY;
}
XS(XS__GetInstanceID); XS(XS__GetInstanceID);
XS(XS__GetInstanceID) { XS(XS__GetInstanceID) {
dXSARGS; dXSARGS;
@ -3636,6 +3649,7 @@ EXTERN_C XS(boot_quest)
newXS(strcpy(buf, "ChooseRandom"), XS__ChooseRandom, file); newXS(strcpy(buf, "ChooseRandom"), XS__ChooseRandom, file);
newXS(strcpy(buf, "CreateInstance"), XS__CreateInstance, file); newXS(strcpy(buf, "CreateInstance"), XS__CreateInstance, file);
newXS(strcpy(buf, "DestroyInstance"), XS__DestroyInstance, file); newXS(strcpy(buf, "DestroyInstance"), XS__DestroyInstance, file);
newXS(strcpy(buf, "UpdateInstanceTimer"), XS__UpdateInstanceTimer, file);
newXS(strcpy(buf, "FlagInstanceByGroupLeader"), XS__FlagInstanceByGroupLeader, file); newXS(strcpy(buf, "FlagInstanceByGroupLeader"), XS__FlagInstanceByGroupLeader, file);
newXS(strcpy(buf, "FlagInstanceByRaidLeader"), XS__FlagInstanceByRaidLeader, file); newXS(strcpy(buf, "FlagInstanceByRaidLeader"), XS__FlagInstanceByRaidLeader, file);
newXS(strcpy(buf, "FlyMode"), XS__FlyMode, file); newXS(strcpy(buf, "FlyMode"), XS__FlyMode, file);

View File

@ -530,6 +530,11 @@ void Lua_Client::UnmemSpell(int slot, bool update_client) {
self->UnmemSpell(slot, update_client); self->UnmemSpell(slot, update_client);
} }
void Lua_Client::UnmemSpellBySpellID(int32 spell_id) {
Lua_Safe_Call_Void();
self->UnmemSpellBySpellID(spell_id);
}
void Lua_Client::UnmemSpellAll() { void Lua_Client::UnmemSpellAll() {
Lua_Safe_Call_Void(); Lua_Safe_Call_Void();
self->UnmemSpellAll(); self->UnmemSpellAll();
@ -575,6 +580,16 @@ void Lua_Client::TrainDisc(int itemid) {
self->TrainDiscipline(itemid); self->TrainDiscipline(itemid);
} }
void Lua_Client::TrainDiscBySpellID(int32 spell_id) {
Lua_Safe_Call_Void();
self->TrainDiscBySpellID(spell_id);
}
int Lua_Client::GetDiscSlotBySpellID(int32 spell_id) {
Lua_Safe_Call_Int();
return self->GetDiscSlotBySpellID(spell_id);
}
void Lua_Client::UntrainDisc(int slot) { void Lua_Client::UntrainDisc(int slot) {
Lua_Safe_Call_Void(); Lua_Safe_Call_Void();
self->UntrainDisc(slot); self->UntrainDisc(slot);
@ -1426,6 +1441,7 @@ luabind::scope lua_register_client() {
.def("MemSpell", (void(Lua_Client::*)(int,int,bool))&Lua_Client::MemSpell) .def("MemSpell", (void(Lua_Client::*)(int,int,bool))&Lua_Client::MemSpell)
.def("UnmemSpell", (void(Lua_Client::*)(int))&Lua_Client::UnmemSpell) .def("UnmemSpell", (void(Lua_Client::*)(int))&Lua_Client::UnmemSpell)
.def("UnmemSpell", (void(Lua_Client::*)(int,bool))&Lua_Client::UnmemSpell) .def("UnmemSpell", (void(Lua_Client::*)(int,bool))&Lua_Client::UnmemSpell)
.def("UnmemSpellBySpellID", (void(Lua_Client::*)(int32))&Lua_Client::UnmemSpellBySpellID)
.def("UnmemSpellAll", (void(Lua_Client::*)(void))&Lua_Client::UnmemSpellAll) .def("UnmemSpellAll", (void(Lua_Client::*)(void))&Lua_Client::UnmemSpellAll)
.def("UnmemSpellAll", (void(Lua_Client::*)(bool))&Lua_Client::UnmemSpellAll) .def("UnmemSpellAll", (void(Lua_Client::*)(bool))&Lua_Client::UnmemSpellAll)
.def("ScribeSpell", (void(Lua_Client::*)(int,int))&Lua_Client::ScribeSpell) .def("ScribeSpell", (void(Lua_Client::*)(int,int))&Lua_Client::ScribeSpell)
@ -1435,6 +1451,8 @@ luabind::scope lua_register_client() {
.def("UnscribeSpellAll", (void(Lua_Client::*)(void))&Lua_Client::UnscribeSpellAll) .def("UnscribeSpellAll", (void(Lua_Client::*)(void))&Lua_Client::UnscribeSpellAll)
.def("UnscribeSpellAll", (void(Lua_Client::*)(bool))&Lua_Client::UnscribeSpellAll) .def("UnscribeSpellAll", (void(Lua_Client::*)(bool))&Lua_Client::UnscribeSpellAll)
.def("TrainDisc", (void(Lua_Client::*)(int))&Lua_Client::TrainDisc) .def("TrainDisc", (void(Lua_Client::*)(int))&Lua_Client::TrainDisc)
.def("TrainDiscBySpellID", (void(Lua_Client::*)(int32))&Lua_Client::TrainDiscBySpellID)
.def("GetDiscSlotBySpellID", (int(Lua_Client::*)(int32))&Lua_Client::GetDiscSlotBySpellID)
.def("UntrainDisc", (void(Lua_Client::*)(int))&Lua_Client::UntrainDisc) .def("UntrainDisc", (void(Lua_Client::*)(int))&Lua_Client::UntrainDisc)
.def("UntrainDisc", (void(Lua_Client::*)(int,bool))&Lua_Client::UntrainDisc) .def("UntrainDisc", (void(Lua_Client::*)(int,bool))&Lua_Client::UntrainDisc)
.def("UntrainDiscAll", (void(Lua_Client::*)(void))&Lua_Client::UntrainDiscAll) .def("UntrainDiscAll", (void(Lua_Client::*)(void))&Lua_Client::UntrainDiscAll)

View File

@ -131,6 +131,7 @@ public:
void MemSpell(int spell_id, int slot, bool update_client); void MemSpell(int spell_id, int slot, bool update_client);
void UnmemSpell(int slot); void UnmemSpell(int slot);
void UnmemSpell(int slot, bool update_client); void UnmemSpell(int slot, bool update_client);
void UnmemSpellBySpellID(int32 spell_id);
void UnmemSpellAll(); void UnmemSpellAll();
void UnmemSpellAll(bool update_client); void UnmemSpellAll(bool update_client);
void ScribeSpell(int spell_id, int slot); void ScribeSpell(int spell_id, int slot);
@ -140,6 +141,8 @@ public:
void UnscribeSpellAll(); void UnscribeSpellAll();
void UnscribeSpellAll(bool update_client); void UnscribeSpellAll(bool update_client);
void TrainDisc(int itemid); void TrainDisc(int itemid);
void TrainDiscBySpellID(int32 spell_id);
int GetDiscSlotBySpellID(int32 spell_id);
void UntrainDisc(int slot); void UntrainDisc(int slot);
void UntrainDisc(int slot, bool update_client); void UntrainDisc(int slot, bool update_client);
void UntrainDiscAll(); void UntrainDiscAll();

View File

@ -804,6 +804,10 @@ void lua_destroy_instance(uint32 instance_id) {
quest_manager.DestroyInstance(instance_id); quest_manager.DestroyInstance(instance_id);
} }
void lua_update_instance_timer(uint16 instance_id, uint32 new_duration) {
quest_manager.UpdateInstanceTimer(instance_id, new_duration);
}
int lua_get_instance_id(const char *zone, uint32 version) { int lua_get_instance_id(const char *zone, uint32 version) {
return quest_manager.GetInstanceID(zone, version); return quest_manager.GetInstanceID(zone, version);
} }
@ -1576,6 +1580,7 @@ luabind::scope lua_register_general() {
luabind::def("get_guild_name_by_id", &lua_get_guild_name_by_id), luabind::def("get_guild_name_by_id", &lua_get_guild_name_by_id),
luabind::def("create_instance", &lua_create_instance), luabind::def("create_instance", &lua_create_instance),
luabind::def("destroy_instance", &lua_destroy_instance), luabind::def("destroy_instance", &lua_destroy_instance),
luabind::def("update_instance_timer", &lua_update_instance_timer),
luabind::def("get_instance_id", &lua_get_instance_id), luabind::def("get_instance_id", &lua_get_instance_id),
luabind::def("get_characters_in_instance", &lua_get_characters_in_instance), luabind::def("get_characters_in_instance", &lua_get_characters_in_instance),
luabind::def("assign_to_instance", &lua_assign_to_instance), luabind::def("assign_to_instance", &lua_assign_to_instance),

View File

@ -1871,6 +1871,16 @@ void Lua_Mob::SetPseudoRoot(bool in) {
self->SetPseudoRoot(in); self->SetPseudoRoot(in);
} }
bool Lua_Mob::IsFeared() {
Lua_Safe_Call_Bool();
return self->IsFeared();
}
bool Lua_Mob::IsBlind() {
Lua_Safe_Call_Bool();
return self->IsBlind();
}
luabind::scope lua_register_mob() { luabind::scope lua_register_mob() {
return luabind::class_<Lua_Mob, Lua_Entity>("Mob") return luabind::class_<Lua_Mob, Lua_Entity>("Mob")
.def(luabind::constructor<>()) .def(luabind::constructor<>())
@ -2156,6 +2166,8 @@ luabind::scope lua_register_mob() {
.def("WearChange", (void(Lua_Mob::*)(int,int,uint32))&Lua_Mob::WearChange) .def("WearChange", (void(Lua_Mob::*)(int,int,uint32))&Lua_Mob::WearChange)
.def("DoKnockback", (void(Lua_Mob::*)(Lua_Mob,uint32,uint32))&Lua_Mob::DoKnockback) .def("DoKnockback", (void(Lua_Mob::*)(Lua_Mob,uint32,uint32))&Lua_Mob::DoKnockback)
.def("RemoveNimbusEffect", (void(Lua_Mob::*)(int))&Lua_Mob::RemoveNimbusEffect) .def("RemoveNimbusEffect", (void(Lua_Mob::*)(int))&Lua_Mob::RemoveNimbusEffect)
.def("IsFeared", (bool(Lua_Mob::*)(void))&Lua_Mob::IsFeared)
.def("IsBlind", (bool(Lua_Mob::*)(void))&Lua_Mob::IsBlind)
.def("IsRunning", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRunning) .def("IsRunning", (bool(Lua_Mob::*)(void))&Lua_Mob::IsRunning)
.def("SetRunning", (void(Lua_Mob::*)(bool))&Lua_Mob::SetRunning) .def("SetRunning", (void(Lua_Mob::*)(bool))&Lua_Mob::SetRunning)
.def("SetBodyType", (void(Lua_Mob::*)(int,bool))&Lua_Mob::SetBodyType) .def("SetBodyType", (void(Lua_Mob::*)(int,bool))&Lua_Mob::SetBodyType)

View File

@ -40,6 +40,8 @@ public:
void SetLevel(int level, bool command); void SetLevel(int level, bool command);
void SendWearChange(int material_slot); void SendWearChange(int material_slot);
bool IsMoving(); bool IsMoving();
bool IsFeared();
bool IsBlind();
void GotoBind(); void GotoBind();
void Gate(); void Gate();
bool Attack(Lua_Mob other); bool Attack(Lua_Mob other);

View File

@ -2445,6 +2445,30 @@ XS(XS_Client_UnmemSpell)
XSRETURN_EMPTY; XSRETURN_EMPTY;
} }
XS(XS_Client_UnmemSpellBySpellID); /* prototype to pass -Wmissing-prototypes */
XS(XS_Client_UnmemSpellBySpellID)
{
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: Client::UnmemSpellBySpellID(THIS, spell_id)");
{
Client * THIS;
int32 spell_id = (int32)SvIV(ST(1));
if (sv_derived_from(ST(0), "Client")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Client *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Client");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->UnmemSpellBySpellID(spell_id);
}
XSRETURN_EMPTY;
}
XS(XS_Client_UnmemSpellAll); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UnmemSpellAll); /* prototype to pass -Wmissing-prototypes */
XS(XS_Client_UnmemSpellAll) XS(XS_Client_UnmemSpellAll)
{ {
@ -2568,6 +2592,57 @@ XS(XS_Client_UnscribeSpellAll)
XSRETURN_EMPTY; XSRETURN_EMPTY;
} }
XS(XS_Client_TrainDiscBySpellID); /* prototype to pass -Wmissing-prototypes */
XS(XS_Client_TrainDiscBySpellID)
{
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: Client::TrainDiscBySpellID(THIS, spell_id)");
{
Client * THIS;
int32 spell_id = (int32)SvIV(ST(1));
if (sv_derived_from(ST(0), "Client")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Client *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Client");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
THIS->TrainDiscBySpellID(spell_id);
}
XSRETURN_EMPTY;
}
XS(XS_Client_GetDiscSlotBySpellID); /* prototype to pass -Wmissing-prototypes */
XS(XS_Client_GetDiscSlotBySpellID)
{
dXSARGS;
if (items != 2)
Perl_croak(aTHX_ "Usage: Client::GetDiscSlotBySpellID(THIS, spell_id)");
{
Client * THIS;
int RETVAL;
int32 spell_id = (int32)SvIV(ST(1));
dXSTARG;
if (sv_derived_from(ST(0), "Client")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Client *,tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Client");
if(THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->GetDiscSlotBySpellID(spell_id);
XSprePUSH; PUSHi((IV)RETVAL);
}
XSRETURN(1);
}
XS(XS_Client_UntrainDisc); /* prototype to pass -Wmissing-prototypes */ XS(XS_Client_UntrainDisc); /* prototype to pass -Wmissing-prototypes */
XS(XS_Client_UntrainDisc) XS(XS_Client_UntrainDisc)
{ {
@ -6443,10 +6518,13 @@ XS(boot_Client)
newXSproto(strcpy(buf, "ResetAA"), XS_Client_ResetAA, file, "$"); newXSproto(strcpy(buf, "ResetAA"), XS_Client_ResetAA, file, "$");
newXSproto(strcpy(buf, "MemSpell"), XS_Client_MemSpell, file, "$$$;$"); newXSproto(strcpy(buf, "MemSpell"), XS_Client_MemSpell, file, "$$$;$");
newXSproto(strcpy(buf, "UnmemSpell"), XS_Client_UnmemSpell, file, "$$;$"); newXSproto(strcpy(buf, "UnmemSpell"), XS_Client_UnmemSpell, file, "$$;$");
newXSproto(strcpy(buf, "UnmemSpellBySpellID"), XS_Client_UnmemSpellBySpellID, file, "$$");
newXSproto(strcpy(buf, "UnmemSpellAll"), XS_Client_UnmemSpellAll, file, "$;$"); newXSproto(strcpy(buf, "UnmemSpellAll"), XS_Client_UnmemSpellAll, file, "$;$");
newXSproto(strcpy(buf, "ScribeSpell"), XS_Client_ScribeSpell, file, "$$$;$"); newXSproto(strcpy(buf, "ScribeSpell"), XS_Client_ScribeSpell, file, "$$$;$");
newXSproto(strcpy(buf, "UnscribeSpell"), XS_Client_UnscribeSpell, file, "$$;$"); newXSproto(strcpy(buf, "UnscribeSpell"), XS_Client_UnscribeSpell, file, "$$;$");
newXSproto(strcpy(buf, "UnscribeSpellAll"), XS_Client_UnscribeSpellAll, file, "$;$"); newXSproto(strcpy(buf, "UnscribeSpellAll"), XS_Client_UnscribeSpellAll, file, "$;$");
newXSproto(strcpy(buf, "TrainDiscBySpellID"), XS_Client_TrainDiscBySpellID, file, "$$");
newXSproto(strcpy(buf, "GetDiscSlotBySpellID"), XS_Client_GetDiscSlotBySpellID, file, "$$");
newXSproto(strcpy(buf, "UntrainDisc"), XS_Client_UntrainDisc, file, "$$;$"); newXSproto(strcpy(buf, "UntrainDisc"), XS_Client_UntrainDisc, file, "$$;$");
newXSproto(strcpy(buf, "UntrainDiscAll"), XS_Client_UntrainDiscAll, file, "$;$"); newXSproto(strcpy(buf, "UntrainDiscAll"), XS_Client_UntrainDiscAll, file, "$;$");
newXSproto(strcpy(buf, "IsSitting"), XS_Client_IsSitting, file, "$"); newXSproto(strcpy(buf, "IsSitting"), XS_Client_IsSitting, file, "$");

View File

@ -8440,6 +8440,56 @@ XS(XS_Mob_CanClassEquipItem)
XSRETURN(1); XSRETURN(1);
} }
XS(XS_Mob_IsFeared);
XS(XS_Mob_IsFeared) {
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: Mob::IsFeared(THIS)");
{
Mob* THIS;
bool RETVAL;
if (sv_derived_from(ST(0), "Mob")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Mob*, tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Mob");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->IsFeared();
ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0));
}
XSRETURN(1);
}
XS(XS_Mob_IsBlind);
XS(XS_Mob_IsBlind) {
dXSARGS;
if (items != 1)
Perl_croak(aTHX_ "Usage: Mob::IsBlind(THIS)");
{
Mob* THIS;
bool RETVAL;
if (sv_derived_from(ST(0), "Mob")) {
IV tmp = SvIV((SV*)SvRV(ST(0)));
THIS = INT2PTR(Mob*, tmp);
}
else
Perl_croak(aTHX_ "THIS is not of type Mob");
if (THIS == nullptr)
Perl_croak(aTHX_ "THIS is nullptr, avoiding crash.");
RETVAL = THIS->IsBlind();
ST(0) = boolSV(RETVAL);
sv_2mortal(ST(0));
}
XSRETURN(1);
}
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
#endif #endif
@ -8751,6 +8801,8 @@ XS(boot_Mob)
newXSproto(strcpy(buf, "ClearSpecialAbilities"), XS_Mob_ClearSpecialAbilities, file, "$"); newXSproto(strcpy(buf, "ClearSpecialAbilities"), XS_Mob_ClearSpecialAbilities, file, "$");
newXSproto(strcpy(buf, "ProcessSpecialAbilities"), XS_Mob_ProcessSpecialAbilities, file, "$$"); newXSproto(strcpy(buf, "ProcessSpecialAbilities"), XS_Mob_ProcessSpecialAbilities, file, "$$");
newXSproto(strcpy(buf, "CanClassEquipItem"), XS_Mob_CanClassEquipItem, file, "$$"); newXSproto(strcpy(buf, "CanClassEquipItem"), XS_Mob_CanClassEquipItem, file, "$$");
newXSproto(strcpy(buf, "IsFeared"), XS_Mob_IsFeared, file, "$");
newXSproto(strcpy(buf, "IsBlind"), XS_Mob_IsBlind, file, "$");
XSRETURN_YES; XSRETURN_YES;
} }

View File

@ -2582,6 +2582,22 @@ void QuestManager::DestroyInstance(uint16 instance_id)
database.DeleteInstance(instance_id); database.DeleteInstance(instance_id);
} }
void QuestManager::UpdateInstanceTimer(uint16 instance_id, uint32 new_duration)
{
std::string query = StringFormat("UPDATE instance_list SET duration = %lu, start_time = UNIX_TIMESTAMP() WHERE id = %lu",
(unsigned long)new_duration, (unsigned long)instance_id);
auto results = database.QueryDatabase(query);
if (results.Success()) {
auto pack = new ServerPacket(ServerOP_InstanceUpdateTime, sizeof(ServerInstanceUpdateTime_Struct));
ServerInstanceUpdateTime_Struct *ut = (ServerInstanceUpdateTime_Struct*)pack->pBuffer;
ut->instance_id = instance_id;
ut->new_duration = new_duration;
worldserver.SendPacket(pack);
safe_delete(pack);
}
}
uint16 QuestManager::GetInstanceID(const char *zone, int16 version) uint16 QuestManager::GetInstanceID(const char *zone, int16 version)
{ {
QuestManagerCurrentQuestVars(); QuestManagerCurrentQuestVars();

View File

@ -217,6 +217,7 @@ public:
void MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity = 0); void MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity = 0);
uint32 MerchantCountItem(uint32 NPCid, uint32 itemid); uint32 MerchantCountItem(uint32 NPCid, uint32 itemid);
uint16 CreateInstance(const char *zone, int16 version, uint32 duration); uint16 CreateInstance(const char *zone, int16 version, uint32 duration);
void UpdateInstanceTimer(uint16 instance_id, uint32 new_duration);
void DestroyInstance(uint16 instance_id); void DestroyInstance(uint16 instance_id);
uint16 GetInstanceID(const char *zone, int16 version); uint16 GetInstanceID(const char *zone, int16 version);
void AssignToInstance(uint16 instance_id); void AssignToInstance(uint16 instance_id);

View File

@ -4910,6 +4910,16 @@ void Client::UnmemSpell(int slot, bool update_client)
} }
} }
void Client::UnmemSpellBySpellID(int32 spell_id)
{
for(int i = 0; i < MAX_PP_MEMSPELL; i++) {
if(m_pp.mem_spells[i] == spell_id) {
UnmemSpell(i, true);
break;
}
}
}
void Client::UnmemSpellAll(bool update_client) void Client::UnmemSpellAll(bool update_client)
{ {
int i; int i;